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

Conformance Testing Results

Tests passed 134/157 85%

Tests failed 23/157 15%

Failures 23

Tests skipped 11

Total tests 168

These tests were run on

Key

The results of the tests are shown below:

Issue Credential - Data Integrity

Issuer ⇒
Test Name
apicatalog.com Danube Tech Digital Bazaar EWF GS1 US IDLab LearnCard Mavennet SecureKey SpruceID Trinsic
MUST successfully issue a credential.
{
                      "name": "AssertionError",
                      "message": "Expected no error, got fetch failed: expected TypeError: fetch failed { …(2) } to not exist",
                      "stack": "AssertionError: Expected no error, got fetch failed: expected TypeError: fetch failed { …(2) } to not exist\n    at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)\n    at shouldReturnResult (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:19:14)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:41:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
Request body MUST have property "credential".
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:55:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
credential MUST have property "@context".
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:65:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
credential "@context" MUST be an array.
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:75:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
credential "@context" items MUST be strings.
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:87:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
credential MUST have property "type"
{
                      "name": "AssertionError",
                      "message": "Expected status code 400 invalid input!: expected 500 to equal 400",
                      "stack": "AssertionError: Expected status code 400 invalid input!: expected 500 to equal 400\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:23)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:98:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:98:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
"credential.type" MUST be an array.
{
                      "name": "AssertionError",
                      "message": "Expected status code 400 invalid input!: expected 500 to equal 400",
                      "stack": "AssertionError: Expected status code 400 invalid input!: expected 500 to equal 400\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:23)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:108:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:108:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
"credential.type" items MUST be strings
{
                      "name": "AssertionError",
                      "message": "Expected status code 400 invalid input!: expected 500 to equal 400",
                      "stack": "AssertionError: Expected status code 400 invalid input!: expected 500 to equal 400\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:23)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:120:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:120:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
credential MUST have property "issuer"
{
                      "name": "AssertionError",
                      "message": "Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'access-control-allow-origin': '*', 'alt-svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***', 'cache-control': 'no-cache, no-store, must-revalidate', 'content-length': '748', 'content-type': 'application/json; charset=utf-8', date: 'Sun, 16 Jun 2024 05:09:17 GMT', etag: 'W/\"2ec-d3QtEZFCKPdQZzIm6CzQbn13VSw\"', expires: '0', pragma: 'no-cache', server: 'Google Frontend', vary: 'X-HTTP-Method-Override, Accept-Encoding', via: '1.1 google', 'x-cloud-trace-context': 'df0fb8cf609c8934a6dd945f13add34f' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist",
                      "stack": "AssertionError: Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'access-control-allow-origin': '*', 'alt-svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***', 'cache-control': 'no-cache, no-store, must-revalidate', 'content-length': '748', 'content-type': 'application/json; charset=utf-8', date: 'Sun, 16 Jun 2024 05:09:17 GMT', etag: 'W/\"2ec-d3QtEZFCKPdQZzIm6CzQbn13VSw\"', expires: '0', pragma: 'no-cache', server: 'Google Frontend', vary: 'X-HTTP-Method-Override, Accept-Encoding', via: '1.1 google', 'x-cloud-trace-context': 'df0fb8cf609c8934a6dd945f13add34f' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist\n    at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:9:14)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:131:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:131:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
"credential.issuer" MUST be a string or an object
{
                      "name": "AssertionError",
                      "message": "Expected status code 400 invalid input!: expected 500 to equal 400",
                      "stack": "AssertionError: Expected status code 400 invalid input!: expected 500 to equal 400\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:23)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:143:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'access-control-allow-origin': '*', 'alt-svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***', 'cache-control': 'no-cache, no-store, must-revalidate', 'content-length': '755', 'content-type': 'application/json; charset=utf-8', date: 'Sun, 16 Jun 2024 05:09:17 GMT', etag: 'W/\"2f3-DYajjGuI9PPysMSA+aFxkUMlEY0\"', expires: '0', pragma: 'no-cache', server: 'Google Frontend', vary: 'X-HTTP-Method-Override, Accept-Encoding', via: '1.1 google', 'x-cloud-trace-context': 'b8b8c3c1ee830daa770a77f1464fcfba' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist",
                      "stack": "AssertionError: Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'access-control-allow-origin': '*', 'alt-svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***', 'cache-control': 'no-cache, no-store, must-revalidate', 'content-length': '755', 'content-type': 'application/json; charset=utf-8', date: 'Sun, 16 Jun 2024 05:09:17 GMT', etag: 'W/\"2f3-DYajjGuI9PPysMSA+aFxkUMlEY0\"', expires: '0', pragma: 'no-cache', server: 'Google Frontend', vary: 'X-HTTP-Method-Override, Accept-Encoding', via: '1.1 google', 'x-cloud-trace-context': 'b8b8c3c1ee830daa770a77f1464fcfba' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist\n    at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:9:14)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:143:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'access-control-allow-origin': '*', 'access-control-expose-headers': 'Content-Disposition', authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***', connection: 'keep-alive', 'content-length': '620', 'content-security-policy': \"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests\", 'content-type': 'application/json; charset=utf-8', 'cross-origin-opener-policy': 'same-origin', 'cross-origin-resource-policy': 'same-origin', date: 'Sun, 16 Jun 2024 05:09:31 GMT', etag: 'W/\"26c-xlktKy4MjZNx7gYRCWZTqaJj+Xk\"', 'origin-agent-cluster': '?1', 'referrer-policy': 'no-referrer', 'strict-transport-security': 'max-age=15552000; includeSubDomains', 'x-content-type-options': 'nosniff', 'x-dns-prefetch-control': 'off', 'x-download-options': 'noopen', 'x-frame-options': 'SAMEORIGIN', 'x-permitted-cross-domain-policies': 'none', 'x-xss-protection': '0' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist",
                      "stack": "AssertionError: Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { 'access-control-allow-origin': '*', 'access-control-expose-headers': 'Content-Disposition', authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***', connection: 'keep-alive', 'content-length': '620', 'content-security-policy': \"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests\", 'content-type': 'application/json; charset=utf-8', 'cross-origin-opener-policy': 'same-origin', 'cross-origin-resource-policy': 'same-origin', date: 'Sun, 16 Jun 2024 05:09:31 GMT', etag: 'W/\"26c-xlktKy4MjZNx7gYRCWZTqaJj+Xk\"', 'origin-agent-cluster': '?1', 'referrer-policy': 'no-referrer', 'strict-transport-security': 'max-age=15552000; includeSubDomains', 'x-content-type-options': 'nosniff', 'x-dns-prefetch-control': 'off', 'x-download-options': 'noopen', 'x-frame-options': 'SAMEORIGIN', 'x-permitted-cross-domain-policies': 'none', 'x-xss-protection': '0' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist\n    at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:9:14)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:143:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:143:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
credential MUST have property "credentialSubject"
{
                      "name": "AssertionError",
                      "message": "Expected status code 400 invalid input!: expected 500 to equal 400",
                      "stack": "AssertionError: Expected status code 400 invalid input!: expected 500 to equal 400\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:23)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:154:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:154:9)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
"credential.credentialSubject" MUST be an object
{
                      "name": "AssertionError",
                      "message": "Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***', 'content-length': '681', 'content-type': 'application/ld+json', date: 'Sun, 16 Jun 2024 05:09:11 GMT', server: 'Google Frontend', 'x-cloud-trace-context': 'e16bb6019f37663bf0effe5171e1a426' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist",
                      "stack": "AssertionError: Expected no result from issuer.: expected Response { status: 201, statusText: 'Created', headers: Headers { authorization: '** SANITIZED TO PREVENT EXPOSING OF SECRETS ***', 'content-length': '681', 'content-type': 'application/ld+json', date: 'Sun, 16 Jun 2024 05:09:11 GMT', server: 'Google Frontend', 'x-cloud-trace-context': 'e16bb6019f37663bf0effe5171e1a426' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'default', url: '' } to not exist\n    at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:9:14)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:168:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected status code 400 invalid input!: expected 500 to equal 400",
                      "stack": "AssertionError: Expected status code 400 invalid input!: expected 500 to equal 400\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:14:23)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:168:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
{
                      "name": "AssertionError",
                      "message": "Expected an HTTP error response code.: expected undefined to exist",
                      "stack": "AssertionError: Expected an HTTP error response code.: expected undefined to exist\n    at should.exist (node_modules/chai/lib/chai/interface/should.js:144:34)\n    at shouldThrowInvalidInput (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:11:10)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:168:11)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
                    }
credential MAY have property "expirationDate"
{
                      "name": "AssertionError",
                      "message": "Expected no error, got fetch failed: expected TypeError: fetch failed { …(2) } to not exist",
                      "stack": "AssertionError: Expected no error, got fetch failed: expected TypeError: fetch failed { …(2) } to not exist\n    at should.not.exist (node_modules/chai/lib/chai/interface/should.js:208:38)\n    at shouldReturnResult (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/assertions.js:19:14)\n    at Context. (file:///home/runner/work/vc-api-issuer-test-suite/vc-api-issuer-test-suite/tests/10-issuer.js:193:9)\n    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"