"""Test cases for the DID class in atpasser.uri.identifier module.""" import pytest from atpasser.uri.identifier import DID from atpasser.uri.exceptions import InvalidDIDError, ResolutionError class TestDID: """Test cases for the DID class.""" def test_valid_did_plc(self): """Test creating a DID with a valid did:plc format.""" did_str = "did:plc:z72i7hdynmk6r22z27h6tvur" did = DID(did_str) assert str(did) == did_str assert did.uri == did_str def test_valid_did_web(self): """Test creating a DID with a valid did:web format.""" did_str = "did:web:blueskyweb.xyz" did = DID(did_str) assert str(did) == did_str assert did.uri == did_str def test_valid_did_with_various_characters(self): """Test creating a DID with various valid characters.""" did_str = "did:method:val:two-with_underscores.and-dashes" did = DID(did_str) assert str(did) == did_str assert did.uri == did_str def test_invalid_did_wrong_format(self): """Test that a DID with wrong format raises InvalidDIDError.""" did_str = "not-a-did" with pytest.raises(InvalidDIDError, match="invalid format"): DID(did_str) def test_invalid_did_uppercase_method(self): """Test that a DID with uppercase method raises InvalidDIDError.""" did_str = "did:METHOD:val" with pytest.raises(InvalidDIDError, match="invalid format"): DID(did_str) def test_invalid_did_method_with_numbers(self): """Test that a DID with method containing numbers raises InvalidDIDError.""" did_str = "did:m123:val" with pytest.raises(InvalidDIDError, match="invalid format"): DID(did_str) def test_invalid_did_empty_identifier(self): """Test that a DID with empty identifier raises InvalidDIDError.""" did_str = "did:method:" with pytest.raises(InvalidDIDError, match="invalid format"): DID(did_str) def test_invalid_did_ends_with_colon(self): """Test that a DID ending with colon raises InvalidDIDError.""" did_str = "did:method:val:" with pytest.raises(InvalidDIDError, match="invalid format"): DID(did_str) def test_invalid_did_too_long(self): """Test that a DID that is too long raises InvalidDIDError.""" # Create a DID that exceeds the 2048 character limit long_identifier = "a" * 2040 did_str = f"did:method:{long_identifier}" with pytest.raises(InvalidDIDError, match="exceeds maximum length"): DID(did_str) def test_did_equality(self): """Test DID equality comparison.""" did_str = "did:plc:z72i7hdynmk6r22z27h6tvur" did1 = DID(did_str) did2 = DID(did_str) assert did1 == did2 assert did1 != "not a did object" def test_did_string_representation(self): """Test DID string representation.""" did_str = "did:plc:z72i7hdynmk6r22z27h6tvur" did = DID(did_str) assert str(did) == did_str def test_did_fetch_plc_method(self): """Test fetching a DID document for did:plc method.""" did_str = "did:plc:z72i7hdynmk6r22z27h6tvur" did = DID(did_str) # This test may fail if there's no internet connection or if the PLC directory is down try: document = did.fetch() assert isinstance(document, list) assert len(document) > 0 except ResolutionError: # If resolution fails, we'll skip this test pytest.skip("Failed to resolve DID document") def test_did_fetch_web_method(self): """Test fetching a DID document for did:web method.""" did_str = "did:web:blueskyweb.xyz" did = DID(did_str) # This test may fail if there's no internet connection or if the web server is down try: document = did.fetch() assert isinstance(document, list) assert len(document) > 0 except ResolutionError: # If resolution fails, we'll skip this test pytest.skip("Failed to resolve DID document") def test_did_fetch_unsupported_method(self): """Test that fetching a DID document with unsupported method raises InvalidDIDError.""" did_str = "did:unsupported:method" did = DID(did_str) with pytest.raises(InvalidDIDError, match="unsupported DID method"): did.fetch() def test_did_fetch_web_empty_domain(self): """Test that fetching a DID document with empty domain raises InvalidDIDError.""" did_str = "did:web:" did = DID(did_str) with pytest.raises(InvalidDIDError, match="invalid format"): did.fetch()