ado-sync 0.1.24 → 0.1.27
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 +240 -678
- package/dist/azure/client.d.ts +3 -0
- package/dist/azure/client.js +6 -0
- package/dist/azure/client.js.map +1 -1
- package/dist/azure/test-cases.d.ts +8 -3
- package/dist/azure/test-cases.js +406 -25
- package/dist/azure/test-cases.js.map +1 -1
- package/dist/cli.js +51 -4
- package/dist/cli.js.map +1 -1
- package/dist/config.js +111 -5
- package/dist/config.js.map +1 -1
- package/dist/parsers/csharp.d.ts +30 -0
- package/dist/parsers/csharp.js +257 -0
- package/dist/parsers/csharp.js.map +1 -0
- package/dist/parsers/gherkin.d.ts +4 -1
- package/dist/parsers/gherkin.js +19 -4
- package/dist/parsers/gherkin.js.map +1 -1
- package/dist/parsers/java.d.ts +40 -0
- package/dist/parsers/java.js +329 -0
- package/dist/parsers/java.js.map +1 -0
- package/dist/parsers/javascript.d.ts +33 -0
- package/dist/parsers/javascript.js +261 -0
- package/dist/parsers/javascript.js.map +1 -0
- package/dist/parsers/markdown.d.ts +4 -1
- package/dist/parsers/markdown.js +5 -3
- package/dist/parsers/markdown.js.map +1 -1
- package/dist/parsers/python.d.ts +34 -0
- package/dist/parsers/python.js +305 -0
- package/dist/parsers/python.js.map +1 -0
- package/dist/parsers/shared.d.ts +18 -0
- package/dist/parsers/shared.js +40 -0
- package/dist/parsers/shared.js.map +1 -1
- package/dist/sync/engine.js +114 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/publish-results.d.ts +49 -0
- package/dist/sync/publish-results.js +476 -0
- package/dist/sync/publish-results.js.map +1 -0
- package/dist/sync/writeback.d.ts +57 -1
- package/dist/sync/writeback.js +243 -0
- package/dist/sync/writeback.js.map +1 -1
- package/dist/types.d.ts +159 -2
- package/docs/advanced.md +350 -0
- package/docs/configuration.md +293 -0
- package/docs/publish-test-results.md +317 -0
- package/docs/spec-formats.md +595 -0
- package/package.json +1 -1
package/dist/sync/writeback.js
CHANGED
|
@@ -48,10 +48,15 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
48
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
49
|
exports.writebackGherkin = writebackGherkin;
|
|
50
50
|
exports.writebackMarkdown = writebackMarkdown;
|
|
51
|
+
exports.writebackCsharp = writebackCsharp;
|
|
52
|
+
exports.writebackJavaScript = writebackJavaScript;
|
|
53
|
+
exports.writebackPython = writebackPython;
|
|
54
|
+
exports.writebackJava = writebackJava;
|
|
51
55
|
exports.writebackId = writebackId;
|
|
52
56
|
const fs = __importStar(require("fs"));
|
|
53
57
|
const csv_1 = require("../parsers/csv");
|
|
54
58
|
const excel_1 = require("../parsers/excel");
|
|
59
|
+
const java_1 = require("../parsers/java");
|
|
55
60
|
// ─── Gherkin writeback ────────────────────────────────────────────────────────
|
|
56
61
|
/**
|
|
57
62
|
* Write (or update) the @tc:ID tag in a .feature file for a given scenario.
|
|
@@ -125,6 +130,232 @@ function writebackMarkdown(test, id, tagPrefix) {
|
|
|
125
130
|
}
|
|
126
131
|
fs.writeFileSync(test.filePath, lines.join('\n'), 'utf8');
|
|
127
132
|
}
|
|
133
|
+
// ─── C# writeback ─────────────────────────────────────────────────────────────
|
|
134
|
+
/**
|
|
135
|
+
* Write (or update) [TestProperty("tc", "ID")] in a .cs file for a given [TestMethod].
|
|
136
|
+
*
|
|
137
|
+
* Strategy:
|
|
138
|
+
* 1. Locate [TestMethod] at test.line (1-based).
|
|
139
|
+
* 2. Scan forward up to 20 lines for an existing [TestProperty("<tagPrefix>", "...")] — replace it.
|
|
140
|
+
* 3. If not found, insert immediately after the [TestMethod] line, matching indentation.
|
|
141
|
+
*
|
|
142
|
+
* Only the value is replaced on an existing attribute; all other attributes are untouched.
|
|
143
|
+
*/
|
|
144
|
+
function writebackCsharp(test, id, tagPrefix) {
|
|
145
|
+
const raw = fs.readFileSync(test.filePath, 'utf8');
|
|
146
|
+
const lines = raw.split('\n');
|
|
147
|
+
const testMethodLineIdx = test.line - 1; // 0-based
|
|
148
|
+
// Re-detect framework from the marker line so we use the correct attribute form.
|
|
149
|
+
// MSTest uses [TestProperty("key","val")], NUnit uses [Property("key","val")].
|
|
150
|
+
const markerTrimmed = (lines[testMethodLineIdx] ?? '').trim();
|
|
151
|
+
const isNUnit = /^\[Test[\]( ]/.test(markerTrimmed) && !/^\[TestMethod[\]( ]/.test(markerTrimmed);
|
|
152
|
+
const propAttrName = isNUnit ? 'Property' : 'TestProperty';
|
|
153
|
+
const newAttr = `[${propAttrName}("${tagPrefix}", "${id}")]`;
|
|
154
|
+
// Match either form so a pre-existing attribute written by a different tool is also replaced
|
|
155
|
+
const existingRe = new RegExp(`\\[(?:Test)?Property\\("${tagPrefix}",\\s*"\\d+"\\)\\]`);
|
|
156
|
+
// Detect indentation from the [TestMethod] / [Test] line
|
|
157
|
+
const indentMatch = (lines[testMethodLineIdx] ?? '').match(/^(\s*)/);
|
|
158
|
+
const indent = indentMatch ? indentMatch[1] : ' ';
|
|
159
|
+
// Scan forward for an existing property attribute within the attribute block
|
|
160
|
+
const scanEnd = Math.min(testMethodLineIdx + 20, lines.length);
|
|
161
|
+
let replaced = false;
|
|
162
|
+
for (let i = testMethodLineIdx + 1; i < scanEnd; i++) {
|
|
163
|
+
const trimmed = lines[i].trim();
|
|
164
|
+
// Stop once we reach the method signature or body
|
|
165
|
+
if (/^(public|private|protected|internal)\s/.test(trimmed) || trimmed === '{')
|
|
166
|
+
break;
|
|
167
|
+
if (existingRe.test(trimmed)) {
|
|
168
|
+
lines[i] = lines[i].replace(existingRe, newAttr);
|
|
169
|
+
replaced = true;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!replaced) {
|
|
174
|
+
// Insert on the line immediately after [TestMethod] / [Test]
|
|
175
|
+
lines.splice(testMethodLineIdx + 1, 0, `${indent}${newAttr}`);
|
|
176
|
+
}
|
|
177
|
+
fs.writeFileSync(test.filePath, lines.join('\n'), 'utf8');
|
|
178
|
+
}
|
|
179
|
+
// ─── JavaScript writeback ─────────────────────────────────────────────────────
|
|
180
|
+
/**
|
|
181
|
+
* Write (or update) the TC ID comment in a .js / .ts file for a given
|
|
182
|
+
* it() / test() call (Jest, Jasmine, WebdriverIO).
|
|
183
|
+
*
|
|
184
|
+
* Format: // @tc:12345 inserted immediately above the it() / test() line.
|
|
185
|
+
* No extra dependency required.
|
|
186
|
+
*
|
|
187
|
+
* Strategy:
|
|
188
|
+
* 1. Locate the it()/test() line at test.line (1-based).
|
|
189
|
+
* 2. Scan backward (up to 25 lines) for an existing // @{tagPrefix}:N comment.
|
|
190
|
+
* 3. If found, replace in place.
|
|
191
|
+
* 4. If not found, insert immediately above the it()/test() line.
|
|
192
|
+
*/
|
|
193
|
+
function writebackJavaScript(test, id, tagPrefix) {
|
|
194
|
+
const raw = fs.readFileSync(test.filePath, 'utf8');
|
|
195
|
+
const lines = raw.split('\n');
|
|
196
|
+
const itLineIdx = test.line - 1; // 0-based
|
|
197
|
+
const indentMatch = (lines[itLineIdx] ?? '').match(/^(\s*)/);
|
|
198
|
+
const indent = indentMatch ? indentMatch[1] : ' ';
|
|
199
|
+
const comment = `// @${tagPrefix}:${id}`;
|
|
200
|
+
const existingRe = new RegExp(`//\\s*@${tagPrefix}:\\d+`);
|
|
201
|
+
let replaced = false;
|
|
202
|
+
for (let i = itLineIdx - 1; i >= 0 && i >= itLineIdx - 25; i--) {
|
|
203
|
+
const trimmed = lines[i].trim();
|
|
204
|
+
if (existingRe.test(trimmed)) {
|
|
205
|
+
lines[i] = lines[i].replace(existingRe, comment.trim());
|
|
206
|
+
replaced = true;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
// Stop at blank lines — the ID comment must be adjacent to the test
|
|
210
|
+
if (trimmed === '')
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
if (!replaced) {
|
|
214
|
+
lines.splice(itLineIdx, 0, `${indent}${comment}`);
|
|
215
|
+
}
|
|
216
|
+
fs.writeFileSync(test.filePath, lines.join('\n'), 'utf8');
|
|
217
|
+
}
|
|
218
|
+
// ─── Python writeback ─────────────────────────────────────────────────────────
|
|
219
|
+
/**
|
|
220
|
+
* Write (or update) the TC ID in a .py file for a given def test_* function.
|
|
221
|
+
*
|
|
222
|
+
* Format: @pytest.mark.{tagPrefix}(12345) inserted immediately above the
|
|
223
|
+
* def line, below any other existing marks.
|
|
224
|
+
*
|
|
225
|
+
* No extra Python dependency — pytest is already on the test path.
|
|
226
|
+
*
|
|
227
|
+
* Strategy:
|
|
228
|
+
* 1. Locate the def line at test.line (1-based).
|
|
229
|
+
* 2. Scan backward (up to 30 lines) for an existing @pytest.mark.{tagPrefix}(N).
|
|
230
|
+
* Also recognises the comment fallback # @tc:N and replaces it with the mark.
|
|
231
|
+
* 3. If found, update in place.
|
|
232
|
+
* 4. If not found, insert @pytest.mark.{tagPrefix}(N) immediately above the def line.
|
|
233
|
+
*/
|
|
234
|
+
function writebackPython(test, id, tagPrefix) {
|
|
235
|
+
const raw = fs.readFileSync(test.filePath, 'utf8');
|
|
236
|
+
const lines = raw.split('\n');
|
|
237
|
+
const defLineIdx = test.line - 1; // 0-based
|
|
238
|
+
const indentMatch = (lines[defLineIdx] ?? '').match(/^(\s*)/);
|
|
239
|
+
const indent = indentMatch ? indentMatch[1] : '';
|
|
240
|
+
const newMark = `${indent}@pytest.mark.${tagPrefix}(${id})`;
|
|
241
|
+
const existMarkRe = new RegExp(`^\\s*@pytest\\.mark\\.${tagPrefix}\\(\\d+\\)\\s*$`);
|
|
242
|
+
const commentIdRe = new RegExp(`#\\s*@${tagPrefix}:\\d+`);
|
|
243
|
+
// Scan backward for an existing ID mark or comment
|
|
244
|
+
let replaced = false;
|
|
245
|
+
for (let i = defLineIdx - 1; i >= 0 && i >= defLineIdx - 30; i--) {
|
|
246
|
+
const trimmed = lines[i].trim();
|
|
247
|
+
if (existMarkRe.test(lines[i])) {
|
|
248
|
+
lines[i] = newMark;
|
|
249
|
+
replaced = true;
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
// Replace a legacy comment-style ID with the proper mark
|
|
253
|
+
if (commentIdRe.test(trimmed)) {
|
|
254
|
+
lines[i] = newMark;
|
|
255
|
+
replaced = true;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
// Stop at blank lines or non-decorator lines
|
|
259
|
+
if (trimmed === '' || (!trimmed.startsWith('@') && !trimmed.startsWith('#')))
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
if (!replaced) {
|
|
263
|
+
// Insert immediately above the def line
|
|
264
|
+
lines.splice(defLineIdx, 0, newMark);
|
|
265
|
+
}
|
|
266
|
+
fs.writeFileSync(test.filePath, lines.join('\n'), 'utf8');
|
|
267
|
+
}
|
|
268
|
+
// ─── Java writeback ───────────────────────────────────────────────────────────
|
|
269
|
+
/**
|
|
270
|
+
* Write (or update) the TC ID in a .java file for a given @Test method.
|
|
271
|
+
*
|
|
272
|
+
* Strategy by framework (detected from import statements):
|
|
273
|
+
*
|
|
274
|
+
* JUnit 5 → @Tag("tc:12345") inserted/updated in the annotation block above @Test.
|
|
275
|
+
* @Tag is already in junit-jupiter-api — no extra dependency.
|
|
276
|
+
* Scans both above and below @Test for an existing @Tag("tc:N") to update.
|
|
277
|
+
*
|
|
278
|
+
* JUnit 4 → // @tc:12345 comment inserted/updated immediately above @Test.
|
|
279
|
+
* TestNG → // @tc:12345 comment inserted/updated immediately above @Test.
|
|
280
|
+
* Note: @Test(tc="...") is not valid TestNG syntax.
|
|
281
|
+
* unknown → comment fallback (same as JUnit 4/TestNG).
|
|
282
|
+
*/
|
|
283
|
+
function writebackJava(test, id, tagPrefix) {
|
|
284
|
+
const raw = fs.readFileSync(test.filePath, 'utf8');
|
|
285
|
+
const lines = raw.split('\n');
|
|
286
|
+
const testAnnotationLineIdx = test.line - 1; // 0-based
|
|
287
|
+
const indentMatch = (lines[testAnnotationLineIdx] ?? '').match(/^(\s*)/);
|
|
288
|
+
const indent = indentMatch ? indentMatch[1] : ' ';
|
|
289
|
+
const framework = (0, java_1.detectJavaFramework)(lines);
|
|
290
|
+
if (framework === 'junit5') {
|
|
291
|
+
// ── JUnit 5: use @Tag("tc:12345") ──────────────────────────────────────
|
|
292
|
+
const newTag = `@Tag("${tagPrefix}:${id}")`;
|
|
293
|
+
const existingTagRe = new RegExp(`^@Tag\\(\\s*"${tagPrefix}:\\d+"\\s*\\)$`);
|
|
294
|
+
// Scan ABOVE @Test first (up to 25 lines)
|
|
295
|
+
let replaced = false;
|
|
296
|
+
for (let i = testAnnotationLineIdx - 1; i >= 0 && i >= testAnnotationLineIdx - 25; i--) {
|
|
297
|
+
const trimmed = lines[i].trim();
|
|
298
|
+
if (existingTagRe.test(trimmed)) {
|
|
299
|
+
lines[i] = lines[i].replace(existingTagRe, newTag);
|
|
300
|
+
replaced = true;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
if (trimmed === '}' || /^\s*(?:(?:public|protected|private|abstract|final)\s+)*class\s+/.test(trimmed))
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
// Scan BELOW @Test (annotation block, up to 25 lines) if not found above
|
|
307
|
+
if (!replaced) {
|
|
308
|
+
for (let i = testAnnotationLineIdx + 1; i < lines.length && i < testAnnotationLineIdx + 25; i++) {
|
|
309
|
+
const trimmed = lines[i].trim();
|
|
310
|
+
if (existingTagRe.test(trimmed)) {
|
|
311
|
+
lines[i] = lines[i].replace(existingTagRe, newTag);
|
|
312
|
+
replaced = true;
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
// Stop at method signature or body
|
|
316
|
+
if (!trimmed.startsWith('@') && trimmed.includes('('))
|
|
317
|
+
break;
|
|
318
|
+
if (trimmed === '{')
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (!replaced) {
|
|
323
|
+
// Insert immediately above the @Test line
|
|
324
|
+
lines.splice(testAnnotationLineIdx, 0, `${indent}${newTag}`);
|
|
325
|
+
}
|
|
326
|
+
// Also remove any stale comment-style ID that may have been written previously
|
|
327
|
+
const staleCommentRe = new RegExp(`//\\s*@${tagPrefix}:\\d+`);
|
|
328
|
+
for (let i = testAnnotationLineIdx; i >= 0 && i >= testAnnotationLineIdx - 25; i--) {
|
|
329
|
+
if (staleCommentRe.test(lines[i])) {
|
|
330
|
+
lines.splice(i, 1);
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
const t = lines[i]?.trim() ?? '';
|
|
334
|
+
if (t === '}' || /^\s*(?:(?:public|protected|private|abstract|final)\s+)*class\s+/.test(t))
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
// ── JUnit 4 / TestNG / unknown: use // @tc:12345 comment ───────────────
|
|
340
|
+
const comment = `// @${tagPrefix}:${id}`;
|
|
341
|
+
const existingCommentRe = new RegExp(`//\\s*@${tagPrefix}:\\d+`);
|
|
342
|
+
let replaced = false;
|
|
343
|
+
for (let i = testAnnotationLineIdx - 1; i >= 0 && i >= testAnnotationLineIdx - 25; i--) {
|
|
344
|
+
const trimmed = lines[i].trim();
|
|
345
|
+
if (existingCommentRe.test(trimmed)) {
|
|
346
|
+
lines[i] = lines[i].replace(existingCommentRe, comment.trim());
|
|
347
|
+
replaced = true;
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
if (trimmed === '}' || /^\s*(?:(?:public|protected|private|abstract|final)\s+)*class\s+/.test(trimmed))
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
if (!replaced) {
|
|
354
|
+
lines.splice(testAnnotationLineIdx, 0, `${indent}${comment}`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
fs.writeFileSync(test.filePath, lines.join('\n'), 'utf8');
|
|
358
|
+
}
|
|
128
359
|
// ─── Dispatcher ──────────────────────────────────────────────────────────────
|
|
129
360
|
async function writebackId(test, id, localType, tagPrefix) {
|
|
130
361
|
switch (localType) {
|
|
@@ -140,6 +371,18 @@ async function writebackId(test, id, localType, tagPrefix) {
|
|
|
140
371
|
case 'excel':
|
|
141
372
|
await (0, excel_1.writebackExcel)(test.filePath, test.title, id);
|
|
142
373
|
break;
|
|
374
|
+
case 'csharp':
|
|
375
|
+
writebackCsharp(test, id, tagPrefix);
|
|
376
|
+
break;
|
|
377
|
+
case 'java':
|
|
378
|
+
writebackJava(test, id, tagPrefix);
|
|
379
|
+
break;
|
|
380
|
+
case 'python':
|
|
381
|
+
writebackPython(test, id, tagPrefix);
|
|
382
|
+
break;
|
|
383
|
+
case 'javascript':
|
|
384
|
+
writebackJavaScript(test, id, tagPrefix);
|
|
385
|
+
break;
|
|
143
386
|
}
|
|
144
387
|
}
|
|
145
388
|
//# sourceMappingURL=writeback.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeback.js","sourceRoot":"","sources":["../../src/sync/writeback.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"writeback.js","sourceRoot":"","sources":["../../src/sync/writeback.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -29,11 +29,126 @@ export interface TestPlanEntry {
|
|
|
29
29
|
/** Override local.exclude for this plan */
|
|
30
30
|
exclude?: string | string[];
|
|
31
31
|
}
|
|
32
|
+
export interface StateConfig {
|
|
33
|
+
/** Set the TC State field to this value when the scenario has changed. e.g. "Design" */
|
|
34
|
+
setValueOnChangeTo?: string;
|
|
35
|
+
/** Optional tag expression to limit which scenarios trigger the state change. */
|
|
36
|
+
condition?: string;
|
|
37
|
+
}
|
|
38
|
+
export type FieldUpdateEvent = 'always' | 'onCreate' | 'onChange';
|
|
39
|
+
export interface FieldUpdateValue {
|
|
40
|
+
/** The value to set. May contain placeholders like {scenario-name}, {feature-name}. */
|
|
41
|
+
value?: string;
|
|
42
|
+
/** When to apply the update. Default: 'always'. */
|
|
43
|
+
update?: FieldUpdateEvent;
|
|
44
|
+
/** Tag expression condition. Update only when this condition matches. */
|
|
45
|
+
condition?: string;
|
|
46
|
+
/** Whether to remove matching tags from the tags list. Default: true. */
|
|
47
|
+
removeMatchingTags?: boolean;
|
|
48
|
+
/** Switch-style conditional values. Keys are tag expressions, values are field values. */
|
|
49
|
+
conditionalValue?: Record<string, string>;
|
|
50
|
+
}
|
|
51
|
+
/** Each key is a field name/reference, value is either a simple string or an update specifier. */
|
|
52
|
+
export type FieldUpdates = Record<string, string | FieldUpdateValue>;
|
|
53
|
+
export interface FieldDefaultsConfig {
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
/** Field reference name → default value. Applied only on create. */
|
|
56
|
+
defaultValues: Record<string, string>;
|
|
57
|
+
}
|
|
58
|
+
export interface IgnoreTestCaseTagsConfig {
|
|
59
|
+
enabled: boolean;
|
|
60
|
+
/** Tag names or patterns with trailing wildcard. e.g. ["mytag", "ado-tag*"] */
|
|
61
|
+
tags: string[];
|
|
62
|
+
}
|
|
63
|
+
export interface TagTextMapConfig {
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
/** Character/substring replacements applied to tags before push. e.g. { "_": " " } */
|
|
66
|
+
textMap: Record<string, string>;
|
|
67
|
+
}
|
|
68
|
+
export interface CustomizationsConfig {
|
|
69
|
+
fieldDefaults?: FieldDefaultsConfig;
|
|
70
|
+
ignoreTestCaseTags?: IgnoreTestCaseTagsConfig;
|
|
71
|
+
tagTextMapTransformation?: TagTextMapConfig;
|
|
72
|
+
}
|
|
73
|
+
export interface FormatConfig {
|
|
74
|
+
/** When true, Then steps are put in the Expected Result column. Default: false. */
|
|
75
|
+
useExpectedResult?: boolean;
|
|
76
|
+
/** Value to use when a step action is empty. Default: undefined (blank). */
|
|
77
|
+
emptyActionValue?: string;
|
|
78
|
+
/** Value to use when step expected result is empty. Default: undefined (blank). */
|
|
79
|
+
emptyExpectedResultValue?: string;
|
|
80
|
+
/** When true, data tables are synced as plain text instead of sub-steps. Default: false. */
|
|
81
|
+
syncDataTableAsText?: boolean;
|
|
82
|
+
/** When true, background steps get a "Background:" prefix. Default: true. */
|
|
83
|
+
prefixBackgroundSteps?: boolean;
|
|
84
|
+
/** When true, TC title gets "Scenario:" or "Scenario Outline:" prefix. Default: true. */
|
|
85
|
+
prefixTitle?: boolean;
|
|
86
|
+
/** Control parameter list step: 'whenUnusedParameters' | 'always' | 'never'. Default: 'whenUnusedParameters'. */
|
|
87
|
+
showParameterListStep?: 'whenUnusedParameters' | 'always' | 'never';
|
|
88
|
+
}
|
|
89
|
+
export interface AttachmentsConfig {
|
|
90
|
+
enabled: boolean;
|
|
91
|
+
/** Additional tag prefixes beyond the default 'attachment'. e.g. ['wireframe','specification'] */
|
|
92
|
+
tagPrefixes?: string[];
|
|
93
|
+
/** Base folder for attached files (relative to config dir). When omitted, relative to feature file. */
|
|
94
|
+
baseFolder?: string;
|
|
95
|
+
}
|
|
96
|
+
export interface PullConfig {
|
|
97
|
+
enabled?: boolean;
|
|
98
|
+
/** When true, pull creates new local test case files for TCs not yet linked. */
|
|
99
|
+
enableCreatingNewLocalTestCases?: boolean;
|
|
100
|
+
/** Folder for newly created local files (relative to config dir). Defaults to '.'. */
|
|
101
|
+
targetFolder?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface TestResultSource {
|
|
104
|
+
/** Path to test result file (relative to config dir or absolute). */
|
|
105
|
+
value: string;
|
|
106
|
+
/** Format of the result file. e.g. 'trx', 'junit', 'cucumberJson'. */
|
|
107
|
+
format?: string;
|
|
108
|
+
}
|
|
109
|
+
export interface PublishTestResultsConfig {
|
|
110
|
+
testResult?: {
|
|
111
|
+
sources: TestResultSource[];
|
|
112
|
+
};
|
|
113
|
+
/** Map inconclusive test outcomes to another value (e.g. 'Failed', 'NotExecuted'). */
|
|
114
|
+
treatInconclusiveAs?: string;
|
|
115
|
+
/** How to handle flaky tests. Default: 'lastAttemptOutcome'. */
|
|
116
|
+
flakyTestOutcome?: 'lastAttemptOutcome' | 'firstAttemptOutcome' | 'worstOutcome';
|
|
117
|
+
testConfiguration?: {
|
|
118
|
+
name?: string;
|
|
119
|
+
id?: number;
|
|
120
|
+
};
|
|
121
|
+
testSuite?: {
|
|
122
|
+
name?: string;
|
|
123
|
+
id?: number;
|
|
124
|
+
testPlan?: string;
|
|
125
|
+
};
|
|
126
|
+
testRunSettings?: {
|
|
127
|
+
name?: string;
|
|
128
|
+
comment?: string;
|
|
129
|
+
runType?: 'Automated' | 'Manual';
|
|
130
|
+
};
|
|
131
|
+
testResultSettings?: {
|
|
132
|
+
comment?: string;
|
|
133
|
+
};
|
|
134
|
+
/** Controls which attachments are published for passing tests. */
|
|
135
|
+
publishAttachmentsForPassingTests?: 'none' | 'files' | 'all';
|
|
136
|
+
}
|
|
137
|
+
export interface ToolSettings {
|
|
138
|
+
licensePath?: string;
|
|
139
|
+
disableStats?: boolean;
|
|
140
|
+
outputLevel?: 'normal' | 'verbose' | 'quiet';
|
|
141
|
+
/** Path to a parent config file for hierarchical configuration. */
|
|
142
|
+
parentConfig?: string;
|
|
143
|
+
ignoreParentConfig?: boolean;
|
|
144
|
+
}
|
|
32
145
|
export interface SyncConfig {
|
|
33
146
|
/** Azure DevOps organisation URL, e.g. https://dev.azure.com/myorg */
|
|
34
147
|
orgUrl: string;
|
|
35
148
|
/** Azure DevOps project name */
|
|
36
149
|
project: string;
|
|
150
|
+
/** A unique identifier for this config within the ADO project. Prevents multi-config conflicts. */
|
|
151
|
+
configurationKey?: string;
|
|
37
152
|
/** Authentication */
|
|
38
153
|
auth: {
|
|
39
154
|
type: AuthType;
|
|
@@ -54,13 +169,24 @@ export interface SyncConfig {
|
|
|
54
169
|
testPlans?: TestPlanEntry[];
|
|
55
170
|
/** Local spec sources */
|
|
56
171
|
local: {
|
|
57
|
-
/** 'gherkin' for .feature files, 'markdown' for .md
|
|
58
|
-
type: 'gherkin' | 'markdown' | 'csv' | 'excel';
|
|
172
|
+
/** 'gherkin' for .feature files, 'markdown' for .md, 'csharp' for MSTest/NUnit .cs, 'java' for JUnit/TestNG .java, 'python' for pytest .py, 'javascript' for Jest/Jasmine/WebdriverIO .js/.ts */
|
|
173
|
+
type: 'gherkin' | 'markdown' | 'csv' | 'excel' | 'csharp' | 'java' | 'python' | 'javascript';
|
|
59
174
|
/** Glob pattern(s) relative to config file location */
|
|
60
175
|
include: string | string[];
|
|
61
176
|
/** Glob pattern(s) to exclude */
|
|
62
177
|
exclude?: string | string[];
|
|
178
|
+
/**
|
|
179
|
+
* Tag expression condition to filter which scenarios are included in sync.
|
|
180
|
+
* e.g. "@done and not (@ignored or @planned)"
|
|
181
|
+
*/
|
|
182
|
+
condition?: string;
|
|
63
183
|
};
|
|
184
|
+
/** Tool settings */
|
|
185
|
+
toolSettings?: ToolSettings;
|
|
186
|
+
/** Customizations */
|
|
187
|
+
customizations?: CustomizationsConfig;
|
|
188
|
+
/** Publish test results configuration */
|
|
189
|
+
publishTestResults?: PublishTestResultsConfig;
|
|
64
190
|
/** Sync behaviour */
|
|
65
191
|
sync?: {
|
|
66
192
|
/** Prefix used in tags/comments to store the Azure test case ID. Default: 'tc' */
|
|
@@ -108,12 +234,29 @@ export interface SyncConfig {
|
|
|
108
234
|
* - suite: "All Tests"
|
|
109
235
|
*/
|
|
110
236
|
suiteConditions?: SuiteCondition[];
|
|
237
|
+
/** State field configuration: set TC state when scenario changes. */
|
|
238
|
+
state?: StateConfig;
|
|
239
|
+
/** Field update rules applied on push. Keys are field names/references. */
|
|
240
|
+
fieldUpdates?: FieldUpdates;
|
|
241
|
+
/** Format configuration for how test case content is structured. */
|
|
242
|
+
format?: FormatConfig;
|
|
243
|
+
/** Attachment sync configuration: attach files to TCs via tags. */
|
|
244
|
+
attachments?: AttachmentsConfig;
|
|
245
|
+
/** Pull-specific configuration. */
|
|
246
|
+
pull?: PullConfig;
|
|
111
247
|
};
|
|
112
248
|
}
|
|
113
249
|
export interface ParsedStep {
|
|
114
250
|
keyword: string;
|
|
115
251
|
text: string;
|
|
116
252
|
expected?: string;
|
|
253
|
+
/** True when this step came from a Background block (Scenario Outline path only). */
|
|
254
|
+
isBackground?: boolean;
|
|
255
|
+
/**
|
|
256
|
+
* Data table attached to this step. Each element is one row of cell values.
|
|
257
|
+
* Present when the step has an inline Gherkin data table.
|
|
258
|
+
*/
|
|
259
|
+
dataTable?: string[][];
|
|
117
260
|
}
|
|
118
261
|
export interface ParsedTest {
|
|
119
262
|
/** Absolute path to the local file */
|
|
@@ -138,6 +281,12 @@ export interface ParsedTest {
|
|
|
138
281
|
headers: string[];
|
|
139
282
|
rows: string[][];
|
|
140
283
|
};
|
|
284
|
+
/**
|
|
285
|
+
* Fully-qualified automated test name. For C# tests this is "Namespace.Class.Method"
|
|
286
|
+
* and is used to populate Microsoft.VSTS.TCM.AutomatedTestName when markAutomated is true.
|
|
287
|
+
* When absent, the name is derived from file basename + scenario title.
|
|
288
|
+
*/
|
|
289
|
+
automatedTestName?: string;
|
|
141
290
|
/**
|
|
142
291
|
* Work item link references extracted from tags matching sync.links config.
|
|
143
292
|
* e.g. @story:123 → { prefix: 'story', id: 123 }
|
|
@@ -146,6 +295,14 @@ export interface ParsedTest {
|
|
|
146
295
|
prefix: string;
|
|
147
296
|
id: number;
|
|
148
297
|
}>;
|
|
298
|
+
/**
|
|
299
|
+
* Attachment file references extracted from tags matching attachment config.
|
|
300
|
+
* e.g. @attachment:screen.png → { prefix: 'attachment', filePath: 'screen.png' }
|
|
301
|
+
*/
|
|
302
|
+
attachmentRefs?: Array<{
|
|
303
|
+
prefix: string;
|
|
304
|
+
filePath: string;
|
|
305
|
+
}>;
|
|
149
306
|
}
|
|
150
307
|
export interface AzureTestCase {
|
|
151
308
|
id: number;
|