diff --git a/src/cr1/types.ts b/src/cr1/types.ts index acde616..c0534ec 100644 --- a/src/cr1/types.ts +++ b/src/cr1/types.ts @@ -255,11 +255,18 @@ export type ConformanceWarningMessage = { export type SchemaValidation = 'succeeded' | 'failed' | 'ignored' + +export type StatusCheckResult = { + set: boolean, + purpose: string, + errors?: StatusListError[] +} & Record + export type ValidationResult = { valid: boolean content: VerifiableCredential schema: Record - status: Record + status: Record warnings: ConformanceWarningMessage[] } diff --git a/src/cr1/validator/index.ts b/src/cr1/validator/index.ts index c755842..cd33913 100644 --- a/src/cr1/validator/index.ts +++ b/src/cr1/validator/index.ts @@ -86,7 +86,9 @@ export const validator = ({ resolver }: RequestValidator) => { if (status.statusPurpose !== verified.credentialSubject.statusPurpose) { validation.valid = false validation.status[`${status.id}`] = { - valid: false, purpose: status.statusPurpose, errors: [{ + set: false, + purpose: status.statusPurpose, + errors: [{ message: 'status list purpose does not match credential status' }] } @@ -95,7 +97,7 @@ export const validator = ({ resolver }: RequestValidator) => { if (bit) { validation.valid = false } - validation.status[`${status.id}`] = { valid: bit, purpose: status.statusPurpose } + validation.status[`${status.id}`] = { set: bit, purpose: status.statusPurpose, [status.statusPurpose]: bit } } } diff --git a/test/jwt-product-passports/integration.test.ts b/test/jwt-product-passports/integration.test.ts index 8a02529..8ce4c7e 100644 --- a/test/jwt-product-passports/integration.test.ts +++ b/test/jwt-product-passports/integration.test.ts @@ -215,8 +215,8 @@ credentialSubject: }) expect(validated.valid).toBe(true) expect(validated.schema[`${baseURL}/schemas/product-passport`].validation).toBe('succeeded') - expect(validated.status[`${baseURL}/credentials/status/3#${revocationIndex}`].valid).toBe(false) - expect(validated.status[`${baseURL}/credentials/status/4#${suspensionIndex}`].valid).toBe(false) + expect(validated.status[`${baseURL}/credentials/status/3#${revocationIndex}`]).toEqual({ "purpose": "revocation", "revocation": false, "set": false }) + expect(validated.status[`${baseURL}/credentials/status/4#${suspensionIndex}`]).toEqual({ "purpose": "suspension", "suspension": false, "set": false }) const vp = await transmute diff --git a/test/w3c-cr-1/4-status.test.ts b/test/w3c-cr-1/4-status.test.ts index 453d667..f3e63e0 100644 --- a/test/w3c-cr-1/4-status.test.ts +++ b/test/w3c-cr-1/4-status.test.ts @@ -97,8 +97,12 @@ credentialSubject: }), }) expect(validation.valid).toBe(true); - expect(validation.status['https://example.com/credentials/status/3#94567'].valid).toBe(false); - expect(validation.status['https://example.com/credentials/status/3#94567'].purpose).toBe('revocation'); + expect(validation.status['https://example.com/credentials/status/3#94567']).toEqual({ + "purpose": "revocation", + "revocation": false, + "set": false + }); + }) // failure here means REVOKED @@ -183,8 +187,11 @@ credentialSubject: }), }) expect(validation.valid).toBe(false); - expect(validation.status['https://example.com/credentials/status/3#94567'].valid).toBe(true); - expect(validation.status['https://example.com/credentials/status/3#94567'].purpose).toBe('revocation'); + expect(validation.status['https://example.com/credentials/status/3#94567']).toEqual({ + "purpose": "revocation", + "revocation": true, + "set": true + }); }) }) @@ -259,8 +266,12 @@ credentialSubject: }), }) expect(validation.valid).toBe(true); - expect(validation.status['https://example.com/credentials/status/3#94567'].valid).toBe(false); - expect(validation.status['https://example.com/credentials/status/3#94567'].purpose).toBe('suspension'); + expect(validation.status['https://example.com/credentials/status/3#94567']).toEqual({ + "set": false, + "purpose": "suspension", + "suspension": false + }); + }) // failure here means REVOKED @@ -345,8 +356,12 @@ credentialSubject: }), }) expect(validation.valid).toBe(false); - expect(validation.status['https://example.com/credentials/status/3#94567'].valid).toBe(true); - expect(validation.status['https://example.com/credentials/status/3#94567'].purpose).toBe('suspension'); + expect(validation.status['https://example.com/credentials/status/3#94567']).toEqual({ + "set": true, + "purpose": "suspension", + "suspension": true + }); + }) }) })