import { DidDocumentResolver } from '../../src/resolvers/didDocumentResolver.js'; import { InvalidDidDocumentException } from '../../src/resolvers/exceptions/invalidDidDocumentException.js'; import { InvalidDidMethodException } from '../../src/resolvers/exceptions/invalidDidMethodException.js'; describe('didDocumentResolver should', () => { it('resolve a did:web didDocument for a bare statusList', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:web:trust.validatedid.com'; const expectedDidDocument = { '@context': [ 'https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1', ], id: 'did:web:trust.validatedid.com', verificationMethod: [ { id: 'did:web:trust.validatedid.com#key-0', type: 'JsonWebKey2020', controller: 'did:web:trust.validatedid.com', publicKeyJwk: { kty: 'EC', x: 'gjuALBMqgSNT-Y0WotbN06wZ49DoSyLrzGMUmNL88ZU', y: 'aTV0B0dcuWQz-EBAH9mT-SP3LWvVvp2bk-s4DbuwlEw', crv: 'P-256', }, }, ], authentication: ['did:web:trust.validatedid.com#key-0'], assertionMethod: ['did:web:trust.validatedid.com#key-0'], keyAgreement: ['did:web:trust.validatedid.com#key-0'], }; const didDocument = await didDocumentResolver.resolveDid(did); expect(didDocument).toEqual(expectedDidDocument); }); it('resolve a did:web didDocument for a path statusList', async () => { const didDocumentResolver = new DidDocumentResolver(); const expectedDidDocument = { '@context': [ 'https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1', ], assertionMethod: [ 'did:web:staging.vidchain.net:api:v1:did-web-resolver:6b2d54b2-39dd-48c4-8b3f-de6ba682bcbd#key-0', ], authentication: [ 'did:web:staging.vidchain.net:api:v1:did-web-resolver:6b2d54b2-39dd-48c4-8b3f-de6ba682bcbd#key-0', ], controller: [ 'did:web:staging.vidchain.net:api:v1:did-web-resolver:6b2d54b2-39dd-48c4-8b3f-de6ba682bcbd', ], id: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:6b2d54b2-39dd-48c4-8b3f-de6ba682bcbd', verificationMethod: [ { controller: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:6b2d54b2-39dd-48c4-8b3f-de6ba682bcbd', id: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:6b2d54b2-39dd-48c4-8b3f-de6ba682bcbd#key-0', publicKeyJwk: { crv: 'P-256', kty: 'EC', x: 'F0NQb5zr02YVQ0xR19xTC7zq2JzjrDeVgFB7AuIpdqg', y: 'xfcB3ofaXEFYgy0FZzBWtm6S8hojKk9VXSL3FVQQxoU', }, type: 'JsonWebKey2020', }, ], }; const did = 'did:web:staging.vidchain.net:api:v1:did-web-resolver:6b2d54b2-39dd-48c4-8b3f-de6ba682bcbd'; const didDocument = await didDocumentResolver.resolveDid(did); expect(didDocument).toEqual(expectedDidDocument); }); it('throw when trying to resolve an invalid did:web', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:web:validatedid.com'; await expect(didDocumentResolver.resolveDid(did)).rejects.toThrow( InvalidDidDocumentException, ); }); it('resolve a did:ebsi didDocument', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:ebsi:zj46t2gXPgmdriraZG6mb5A'; const expectedDidDocument = { '@context': [ 'https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1', ], id: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A', controller: ['did:ebsi:zj46t2gXPgmdriraZG6mb5A'], verificationMethod: [ { id: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#7-1eNcG4MFkxahS1m85zcyu9ey_zOAl_fxvSPtI5Q2k', type: 'JsonWebKey2020', controller: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A', publicKeyJwk: { kty: 'EC', crv: 'secp256k1', x: 'u0LAULtFwOQwusN8esicYCz579culZW5htoPC_ADha4', y: 'mYnbYZH4iyvlyMWuXE-X2ssebVE7VC9aW3wPxkU9wdQ', }, }, { id: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#awSc2nG7WGNGw9YDtnVZ5HPOjeIhC8eb8UDOr3QV1Fc', type: 'JsonWebKey2020', controller: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A', publicKeyJwk: { kty: 'EC', crv: 'P-256', x: 'mDX7h2ZIOL1993wj4H83_jg67d_TaYk3dvVL447rRC0', y: 'Lr-efgLN1QPv-rb2sk-4gv7cVwXpzTY6FE8kdNHUUwU', }, }, ], authentication: [ 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#7-1eNcG4MFkxahS1m85zcyu9ey_zOAl_fxvSPtI5Q2k', 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#awSc2nG7WGNGw9YDtnVZ5HPOjeIhC8eb8UDOr3QV1Fc', ], assertionMethod: [ 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#awSc2nG7WGNGw9YDtnVZ5HPOjeIhC8eb8UDOr3QV1Fc', 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#7-1eNcG4MFkxahS1m85zcyu9ey_zOAl_fxvSPtI5Q2k', ], capabilityInvocation: [ 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#7-1eNcG4MFkxahS1m85zcyu9ey_zOAl_fxvSPtI5Q2k', ], }; const didDocument = await didDocumentResolver.resolveDid(did); expect(didDocument).toEqual(expectedDidDocument); }); it('resolve a did:ebsi didDocument: for pilot environment', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:ebsi:z25gUx2D5Ujb6eZcmQEnertx'; const expectedDidDocument = { '@context': [ 'https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1', ], id: 'did:ebsi:z25gUx2D5Ujb6eZcmQEnertx', controller: ['did:ebsi:z25gUx2D5Ujb6eZcmQEnertx'], verificationMethod: [ { id: 'did:ebsi:z25gUx2D5Ujb6eZcmQEnertx#5jOg2ai976NEo_UKDCDHqDzO1vBx2RQJ_9ZuyZLqSCs', type: 'JsonWebKey2020', controller: 'did:ebsi:z25gUx2D5Ujb6eZcmQEnertx', publicKeyJwk: { kty: 'EC', crv: 'secp256k1', x: 'JrxLZH7tnmMNKP58VhKF0__HK3RLKRHU1n7TtE-htJo', y: '4yr_DPo70fZiWRp7McFr_n_on8FtDO5d-pe7-_v6_iA', }, }, ], authentication: [ 'did:ebsi:z25gUx2D5Ujb6eZcmQEnertx#5jOg2ai976NEo_UKDCDHqDzO1vBx2RQJ_9ZuyZLqSCs', ], capabilityInvocation: [ 'did:ebsi:z25gUx2D5Ujb6eZcmQEnertx#5jOg2ai976NEo_UKDCDHqDzO1vBx2RQJ_9ZuyZLqSCs', ], }; const didDocument = await didDocumentResolver.resolveDid(did, { didRegistry: 'https://api-pilot.ebsi.eu/did-registry/v4/identifiers', }); expect(didDocument).toEqual(expectedDidDocument); }); it('throw when trying to resolve an invalid did:ebsi', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:ebsi:zj46t2gXPgmdriraZG6qw5A'; await expect(didDocumentResolver.resolveDid(did)).rejects.toThrow( InvalidDidDocumentException, ); }); it('resolve a did:key didDocument: using transmute', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme'; const expectedDidDocument = { '@context': [ 'https://www.w3.org/ns/did/v1', 'https://ns.did.ai/transmute/v1', { '@base': 'did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme', }, ], assertionMethod: ['#zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme'], authentication: ['#zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme'], capabilityDelegation: [ '#zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme', ], capabilityInvocation: [ '#zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme', ], id: 'did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme', verificationMethod: [ { controller: 'did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme', id: '#zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme', publicKeyBase58: '23o6Sau8NxxzXcgSc3PLcNxrzrZpbLeBn1izfv3jbKhuv', type: 'EcdsaSecp256k1VerificationKey2019', }, ], }; const didDocument = await didDocumentResolver.resolveDid(did); expect(didDocument).toEqual(expectedDidDocument); }); it('resolve a did:key didDocument: using ebsi-did-key', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y'; const expectedDidDocument = { '@context': [ 'https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1', ], assertionMethod: [ 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', ], authentication: [ 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', ], capabilityDelegation: [ 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', ], capabilityInvocation: [ 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', ], id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', verificationMethod: [ { controller: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', publicKeyJwk: { crv: 'P-256', kty: 'EC', x: 'gFBYByibyPMs-lCnMUPiQ7k5AlqXtKyfTOzP9GHwQK0', y: 'FSM7awyWDKq5pkE8rTqtt3rfS7Wq8YHloBCGSlh3g-A', }, type: 'JsonWebKey2020', }, ], }; const didDocument = await didDocumentResolver.resolveDid(did); expect(didDocument).toEqual(expectedDidDocument); }); it('throw when trying to resolve an invalid did:key', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:key:zj46t2gXPgmdriraZG6qw5A'; await expect(didDocumentResolver.resolveDid(did)).rejects.toThrow( InvalidDidDocumentException, ); }); it('throw when trying to resolve a did method not supported', async () => { const didDocumentResolver = new DidDocumentResolver(); const did = 'did:ethr:0xzj46t2gXPgmdriraZG6qw5A'; await expect(didDocumentResolver.resolveDid(did)).rejects.toThrow( InvalidDidMethodException, ); }); });