@msalaam/xray-qe-toolkit 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -1
- package/bin/cli.js +1 -0
- package/commands/pushTests.js +1 -1
- package/lib/testCaseBuilder.js +12 -7
- package/lib/xrayClient.js +25 -7
- package/package.json +2 -2
- package/templates/README.template.md +54 -2
- package/templates/tests.json +222 -79
package/README.md
CHANGED
|
@@ -194,12 +194,14 @@ Optionally create a Test Execution linked to the plan in a single command.
|
|
|
194
194
|
```bash
|
|
195
195
|
npx xqt push
|
|
196
196
|
npx xqt push --plan APIEE-1234
|
|
197
|
+
npx xqt push --bulk # force bulk import regardless of count
|
|
197
198
|
npx xqt push --plan APIEE-1234 --create-execution --execution-env IOP-QA
|
|
198
199
|
```
|
|
199
200
|
|
|
200
201
|
| Flag | Description |
|
|
201
202
|
|---|---|
|
|
202
203
|
| `--plan <key>` | Test Plan key (overrides `.xrayrc testPlanKey`) |
|
|
204
|
+
| `--bulk` | Force bulk Xray REST import regardless of new-test count (useful when count is below `bulkImportThreshold`) |
|
|
203
205
|
| `--create-execution` | Create a Test Execution linked to the Test Plan after pushing |
|
|
204
206
|
| `--execution-env <label>` | Environment label for the created execution (e.g. `IOP-QA`) |
|
|
205
207
|
| `--execution-summary <text>` | Custom summary for the created execution |
|
|
@@ -791,7 +793,22 @@ test.info().annotations.push({ type: 'xray', description: 'APIEE-1234' });
|
|
|
791
793
|
**Validate fails in CI**
|
|
792
794
|
Fix schema errors before pushing. Common causes: missing `testId`, invalid `priority`, malformed `folder` path (must start with `/`).
|
|
793
795
|
|
|
794
|
-
|
|
796
|
+
**`xqt push` — Test Repository folder errors**
|
|
797
|
+
```
|
|
798
|
+
GraphQL errors: User doesn't have permissions to view/edit test repository for project
|
|
799
|
+
```
|
|
800
|
+
The JIRA user in `JIRA_EMAIL` needs **Test Repository** write access in Xray. Fix in Jira:
|
|
801
|
+
> **Project Settings → Xray → Test Repository** → add your role or user to the allowed list.
|
|
802
|
+
Folder sync errors are non-fatal — tests are still created/updated correctly.
|
|
803
|
+
|
|
804
|
+
**Test Set creation returns HTTP 400**
|
|
805
|
+
Ensure the Xray **Test Set** issue type exists in your JIRA project and that the user has permission to create it.
|
|
806
|
+
> **Project Settings → Issue Types** — "Test Set" must be present.
|
|
807
|
+
|
|
808
|
+
**`updateTestType` "not found" on new tests**
|
|
809
|
+
Xray Cloud is eventually consistent — a newly created issue may not be immediately visible to the GraphQL API. `xqt push` automatically retries with backoff. If failures persist, rerun `xqt push` (existing tests update, not duplicate).
|
|
810
|
+
|
|
811
|
+
|
|
795
812
|
All previous multi-word commands (`push-tests`, `pull-tests`, `create-plan`, `create-execution`, `import-results`, `sync-folders`, `gen-pipeline`, `mcp-server`) remain valid as aliases.
|
|
796
813
|
|
|
797
814
|
**EU region**
|
package/bin/cli.js
CHANGED
|
@@ -67,6 +67,7 @@ program
|
|
|
67
67
|
"Create/update tests in Xray Cloud, sync to Test Plan, sync folder structure"
|
|
68
68
|
)
|
|
69
69
|
.option("--plan <key>", "Test Plan key (overrides .xrayrc testPlanKey)")
|
|
70
|
+
.option("--bulk", "Force bulk Xray REST import regardless of new-test count")
|
|
70
71
|
.option("--create-execution", "Create a Test Execution linked to the Test Plan after pushing")
|
|
71
72
|
.option("--execution-env <label>", "Environment label for created execution (e.g. IOP-QA)")
|
|
72
73
|
.option("--execution-summary <text>", "Custom summary for created execution")
|
package/commands/pushTests.js
CHANGED
|
@@ -84,7 +84,7 @@ export default async function pushTests(opts = {}) {
|
|
|
84
84
|
|
|
85
85
|
// ── Build & push tests ─────────────────────────────────────────────────────
|
|
86
86
|
logger.send("Pushing tests to Xray...");
|
|
87
|
-
const result = await buildAndPush(cfg, tests, mapping, xrayToken);
|
|
87
|
+
const result = await buildAndPush(cfg, tests, mapping, xrayToken, { forceBulk: !!opts.bulk });
|
|
88
88
|
|
|
89
89
|
logger.blank();
|
|
90
90
|
logger.success(
|
package/lib/testCaseBuilder.js
CHANGED
|
@@ -77,7 +77,7 @@ export function saveMapping(mappingPath, mapping) {
|
|
|
77
77
|
* @param {string} xrayToken JWT token (pass to avoid re-authenticating)
|
|
78
78
|
* @returns {Promise<{created: string[], updated: string[], failed: string[]}>}
|
|
79
79
|
*/
|
|
80
|
-
export async function buildAndPush(cfg, tests, mapping, xrayToken) {
|
|
80
|
+
export async function buildAndPush(cfg, tests, mapping, xrayToken, opts = {}) {
|
|
81
81
|
const created = [];
|
|
82
82
|
const updated = [];
|
|
83
83
|
const failed = [];
|
|
@@ -85,9 +85,12 @@ export async function buildAndPush(cfg, tests, mapping, xrayToken) {
|
|
|
85
85
|
const toCreate = tests.filter((t) => !mapping[t.test_id]);
|
|
86
86
|
const toUpdate = tests.filter((t) => mapping[t.test_id]);
|
|
87
87
|
|
|
88
|
+
const threshold = cfg.bulkImportThreshold ?? 50;
|
|
89
|
+
const useBulk = opts.forceBulk ? toCreate.length > 0 : toCreate.length >= threshold;
|
|
90
|
+
|
|
88
91
|
// ── Bulk create path ───────────────────────────────────────────────────────
|
|
89
|
-
if (
|
|
90
|
-
logger.send(`Bulk creating ${toCreate.length} new test(s) via Xray REST...`);
|
|
92
|
+
if (useBulk) {
|
|
93
|
+
logger.send(`Bulk creating ${toCreate.length} new test(s) via Xray REST${opts.forceBulk ? " (--bulk)" : ""}...`);
|
|
91
94
|
|
|
92
95
|
const bulkPayload = toCreate.map((test) => {
|
|
93
96
|
const testType = test.xray?.testType || "Generic";
|
|
@@ -266,7 +269,9 @@ async function pushSingleTest(cfg, xrayToken, test, mapping, successList, failed
|
|
|
266
269
|
await updateTestDefinition(cfg, xrayToken, issue.id, test.xray.definition);
|
|
267
270
|
}
|
|
268
271
|
},
|
|
269
|
-
|
|
272
|
+
// Xray is eventually consistent: new issues take a moment to be indexed.
|
|
273
|
+
// Retry on both the "not found" timing error and the legacy "issueId" error.
|
|
274
|
+
{ retryOn: ["not found", "issueId provided is not valid"], baseDelay: 1500 }
|
|
270
275
|
);
|
|
271
276
|
|
|
272
277
|
if (testType === "Manual" && test.xray.steps) {
|
|
@@ -301,7 +306,7 @@ async function pushSingleTest(cfg, xrayToken, test, mapping, successList, failed
|
|
|
301
306
|
const detail = err.response?.data ? JSON.stringify(err.response.data) : err.message;
|
|
302
307
|
logger.stepFail(`Failed: ${detail}`);
|
|
303
308
|
logger.blank();
|
|
304
|
-
failedList.push(test.test_id);
|
|
309
|
+
failedList.push({ testId: test.test_id, reason: detail });
|
|
305
310
|
}
|
|
306
311
|
}
|
|
307
312
|
|
|
@@ -535,13 +540,13 @@ export async function syncFolders(cfg, xrayToken, projectId, tests, mapping) {
|
|
|
535
540
|
await addTestsToFolder(cfg, xrayToken, projectId, folderPath, testIds);
|
|
536
541
|
synced += testIds.length;
|
|
537
542
|
|
|
538
|
-
logger.step(`${folderPath} — ${testIds.length} test(s)
|
|
543
|
+
logger.step(`${folderPath} — ${testIds.length} test(s)`);
|
|
539
544
|
} catch (err) {
|
|
540
545
|
logger.warn(`Failed to sync folder ${folderPath}: ${err.message}`);
|
|
541
546
|
}
|
|
542
547
|
}
|
|
543
548
|
|
|
544
|
-
return {
|
|
549
|
+
return { created: createdFolders.length, assigned: synced };
|
|
545
550
|
}
|
|
546
551
|
|
|
547
552
|
|
package/lib/xrayClient.js
CHANGED
|
@@ -150,11 +150,25 @@ export async function getIssue(cfg, issueKey) {
|
|
|
150
150
|
* @returns {Promise<object>} data object
|
|
151
151
|
*/
|
|
152
152
|
async function graphql(cfg, xrayToken, query, variables = {}) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
153
|
+
let response;
|
|
154
|
+
try {
|
|
155
|
+
response = await axios.post(
|
|
156
|
+
cfg.xrayGraphqlUrl,
|
|
157
|
+
{ query, variables },
|
|
158
|
+
{ httpsAgent, headers: xrayHeaders(xrayToken) }
|
|
159
|
+
);
|
|
160
|
+
} catch (err) {
|
|
161
|
+
// Extract the actual response body from axios HTTP errors (4xx/5xx)
|
|
162
|
+
if (err.response) {
|
|
163
|
+
const body = err.response.data
|
|
164
|
+
? (typeof err.response.data === "string"
|
|
165
|
+
? err.response.data
|
|
166
|
+
: JSON.stringify(err.response.data))
|
|
167
|
+
: "(no body)";
|
|
168
|
+
throw new Error(`HTTP ${err.response.status} from Xray GraphQL: ${body}`);
|
|
169
|
+
}
|
|
170
|
+
throw err;
|
|
171
|
+
}
|
|
158
172
|
|
|
159
173
|
if (response.data.errors) {
|
|
160
174
|
throw new Error(`GraphQL errors: ${JSON.stringify(response.data.errors)}`);
|
|
@@ -1059,7 +1073,10 @@ export async function getAttachment(cfg, xrayToken, attachmentId) {
|
|
|
1059
1073
|
export async function withRetry(fn, opts = {}) {
|
|
1060
1074
|
const maxRetries = opts.maxRetries ?? 5;
|
|
1061
1075
|
const baseDelay = opts.baseDelay ?? 2000;
|
|
1062
|
-
|
|
1076
|
+
// retryOn accepts a string or array of strings — retry if the error matches any
|
|
1077
|
+
const retryPatterns = Array.isArray(opts.retryOn)
|
|
1078
|
+
? opts.retryOn
|
|
1079
|
+
: [opts.retryOn ?? "issueId provided is not valid"];
|
|
1063
1080
|
|
|
1064
1081
|
let lastError;
|
|
1065
1082
|
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
@@ -1068,7 +1085,8 @@ export async function withRetry(fn, opts = {}) {
|
|
|
1068
1085
|
} catch (err) {
|
|
1069
1086
|
lastError = err;
|
|
1070
1087
|
const msg = err.message || "";
|
|
1071
|
-
|
|
1088
|
+
const shouldRetry = retryPatterns.some((p) => msg.includes(p));
|
|
1089
|
+
if (!shouldRetry) {
|
|
1072
1090
|
if (msg.includes("disallowed to impersonate") || msg.includes("no valid active user exists")) {
|
|
1073
1091
|
throw new Error(
|
|
1074
1092
|
`Xray user authentication mismatch.\n\n` +
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@msalaam/xray-qe-toolkit",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"description": "QE toolkit for Xray Cloud — test management, tests.json standardisation, Playwright result import, and CI pipeline integration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"license": "UNLICENSED",
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
33
|
-
"@msalaam/xray-qe-toolkit": "^1.
|
|
33
|
+
"@msalaam/xray-qe-toolkit": "^1.6.0",
|
|
34
34
|
"axios": "^1.13.4",
|
|
35
35
|
"commander": "^13.1.0",
|
|
36
36
|
"dotenv": "^17.2.3",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
10. [CI/CD Integration](#10-cicd-integration)
|
|
22
22
|
11. [xray-mapping.json](#11-xray-mappingjson)
|
|
23
23
|
12. [Configuration (.xrayrc)](#12-configuration-xrayrc)
|
|
24
|
+
13. [Troubleshooting](#13-troubleshooting)
|
|
24
25
|
|
|
25
26
|
> **This file covers the xqt toolkit commands and Xray configuration.**
|
|
26
27
|
> For the full QE process — spec-driven workflow, greenfield/brownfield steps, AI agent
|
|
@@ -219,14 +220,15 @@ npx xqt create-plan --summary "Sprint 12 Smoke Tests" --version "2024.12"
|
|
|
219
220
|
|
|
220
221
|
Create or update tests in Xray Cloud, then sync the Test Plan membership and folder structure.
|
|
221
222
|
|
|
222
|
-
- New tests are **bulk-imported** via the Xray REST API when there are ≥ `bulkImportThreshold` (default: 50) to create — significantly faster for large suites
|
|
223
|
+
- New tests are **bulk-imported** via the Xray REST API when there are ≥ `bulkImportThreshold` (default: 50) to create — significantly faster for large suites. Force it at any count with `--bulk`
|
|
223
224
|
- Test Plan membership is **bi-directionally synced**: new tests are added and tests removed from `tests.json` are removed from the plan
|
|
224
225
|
- Test Sets are **deduplicated by name** — safe to run on a fresh clone, existing sets are found in JIRA before creating new ones
|
|
225
226
|
- `preconditions` are linked after every create or update
|
|
226
227
|
|
|
227
228
|
```bash
|
|
228
229
|
npx xqt push
|
|
229
|
-
npx xqt push --plan APIEE-1234
|
|
230
|
+
npx xqt push --plan APIEE-1234 # override plan key
|
|
231
|
+
npx xqt push --bulk # force bulk REST import regardless of test count
|
|
230
232
|
npx xqt push --verbose
|
|
231
233
|
```
|
|
232
234
|
|
|
@@ -624,4 +626,54 @@ You can also set `XRAY_REGION=eu` in `.env`.
|
|
|
624
626
|
|
|
625
627
|
---
|
|
626
628
|
|
|
629
|
+
## 13. Troubleshooting
|
|
630
|
+
|
|
631
|
+
**Missing credentials**
|
|
632
|
+
```
|
|
633
|
+
Error: Missing required config: xrayId, xraySecret
|
|
634
|
+
```
|
|
635
|
+
Ensure `.env` exists and all required fields are populated. Copy from `.env.example`.
|
|
636
|
+
|
|
637
|
+
**Test not found in mapping after push**
|
|
638
|
+
```bash
|
|
639
|
+
npx xqt status
|
|
640
|
+
npx xqt push --verbose
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
**Test Set creation returns HTTP 400**
|
|
644
|
+
Ensure the **Test Set** issue type exists in your JIRA project and the user can create it.
|
|
645
|
+
> **Project Settings → Issue Types** — "Test Set" must appear in the list.
|
|
646
|
+
|
|
647
|
+
**Folder sync — permission error**
|
|
648
|
+
```
|
|
649
|
+
User doesn't have permissions to view/edit test repository for project
|
|
650
|
+
```
|
|
651
|
+
The `JIRA_EMAIL` user needs **Test Repository** write access in Xray.
|
|
652
|
+
> **Project Settings → Xray → Test Repository** → add your role or user.
|
|
653
|
+
Folder errors are non-fatal — tests are still created/updated correctly without folder assignment.
|
|
654
|
+
|
|
655
|
+
**`updateTestType` "not found" on newly created tests**
|
|
656
|
+
Xray Cloud is eventually consistent. `xqt push` retries automatically with backoff. If a test still fails, rerun `xqt push` — it will update the existing test rather than duplicate it.
|
|
657
|
+
|
|
658
|
+
**Too many tests for serial mode (slow push)**
|
|
659
|
+
```bash
|
|
660
|
+
npx xqt push --bulk # force REST bulk import regardless of count
|
|
661
|
+
# or lower the threshold in .xrayrc:
|
|
662
|
+
{ "bulkImportThreshold": 10 }
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
**Import results — 0 tests matched**
|
|
666
|
+
Playwright tests must be annotated with an Xray key:
|
|
667
|
+
```typescript
|
|
668
|
+
test.info().annotations.push({ type: 'xray', description: 'APIEE-1234' });
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
**"disallowed to impersonate" error**
|
|
672
|
+
`JIRA_EMAIL` must match the email of the user who created the Xray API Key.
|
|
673
|
+
|
|
674
|
+
**EU / AU region**
|
|
675
|
+
Set `XRAY_REGION=eu` or `XRAY_REGION=au` in `.env`, or `"xrayRegion": "eu"` in `.xrayrc`.
|
|
676
|
+
|
|
677
|
+
---
|
|
678
|
+
|
|
627
679
|
*Generated by @msalaam/xray-qe-toolkit — See [npm package](https://www.npmjs.com/package/@msalaam/xray-qe-toolkit) for updates.*
|
package/templates/tests.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
{
|
|
2
2
|
"testPlan": {
|
|
3
3
|
"summary": "AML Verification V2 – Dual-Track Test Suite",
|
|
4
4
|
"description": "Contract and business-rule tests for party-aml-verification-verify-api v2. Three endpoints: POST /person, POST /entity, GET /healthcheck. Business-rule tests cover the 5-tier data-source routing chain (CACHE → DHA-MASTER → CPB → DHA-NPR → DHA-HANIS) plus validation scenarios. Contract tests cover schema, status code, auth, and header validation per openapi.json."
|
|
@@ -26,7 +26,10 @@
|
|
|
26
26
|
"smoke"
|
|
27
27
|
],
|
|
28
28
|
"folder": "/Person Tests/Scenario Tests/Cache",
|
|
29
|
-
"testSet":
|
|
29
|
+
"testSet": [
|
|
30
|
+
"Person Tests",
|
|
31
|
+
"Smoke Tests"
|
|
32
|
+
],
|
|
30
33
|
"requirementKeys": [],
|
|
31
34
|
"displayName": "TC-01 | Cache – Deceased, Surname Pass",
|
|
32
35
|
"xray": {
|
|
@@ -162,7 +165,8 @@
|
|
|
162
165
|
"CACHE_DEAD_FIRST_NAME"
|
|
163
166
|
]
|
|
164
167
|
}
|
|
165
|
-
}
|
|
168
|
+
},
|
|
169
|
+
"preconditions": []
|
|
166
170
|
},
|
|
167
171
|
{
|
|
168
172
|
"test_id": "TC-AMLVER-02",
|
|
@@ -311,7 +315,8 @@
|
|
|
311
315
|
"CACHE_DEAD_FIRST_NAME"
|
|
312
316
|
]
|
|
313
317
|
}
|
|
314
|
-
}
|
|
318
|
+
},
|
|
319
|
+
"preconditions": []
|
|
315
320
|
},
|
|
316
321
|
{
|
|
317
322
|
"test_id": "TC-AMLVER-03",
|
|
@@ -322,7 +327,10 @@
|
|
|
322
327
|
"smoke"
|
|
323
328
|
],
|
|
324
329
|
"folder": "/Person Tests/Scenario Tests/Cache",
|
|
325
|
-
"testSet":
|
|
330
|
+
"testSet": [
|
|
331
|
+
"Person Tests",
|
|
332
|
+
"Smoke Tests"
|
|
333
|
+
],
|
|
326
334
|
"requirementKeys": [],
|
|
327
335
|
"displayName": "TC-03 | Cache – Alive, Surname Pass",
|
|
328
336
|
"planReason": "Request shape and test data derived from validCurl pipeline input — proven to return HTTP 200 in the target environment. IdentityNumber=9612235153080, FirstName=Muhammad, LastName=Salaam.",
|
|
@@ -463,7 +471,8 @@
|
|
|
463
471
|
"FIRST_NAME"
|
|
464
472
|
]
|
|
465
473
|
}
|
|
466
|
-
}
|
|
474
|
+
},
|
|
475
|
+
"preconditions": []
|
|
467
476
|
},
|
|
468
477
|
{
|
|
469
478
|
"test_id": "TC-AMLVER-04",
|
|
@@ -600,7 +609,8 @@
|
|
|
600
609
|
"FIRST_NAME"
|
|
601
610
|
]
|
|
602
611
|
}
|
|
603
|
-
}
|
|
612
|
+
},
|
|
613
|
+
"preconditions": []
|
|
604
614
|
},
|
|
605
615
|
{
|
|
606
616
|
"test_id": "TC-AMLVER-05",
|
|
@@ -747,7 +757,8 @@
|
|
|
747
757
|
"DHA_MASTER_DEAD_FIRST_NAME"
|
|
748
758
|
]
|
|
749
759
|
}
|
|
750
|
-
}
|
|
760
|
+
},
|
|
761
|
+
"preconditions": []
|
|
751
762
|
},
|
|
752
763
|
{
|
|
753
764
|
"test_id": "TC-AMLVER-06",
|
|
@@ -897,7 +908,8 @@
|
|
|
897
908
|
"FIRST_NAME"
|
|
898
909
|
]
|
|
899
910
|
}
|
|
900
|
-
}
|
|
911
|
+
},
|
|
912
|
+
"preconditions": []
|
|
901
913
|
},
|
|
902
914
|
{
|
|
903
915
|
"test_id": "TC-AMLVER-07",
|
|
@@ -1028,7 +1040,8 @@
|
|
|
1028
1040
|
"FIRST_NAME"
|
|
1029
1041
|
]
|
|
1030
1042
|
}
|
|
1031
|
-
}
|
|
1043
|
+
},
|
|
1044
|
+
"preconditions": []
|
|
1032
1045
|
},
|
|
1033
1046
|
{
|
|
1034
1047
|
"test_id": "TC-AMLVER-08",
|
|
@@ -1158,7 +1171,8 @@
|
|
|
1158
1171
|
"CPB_SECOND_NAME"
|
|
1159
1172
|
]
|
|
1160
1173
|
}
|
|
1161
|
-
}
|
|
1174
|
+
},
|
|
1175
|
+
"preconditions": []
|
|
1162
1176
|
},
|
|
1163
1177
|
{
|
|
1164
1178
|
"test_id": "TC-AMLVER-09",
|
|
@@ -1288,7 +1302,8 @@
|
|
|
1288
1302
|
"FIRST_NAME"
|
|
1289
1303
|
]
|
|
1290
1304
|
}
|
|
1291
|
-
}
|
|
1305
|
+
},
|
|
1306
|
+
"preconditions": []
|
|
1292
1307
|
},
|
|
1293
1308
|
{
|
|
1294
1309
|
"test_id": "TC-AMLVER-10",
|
|
@@ -1416,7 +1431,8 @@
|
|
|
1416
1431
|
"FIRST_NAME"
|
|
1417
1432
|
]
|
|
1418
1433
|
}
|
|
1419
|
-
}
|
|
1434
|
+
},
|
|
1435
|
+
"preconditions": []
|
|
1420
1436
|
},
|
|
1421
1437
|
{
|
|
1422
1438
|
"test_id": "TC-AMLVER-11",
|
|
@@ -1427,7 +1443,10 @@
|
|
|
1427
1443
|
"smoke"
|
|
1428
1444
|
],
|
|
1429
1445
|
"folder": "/Person Tests/Scenario Tests/DHA-NPR",
|
|
1430
|
-
"testSet":
|
|
1446
|
+
"testSet": [
|
|
1447
|
+
"Person Tests",
|
|
1448
|
+
"Smoke Tests"
|
|
1449
|
+
],
|
|
1431
1450
|
"requirementKeys": [],
|
|
1432
1451
|
"displayName": "TC-11 | DHA-NPR – Alive, Surname Pass",
|
|
1433
1452
|
"xray": {
|
|
@@ -1553,7 +1572,8 @@
|
|
|
1553
1572
|
"FIRST_NAME"
|
|
1554
1573
|
]
|
|
1555
1574
|
}
|
|
1556
|
-
}
|
|
1575
|
+
},
|
|
1576
|
+
"preconditions": []
|
|
1557
1577
|
},
|
|
1558
1578
|
{
|
|
1559
1579
|
"test_id": "TC-AMLVER-12",
|
|
@@ -1681,7 +1701,8 @@
|
|
|
1681
1701
|
"DEAD_FIRST_NAME"
|
|
1682
1702
|
]
|
|
1683
1703
|
}
|
|
1684
|
-
}
|
|
1704
|
+
},
|
|
1705
|
+
"preconditions": []
|
|
1685
1706
|
},
|
|
1686
1707
|
{
|
|
1687
1708
|
"test_id": "TC-AMLVER-14",
|
|
@@ -1817,7 +1838,8 @@
|
|
|
1817
1838
|
"FIRST_NAME"
|
|
1818
1839
|
]
|
|
1819
1840
|
}
|
|
1820
|
-
}
|
|
1841
|
+
},
|
|
1842
|
+
"preconditions": []
|
|
1821
1843
|
},
|
|
1822
1844
|
{
|
|
1823
1845
|
"test_id": "TC-AMLVER-ERR-02",
|
|
@@ -1935,7 +1957,8 @@
|
|
|
1935
1957
|
"GRAVITEE_API_KEY"
|
|
1936
1958
|
]
|
|
1937
1959
|
}
|
|
1938
|
-
}
|
|
1960
|
+
},
|
|
1961
|
+
"preconditions": []
|
|
1939
1962
|
},
|
|
1940
1963
|
{
|
|
1941
1964
|
"test_id": "TC-AMLVER-F-01",
|
|
@@ -1946,7 +1969,10 @@
|
|
|
1946
1969
|
"smoke"
|
|
1947
1970
|
],
|
|
1948
1971
|
"folder": "/Person Tests/UseCache FALSE",
|
|
1949
|
-
"testSet":
|
|
1972
|
+
"testSet": [
|
|
1973
|
+
"Person Tests",
|
|
1974
|
+
"Smoke Tests"
|
|
1975
|
+
],
|
|
1950
1976
|
"requirementKeys": [],
|
|
1951
1977
|
"displayName": "TC-F-01 | UseCache=FALSE – Cache Bypass, DHA-NPR Called Directly",
|
|
1952
1978
|
"planReason": "Request shape and test data derived from validCurl pipeline input — proven to return HTTP 200 in the target environment. UseCache: false bypasses all caches.",
|
|
@@ -2076,7 +2102,8 @@
|
|
|
2076
2102
|
"FIRST_NAME"
|
|
2077
2103
|
]
|
|
2078
2104
|
}
|
|
2079
|
-
}
|
|
2105
|
+
},
|
|
2106
|
+
"preconditions": []
|
|
2080
2107
|
},
|
|
2081
2108
|
{
|
|
2082
2109
|
"test_id": "TC-AMLVER-F-02",
|
|
@@ -2192,7 +2219,8 @@
|
|
|
2192
2219
|
"FIRST_NAME"
|
|
2193
2220
|
]
|
|
2194
2221
|
}
|
|
2195
|
-
}
|
|
2222
|
+
},
|
|
2223
|
+
"preconditions": []
|
|
2196
2224
|
},
|
|
2197
2225
|
{
|
|
2198
2226
|
"test_id": "TC-AMLVER-ID-01",
|
|
@@ -2203,7 +2231,10 @@
|
|
|
2203
2231
|
"regression"
|
|
2204
2232
|
],
|
|
2205
2233
|
"folder": "/Person Tests/ID Validation",
|
|
2206
|
-
"testSet":
|
|
2234
|
+
"testSet": [
|
|
2235
|
+
"Person Tests",
|
|
2236
|
+
"Validation Tests"
|
|
2237
|
+
],
|
|
2207
2238
|
"requirementKeys": [],
|
|
2208
2239
|
"displayName": "TC-ID-01 | ID Validation – Valid South African ID",
|
|
2209
2240
|
"xray": {
|
|
@@ -2322,7 +2353,8 @@
|
|
|
2322
2353
|
"FIRST_NAME"
|
|
2323
2354
|
]
|
|
2324
2355
|
}
|
|
2325
|
-
}
|
|
2356
|
+
},
|
|
2357
|
+
"preconditions": []
|
|
2326
2358
|
},
|
|
2327
2359
|
{
|
|
2328
2360
|
"test_id": "TC-AMLVER-ID-02",
|
|
@@ -2333,7 +2365,10 @@
|
|
|
2333
2365
|
"regression"
|
|
2334
2366
|
],
|
|
2335
2367
|
"folder": "/Person Tests/ID Validation",
|
|
2336
|
-
"testSet":
|
|
2368
|
+
"testSet": [
|
|
2369
|
+
"Person Tests",
|
|
2370
|
+
"Validation Tests"
|
|
2371
|
+
],
|
|
2337
2372
|
"requirementKeys": [],
|
|
2338
2373
|
"displayName": "TC-ID-02 | ID Validation – Invalid ID Length",
|
|
2339
2374
|
"planReason": "Equivalence Partitioning (invalid class) — ID shorter than 13 digits is an invalid class for IdentityNumber.",
|
|
@@ -2438,7 +2473,8 @@
|
|
|
2438
2473
|
"FIRST_NAME"
|
|
2439
2474
|
]
|
|
2440
2475
|
}
|
|
2441
|
-
}
|
|
2476
|
+
},
|
|
2477
|
+
"preconditions": []
|
|
2442
2478
|
},
|
|
2443
2479
|
{
|
|
2444
2480
|
"test_id": "TC-AMLVER-ID-03",
|
|
@@ -2449,7 +2485,10 @@
|
|
|
2449
2485
|
"regression"
|
|
2450
2486
|
],
|
|
2451
2487
|
"folder": "/Person Tests/ID Validation",
|
|
2452
|
-
"testSet":
|
|
2488
|
+
"testSet": [
|
|
2489
|
+
"Person Tests",
|
|
2490
|
+
"Validation Tests"
|
|
2491
|
+
],
|
|
2453
2492
|
"requirementKeys": [],
|
|
2454
2493
|
"displayName": "TC-ID-03 | ID Validation – Invalid Luhn Checksum",
|
|
2455
2494
|
"planReason": "Error Guessing — SA ID numbers use Luhn algorithm for checksum validation. A 13-digit number with an incorrect final check digit is an invalid class per Equivalence Partitioning.",
|
|
@@ -2554,7 +2593,8 @@
|
|
|
2554
2593
|
"FIRST_NAME"
|
|
2555
2594
|
]
|
|
2556
2595
|
}
|
|
2557
|
-
}
|
|
2596
|
+
},
|
|
2597
|
+
"preconditions": []
|
|
2558
2598
|
},
|
|
2559
2599
|
{
|
|
2560
2600
|
"test_id": "TC-AMLVER-ID-04",
|
|
@@ -2565,7 +2605,10 @@
|
|
|
2565
2605
|
"regression"
|
|
2566
2606
|
],
|
|
2567
2607
|
"folder": "/Person Tests/ID Validation",
|
|
2568
|
-
"testSet":
|
|
2608
|
+
"testSet": [
|
|
2609
|
+
"Person Tests",
|
|
2610
|
+
"Validation Tests"
|
|
2611
|
+
],
|
|
2569
2612
|
"requirementKeys": [],
|
|
2570
2613
|
"displayName": "TC-ID-04 | ID Validation – Invalid Embedded Date of Birth",
|
|
2571
2614
|
"planReason": "Error Guessing — SA ID number embeds YYMMDD in positions 1-6. Month '99' is an impossible date, making the ID invalid.",
|
|
@@ -2677,7 +2720,8 @@
|
|
|
2677
2720
|
"FIRST_NAME"
|
|
2678
2721
|
]
|
|
2679
2722
|
}
|
|
2680
|
-
}
|
|
2723
|
+
},
|
|
2724
|
+
"preconditions": []
|
|
2681
2725
|
},
|
|
2682
2726
|
{
|
|
2683
2727
|
"test_id": "TC-AMLVER-IN-01",
|
|
@@ -2688,7 +2732,10 @@
|
|
|
2688
2732
|
"regression"
|
|
2689
2733
|
],
|
|
2690
2734
|
"folder": "/Person Tests/Input Validation",
|
|
2691
|
-
"testSet":
|
|
2735
|
+
"testSet": [
|
|
2736
|
+
"Person Tests",
|
|
2737
|
+
"Validation Tests"
|
|
2738
|
+
],
|
|
2692
2739
|
"requirementKeys": [],
|
|
2693
2740
|
"displayName": "TC-IN-01 | Input Validation – UseCache Field Missing",
|
|
2694
2741
|
"planReason": "Negative Testing — UseCache is a required header per OpenAPI spec. Missing it must return 400.",
|
|
@@ -2796,7 +2843,8 @@
|
|
|
2796
2843
|
"FIRST_NAME"
|
|
2797
2844
|
]
|
|
2798
2845
|
}
|
|
2799
|
-
}
|
|
2846
|
+
},
|
|
2847
|
+
"preconditions": []
|
|
2800
2848
|
},
|
|
2801
2849
|
{
|
|
2802
2850
|
"test_id": "TC-AMLVER-IN-02",
|
|
@@ -2807,7 +2855,10 @@
|
|
|
2807
2855
|
"regression"
|
|
2808
2856
|
],
|
|
2809
2857
|
"folder": "/Person Tests/Input Validation",
|
|
2810
|
-
"testSet":
|
|
2858
|
+
"testSet": [
|
|
2859
|
+
"Person Tests",
|
|
2860
|
+
"Validation Tests"
|
|
2861
|
+
],
|
|
2811
2862
|
"requirementKeys": [],
|
|
2812
2863
|
"displayName": "TC-IN-02 | Input Validation – UseCache Field Invalid Value",
|
|
2813
2864
|
"planReason": "Equivalence Partitioning (invalid class) — UseCache accepts only boolean values (true/false). Sending 'MAYBE' is outside the valid enum.",
|
|
@@ -2920,7 +2971,8 @@
|
|
|
2920
2971
|
"FIRST_NAME"
|
|
2921
2972
|
]
|
|
2922
2973
|
}
|
|
2923
|
-
}
|
|
2974
|
+
},
|
|
2975
|
+
"preconditions": []
|
|
2924
2976
|
},
|
|
2925
2977
|
{
|
|
2926
2978
|
"test_id": "TC-AMLVER-CT-POST-PERSON-200",
|
|
@@ -2931,7 +2983,11 @@
|
|
|
2931
2983
|
"smoke"
|
|
2932
2984
|
],
|
|
2933
2985
|
"folder": "/Person Tests/Contract",
|
|
2934
|
-
"testSet":
|
|
2986
|
+
"testSet": [
|
|
2987
|
+
"Person Tests",
|
|
2988
|
+
"Contract Tests",
|
|
2989
|
+
"Smoke Tests"
|
|
2990
|
+
],
|
|
2935
2991
|
"requirementKeys": [],
|
|
2936
2992
|
"displayName": "Verify Person – 200 OK contract",
|
|
2937
2993
|
"planReason": "Request shape and test data derived from validCurl pipeline input — proven to return HTTP 2xx in the target environment.",
|
|
@@ -3029,7 +3085,8 @@
|
|
|
3029
3085
|
"FIRST_NAME"
|
|
3030
3086
|
]
|
|
3031
3087
|
}
|
|
3032
|
-
}
|
|
3088
|
+
},
|
|
3089
|
+
"preconditions": []
|
|
3033
3090
|
},
|
|
3034
3091
|
{
|
|
3035
3092
|
"test_id": "TC-AMLVER-CT-POST-PERSON-4XX-NEG_BADKEY",
|
|
@@ -3040,7 +3097,10 @@
|
|
|
3040
3097
|
"regression"
|
|
3041
3098
|
],
|
|
3042
3099
|
"folder": "/Person Tests/Contract",
|
|
3043
|
-
"testSet":
|
|
3100
|
+
"testSet": [
|
|
3101
|
+
"Person Tests",
|
|
3102
|
+
"Contract Tests"
|
|
3103
|
+
],
|
|
3044
3104
|
"requirementKeys": [],
|
|
3045
3105
|
"displayName": "Verify Person – 401 Invalid Auth Key contract",
|
|
3046
3106
|
"planReason": "Security/Authentication Planning — gateway must reject invalid API keys.",
|
|
@@ -3117,7 +3177,8 @@
|
|
|
3117
3177
|
"FIRST_NAME"
|
|
3118
3178
|
]
|
|
3119
3179
|
}
|
|
3120
|
-
}
|
|
3180
|
+
},
|
|
3181
|
+
"preconditions": []
|
|
3121
3182
|
},
|
|
3122
3183
|
{
|
|
3123
3184
|
"test_id": "TC-AMLVER-E-01",
|
|
@@ -3128,7 +3189,10 @@
|
|
|
3128
3189
|
"smoke"
|
|
3129
3190
|
],
|
|
3130
3191
|
"folder": "/Entity Tests/Scenario Tests",
|
|
3131
|
-
"testSet":
|
|
3192
|
+
"testSet": [
|
|
3193
|
+
"Entity Tests",
|
|
3194
|
+
"Smoke Tests"
|
|
3195
|
+
],
|
|
3132
3196
|
"requirementKeys": [],
|
|
3133
3197
|
"displayName": "TC-E-01 | Entity Validation – All Directors Valid",
|
|
3134
3198
|
"xray": {
|
|
@@ -3262,7 +3326,8 @@
|
|
|
3262
3326
|
"REGISTRATION_NAME"
|
|
3263
3327
|
]
|
|
3264
3328
|
}
|
|
3265
|
-
}
|
|
3329
|
+
},
|
|
3330
|
+
"preconditions": []
|
|
3266
3331
|
},
|
|
3267
3332
|
{
|
|
3268
3333
|
"test_id": "TC-AMLVER-E-02",
|
|
@@ -3393,7 +3458,8 @@
|
|
|
3393
3458
|
"REGISTRATION_NAME"
|
|
3394
3459
|
]
|
|
3395
3460
|
}
|
|
3396
|
-
}
|
|
3461
|
+
},
|
|
3462
|
+
"preconditions": []
|
|
3397
3463
|
},
|
|
3398
3464
|
{
|
|
3399
3465
|
"test_id": "TC-AMLVER-E-03",
|
|
@@ -3538,7 +3604,8 @@
|
|
|
3538
3604
|
"REGISTRATION_NAME"
|
|
3539
3605
|
]
|
|
3540
3606
|
}
|
|
3541
|
-
}
|
|
3607
|
+
},
|
|
3608
|
+
"preconditions": []
|
|
3542
3609
|
},
|
|
3543
3610
|
{
|
|
3544
3611
|
"test_id": "TC-AMLVER-E-04",
|
|
@@ -3669,7 +3736,8 @@
|
|
|
3669
3736
|
"REGISTRATION_NAME"
|
|
3670
3737
|
]
|
|
3671
3738
|
}
|
|
3672
|
-
}
|
|
3739
|
+
},
|
|
3740
|
+
"preconditions": []
|
|
3673
3741
|
},
|
|
3674
3742
|
{
|
|
3675
3743
|
"test_id": "TC-AMLVER-CT-POST-ENTITY-200",
|
|
@@ -3680,7 +3748,11 @@
|
|
|
3680
3748
|
"smoke"
|
|
3681
3749
|
],
|
|
3682
3750
|
"folder": "/Entity Tests/Contract",
|
|
3683
|
-
"testSet":
|
|
3751
|
+
"testSet": [
|
|
3752
|
+
"Entity Tests",
|
|
3753
|
+
"Contract Tests",
|
|
3754
|
+
"Smoke Tests"
|
|
3755
|
+
],
|
|
3684
3756
|
"requirementKeys": [],
|
|
3685
3757
|
"displayName": "Verify Entity – 200 OK contract",
|
|
3686
3758
|
"xray": {
|
|
@@ -3770,7 +3842,8 @@
|
|
|
3770
3842
|
"REGISTRATION_NAME"
|
|
3771
3843
|
]
|
|
3772
3844
|
}
|
|
3773
|
-
}
|
|
3845
|
+
},
|
|
3846
|
+
"preconditions": []
|
|
3774
3847
|
},
|
|
3775
3848
|
{
|
|
3776
3849
|
"test_id": "TC-AMLVER-CT-POST-ENTITY-4XX-NEG_BADKEY",
|
|
@@ -3781,7 +3854,10 @@
|
|
|
3781
3854
|
"regression"
|
|
3782
3855
|
],
|
|
3783
3856
|
"folder": "/Entity Tests/Contract",
|
|
3784
|
-
"testSet":
|
|
3857
|
+
"testSet": [
|
|
3858
|
+
"Entity Tests",
|
|
3859
|
+
"Contract Tests"
|
|
3860
|
+
],
|
|
3785
3861
|
"requirementKeys": [],
|
|
3786
3862
|
"displayName": "Verify Entity – 401 Invalid Auth Key contract",
|
|
3787
3863
|
"planReason": "Security/Authentication Planning — gateway must reject invalid API keys.",
|
|
@@ -3857,7 +3933,8 @@
|
|
|
3857
3933
|
"REGISTRATION_NAME"
|
|
3858
3934
|
]
|
|
3859
3935
|
}
|
|
3860
|
-
}
|
|
3936
|
+
},
|
|
3937
|
+
"preconditions": []
|
|
3861
3938
|
},
|
|
3862
3939
|
{
|
|
3863
3940
|
"test_id": "TC-AMLVER-CT-GET-HEALTHCHECK-200",
|
|
@@ -3868,7 +3945,11 @@
|
|
|
3868
3945
|
"smoke"
|
|
3869
3946
|
],
|
|
3870
3947
|
"folder": "/Healthcheck Tests/Contract",
|
|
3871
|
-
"testSet":
|
|
3948
|
+
"testSet": [
|
|
3949
|
+
"Healthcheck Tests",
|
|
3950
|
+
"Contract Tests",
|
|
3951
|
+
"Smoke Tests"
|
|
3952
|
+
],
|
|
3872
3953
|
"requirementKeys": [],
|
|
3873
3954
|
"displayName": "Health Check – 200 OK contract",
|
|
3874
3955
|
"xray": {
|
|
@@ -3935,7 +4016,8 @@
|
|
|
3935
4016
|
"GRAVITEE_API_KEY"
|
|
3936
4017
|
]
|
|
3937
4018
|
}
|
|
3938
|
-
}
|
|
4019
|
+
},
|
|
4020
|
+
"preconditions": []
|
|
3939
4021
|
},
|
|
3940
4022
|
{
|
|
3941
4023
|
"test_id": "TC-AMLVER-CT-GET-HEALTHCHECK-4XX-NEG_AUTH",
|
|
@@ -3946,7 +4028,10 @@
|
|
|
3946
4028
|
"regression"
|
|
3947
4029
|
],
|
|
3948
4030
|
"folder": "/Healthcheck Tests/Contract",
|
|
3949
|
-
"testSet":
|
|
4031
|
+
"testSet": [
|
|
4032
|
+
"Healthcheck Tests",
|
|
4033
|
+
"Contract Tests"
|
|
4034
|
+
],
|
|
3950
4035
|
"requirementKeys": [],
|
|
3951
4036
|
"displayName": "Health Check – 401 No Auth Key contract",
|
|
3952
4037
|
"planReason": "Security/Authentication Planning — Gravitee gateway enforces x-gravitee-api-key on all routes including healthcheck.",
|
|
@@ -4011,7 +4096,8 @@
|
|
|
4011
4096
|
],
|
|
4012
4097
|
"env": []
|
|
4013
4098
|
}
|
|
4014
|
-
}
|
|
4099
|
+
},
|
|
4100
|
+
"preconditions": []
|
|
4015
4101
|
},
|
|
4016
4102
|
{
|
|
4017
4103
|
"test_id": "TC-AMLVER-CT-POST-PERSON-400-MISSING_BODY",
|
|
@@ -4022,7 +4108,10 @@
|
|
|
4022
4108
|
"regression"
|
|
4023
4109
|
],
|
|
4024
4110
|
"folder": "/Person Tests/Contract",
|
|
4025
|
-
"testSet":
|
|
4111
|
+
"testSet": [
|
|
4112
|
+
"Person Tests",
|
|
4113
|
+
"Contract Tests"
|
|
4114
|
+
],
|
|
4026
4115
|
"requirementKeys": [],
|
|
4027
4116
|
"displayName": "Verify Person – 400 Missing Required Body Fields",
|
|
4028
4117
|
"planReason": "ISTQB Negative Testing / Error Guessing: Sending an empty JSON body {} omits all required fields (IdentityNumber, LastName, FirstName); API must return 400 with ApiFailureResponse.",
|
|
@@ -4100,7 +4189,8 @@
|
|
|
4100
4189
|
"GRAVITEE_API_KEY"
|
|
4101
4190
|
]
|
|
4102
4191
|
}
|
|
4103
|
-
}
|
|
4192
|
+
},
|
|
4193
|
+
"preconditions": []
|
|
4104
4194
|
},
|
|
4105
4195
|
{
|
|
4106
4196
|
"test_id": "TC-AMLVER-CT-POST-PERSON-5XX",
|
|
@@ -4111,7 +4201,10 @@
|
|
|
4111
4201
|
"regression"
|
|
4112
4202
|
],
|
|
4113
4203
|
"folder": "/Person Tests/Contract",
|
|
4114
|
-
"testSet":
|
|
4204
|
+
"testSet": [
|
|
4205
|
+
"Person Tests",
|
|
4206
|
+
"Contract Tests"
|
|
4207
|
+
],
|
|
4115
4208
|
"requirementKeys": [],
|
|
4116
4209
|
"displayName": "Verify Person – 5XX Server Error",
|
|
4117
4210
|
"planReason": "ISTQB Error Guessing: OpenAPI documents a 5XX server-error path returning ApiFailureResponse. No deterministic fault-inducing input is known; skipped until a fault trigger is identified.",
|
|
@@ -4173,7 +4266,8 @@
|
|
|
4173
4266
|
"GRAVITEE_API_KEY"
|
|
4174
4267
|
]
|
|
4175
4268
|
}
|
|
4176
|
-
}
|
|
4269
|
+
},
|
|
4270
|
+
"preconditions": []
|
|
4177
4271
|
},
|
|
4178
4272
|
{
|
|
4179
4273
|
"test_id": "TC-AMLVER-CT-POST-ENTITY-400-MISSING_BODY",
|
|
@@ -4184,7 +4278,10 @@
|
|
|
4184
4278
|
"regression"
|
|
4185
4279
|
],
|
|
4186
4280
|
"folder": "/Entity Tests/Contract",
|
|
4187
|
-
"testSet":
|
|
4281
|
+
"testSet": [
|
|
4282
|
+
"Entity Tests",
|
|
4283
|
+
"Contract Tests"
|
|
4284
|
+
],
|
|
4188
4285
|
"requirementKeys": [],
|
|
4189
4286
|
"displayName": "Verify Entity – 400 Missing Required Body Fields",
|
|
4190
4287
|
"planReason": "ISTQB Negative Testing / Error Guessing: Sending an empty JSON body {} omits all required fields (registrationNumber, registrationName); API must return 400 with ApiFailureResponse.",
|
|
@@ -4262,7 +4359,8 @@
|
|
|
4262
4359
|
"GRAVITEE_API_KEY"
|
|
4263
4360
|
]
|
|
4264
4361
|
}
|
|
4265
|
-
}
|
|
4362
|
+
},
|
|
4363
|
+
"preconditions": []
|
|
4266
4364
|
},
|
|
4267
4365
|
{
|
|
4268
4366
|
"test_id": "TC-AMLVER-CT-POST-ENTITY-5XX",
|
|
@@ -4273,7 +4371,10 @@
|
|
|
4273
4371
|
"regression"
|
|
4274
4372
|
],
|
|
4275
4373
|
"folder": "/Entity Tests/Contract",
|
|
4276
|
-
"testSet":
|
|
4374
|
+
"testSet": [
|
|
4375
|
+
"Entity Tests",
|
|
4376
|
+
"Contract Tests"
|
|
4377
|
+
],
|
|
4277
4378
|
"requirementKeys": [],
|
|
4278
4379
|
"displayName": "Verify Entity – 5XX Server Error",
|
|
4279
4380
|
"planReason": "ISTQB Error Guessing: OpenAPI documents a 5XX server-error path returning ApiFailureResponse. No deterministic fault-inducing input is known; skipped until a fault trigger is identified.",
|
|
@@ -4335,7 +4436,8 @@
|
|
|
4335
4436
|
"GRAVITEE_API_KEY"
|
|
4336
4437
|
]
|
|
4337
4438
|
}
|
|
4338
|
-
}
|
|
4439
|
+
},
|
|
4440
|
+
"preconditions": []
|
|
4339
4441
|
},
|
|
4340
4442
|
{
|
|
4341
4443
|
"test_id": "TC-AMLVER-CT-GET-HEALTHCHECK-4XX-NEG_BADKEY",
|
|
@@ -4346,7 +4448,10 @@
|
|
|
4346
4448
|
"regression"
|
|
4347
4449
|
],
|
|
4348
4450
|
"folder": "/Healthcheck Tests/Contract",
|
|
4349
|
-
"testSet":
|
|
4451
|
+
"testSet": [
|
|
4452
|
+
"Healthcheck Tests",
|
|
4453
|
+
"Contract Tests"
|
|
4454
|
+
],
|
|
4350
4455
|
"requirementKeys": [],
|
|
4351
4456
|
"displayName": "Health Check – 401 Invalid Auth Key contract",
|
|
4352
4457
|
"planReason": "ISTQB Negative Testing: Gravitee gateway must reject requests with an invalid API key. This mirrors the NEG_BADKEY pattern applied to /person and /entity but is missing for /healthcheck.",
|
|
@@ -4411,7 +4516,8 @@
|
|
|
4411
4516
|
],
|
|
4412
4517
|
"env": []
|
|
4413
4518
|
}
|
|
4414
|
-
}
|
|
4519
|
+
},
|
|
4520
|
+
"preconditions": []
|
|
4415
4521
|
},
|
|
4416
4522
|
{
|
|
4417
4523
|
"test_id": "TC-AMLVER-PV-01",
|
|
@@ -4422,7 +4528,10 @@
|
|
|
4422
4528
|
"regression"
|
|
4423
4529
|
],
|
|
4424
4530
|
"folder": "/Person Validation Tests",
|
|
4425
|
-
"testSet":
|
|
4531
|
+
"testSet": [
|
|
4532
|
+
"Person Validation Tests",
|
|
4533
|
+
"Validation Tests"
|
|
4534
|
+
],
|
|
4426
4535
|
"requirementKeys": [],
|
|
4427
4536
|
"displayName": "Person Validation – FirstName Excluded Returns Fail",
|
|
4428
4537
|
"planReason": "ISTQB Negative Testing / Error Guessing: Omitting FirstName from the request body means the API cannot match the firstName field; Levenshtein distance is maximum → overallResult=Fail → HTTP 422.",
|
|
@@ -4493,7 +4602,8 @@
|
|
|
4493
4602
|
"LAST_NAME"
|
|
4494
4603
|
]
|
|
4495
4604
|
}
|
|
4496
|
-
}
|
|
4605
|
+
},
|
|
4606
|
+
"preconditions": []
|
|
4497
4607
|
},
|
|
4498
4608
|
{
|
|
4499
4609
|
"test_id": "TC-AMLVER-PV-02",
|
|
@@ -4504,7 +4614,10 @@
|
|
|
4504
4614
|
"regression"
|
|
4505
4615
|
],
|
|
4506
4616
|
"folder": "/Person Validation Tests",
|
|
4507
|
-
"testSet":
|
|
4617
|
+
"testSet": [
|
|
4618
|
+
"Person Validation Tests",
|
|
4619
|
+
"Validation Tests"
|
|
4620
|
+
],
|
|
4508
4621
|
"requirementKeys": [],
|
|
4509
4622
|
"displayName": "Person Validation – FirstName Levenshtein=1 Returns Pass With Warning",
|
|
4510
4623
|
"planReason": "ISTQB Equivalence Partitioning (valid class with warning): A FirstName with Levenshtein distance of 1 from the source value is within the near-match threshold; the API must return 200 with overallResult=Pass with warning.",
|
|
@@ -4576,7 +4689,8 @@
|
|
|
4576
4689
|
"LAST_NAME"
|
|
4577
4690
|
]
|
|
4578
4691
|
}
|
|
4579
|
-
}
|
|
4692
|
+
},
|
|
4693
|
+
"preconditions": []
|
|
4580
4694
|
},
|
|
4581
4695
|
{
|
|
4582
4696
|
"test_id": "TC-AMLVER-PV-03",
|
|
@@ -4587,7 +4701,10 @@
|
|
|
4587
4701
|
"regression"
|
|
4588
4702
|
],
|
|
4589
4703
|
"folder": "/Person Validation Tests",
|
|
4590
|
-
"testSet":
|
|
4704
|
+
"testSet": [
|
|
4705
|
+
"Person Validation Tests",
|
|
4706
|
+
"Validation Tests"
|
|
4707
|
+
],
|
|
4591
4708
|
"requirementKeys": [],
|
|
4592
4709
|
"displayName": "Person Validation – SecondName Levenshtein=1 Returns Pass With Warning",
|
|
4593
4710
|
"planReason": "ISTQB Equivalence Partitioning (valid class with warning): SecondName with Levenshtein distance of 1 from the CPB source value (ANN → AN) triggers a near-match warning; overallResult must be Pass with warning with HTTP 200.",
|
|
@@ -4664,7 +4781,8 @@
|
|
|
4664
4781
|
"CPB_FIRST_NAME"
|
|
4665
4782
|
]
|
|
4666
4783
|
}
|
|
4667
|
-
}
|
|
4784
|
+
},
|
|
4785
|
+
"preconditions": []
|
|
4668
4786
|
},
|
|
4669
4787
|
{
|
|
4670
4788
|
"test_id": "TC-AMLVER-EV-01",
|
|
@@ -4675,7 +4793,10 @@
|
|
|
4675
4793
|
"regression"
|
|
4676
4794
|
],
|
|
4677
4795
|
"folder": "/Entity Validation Tests",
|
|
4678
|
-
"testSet":
|
|
4796
|
+
"testSet": [
|
|
4797
|
+
"Entity Validation Tests",
|
|
4798
|
+
"Validation Tests"
|
|
4799
|
+
],
|
|
4679
4800
|
"requirementKeys": [],
|
|
4680
4801
|
"displayName": "Entity Validation – Director FirstName Excluded Returns Fail",
|
|
4681
4802
|
"planReason": "ISTQB Negative Testing / Error Guessing: Omitting a director FirstName causes maximum Levenshtein distance against the source; that director gets result=Fail → overallResult=Fail → HTTP 422.",
|
|
@@ -4747,7 +4868,8 @@
|
|
|
4747
4868
|
"REGISTRATION_NAME"
|
|
4748
4869
|
]
|
|
4749
4870
|
}
|
|
4750
|
-
}
|
|
4871
|
+
},
|
|
4872
|
+
"preconditions": []
|
|
4751
4873
|
},
|
|
4752
4874
|
{
|
|
4753
4875
|
"test_id": "TC-AMLVER-E-06",
|
|
@@ -4900,7 +5022,8 @@
|
|
|
4900
5022
|
"REGISTRATION_NAME"
|
|
4901
5023
|
]
|
|
4902
5024
|
}
|
|
4903
|
-
}
|
|
5025
|
+
},
|
|
5026
|
+
"preconditions": []
|
|
4904
5027
|
},
|
|
4905
5028
|
{
|
|
4906
5029
|
"test_id": "TC-AMLVER-CT-POST-ENTITY-404",
|
|
@@ -4912,7 +5035,10 @@
|
|
|
4912
5035
|
"contract"
|
|
4913
5036
|
],
|
|
4914
5037
|
"folder": "/Entity Tests/Contract",
|
|
4915
|
-
"testSet":
|
|
5038
|
+
"testSet": [
|
|
5039
|
+
"Entity Tests",
|
|
5040
|
+
"Contract Tests"
|
|
5041
|
+
],
|
|
4916
5042
|
"requirementKeys": [],
|
|
4917
5043
|
"displayName": "Verify Entity – 404 Not Found contract",
|
|
4918
5044
|
"planReason": "ISTQB Negative Testing: POST to a misspelled path (/entit instead of /entity) must return 404 — the gateway must not silently reroute or accept unknown paths.",
|
|
@@ -4982,7 +5108,8 @@
|
|
|
4982
5108
|
"REGISTRATION_NAME"
|
|
4983
5109
|
]
|
|
4984
5110
|
}
|
|
4985
|
-
}
|
|
5111
|
+
},
|
|
5112
|
+
"preconditions": []
|
|
4986
5113
|
},
|
|
4987
5114
|
{
|
|
4988
5115
|
"test_id": "TC-AMLVER-CT-POST-ENTITY-422",
|
|
@@ -4994,7 +5121,10 @@
|
|
|
4994
5121
|
"contract"
|
|
4995
5122
|
],
|
|
4996
5123
|
"folder": "/Entity Tests/Contract",
|
|
4997
|
-
"testSet":
|
|
5124
|
+
"testSet": [
|
|
5125
|
+
"Entity Tests",
|
|
5126
|
+
"Contract Tests"
|
|
5127
|
+
],
|
|
4998
5128
|
"requirementKeys": [],
|
|
4999
5129
|
"displayName": "Verify Entity – 422 Unprocessable Entity contract",
|
|
5000
5130
|
"planReason": "ISTQB Equivalence Partitioning (invalid class): POST /entity with a director FirstName='sd' (Levenshtein >2 from source JACQUELINE) must return 422 Unprocessable Entity — confirms API correctly rejects grossly mismatched director name data.",
|
|
@@ -5075,7 +5205,8 @@
|
|
|
5075
5205
|
"REGISTRATION_NAME"
|
|
5076
5206
|
]
|
|
5077
5207
|
}
|
|
5078
|
-
}
|
|
5208
|
+
},
|
|
5209
|
+
"preconditions": []
|
|
5079
5210
|
},
|
|
5080
5211
|
{
|
|
5081
5212
|
"test_id": "TC-AMLVER-CT-POST-PERSON-404",
|
|
@@ -5087,7 +5218,10 @@
|
|
|
5087
5218
|
"contract"
|
|
5088
5219
|
],
|
|
5089
5220
|
"folder": "/Person Tests/Contract",
|
|
5090
|
-
"testSet":
|
|
5221
|
+
"testSet": [
|
|
5222
|
+
"Person Tests",
|
|
5223
|
+
"Contract Tests"
|
|
5224
|
+
],
|
|
5091
5225
|
"requirementKeys": [],
|
|
5092
5226
|
"displayName": "Verify Person – 404 Not Found contract",
|
|
5093
5227
|
"planReason": "ISTQB Negative Testing: POST to a misspelled path (/perso instead of /person) must return 404 — the gateway must not silently reroute or accept unknown paths.",
|
|
@@ -5158,7 +5292,8 @@
|
|
|
5158
5292
|
"FIRST_NAME"
|
|
5159
5293
|
]
|
|
5160
5294
|
}
|
|
5161
|
-
}
|
|
5295
|
+
},
|
|
5296
|
+
"preconditions": []
|
|
5162
5297
|
},
|
|
5163
5298
|
{
|
|
5164
5299
|
"test_id": "TC-AMLVER-CT-POST-PERSON-422",
|
|
@@ -5170,7 +5305,10 @@
|
|
|
5170
5305
|
"contract"
|
|
5171
5306
|
],
|
|
5172
5307
|
"folder": "/Person Tests/Contract",
|
|
5173
|
-
"testSet":
|
|
5308
|
+
"testSet": [
|
|
5309
|
+
"Person Tests",
|
|
5310
|
+
"Contract Tests"
|
|
5311
|
+
],
|
|
5174
5312
|
"requirementKeys": [],
|
|
5175
5313
|
"displayName": "Verify Person – 422 Unprocessable Entity contract",
|
|
5176
5314
|
"planReason": "ISTQB Equivalence Partitioning (invalid class): POST /person with LastName='Sala' (Levenshtein >2 from source surname) must return 422 Unprocessable Entity — confirms API correctly rejects clearly mismatched surname data.",
|
|
@@ -5251,7 +5389,8 @@
|
|
|
5251
5389
|
"FIRST_NAME"
|
|
5252
5390
|
]
|
|
5253
5391
|
}
|
|
5254
|
-
}
|
|
5392
|
+
},
|
|
5393
|
+
"preconditions": []
|
|
5255
5394
|
},
|
|
5256
5395
|
{
|
|
5257
5396
|
"test_id": "TC-AMLVER-EV-02",
|
|
@@ -5262,7 +5401,10 @@
|
|
|
5262
5401
|
"regression"
|
|
5263
5402
|
],
|
|
5264
5403
|
"folder": "/Entity Validation Tests",
|
|
5265
|
-
"testSet":
|
|
5404
|
+
"testSet": [
|
|
5405
|
+
"Entity Validation Tests",
|
|
5406
|
+
"Validation Tests"
|
|
5407
|
+
],
|
|
5266
5408
|
"requirementKeys": [],
|
|
5267
5409
|
"displayName": "Entity Validation – Director FirstName Levenshtein=1 Returns Pass With Warning",
|
|
5268
5410
|
"planReason": "ISTQB Equivalence Partitioning (valid class with warning): A director FirstName with Levenshtein distance of 1 from source (JACQUELIN vs JACQUELINE) is within the near-match threshold; overallResult must be Pass with warning → HTTP 200.",
|
|
@@ -5335,7 +5477,8 @@
|
|
|
5335
5477
|
"REGISTRATION_NAME"
|
|
5336
5478
|
]
|
|
5337
5479
|
}
|
|
5338
|
-
}
|
|
5480
|
+
},
|
|
5481
|
+
"preconditions": []
|
|
5339
5482
|
}
|
|
5340
5483
|
]
|
|
5341
5484
|
}
|