This is a test suite to demonstrate interoperability of issuers using the VC HTTP API.

Conformance Testing Results

Tests passed 130/157 82%

Tests failed 27/157 18%

Failures 27

Tests skipped 11

Total tests 168

These tests were run on

Key

🚫
Pending
Passed
Failed
Access Denied
Timeout
Not Implemented

The results of the tests are shown below:

Issue Credential - Data Integrity

Issuer ⇒
Test Name
ACA-py apicatalog.com Danube Tech Digital Bazaar EWF GS1 US LearnCard Mavennet SecureKey SpruceID Trinsic
MUST successfully issue a credential.
Expected no error, got Request failed with status code 500 Internal Server Error: expected HTTPError: Request failed with status cod… { …(5) } to not exist
AssertionError: Expected no error, got Request failed with status code 500 Internal Server Error: expected HTTPError: Request failed with status cod… { …(5) } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldReturnResult (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:19:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:41:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Cannot construct a Request with a Request object that has already been used.
TypeError: Cannot construct a Request with a Request object that has already been used.
                        at new Request (node:internal/deps/undici/undici:9523:19)
                        at _sanitizeErrorHeaders (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/node_modules/vc-test-suite-implementations/lib/requests.js:131:21)
                        at makeHttpsRequest (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/node_modules/vc-test-suite-implementations/lib/requests.js:50:13)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
                        at async Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:40:49)
Expected no error, got credential.validFrom must be a valid ISO 8601 date string,credential.validFrom should not be empty: expected HTTPError { message: [ …(2) ], …(6) } to not exist
AssertionError: Expected no error, got credential.validFrom must be a valid ISO 8601 date string,credential.validFrom should not be empty: expected HTTPError { message: [ …(2) ], …(6) } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldReturnResult (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:19:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:41:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected no error, got fetch failed: expected TypeError: fetch failed { …(2) } to not exist
AssertionError: Expected no error, got fetch failed: expected TypeError: fetch failed { …(2) } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldReturnResult (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:19:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:41:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Request body MUST have property "credential".
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:55:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
credential MUST have property "@context".
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:65:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
credential "@context" MUST be an array.
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:75:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
credential "@context" items MUST be strings.
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:87:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
credential MUST have property "type"
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:98:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
"credential.type" MUST be an array.
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:108:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
"credential.type" items MUST be strings
Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
AssertionError: Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:26)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:120:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:120:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
credential MUST have property "issuer"
Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
AssertionError: Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:26)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:131:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'cache-control': 'no-cache, no-store, must-revalidate', pragma: 'no-cache', expires: '0', vary: 'X-HTTP-Method-Override, Accept-Encoding', 'access-control-allow-origin': '*', 'content-type': 'application/json; charset=utf-8', etag: 'W/"2eb-o3VtBb5zfJPQ9rILfUvq4THh0UM"', 'x-cloud-trace-context': '423ad688657b9df7cf0cef3ced268160', date: 'Sun, 10 Nov 2024 05:09:14 GMT', server: 'Google Frontend', 'content-length': '747', via: '1.1 google', 'alt-svc': 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000', Authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist
AssertionError: Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'cache-control': 'no-cache, no-store, must-revalidate', pragma: 'no-cache', expires: '0', vary: 'X-HTTP-Method-Override, Accept-Encoding', 'access-control-allow-origin': '*', 'content-type': 'application/json; charset=utf-8', etag: 'W/"2eb-o3VtBb5zfJPQ9rILfUvq4THh0UM"', 'x-cloud-trace-context': '423ad688657b9df7cf0cef3ced268160', date: 'Sun, 10 Nov 2024 05:09:14 GMT', server: 'Google Frontend', 'content-length': '747', via: '1.1 google', 'alt-svc': 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000', Authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:9:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:131:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:131:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
"credential.issuer" MUST be a string or an object
Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
AssertionError: Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:26)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:143:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
AssertionError: Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:26)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:143:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'cache-control': 'no-cache, no-store, must-revalidate', pragma: 'no-cache', expires: '0', vary: 'X-HTTP-Method-Override, Accept-Encoding', 'access-control-allow-origin': '*', 'content-type': 'application/json; charset=utf-8', etag: 'W/"2f3-e+VqrqKh401vFGLzvnB1HurXAfk"', 'x-cloud-trace-context': '75bf3b4c9b5b237c3701be52f1e24a1b', date: 'Sun, 10 Nov 2024 05:09:14 GMT', server: 'Google Frontend', 'content-length': '755', via: '1.1 google', 'alt-svc': 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000', Authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist
AssertionError: Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'cache-control': 'no-cache, no-store, must-revalidate', pragma: 'no-cache', expires: '0', vary: 'X-HTTP-Method-Override, Accept-Encoding', 'access-control-allow-origin': '*', 'content-type': 'application/json; charset=utf-8', etag: 'W/"2f3-e+VqrqKh401vFGLzvnB1HurXAfk"', 'x-cloud-trace-context': '75bf3b4c9b5b237c3701be52f1e24a1b', date: 'Sun, 10 Nov 2024 05:09:14 GMT', server: 'Google Frontend', 'content-length': '755', via: '1.1 google', 'alt-svc': 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000', Authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:9:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:143:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:143:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
credential MUST have property "credentialSubject"
Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
AssertionError: Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:26)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:154:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:154:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
"credential.credentialSubject" MUST be an object
Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
AssertionError: Expected status code 400 or 422.: expected 500 to be one of [ 400, 422 ]
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:26)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:168:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'content-type': 'application/ld+json', 'x-cloud-trace-context': '315e2e7c4e20892b22c7e82036fb90da', date: 'Sun, 10 Nov 2024 05:09:07 GMT', server: 'Google Frontend', 'content-length': '681', Authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist
AssertionError: Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'content-type': 'application/ld+json', 'x-cloud-trace-context': '315e2e7c4e20892b22c7e82036fb90da', date: 'Sun, 10 Nov 2024 05:09:07 GMT', server: 'Google Frontend', 'content-length': '681', Authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:9:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:168:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected an HTTP error response code.: expected undefined to exist
AssertionError: Expected an HTTP error response code.: expected undefined to exist
                        at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)
                        at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:168:11)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
