common-qa-mcp 0.3.0 → 0.4.0
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/dist/adapters/factory.d.ts +1 -1
- package/dist/adapters/factory.d.ts.map +1 -1
- package/dist/adapters/factory.js +12 -29
- package/dist/adapters/factory.js.map +1 -1
- package/dist/adapters/http.js +2 -3
- package/dist/adapters/http.js.map +1 -1
- package/dist/adapters/remoteMcp/adapter.d.ts +7 -2
- package/dist/adapters/remoteMcp/adapter.d.ts.map +1 -1
- package/dist/adapters/remoteMcp/adapter.js +9 -3
- package/dist/adapters/remoteMcp/adapter.js.map +1 -1
- package/dist/adapters/simplifyqa/adapter.d.ts +306 -23
- package/dist/adapters/simplifyqa/adapter.d.ts.map +1 -1
- package/dist/adapters/simplifyqa/adapter.js +2033 -86
- package/dist/adapters/simplifyqa/adapter.js.map +1 -1
- package/dist/adapters/simplifyqa/mapper.d.ts +43 -11
- package/dist/adapters/simplifyqa/mapper.d.ts.map +1 -1
- package/dist/adapters/simplifyqa/mapper.js +470 -21
- package/dist/adapters/simplifyqa/mapper.js.map +1 -1
- package/dist/adapters/types.d.ts +121 -5
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/walnut/adapter.d.ts +6 -2
- package/dist/adapters/walnut/adapter.d.ts.map +1 -1
- package/dist/adapters/walnut/adapter.js +33 -2
- package/dist/adapters/walnut/adapter.js.map +1 -1
- package/dist/adapters/walnut/mapper.d.ts +2 -1
- package/dist/adapters/walnut/mapper.d.ts.map +1 -1
- package/dist/adapters/walnut/mapper.js +13 -0
- package/dist/adapters/walnut/mapper.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -1
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +15 -7
- package/dist/connection.js.map +1 -1
- package/dist/domain/types.d.ts +485 -4
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/initAgents.d.ts.map +1 -1
- package/dist/initAgents.js +22 -9
- package/dist/initAgents.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +23 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/backlog.tools.d.ts +13 -0
- package/dist/tools/backlog.tools.d.ts.map +1 -0
- package/dist/tools/backlog.tools.js +399 -0
- package/dist/tools/backlog.tools.js.map +1 -0
- package/dist/tools/defects.tools.d.ts +7 -0
- package/dist/tools/defects.tools.d.ts.map +1 -0
- package/dist/tools/defects.tools.js +82 -0
- package/dist/tools/defects.tools.js.map +1 -0
- package/dist/tools/discovery.tools.d.ts.map +1 -1
- package/dist/tools/discovery.tools.js +871 -55
- package/dist/tools/discovery.tools.js.map +1 -1
- package/dist/tools/markdown.d.ts +3 -3
- package/dist/tools/markdown.d.ts.map +1 -1
- package/dist/tools/markdown.js +89 -18
- package/dist/tools/markdown.js.map +1 -1
- package/dist/tools/objects.tools.d.ts +7 -0
- package/dist/tools/objects.tools.d.ts.map +1 -0
- package/dist/tools/objects.tools.js +201 -0
- package/dist/tools/objects.tools.js.map +1 -0
- package/dist/tools/recording.tools.d.ts.map +1 -1
- package/dist/tools/recording.tools.js +64 -5
- package/dist/tools/recording.tools.js.map +1 -1
- package/dist/tools/run.tools.d.ts.map +1 -1
- package/dist/tools/run.tools.js +102 -18
- package/dist/tools/run.tools.js.map +1 -1
- package/dist/tools/schemas.d.ts +21 -4
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +14 -1
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/tasks.tools.d.ts +7 -0
- package/dist/tools/tasks.tools.d.ts.map +1 -0
- package/dist/tools/tasks.tools.js +75 -0
- package/dist/tools/tasks.tools.js.map +1 -0
- package/dist/tools/testcase.tools.d.ts.map +1 -1
- package/dist/tools/testcase.tools.js +146 -100
- package/dist/tools/testcase.tools.js.map +1 -1
- package/dist/tools/testdata.tools.d.ts.map +1 -1
- package/dist/tools/testdata.tools.js +99 -11
- package/dist/tools/testdata.tools.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ConnectedQaConfig } from '../../config.js';
|
|
2
2
|
import type { MakeClientOptions } from '../http.js';
|
|
3
|
-
import type { ProjectInfo } from '../types.js';
|
|
4
|
-
import type { ActionDef, CloudRunner, DatasetInfo, DefaultIteration, EntityRef, EnvInfo, Formula, FormulaCall, JournalOp, JournalView, LocalAgent, MemberOp, ModuleSummary, ObjectQuery, ProjectSummary, QaObject, ReleaseQuery, ReleaseSummary, RunOptions, RunRef, RunStatus, RunTarget, SaveGeneratedIterations, SaveGeneratedIterationsResult, SavedRef, SprintQuery, SprintSummary, Story, StoryQuery, StorySummary, Suite, SuiteSummary, TcQuery, TcSummary, TestCase } from '../../domain/types.js';
|
|
3
|
+
import type { ListResult, ProjectInfo } from '../types.js';
|
|
4
|
+
import type { ActionDef, CloudRunner, DatasetInfo, DefaultIteration, DefectQuery, DefectSummary, EntityRef, EnvInfo, Epic, EpicInput, EpicQuery, EpicSummary, EpicUpdate, Feature, FeatureInput, FeatureQuery, FeatureSummary, FeatureUpdate, Formula, FormulaCall, FunctionQuery, FunctionSummary, QaFunction, JournalOp, JournalView, LocalAgent, Locator, MemberOp, ModuleCreateInput, ModuleDeleteResult, ModuleDetail, ModuleSummary, ObjectQuery, ProjectSummary, QaObject, ReleaseQuery, ReleaseSummary, RunOptions, RunRef, RunStatus, RunTarget, SaveGeneratedIterations, SaveGeneratedIterationsResult, SavedRef, SprintQuery, SprintSummary, Story, StoryInput, StoryQuery, StorySummary, StoryUpdate, Suite, SuiteSummary, TaskQuery, TaskSummary, TcQuery, TcSummary, TestCase, UserQuery, UserSummary, VersionDeleteInput, VersionDeleteResult } from '../../domain/types.js';
|
|
5
5
|
/** Test seam identical to WalnutAdapter's — swap transport, keep real headers. */
|
|
6
6
|
export type SimplifyQaTransport = Pick<MakeClientOptions, 'fetchImpl' | 'FormDataImpl' | 'BlobImpl'>;
|
|
7
7
|
/**
|
|
8
8
|
* SimplifyQaAdapter — DIRECT-to-backend REST driver for SimplifyQA, mirroring WalnutAdapter's
|
|
9
9
|
* design. Reads (list/get for projects/testcases/suites/stories/modules/releases/sprints/objects)
|
|
10
|
-
* hit the
|
|
10
|
+
* hit the SimplifyQA backend REST directly via a `QaHttp` bound to `cfg.baseUrl`. Anything not yet
|
|
11
11
|
* ported (writes, testdata, run dispatch, marketplace, and the recording surface) delegates to
|
|
12
12
|
* the LOCAL AGENT's `/mcp` (`cfg.url`) via a lazily-built RemoteMcpAdapter — same "graceful hop"
|
|
13
13
|
* pattern walnut uses for recording. When the hop is not configured, unported ops surface a clear
|
|
@@ -27,25 +27,114 @@ export declare class SimplifyQaAdapter {
|
|
|
27
27
|
private requireProjectId;
|
|
28
28
|
private searchBody;
|
|
29
29
|
/** Validates baseUrl + token + (optional) project by running the same list_projects search the
|
|
30
|
-
* Java `infoResult` uses to resolve the project name — no separate /info endpoint on SQA.
|
|
30
|
+
* Java `infoResult` uses to resolve the project name — no separate /info endpoint on SQA.
|
|
31
|
+
* `counts` is a best-effort row count per entity type (test cases/suites/stories/objects), read
|
|
32
|
+
* from each `/search` endpoint's own `totalCount` (see searchTotalCount) — mirrors what Walnut's
|
|
33
|
+
* info() already returns via its own `counts`. */
|
|
31
34
|
info(): Promise<ProjectInfo>;
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
/** Projects the caller can access. Three code paths in priority order:
|
|
36
|
+
*
|
|
37
|
+
* 1. Config-supplied `QA_MCP_USER_ID` (needed for API-key auth — SQA keys are encrypted JWTs
|
|
38
|
+
* with no client-decryptable userId, and no whoami endpoint exists yet) → user-scoped
|
|
39
|
+
* two-step via `/pm/projectuserrole`.
|
|
40
|
+
* 2. Session JWT with `userId` claim → same two-step.
|
|
41
|
+
* 3. Neither → direct `/pm/project/search`; the backend scopes by the token owner where it
|
|
42
|
+
* can (may return tenant-wide for API keys). `totalCount` uses `rows.length` (backend's
|
|
43
|
+
* top-level `totalCount` is unreliable — counts pre-filter, includes deleted).
|
|
44
|
+
*
|
|
45
|
+
* The two-step avoids both problems: correct user scoping AND an accurate count. */
|
|
46
|
+
listProjects(): Promise<ListResult<ProjectSummary>>;
|
|
47
|
+
private listProjectsForUser;
|
|
48
|
+
/** Best-effort row count for an entity `/search` endpoint — posts a minimal (limit 1) project-scoped
|
|
49
|
+
* search and reads the `totalCount` the backend returns alongside `data` (the same envelope shape
|
|
50
|
+
* every /search endpoint in this codebase uses, confirmed via the real sqa-ui
|
|
51
|
+
* `{ totalCount: number, data: [...] }` response typing). Never throws — counts are a nice-to-have
|
|
52
|
+
* for project_info, not worth failing the whole call over; any failure (or a missing totalCount)
|
|
53
|
+
* falls back to 0 / the returned row count. */
|
|
54
|
+
private searchTotalCount;
|
|
55
|
+
private listProjectsDirect;
|
|
56
|
+
/** Decode the `userId` claim from the SQA JWT payload WITHOUT verifying the signature. Backend
|
|
57
|
+
* re-verifies on every call; this only needs the id for `/pm/projectuserrole`. Returns undefined
|
|
58
|
+
* on any parse failure or when the token isn't a JWT. */
|
|
59
|
+
private jwtUserId;
|
|
60
|
+
listTestCases(q: TcQuery): Promise<ListResult<TcSummary>>;
|
|
61
|
+
/** "me" → cfg.userId (numeric); numeric string → number; anything else → undefined. Callers
|
|
62
|
+
* should have resolved a name to a numeric id via `list_users` first. */
|
|
63
|
+
private resolveUserFilter;
|
|
64
|
+
/** Neutral test case, steps included. Accepts numeric id or business code (`TC_123`).
|
|
65
|
+
* `versionId` overrides which version's steps to load — omit to accept the TC's currently-
|
|
66
|
+
* selected version. When the resolved version differs from the doc's current selection, we
|
|
67
|
+
* also patch `currentVersionId` on the returned tc so callers can render "showing version X". */
|
|
68
|
+
getTestCase(id: string, versionId?: string): Promise<TestCase>;
|
|
37
69
|
private fetchRawTestcase;
|
|
38
70
|
private fetchStepsCollection;
|
|
39
|
-
|
|
71
|
+
/** For every FUNCTION step, resolve the referenced function's code + name via /tm/function search
|
|
72
|
+
* (batched by distinct functionId). Mutates `tc.steps[i].functionCall` in place with
|
|
73
|
+
* `testCaseCode`/`testCaseName`. Non-fatal on failure — the raw id still renders. Mirrors the
|
|
74
|
+
* Excel export builder in tcfn.service.js:2696-2703. */
|
|
75
|
+
private hydrateFunctionNames;
|
|
76
|
+
/** For every step with an objectRef, resolve the object's display name (`disname`) via
|
|
77
|
+
* /tm/object/search (batched by distinct objectId). Mutates `objectRef.name` in place. Non-fatal
|
|
78
|
+
* on failure — the bare id still renders. Mirrors the FE's `defaultFieldsMap.get('objectId').map`
|
|
79
|
+
* behavior used by the Excel export (tcfn.service.js:2876) so the tool surface matches the UI. */
|
|
80
|
+
private hydrateObjectNames;
|
|
81
|
+
listSuites(): Promise<ListResult<SuiteSummary>>;
|
|
40
82
|
getSuite(id: string): Promise<Suite>;
|
|
41
|
-
listStories(q: StoryQuery): Promise<StorySummary
|
|
83
|
+
listStories(q: StoryQuery): Promise<ListResult<StorySummary>>;
|
|
42
84
|
getStory(id: string): Promise<Story>;
|
|
43
85
|
/** A US_XXX business key → the numeric userstoryId via `/pm/userstory/search`. Numeric passes
|
|
44
86
|
* through. SQA's GET-by-id parseInts the path, so a raw key would 404. */
|
|
45
87
|
private resolveStoryNumericId;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
88
|
+
/** `POST /pm/defect/search` — same searchFields protocol as userstory/testcase search. */
|
|
89
|
+
listDefects(q: DefectQuery): Promise<ListResult<DefectSummary>>;
|
|
90
|
+
/** `POST /pm/task/search` — same searchFields protocol as defect/userstory search. */
|
|
91
|
+
listTasks(q: TaskQuery): Promise<ListResult<TaskSummary>>;
|
|
92
|
+
createStory(input: StoryInput): Promise<SavedRef>;
|
|
93
|
+
updateStory(id: string, patch: StoryUpdate): Promise<SavedRef>;
|
|
94
|
+
listEpics(q: EpicQuery): Promise<ListResult<EpicSummary>>;
|
|
95
|
+
getEpic(id: string): Promise<Epic>;
|
|
96
|
+
createEpic(input: EpicInput): Promise<SavedRef>;
|
|
97
|
+
updateEpic(id: string, patch: EpicUpdate): Promise<SavedRef>;
|
|
98
|
+
/** EP_XXX business key → numeric epic id via `/pm/epic/search`. Numeric passes through. */
|
|
99
|
+
private resolveEpicNumericId;
|
|
100
|
+
listFeatures(q: FeatureQuery): Promise<ListResult<FeatureSummary>>;
|
|
101
|
+
getFeature(id: string): Promise<Feature>;
|
|
102
|
+
createFeature(input: FeatureInput): Promise<SavedRef>;
|
|
103
|
+
updateFeature(id: string, patch: FeatureUpdate): Promise<SavedRef>;
|
|
104
|
+
/** FT_XXX business key → numeric feature id via `/pm/feature/search`. Numeric passes through. */
|
|
105
|
+
private resolveFeatureNumericId;
|
|
106
|
+
listModules(): Promise<ListResult<ModuleSummary>>;
|
|
107
|
+
/** GET /pm/module/:id — server returns an array; empty array → NotFound. */
|
|
108
|
+
getModule(id: string): Promise<ModuleDetail>;
|
|
109
|
+
/** POST /pm/module — server validates: name+isRoot+projectId required; parentId ignored when
|
|
110
|
+
* isRoot:true. Duplicate name per project is rejected server-side. */
|
|
111
|
+
createModule(input: ModuleCreateInput): Promise<SavedRef>;
|
|
112
|
+
/** PATCH /pm/module — two-phase per module.controller.js:94. `confirm:false` returns the per-id
|
|
113
|
+
* dependency footprint (test cases, functions, params, objects, defects, user stories). `confirm:true`
|
|
114
|
+
* triggers the actual delete: server drops only ids with EMPTY dependencies; ids with references are
|
|
115
|
+
* silently skipped — we still return that list so the caller can act on it.
|
|
116
|
+
* ponytail: one method, `confirm` flag; mirrors the backend's two-call contract. */
|
|
117
|
+
deleteModule(input: {
|
|
118
|
+
ids: string[];
|
|
119
|
+
projectId: string;
|
|
120
|
+
confirm?: boolean;
|
|
121
|
+
}): Promise<ModuleDeleteResult>;
|
|
122
|
+
/** PUT /tm/tcfnversion/delete — soft-delete ONE version of a TC or FN. Two-phase per
|
|
123
|
+
* tcfnversion.service.js:30 — `isDelete:false` (or `isDelete:true` with non-empty deps) →
|
|
124
|
+
* returns the dependency array unchanged; `isDelete:true` with EMPTY deps → soft-deletes the
|
|
125
|
+
* tcfn_version row + its steps + testdata + testdata iterations.
|
|
126
|
+
*
|
|
127
|
+
* ponytail: one method, `confirm` flag. Response shape decides `deleted`: if every dep row is
|
|
128
|
+
* fully empty (all `*Arr` are `{}` maps), the server actually deleted; otherwise it refused
|
|
129
|
+
* and just handed back the deps. We do not assume — we inspect. */
|
|
130
|
+
deleteVersion(input: VersionDeleteInput): Promise<VersionDeleteResult>;
|
|
131
|
+
listReleases(q: ReleaseQuery): Promise<ListResult<ReleaseSummary>>;
|
|
132
|
+
listSprints(q: SprintQuery): Promise<ListResult<SprintSummary>>;
|
|
133
|
+
/** POST /pm/users/search — the customer's users (router mounted at `/pm/users`, plural — see
|
|
134
|
+
* project-management/express-app.js:181). Backend auto-scopes non-admin callers to users in
|
|
135
|
+
* their assigned projects. Optional `projectId` narrows to that project's members; optional
|
|
136
|
+
* `search` is a case-insensitive regex over `name`. */
|
|
137
|
+
listUsers(q: UserQuery): Promise<ListResult<UserSummary>>;
|
|
49
138
|
getObject(id: string): Promise<QaObject>;
|
|
50
139
|
productUrlFor(entity: EntityRef): string;
|
|
51
140
|
private hop;
|
|
@@ -60,18 +149,154 @@ export declare class SimplifyQaAdapter {
|
|
|
60
149
|
/** Forward a recording-tool call to the agent /mcp. Same behavior as walnut. */
|
|
61
150
|
callRaw(name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
62
151
|
/** Two-step create: (1) resolve every `${name}` token in the steps to a project-scoped parameter id
|
|
63
|
-
* (get-or-create), (2) POST /tm/testcase
|
|
152
|
+
* (get-or-create) plus, for AUTOMATION, each step's actionId + objectId, (2) POST /tm/testcase
|
|
153
|
+
* multipart with the assembled `testcaseObj`. */
|
|
64
154
|
createTestCase(tc: TestCase): Promise<SavedRef>;
|
|
65
|
-
/** Same shape as create, but with `tcfnObj.id` set
|
|
155
|
+
/** Same shape as create, but with `tcfnObj.id` set. */
|
|
66
156
|
updateTestCase(id: string, tc: TestCase): Promise<SavedRef>;
|
|
67
|
-
/**
|
|
157
|
+
/** Snapshot the CURRENT server state of a testcase under a NEW version name — same TC id,
|
|
158
|
+
* new `tcfn_version` row with cloned steps. Backed by `PUT /tm/testcase` with
|
|
159
|
+
* `operation:"SAVENEWVERSION"` (see tcfn.service.js:115/242/355 for the branches). The steps
|
|
160
|
+
* we fetch from the collection are re-POSTed with their `id` stripped so the backend inserts
|
|
161
|
+
* fresh rows attached to the new version. When `tdCopy` is true, the source version's
|
|
162
|
+
* testdata iterations are cloned across environments via `verData.selVersionId`.
|
|
163
|
+
*
|
|
164
|
+
* Not a mapper roundtrip: we resend the raw tcfnObj/steps we just fetched, so any fields the
|
|
165
|
+
* neutral `TestCase` type doesn't carry (custom fields, mailers, exec platform, ...) are
|
|
166
|
+
* preserved verbatim — the point of a version is "freeze what's there now". */
|
|
167
|
+
saveAsNewVersion(id: string, opts: {
|
|
168
|
+
versionName: string;
|
|
169
|
+
tdCopy?: boolean;
|
|
170
|
+
sourceVersionId?: string;
|
|
171
|
+
}): Promise<SavedRef>;
|
|
172
|
+
/** STEPSTOFN — mirrors the FE "Save as function" flow (create-new-fn-modal.component.ts:88-197):
|
|
173
|
+
* pick a subset of the TC's steps, retype to FN, POST /tm/function multipart with the
|
|
174
|
+
* `functionObj` payload. Backend re-assigns step ids/versionId under the newly created FN version.
|
|
175
|
+
*
|
|
176
|
+
* ponytail: file attachments (STEP_ATTACMENTS / STEP_COMAPAREFILES multipart entries) are NOT
|
|
177
|
+
* forwarded — MCP callers don't ship blobs. Add if a real caller needs them.
|
|
178
|
+
* ponytail: sub-step flattening (FE lines 124-127) is skipped — `/tm/testcase/steps` returns
|
|
179
|
+
* flat top-level rows; nested FN expansions aren't in that read. Handle if that changes. */
|
|
180
|
+
saveStepsAsFunction(tcId: string, opts: {
|
|
181
|
+
stepSeqs: number[];
|
|
182
|
+
name: string;
|
|
183
|
+
moduleId: number;
|
|
184
|
+
copyTestData?: boolean;
|
|
185
|
+
executionType?: 'AUTOMATION' | 'MANUAL';
|
|
186
|
+
}): Promise<SavedRef>;
|
|
187
|
+
/** Look up the freshly-created FN's version id — STEPSTOFN's response inlines the FN but not its
|
|
188
|
+
* version, and the replace-in-TC step needs `fnVersionId`. Mirrors the FE
|
|
189
|
+
* (`create-new-fn-modal.component.ts:getFnVersion`): search `tcfnversion` by parentType=FN
|
|
190
|
+
* ordered by createdAt asc, take the first. */
|
|
191
|
+
private fetchFnVersionId;
|
|
192
|
+
/** Second half of extract-to-function-and-replace-in-source (FE
|
|
193
|
+
* `testcase.component.ts:createNewFns → onSave`): after the FN exists, PUT the source TC with the
|
|
194
|
+
* extracted step rows marked `deleted:true` and a synthetic FUNCTION + FUNCTION_END pair inserted
|
|
195
|
+
* at the first extracted position. The backend automatically:
|
|
196
|
+
* - drops testdata columns for params only the deleted steps referenced (allParameters skips
|
|
197
|
+
* `step.deleted:true` at tcfn.service.js:411)
|
|
198
|
+
* - injects a per-env FN cell into every TC iteration row using the FN's default iteration
|
|
199
|
+
* (tcfn.service.js:1032-1085) — so testdata rewiring is free.
|
|
200
|
+
*
|
|
201
|
+
* ponytail: refuses DUO / SYNCON test cases and picks that span control-flow or nested FN
|
|
202
|
+
* brackets. Those cases (v2) need parallel mirroring into the other execution-type array and
|
|
203
|
+
* bracket-aware validation — out of scope for the first pass. */
|
|
204
|
+
replaceStepsWithFunctionCall(tcId: string, opts: {
|
|
205
|
+
extractedSeqs: number[];
|
|
206
|
+
functionId: string;
|
|
207
|
+
fnVersionId: string;
|
|
208
|
+
fnModuleId: number;
|
|
209
|
+
technologyType: string;
|
|
210
|
+
}): Promise<SavedRef>;
|
|
211
|
+
/** One-shot extract-to-function-and-replace. Chains STEPSTOFN → fetch fn version id → replace in
|
|
212
|
+
* source TC. If step 2 or 3 fails after step 1 succeeded, the caller sees the fn id in the error
|
|
213
|
+
* so they can retry or clean up the phantom function. */
|
|
214
|
+
extractStepsAsFunctionAndReplace(tcId: string, opts: {
|
|
215
|
+
stepSeqs: number[];
|
|
216
|
+
name: string;
|
|
217
|
+
moduleId: number;
|
|
218
|
+
copyTestData?: boolean;
|
|
219
|
+
executionType?: 'AUTOMATION' | 'MANUAL';
|
|
220
|
+
}): Promise<SavedRef & {
|
|
221
|
+
fnId: string;
|
|
222
|
+
fnVersionId: string;
|
|
223
|
+
}>;
|
|
224
|
+
/** Soft-delete. `/tm/testcase/delete` returns HTTP 200 either way — its `data` is `true` on real
|
|
225
|
+
* delete, or an array of dependency records when the TC is still referenced by a defect, suite,
|
|
226
|
+
* execution plan, scenario, workflow, pipeline, or scheduler (nothing was deleted). Inspect the
|
|
227
|
+
* shape and throw so the tool surfaces it as a failure instead of a fake success. */
|
|
68
228
|
deleteTestCase(id: string): Promise<void>;
|
|
229
|
+
/** Clone a testcase in place (same project + module) with all steps, versions, testdata,
|
|
230
|
+
* parameters, object refs, and nested function calls carried over. Backed by the SQA native
|
|
231
|
+
* `/tm/tcfnCopy/copytc` endpoint (see test-management/src/controllers/tcfnCopy.controller.js).
|
|
232
|
+
*
|
|
233
|
+
* Requires the `copy_testcase_across_project` privilege on the current project — enforced
|
|
234
|
+
* server-side regardless of whether the copy is in-project or across projects.
|
|
235
|
+
*
|
|
236
|
+
* When `newTitle` is omitted the backend auto-names the copy as `{sourceName}_copy1`,
|
|
237
|
+
* `_copy2`, etc. When provided, a follow-up PUT renames the freshly-created TC to that name.
|
|
238
|
+
*
|
|
239
|
+
* IMPORTANT — the copy endpoint's `selversions` and `selectedEnv` fields are FILTERS, not
|
|
240
|
+
* wildcards. Passing empty arrays makes the backend copy the TC shell only (no steps, no
|
|
241
|
+
* testdata, since both live under versions and per-env iterations). So we fetch the source
|
|
242
|
+
* TC's version names AND the project's environment names first and pass them explicitly. */
|
|
243
|
+
cloneTestCase(id: string, newTitle?: string, versions?: string[]): Promise<SavedRef>;
|
|
244
|
+
listFunctions(q: FunctionQuery): Promise<ListResult<FunctionSummary>>;
|
|
245
|
+
getFunction(id: string): Promise<QaFunction>;
|
|
246
|
+
/** Steps for one FN version. Unlike TC docs, the FN doc from `/tm/function/:id/:projectId`
|
|
247
|
+
* doesn't carry a versionId inline — callers resolve the target versionId (usually the newest,
|
|
248
|
+
* from `fetchFunctionVersionRows`) and pass it here. */
|
|
249
|
+
private fetchFunctionStepsForVersion;
|
|
250
|
+
/** The function's version rows, newest-first. */
|
|
251
|
+
private fetchFunctionVersionRows;
|
|
252
|
+
/** Soft-delete a function. `/tm/function/delete` returns HTTP 200 either way — its `data` is
|
|
253
|
+
* `true` on real delete, or an array of dependency records when the FN is still referenced by a
|
|
254
|
+
* TC / FN / workflow (nothing was deleted). Inspect the shape and throw so the tool surfaces it
|
|
255
|
+
* as a failure instead of a fake success. */
|
|
256
|
+
deleteFunction(id: string): Promise<void>;
|
|
257
|
+
/** Copy a function in place — new tcfnObj row, all versions/steps/testdata carried over. Same
|
|
258
|
+
* shape as `cloneTestCase`: version names + env names come from the source, then POST to
|
|
259
|
+
* `/tm/tcfnCopy/copytc` with `type:'FN'` (backend enforces `copy_function_across_projects`).
|
|
260
|
+
* When `newTitle` is omitted the backend auto-names as `{sourceName}_copy1`, etc.; when
|
|
261
|
+
* provided a follow-up PUT `/tm/function/:id` renames the freshly-created FN. */
|
|
262
|
+
cloneFunction(id: string, newTitle?: string, versions?: string[]): Promise<SavedRef>;
|
|
263
|
+
/** Snapshot the CURRENT server state of a function under a NEW version name — same FN id, new
|
|
264
|
+
* `tcfn_version` row with cloned steps. Mirrors `saveAsNewVersion` (see there for the shape
|
|
265
|
+
* rationale) with `type:'FN'` and the multipart route `PUT /tm/function` / key `functionObj`.
|
|
266
|
+
* Source-version resolution goes through the FN's `/tm/function/version/:id/:pid` list — the
|
|
267
|
+
* FN doc has no inline versionId. */
|
|
268
|
+
saveAsNewFunctionVersion(id: string, opts: {
|
|
269
|
+
versionName: string;
|
|
270
|
+
tdCopy?: boolean;
|
|
271
|
+
sourceVersionId?: string;
|
|
272
|
+
}): Promise<SavedRef>;
|
|
69
273
|
/** Never throw on unresolvable storyRef — the Java code logs and moves on so the save still lands. */
|
|
70
274
|
private resolveStoryNumericIdOrNull;
|
|
71
|
-
/** Resolve every
|
|
72
|
-
*
|
|
73
|
-
*
|
|
275
|
+
/** Resolve every param name referenced by the TC to a SQA parameter id via get-or-create.
|
|
276
|
+
* Sources: (a) `${name}` tokens in every step's description (manual + automation), and
|
|
277
|
+
* (b) keys of every automation step's `recordedParam` (action-argument names like
|
|
278
|
+
* "packageName", "activity", "keys"). Name-uniqueness is project-wide on the backend, so
|
|
279
|
+
* get-or-create means every TC using `${appUrl}` (or the same "packageName" recorded param)
|
|
280
|
+
* links to the same parameter row. */
|
|
74
281
|
private resolveParamIds;
|
|
282
|
+
/** POST /tm/action/search → per (technology, name) → row (id + objectRequired + objectTemplate).
|
|
283
|
+
* Cached per adapter instance: the catalog is customer-wide and rarely changes during a session.
|
|
284
|
+
* Keyed by `${technologyType}::${lowerCaseName}` so the same action name across two techs
|
|
285
|
+
* (e.g. "click" for WEB + ANDROID) resolves to the right numeric id. */
|
|
286
|
+
private actionCatalogCache;
|
|
287
|
+
private actionCatalog;
|
|
288
|
+
/** POST /tm/object/createObjectSeq — get-or-create the shared object row by locator match. The
|
|
289
|
+
* backend does the dedup (`object.controller.js:268-370`) — same-locators reuses, same-disname-
|
|
290
|
+
* different-locators creates a suffixed one. Returns the numeric object id.
|
|
291
|
+
*
|
|
292
|
+
* ponytail: minimum body — no thumbnail_url / pageScreenShot_url / parameterId. The recording
|
|
293
|
+
* path enriches these; the tc_save path doesn't have screenshots to attach, and the object
|
|
294
|
+
* works for execution without them. */
|
|
295
|
+
private resolveObjectId;
|
|
296
|
+
/** For every automation step, resolve `actionId` (from action name + technology) and
|
|
297
|
+
* `objectId` (via createObjectSeq get-or-create) so the mapper can emit a valid step. Runs
|
|
298
|
+
* once per save, aligned by step index. */
|
|
299
|
+
private resolveAutomationSteps;
|
|
75
300
|
/** Case-insensitive project-scoped exact-name lookup. Backend duplicate-name check uses Mongo
|
|
76
301
|
* collation strength:2, so a case-sensitive search here misses params stored under different
|
|
77
302
|
* casing — the next POST then trips "Duplicate Name Error". Returns null when not found. */
|
|
@@ -88,8 +313,61 @@ export declare class SimplifyQaAdapter {
|
|
|
88
313
|
/** Assemble the strict allow-listed suite entry for an ADD op. Required fields per the SQA
|
|
89
314
|
* validator: testcaseId, code, seq (set by the caller), version, versionId, tcType. */
|
|
90
315
|
private buildSuiteEntryFromTestcase;
|
|
316
|
+
/** name (UPPERCASE) → objecttemplateId. Rarely changes; cached per adapter instance like
|
|
317
|
+
* formulaCache. Populated from `POST /tm/objectTemplate/search` (confirmed endpoint,
|
|
318
|
+
* api-endpoints.ts `object.search`'s sibling `objectTemplate.search`). */
|
|
319
|
+
private objectTemplateCache;
|
|
320
|
+
private resolveObjectTemplateId;
|
|
321
|
+
/** `POST /tm/object/search` — objects visible in the current project. `q.query` free-text searches
|
|
322
|
+
* `disname` — the UI's "Name" column (confirmed against the real sqa-ui Object Repository grid;
|
|
323
|
+
* `description` is a separate, optional field and is NOT what users mean by an object's name). */
|
|
91
324
|
searchObjects(q: ObjectQuery): Promise<QaObject[]>;
|
|
325
|
+
/**
|
|
326
|
+
* Create a new object — `POST /tm/object`, plain JSON (NOT multipart, unlike testcase/suite writes;
|
|
327
|
+
* confirmed against the real sqa-ui ObjectService.saveNewObject). `o.objectType` is REQUIRED: it
|
|
328
|
+
* resolves to the object's `objecttemplateId` — structural, and (per updateObject's contract) not
|
|
329
|
+
* editable after creation. `moduleId` auto-resolves to the project's "Default Module" (matching the
|
|
330
|
+
* real UI's `object.component.ts` `openForm()`, which pre-selects it for every new object) — best
|
|
331
|
+
* effort, never blocks creation if no such module exists or the lookup fails.
|
|
332
|
+
*/
|
|
92
333
|
createObject(o: QaObject): Promise<QaObject>;
|
|
334
|
+
/** The current project's module literally named "Default Module" (case-insensitive) — mirrors the
|
|
335
|
+
* real sqa-ui `object.component.ts` `openForm()` auto-selection. Best-effort: returns undefined
|
|
336
|
+
* (never throws) when no such module exists or the lookup fails, so object creation still proceeds
|
|
337
|
+
* without a module rather than being blocked by this convenience. */
|
|
338
|
+
private resolveDefaultModuleId;
|
|
339
|
+
/**
|
|
340
|
+
* Soft-delete — `PATCH /tm/object` (NOT POST .../delete like testcase/suite; confirmed against the
|
|
341
|
+
* real sqa-ui ObjectService.deleteObject), body `{ids, projectId, isDelete:true}`.
|
|
342
|
+
*
|
|
343
|
+
* DEPENDENCY-CHECKED first: the SAME route with `isDelete:false` is a DRY RUN that returns, per
|
|
344
|
+
* object, which test cases / functions / workflows still reference it (`tcArr`/`fnArr`/`wfArr`, each
|
|
345
|
+
* keyed by projectId → an array of referencing ids — mirrors the real UI's
|
|
346
|
+
* deleteDependencyForObject flow, object.component.html/.ts). If anything still references it, the
|
|
347
|
+
* delete is refused rather than silently breaking those test cases; only a dependency-free object
|
|
348
|
+
* gets the real `isDelete:true` call.
|
|
349
|
+
*/
|
|
350
|
+
deleteObject(id: string): Promise<void>;
|
|
351
|
+
/**
|
|
352
|
+
* Update an object — `PUT /tm/object/:id`, plain JSON (NOT multipart, unlike testcase/suite writes;
|
|
353
|
+
* confirmed against the real sqa-ui ObjectService.update). The backend expects the FULL document
|
|
354
|
+
* back, so this reads the current one first and echoes every field it doesn't touch
|
|
355
|
+
* (disname/description/objecttemplateId/parameterId/moduleId/technology/updateVersion — the
|
|
356
|
+
* optimistic-concurrency token the real form also round-trips).
|
|
357
|
+
*
|
|
358
|
+
* `changes.locators` UPSERTS by locator name into the existing attribute list — an entry with a
|
|
359
|
+
* matching name gets its value/unique updated in place, everything else on the object is left alone,
|
|
360
|
+
* and a name with no existing match is appended as a new locator.
|
|
361
|
+
*
|
|
362
|
+
* `technology` (object type) and `objecttemplateId` are DELIBERATELY never taken from `changes` —
|
|
363
|
+
* they are always echoed back from the existing doc. Both are structural (they determine which
|
|
364
|
+
* attribute set is even valid for this object), so editing them here — outside the create flow — is
|
|
365
|
+
* out of scope; changing them means creating a new object, not "updating" this one.
|
|
366
|
+
*/
|
|
367
|
+
updateObject(id: string, changes: {
|
|
368
|
+
name?: string;
|
|
369
|
+
locators?: Locator[];
|
|
370
|
+
}): Promise<QaObject>;
|
|
93
371
|
actionsCatalog(platform?: string): Promise<ActionDef[]>;
|
|
94
372
|
/** Fetch the default (template) iteration row for a TC. Fills gaps from the raw TC:
|
|
95
373
|
* - versionId: falls back through versionId → selectedVersionId → versionsDetails.id → versions[0].id
|
|
@@ -106,9 +384,8 @@ export declare class SimplifyQaAdapter {
|
|
|
106
384
|
/** Environment key: caller wins; else fetch the project's configured envs and pick the first;
|
|
107
385
|
* else 'general' (matches the SQA UI fallback). */
|
|
108
386
|
private resolveEnvironment;
|
|
109
|
-
/** Parameter name
|
|
110
|
-
|
|
111
|
-
private fetchParameterName;
|
|
387
|
+
/** Parameter name + protected-flag lookup. Null when the parameter is deleted or cross-project. */
|
|
388
|
+
private fetchParameterMeta;
|
|
112
389
|
/** List every formula the current project can use — DEFAULT (customer-wide prefabs) unioned with
|
|
113
390
|
* CUSTOM entries scoped to the customer or this project. The backend endpoint already returns the
|
|
114
391
|
* union when called with `projectId`; we just normalise the doc shape and derive `scope` from
|
|
@@ -124,6 +401,10 @@ export declare class SimplifyQaAdapter {
|
|
|
124
401
|
/** Real status of a run — reads step-level results direct from SQA REST because the desktop agent's
|
|
125
402
|
* get_run only returns queue state (often stale). start/stop still hop for v1. */
|
|
126
403
|
getRun(runId: string): Promise<RunStatus>;
|
|
404
|
+
/** Targeted name lookup for a single project by numeric id — the whole-list `listProjects`
|
|
405
|
+
* is paged (default 100) and API-key scoping can hide the selected project, which left
|
|
406
|
+
* callers with an empty projectName. */
|
|
407
|
+
private lookupProjectName;
|
|
127
408
|
startRun(target: RunTarget, opts: RunOptions): Promise<RunRef>;
|
|
128
409
|
stopRun(runId: string): Promise<void>;
|
|
129
410
|
listCloudRunners(): Promise<CloudRunner[]>;
|
|
@@ -146,6 +427,8 @@ export declare class SimplifyQaAdapter {
|
|
|
146
427
|
private resolveLocalAgentId;
|
|
147
428
|
private detectExecutionOS;
|
|
148
429
|
private buildRunPlatform;
|
|
430
|
+
/** Direct REST — same endpoint `resolveEnvironment` uses. Works without an agent hop.
|
|
431
|
+
* `key` is what testdata iterations store as `environmentType`; `id` is the uuid used by run dispatch. */
|
|
149
432
|
listEnvironments(): Promise<EnvInfo[]>;
|
|
150
433
|
listDatasets(tcId?: string): Promise<DatasetInfo[]>;
|
|
151
434
|
readJournal(tcId: string): Promise<JournalView>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAU,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/adapter.ts"],"names":[],"mappings":"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"}
|