import { DcqlQueryValidator } from '../../../../src/validators/presentation/dcqlQueryValidator.js'; import { CredentialFormat } from '../../../../src/validators/presentation/vpTokenCredentialsExtractor.js'; describe('DCQLQueryValidator should', () => { it('validate a valid DCQL query with a VP containing a LDP credential', async () => { const verifiableCredentials = [ { format: CredentialFormat.JSON, verifiableCredential: { '@context': ['https://www.w3.org/2018/credentials/v1'], type: ['VerifiableCredential', 'EmailCredential'], credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbrgr5JcheufqFEsAJHceL3WpCbCbVkwbiT65KmZ4d8DQ8wfyVgsjZuwAMCN1mdxga1z1txiW547K9NQ5i1Z63ceYHgZ2UnboE2NRHu2kD6Qnd7wdRHSZ9rQYY4dVhaKW5xp', email: 'pablo@test.com', }, issuer: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrDFBktnKrGkokUSPrHRnUeR2fgoZqtTQtPUWbcLzWNTSEJUeM5sv2T7e9LnuC3gVhLj6cYGudKqnBT9LFqpXtREc3Pn18Ab3n1o3zXvxdZm2zPMScgGnkXw6pBuvDWKgtL', id: 'urn:uuid:9ba42da2-d8fd-4d60-9246-0ae50cffc513', validFrom: '2025-01-27T11:21:58Z', credentialStatus: { id: 'https://labs-studio.vidchain.net/vidcredentials-studio/api/v1/status-list-credential/cbed6f0f-68b6-412c-b3e5-5f8718c52d62#67', statusListCredential: 'https://labs-studio.vidchain.net/vidcredentials-studio/api/v1/status-list-credential/cbed6f0f-68b6-412c-b3e5-5f8718c52d62', statusListIndex: '67', type: 'StatusList2021Entry', statusPurpose: 'revocation', }, }, }, ]; const dcqlQuery = { credentials: [ { id: 'query_0', format: 'ldp_vc', meta: { type_values: [['EmailCredential']], }, claims: [ { path: ['credentialSubject', 'email'], values: ['pablo@test.com'], }, { path: ['credentialSubject', 'id'] }, ], }, ], }; const credentialQueryIds = ['query_0']; const result = new DcqlQueryValidator( verifiableCredentials, dcqlQuery, credentialQueryIds, ).validate(); expect(result.valid).toBeTruthy(); }); it('validate an valid DCQL query with a VP containing an invalid JWT credential', async () => { const verifiableCredentials = [ { format: CredentialFormat.JWT, verifiableCredential: 'eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa3dUb1k1Wm45TDdVajdXRDdNUHhDTEJOUXk0RkxjSGdBQjkzTWtaODZTaDZNI2tleXMtMSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2NzYzODIxOTcsImlzcyI6ImRpZDprZXk6ejZNa3dUb1k1Wm45TDdVajdXRDdNUHhDTEJOUXk0RkxjSGdBQjkzTWtaODZTaDZNIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiYmlydGhOYW1lIjoiRXZhIiwiY3VycmVudEFkZHJlc3MiOiI0NCwgcnVlIGRlIEZhbWUiLCJjdXJyZW50RmFtaWx5TmFtZSI6IkV2YSIsImN1cnJlbnRHaXZlbk5hbWUiOiJBZGFtcyIsImRhdGVPZkJpcnRoIjoiMTk5OC0wMi0xNCIsImdlbmRlciI6IkZlbWFsZSIsImlkIjoiZGlkOmtleTp6Nk1raFF4TGVYcVRhOWpkWFFtSEFHMkZWUFBzTjQ4OHJZZ1ZIY3RHYjNYVm5rQW8iLCJwZXJzb25JZGVudGlmaWVyIjoiQkUvQkUvMDI2MzU1NDJZIiwicGxhY2VPZkJpcnRoIjoiQnJ1c3NlbHMifSwiaWQiOiJodHRwczovL2V4YW1wbGUuY29tL2NyZWRlbnRpYWwvMjM5MCIsImlzc3VlciI6eyJpZCI6ImRpZDprZXk6ejZNa3dUb1k1Wm45TDdVajdXRDdNUHhDTEJOUXk0RkxjSGdBQjkzTWtaODZTaDZNIiwibmFtZSI6InRlc3RJc3N1ZXIifSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkVzc2lmVmVyaWZpYWJsZUlEIl19fQ.nkNerRTPh6PZG79UYenyT7BTc0tDj45svgFAfxKi01uzoInUj08UJFvwMRY_MmFt7fS065CcIPO32yc87wLIDw', }, ]; const dcqlQuery = { credentials: [ { id: 'query_0', format: 'jwt_vc_json', meta: { type_values: [['EmailCredential']], }, claims: [ { path: ['credentialSubject', 'email'], values: ['pablo@test.com'], }, { path: ['credentialSubject', 'id'] }, ], }, ], }; const credentialQueryIds = ['query_0']; const result = new DcqlQueryValidator( verifiableCredentials, dcqlQuery, credentialQueryIds, ).validate(); expect(result.valid).toBeFalsy(); expect(result.message).toBe( `Credential presented does not satisfy Presentation Query with id ${dcqlQuery.credentials[0].id}.`, ); }); });