Postman + Newman tests for the DummyJSON e-commerce API: auth (JWT login, current user, refresh) and products. Built from `context/test-case-matrix.md`; each request's description names its Case ID and rule. Run with `scripts/run-newman.sh main|data|defects`. Credentials are passed at run time and never stored here.
| Summary Item | Total | Failed |
|---|---|---|
| Requests | 49 | 0 |
| Prerequest Scripts | 49 | 0 |
| Test Scripts | 92 | 0 |
| Assertions | 219 | 0 |
| Skipped Tests | 0 | - |
**TC-post-auth-login-happy-valid-credentials** · RULE-auth-login-returns-token-pair
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| login body matches the schema (identity + two JWTs) | 1 | 0 | 0 |
| the logged-in user is the configured test user | 1 | 0 | 0 |
| access and refresh tokens are different | 1 | 0 | 0 |
| Total | 6 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-login-boundary-expires-in-mins-honoured** · RULE-auth-expiry-configurable
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| access token lives exactly 5 minutes (exp - iat = 300 s) | 1 | 0 | 0 |
| token claims name the logged-in user | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-login-negative-wrong-password** · RULE-auth-bad-credentials-generic-error
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| message is "Invalid credentials" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-login-negative-unknown-user-same-message** · RULE-auth-bad-credentials-generic-error
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| message is "Invalid credentials" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-login-negative-missing-credentials** · RULE-auth-login-requires-credentials
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| message is "Username and password required" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-login-negative-malformed-json** · RULE-auth-login-rejects-malformed-json
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| a non-empty error message is returned | 1 | 0 | 0 |
| no tokens are issued | 1 | 0 | 0 |
| Total | 6 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-auth-me-happy-valid-bearer** · RULE-auth-bearer-required-on-auth-routes
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| identity fields are present and typed | 1 | 0 | 0 |
| the token belongs to the test user | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-auth-me-auth-authz-missing-token** · RULE-auth-bearer-required-on-auth-routes
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 401 | 1 | 0 | 0 |
| message is "Access Token is required" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-refresh-happy-new-pair** · RULE-auth-refresh-issues-new-pair
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| body is exactly the two new tokens | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-auth-me-happy-refreshed-token-works** · RULE-auth-refresh-issues-new-pair
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| the refreshed token still identifies the test user | 1 | 0 | 0 |
| the refreshed access token is a new token | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-refresh-negative-invalid-token** · RULE-auth-refresh-token-required
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 403 | 1 | 0 | 0 |
| message is "Invalid refresh token" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-refresh-negative-missing-token** · RULE-auth-refresh-token-required
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 401 | 1 | 0 | 0 |
| message is "Refresh token required" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-happy-default-first-page** · RULE-products-default-page-30
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| list matches the ProductList schema | 1 | 0 | 0 |
| 30 products, skip 0, limit 30 | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-happy-limit-skip-window** · RULE-products-limit-skip-paginate
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| returns products 11 to 15, in order | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-boundary-limit-zero-all-valid** · RULE-products-limit-skip-paginate
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| item count equals the catalogue total | 1 | 0 | 0 |
| every product matches the Product schema | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-boundary-skip-beyond-total** · RULE-products-limit-skip-paginate
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| no products, total unchanged | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-negative-invalid-limit** · RULE-products-invalid-paging-rejected
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| message is "Invalid 'limit' - should be a positive number" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-negative-negative-skip** · RULE-products-invalid-paging-rejected
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| message is "Invalid 'skip' - should be a positive number" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-happy-select-fields** · RULE-products-select-fields
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| each product has exactly id, title and price | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-happy-sort-by-price-desc** · RULE-products-sort-by-order
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| prices never increase across the whole catalogue | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-negative-invalid-sort-order** · RULE-products-sort-by-order
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| message is "Invalid 'order' - should be either 'asc' or 'desc'" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-negative-invalid-modified-date** · RULE-products-modified-date-filter
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| message is "Invalid 'modifiedAfter' - should be a valid ISO 8601 date, e.g. 2025-01-01T00:00:00Z" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-boundary-delay-above-max** · RULE-products-delay-max-5000
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 400 | 1 | 0 | 0 |
| message is "Delay should be less than 5 seconds (5000 milliseconds)" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-id-happy-existing-id** · Endpoint inventory: GET /products/{id}
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| it is product 1 | 1 | 0 | 0 |
| it matches the Product schema | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-id-negative-unknown-id** · RULE-products-unknown-id-not-found
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 404 | 1 | 0 | 0 |
| message is "Product with id '99999' not found" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-id-negative-non-numeric-id** · RULE-products-unknown-id-not-found
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 404 | 1 | 0 | 0 |
| message is "Product with id 'abc' not found" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-search-happy-results-match-term** · RULE-products-search-title-description
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| results match the ProductList schema | 1 | 0 | 0 |
| there are results | 1 | 0 | 0 |
| every result mentions "phone" in its title or description | 1 | 0 | 0 |
| Total | 6 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-search-happy-case-insensitive** · RULE-products-search-title-description
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| PHONE finds as many products as phone | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-search-negative-no-match** · RULE-products-search-title-description
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| no products and a total of 0 | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-categories-contract-schema-list** · RULE-products-categories-lists-agree
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| each category is {slug, name, url} | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-category-list-contract-schema-agrees** · RULE-products-categories-lists-agree
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| same slugs, in the same order, as /products/categories | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-category-slug-happy-filter** · RULE-products-category-filter
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| there are smartphones | 1 | 0 | 0 |
| every product is in the smartphones category | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-products-category-slug-negative-unknown** · RULE-products-category-filter
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| no products and a total of 0 | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-products-add-happy-echoes-with-new-id** · RULE-products-writes-simulated
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 2 | 0 | 0 |
| [shared] body is JSON | 2 | 0 | 0 |
| status is 201 | 2 | 0 | 0 |
| it gets a new integer id | 2 | 0 | 0 |
| the new id is the product total + 1 | 2 | 0 | 0 |
| every field sent is echoed back | 2 | 0 | 0 |
| Total | 12 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-products-add-happy-not-persisted** · RULE-products-writes-simulated
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 404 | 1 | 0 | 0 |
| reading it back says not found (writes are simulated) | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-put-products-id-happy-applies-change-keeps-rest** · RULE-products-writes-simulated
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 2 | 0 | 0 |
| [shared] body is JSON | 2 | 0 | 0 |
| status is 200 | 2 | 0 | 0 |
| the new title is returned | 2 | 0 | 0 |
| fields not sent keep their values | 2 | 0 | 0 |
| Total | 10 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-patch-products-id-happy-change-returned** · RULE-products-writes-simulated
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 2 | 0 | 0 |
| [shared] body is JSON | 2 | 0 | 0 |
| status is 200 | 2 | 0 | 0 |
| the new price is returned | 2 | 0 | 0 |
| Total | 8 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-patch-products-id-happy-not-persisted** · RULE-products-writes-simulated
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| the price is still the original, not the patched 1.23 | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-delete-products-id-happy-delete-marker** · RULE-products-writes-simulated
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| it is product 1, marked as deleted | 1 | 0 | 0 |
| deletedOn is an ISO 8601 time | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-put-products-id-negative-unknown-id** · RULE-products-unknown-id-not-found
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 404 | 1 | 0 | 0 |
| message is "Product with id '99999' not found" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-setup-protected-login** · RULE-auth-login-returns-token-pair
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| login body matches the schema | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-auth-products-auth-authz-no-token** · RULE-auth-bearer-required-on-auth-routes
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 401 | 1 | 0 | 0 |
| message is "Access Token is required" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-get-auth-products-happy-with-token** · RULE-auth-bearer-required-on-auth-routes
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 200 | 1 | 0 | 0 |
| 3 products are returned | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-products-add-happy-with-token** · RULE-auth-bearer-required-on-auth-routes
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| status is 201 | 1 | 0 | 0 |
| the title is echoed | 1 | 0 | 0 |
| Total | 4 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-post-auth-products-add-auth-authz-no-token** · RULE-auth-bearer-required-on-auth-routes
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 401 | 1 | 0 | 0 |
| message is "Access Token is required" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|
**TC-delete-auth-products-id-auth-authz-no-token** · RULE-auth-bearer-required-on-auth-routes
| Name | Passed | Failed | Skipped |
|---|---|---|---|
| [shared] responds within 3000 ms | 1 | 0 | 0 |
| [shared] body is JSON | 1 | 0 | 0 |
| [shared] error body is exactly {"message": string} | 1 | 0 | 0 |
| status is 401 | 1 | 0 | 0 |
| message is "Access Token is required" | 1 | 0 | 0 |
| Total | 5 | 0 | 0 |
| Test Name | Assertion Error |
|---|