credential MAY have property "expirationDate"
Expected no error, got Request failed with status code 500 Internal Server Error: expected HTTPError: Request failed with status cod… { …(5) } to not exist
AssertionError: Expected no error, got Request failed with status code 500 Internal Server Error: expected HTTPError: Request failed with status cod… { …(5) } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldReturnResult (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:19:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:193:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected no error, got credential.validFrom must be a valid ISO 8601 date string,credential.validFrom should not be empty: expected HTTPError { message: [ …(2) ], …(6) } to not exist
AssertionError: Expected no error, got credential.validFrom must be a valid ISO 8601 date string,credential.validFrom should not be empty: expected HTTPError { message: [ …(2) ], …(6) } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldReturnResult (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:19:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:193:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected no error, got fetch failed: expected TypeError: fetch failed { …(2) } to not exist
AssertionError: Expected no error, got fetch failed: expected TypeError: fetch failed { …(2) } to not exist
                        at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)
                        at shouldReturnResult (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:19:14)
                        at Context.<anonymous> (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:193:9)
                        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

Issue Credential - JWT

Issuer ⇒
Test Name
SpruceID
MUST successfully issue a credential.
Request body MUST have property "credential".
credential MUST have property "@context".
credential "@context" MUST be an array.
credential "@context" items MUST be strings.
credential MUST have property "type"
"credential.type" MUST be an array.
"credential.type" items MUST be strings
credential MUST have property "issuer"
"credential.issuer" MUST be a string or an object
credential MUST have property "credentialSubject"
"credential.credentialSubject" MUST be an object
credential MAY have property "issuanceDate"
credential MAY have property "expirationDate"

At Risk

Reason ⇒
Statement
At least 2 passing implementations
MUST successfully issue a credential.
Request body MUST have property "credential".
credential MUST have property "@context".
credential "@context" MUST be an array.
credential "@context" items MUST be strings.
credential MUST have property "type"
"credential.type" MUST be an array.
"credential.type" items MUST be strings
credential MUST have property "issuer"
"credential.issuer" MUST be a string or an object
credential MUST have property "credentialSubject"
"credential.credentialSubject" MUST be an object
credential MAY have property "issuanceDate"
credential MAY have property "expirationDate"