ado-sync 0.1.2 → 0.1.4
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/azure/test-cases.d.ts +16 -3
- package/dist/azure/test-cases.js +258 -19
- package/dist/azure/test-cases.js.map +1 -1
- package/dist/cli.js +23 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.js +50 -2
- package/dist/config.js.map +1 -1
- package/dist/parsers/gherkin.d.ts +9 -14
- package/dist/parsers/gherkin.js +94 -34
- package/dist/parsers/gherkin.js.map +1 -1
- package/dist/parsers/markdown.d.ts +7 -6
- package/dist/parsers/markdown.js +30 -9
- package/dist/parsers/markdown.js.map +1 -1
- package/dist/parsers/shared.d.ts +20 -0
- package/dist/parsers/shared.js +81 -0
- package/dist/parsers/shared.js.map +1 -0
- package/dist/sync/cache.d.ts +24 -0
- package/dist/sync/cache.js +83 -0
- package/dist/sync/cache.js.map +1 -0
- package/dist/sync/engine.d.ts +0 -2
- package/dist/sync/engine.js +200 -30
- package/dist/sync/engine.js.map +1 -1
- package/dist/types.d.ts +57 -2
- package/package.json +2 -2
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Local state cache (.ado-sync-state.json).
|
|
4
|
+
*
|
|
5
|
+
* Stores the last-synced state of each Azure Test Case, enabling:
|
|
6
|
+
* - Conflict detection: remote was changed since we last pushed
|
|
7
|
+
* - Faster status checks: skip Azure API call when nothing changed
|
|
8
|
+
*
|
|
9
|
+
* Commit this file to version control so all team members and CI
|
|
10
|
+
* share the same last-synced state.
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.loadCache = loadCache;
|
|
47
|
+
exports.saveCache = saveCache;
|
|
48
|
+
exports.hashSteps = hashSteps;
|
|
49
|
+
exports.hashString = hashString;
|
|
50
|
+
const crypto = __importStar(require("crypto"));
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const CACHE_FILENAME = '.ado-sync-state.json';
|
|
54
|
+
function loadCache(configDir) {
|
|
55
|
+
const cachePath = path.join(configDir, CACHE_FILENAME);
|
|
56
|
+
if (!fs.existsSync(cachePath))
|
|
57
|
+
return {};
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(fs.readFileSync(cachePath, 'utf8'));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function saveCache(configDir, cache) {
|
|
66
|
+
const cachePath = path.join(configDir, CACHE_FILENAME);
|
|
67
|
+
fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2), 'utf8');
|
|
68
|
+
}
|
|
69
|
+
function hashSteps(steps) {
|
|
70
|
+
const text = steps
|
|
71
|
+
.map((s) => {
|
|
72
|
+
if ('keyword' in s) {
|
|
73
|
+
return `${s.keyword} ${s.text}|${s.expected ?? ''}`;
|
|
74
|
+
}
|
|
75
|
+
return `${s.action}|${s.expected}`;
|
|
76
|
+
})
|
|
77
|
+
.join('\n');
|
|
78
|
+
return crypto.createHash('sha256').update(text).digest('hex');
|
|
79
|
+
}
|
|
80
|
+
function hashString(s) {
|
|
81
|
+
return crypto.createHash('sha256').update(s ?? '').digest('hex');
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/sync/cache.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBH,8BAQC;AAED,8BAGC;AAED,8BAUC;AAED,gCAEC;AAhDD,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAI7B,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAa9C,SAAgB,SAAS,CAAC,SAAiB;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAc,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,SAAS,CAAC,SAAiB,EAAE,KAAgB;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACvD,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,SAAgB,SAAS,CAAC,KAAiC;IACzD,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,UAAU,CAAC,CAAqB;IAC9C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC"}
|
package/dist/sync/engine.d.ts
CHANGED
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
import { SyncConfig, SyncResult } from '../types';
|
|
5
5
|
export interface SyncOpts {
|
|
6
6
|
dryRun?: boolean;
|
|
7
|
-
/** Cucumber tag expression to restrict which scenarios are synced.
|
|
8
|
-
* Examples: "@smoke" "@smoke and not @wip" "not @manual" */
|
|
9
7
|
tags?: string;
|
|
10
8
|
}
|
|
11
9
|
export declare function push(config: SyncConfig, configDir: string, opts?: SyncOpts): Promise<SyncResult[]>;
|
package/dist/sync/engine.js
CHANGED
|
@@ -49,29 +49,21 @@ const client_1 = require("../azure/client");
|
|
|
49
49
|
const test_cases_1 = require("../azure/test-cases");
|
|
50
50
|
const gherkin_1 = require("../parsers/gherkin");
|
|
51
51
|
const markdown_1 = require("../parsers/markdown");
|
|
52
|
+
const cache_1 = require("./cache");
|
|
52
53
|
const writeback_1 = require("./writeback");
|
|
53
54
|
// ─── Tag filtering ────────────────────────────────────────────────────────────
|
|
54
|
-
/**
|
|
55
|
-
* Returns true when the test's tags satisfy the given tag expression.
|
|
56
|
-
* Expression syntax mirrors Cucumber: "@smoke and not @wip"
|
|
57
|
-
* Tags in ParsedTest are stored without the leading @.
|
|
58
|
-
* The expression evaluator expects them with @, so we re-add it here.
|
|
59
|
-
*/
|
|
60
55
|
function matchesTags(test, expression) {
|
|
61
56
|
const node = (0, tag_expressions_1.default)(expression);
|
|
62
|
-
// Tags in ParsedTest have no leading '@'; tag-expressions evaluator needs them with '@'
|
|
63
57
|
const tagsWithAt = test.tags.map((t) => (t.startsWith('@') ? t : `@${t}`));
|
|
64
58
|
return node.evaluate(tagsWithAt);
|
|
65
59
|
}
|
|
66
60
|
// ─── File discovery ───────────────────────────────────────────────────────────
|
|
67
|
-
async function discoverFiles(
|
|
68
|
-
const patterns = Array.isArray(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
? config.local.exclude
|
|
74
|
-
: [config.local.exclude]
|
|
61
|
+
async function discoverFiles(include, exclude, configDir) {
|
|
62
|
+
const patterns = Array.isArray(include) ? include : [include];
|
|
63
|
+
const excludes = exclude
|
|
64
|
+
? Array.isArray(exclude)
|
|
65
|
+
? exclude
|
|
66
|
+
: [exclude]
|
|
75
67
|
: [];
|
|
76
68
|
const all = [];
|
|
77
69
|
for (const pattern of patterns) {
|
|
@@ -87,12 +79,13 @@ async function discoverFiles(config, configDir) {
|
|
|
87
79
|
// ─── Local file parsing ───────────────────────────────────────────────────────
|
|
88
80
|
function parseLocalFiles(filePaths, config, tagsFilter) {
|
|
89
81
|
const tagPrefix = config.sync?.tagPrefix ?? 'tc';
|
|
82
|
+
const linkConfigs = config.sync?.links;
|
|
90
83
|
const results = [];
|
|
91
84
|
for (const fp of filePaths) {
|
|
92
85
|
try {
|
|
93
86
|
const tests = config.local.type === 'gherkin'
|
|
94
|
-
? (0, gherkin_1.parseGherkinFile)(fp, tagPrefix)
|
|
95
|
-
: (0, markdown_1.parseMarkdownFile)(fp, tagPrefix);
|
|
87
|
+
? (0, gherkin_1.parseGherkinFile)(fp, tagPrefix, linkConfigs)
|
|
88
|
+
: (0, markdown_1.parseMarkdownFile)(fp, tagPrefix, linkConfigs);
|
|
96
89
|
for (const t of tests) {
|
|
97
90
|
if (tagsFilter && !matchesTags(t, tagsFilter))
|
|
98
91
|
continue;
|
|
@@ -105,17 +98,58 @@ function parseLocalFiles(filePaths, config, tagsFilter) {
|
|
|
105
98
|
}
|
|
106
99
|
return results;
|
|
107
100
|
}
|
|
101
|
+
// ─── Multi-plan helpers ───────────────────────────────────────────────────────
|
|
102
|
+
/**
|
|
103
|
+
* Build an effective config for a single plan entry in testPlans[] mode.
|
|
104
|
+
* Overrides testPlan and local include/exclude without mutating the original.
|
|
105
|
+
*/
|
|
106
|
+
function configForPlanEntry(base, entry) {
|
|
107
|
+
return {
|
|
108
|
+
...base,
|
|
109
|
+
testPlan: {
|
|
110
|
+
id: entry.id,
|
|
111
|
+
suiteId: entry.suiteId ?? base.testPlan.suiteId,
|
|
112
|
+
suiteMapping: entry.suiteMapping ?? base.testPlan.suiteMapping,
|
|
113
|
+
},
|
|
114
|
+
local: {
|
|
115
|
+
...base.local,
|
|
116
|
+
include: entry.include ?? base.local.include,
|
|
117
|
+
exclude: entry.exclude ?? base.local.exclude,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
108
121
|
// ─── Push ─────────────────────────────────────────────────────────────────────
|
|
109
122
|
async function push(config, configDir, opts = {}) {
|
|
110
|
-
|
|
123
|
+
// Multi-plan: delegate to each plan entry
|
|
124
|
+
if (config.testPlans?.length) {
|
|
125
|
+
const all = [];
|
|
126
|
+
for (const entry of config.testPlans) {
|
|
127
|
+
const entryConfig = configForPlanEntry(config, entry);
|
|
128
|
+
all.push(...await pushSingle(entryConfig, configDir, opts));
|
|
129
|
+
}
|
|
130
|
+
return all;
|
|
131
|
+
}
|
|
132
|
+
return pushSingle(config, configDir, opts);
|
|
133
|
+
}
|
|
134
|
+
async function pushSingle(config, configDir, opts) {
|
|
135
|
+
const files = await discoverFiles(config.local.include, config.local.exclude, configDir);
|
|
111
136
|
const tests = parseLocalFiles(files, config, opts.tags);
|
|
112
137
|
const client = await client_1.AzureClient.create(config);
|
|
113
138
|
const tagPrefix = config.sync?.tagPrefix ?? 'tc';
|
|
139
|
+
const titleField = config.sync?.titleField ?? 'System.Title';
|
|
140
|
+
const conflictAction = config.sync?.conflictAction ?? 'overwrite';
|
|
141
|
+
const disableLocal = config.sync?.disableLocalChanges ?? false;
|
|
142
|
+
const byFolder = config.testPlan.suiteMapping === 'byFolder';
|
|
143
|
+
const suiteCache = new Map();
|
|
114
144
|
const results = [];
|
|
145
|
+
const conflicts = [];
|
|
146
|
+
// Load local cache for conflict detection and skip optimisation
|
|
147
|
+
const cache = (0, cache_1.loadCache)(configDir);
|
|
115
148
|
for (const test of tests) {
|
|
116
149
|
if (test.azureId) {
|
|
117
150
|
try {
|
|
118
|
-
const
|
|
151
|
+
const cached = cache[test.azureId];
|
|
152
|
+
const remote = await (0, test_cases_1.getTestCase)(client, test.azureId, titleField);
|
|
119
153
|
if (!remote) {
|
|
120
154
|
results.push({
|
|
121
155
|
action: 'error',
|
|
@@ -131,11 +165,33 @@ async function push(config, configDir, opts = {}) {
|
|
|
131
165
|
const titleChanged = remote.title !== test.title;
|
|
132
166
|
const stepsChanged = localStepsText !== remoteStepsText;
|
|
133
167
|
if (!titleChanged && !stepsChanged) {
|
|
168
|
+
// Update cache entry even on skip (changedDate may differ due to other fields)
|
|
169
|
+
updateCacheEntry(cache, test, remote);
|
|
134
170
|
results.push({ action: 'skipped', filePath: test.filePath, title: test.title, azureId: test.azureId });
|
|
135
171
|
continue;
|
|
136
172
|
}
|
|
173
|
+
// Conflict detection: remote was changed since last push AND local also differs
|
|
174
|
+
if (cached && remote.changedDate && remote.changedDate !== cached.changedDate) {
|
|
175
|
+
const conflict = {
|
|
176
|
+
action: 'conflict',
|
|
177
|
+
filePath: test.filePath,
|
|
178
|
+
title: test.title,
|
|
179
|
+
azureId: test.azureId,
|
|
180
|
+
detail: 'Both local and remote have changed since last sync',
|
|
181
|
+
};
|
|
182
|
+
if (conflictAction === 'skip') {
|
|
183
|
+
results.push(conflict);
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (conflictAction === 'fail') {
|
|
187
|
+
conflicts.push(conflict);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
// 'overwrite' — fall through to update
|
|
191
|
+
}
|
|
137
192
|
if (!opts.dryRun) {
|
|
138
193
|
await (0, test_cases_1.updateTestCase)(client, test.azureId, test, config);
|
|
194
|
+
updateCacheEntry(cache, test, remote);
|
|
139
195
|
}
|
|
140
196
|
results.push({ action: 'updated', filePath: test.filePath, title: test.title, azureId: test.azureId });
|
|
141
197
|
}
|
|
@@ -147,8 +203,17 @@ async function push(config, configDir, opts = {}) {
|
|
|
147
203
|
try {
|
|
148
204
|
let newId;
|
|
149
205
|
if (!opts.dryRun) {
|
|
150
|
-
|
|
151
|
-
|
|
206
|
+
const suiteIdOverride = byFolder
|
|
207
|
+
? await (0, test_cases_1.getOrCreateSuiteForFile)(client, config, test.filePath, configDir, suiteCache)
|
|
208
|
+
: undefined;
|
|
209
|
+
newId = await (0, test_cases_1.createTestCase)(client, test, config, suiteIdOverride);
|
|
210
|
+
if (!disableLocal) {
|
|
211
|
+
(0, writeback_1.writebackId)(test, newId, config.local.type, tagPrefix);
|
|
212
|
+
}
|
|
213
|
+
// Fetch back to get changedDate for cache
|
|
214
|
+
const created = await (0, test_cases_1.getTestCase)(client, newId, titleField);
|
|
215
|
+
if (created)
|
|
216
|
+
updateCacheEntry(cache, test, created);
|
|
152
217
|
}
|
|
153
218
|
results.push({ action: 'created', filePath: test.filePath, title: test.title, azureId: newId });
|
|
154
219
|
}
|
|
@@ -157,18 +222,60 @@ async function push(config, configDir, opts = {}) {
|
|
|
157
222
|
}
|
|
158
223
|
}
|
|
159
224
|
}
|
|
225
|
+
if (conflicts.length) {
|
|
226
|
+
const titles = conflicts.map((c) => ` #${c.azureId} — ${c.title}`).join('\n');
|
|
227
|
+
throw new Error(`Conflicts detected (conflictAction=fail):\n${titles}`);
|
|
228
|
+
}
|
|
229
|
+
// Removed TC detection: find suite TCs not referenced by any local test
|
|
230
|
+
if (!opts.dryRun || true /* show removed in dry-run too */) {
|
|
231
|
+
try {
|
|
232
|
+
const remoteTcs = await (0, test_cases_1.getTestCasesInSuite)(client, config);
|
|
233
|
+
const localIds = new Set(tests.map((t) => t.azureId).filter(Boolean));
|
|
234
|
+
for (const remote of remoteTcs) {
|
|
235
|
+
if (!localIds.has(remote.id)) {
|
|
236
|
+
if (!opts.dryRun) {
|
|
237
|
+
await (0, test_cases_1.tagTestCaseAsRemoved)(client, remote.id);
|
|
238
|
+
}
|
|
239
|
+
results.push({
|
|
240
|
+
action: 'removed',
|
|
241
|
+
filePath: '',
|
|
242
|
+
title: remote.title,
|
|
243
|
+
azureId: remote.id,
|
|
244
|
+
detail: opts.dryRun ? 'would tag as ado-sync:removed' : 'tagged ado-sync:removed',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch { /* best-effort: don't fail the whole push */ }
|
|
250
|
+
}
|
|
251
|
+
if (!opts.dryRun) {
|
|
252
|
+
(0, cache_1.saveCache)(configDir, cache);
|
|
253
|
+
}
|
|
160
254
|
return results;
|
|
161
255
|
}
|
|
162
256
|
// ─── Pull ─────────────────────────────────────────────────────────────────────
|
|
163
257
|
async function pull(config, configDir, opts = {}) {
|
|
164
|
-
|
|
258
|
+
if (config.testPlans?.length) {
|
|
259
|
+
const all = [];
|
|
260
|
+
for (const entry of config.testPlans) {
|
|
261
|
+
all.push(...await pullSingle(configForPlanEntry(config, entry), configDir, opts));
|
|
262
|
+
}
|
|
263
|
+
return all;
|
|
264
|
+
}
|
|
265
|
+
return pullSingle(config, configDir, opts);
|
|
266
|
+
}
|
|
267
|
+
async function pullSingle(config, configDir, opts) {
|
|
268
|
+
const files = await discoverFiles(config.local.include, config.local.exclude, configDir);
|
|
165
269
|
const tests = parseLocalFiles(files, config, opts.tags);
|
|
166
270
|
const client = await client_1.AzureClient.create(config);
|
|
271
|
+
const titleField = config.sync?.titleField ?? 'System.Title';
|
|
272
|
+
const disableLocal = config.sync?.disableLocalChanges ?? false;
|
|
167
273
|
const results = [];
|
|
274
|
+
const cache = (0, cache_1.loadCache)(configDir);
|
|
168
275
|
const linked = tests.filter((t) => t.azureId !== undefined);
|
|
169
276
|
for (const test of linked) {
|
|
170
277
|
try {
|
|
171
|
-
const remote = await (0, test_cases_1.getTestCase)(client, test.azureId);
|
|
278
|
+
const remote = await (0, test_cases_1.getTestCase)(client, test.azureId, titleField);
|
|
172
279
|
if (!remote) {
|
|
173
280
|
results.push({
|
|
174
281
|
action: 'error',
|
|
@@ -183,38 +290,61 @@ async function pull(config, configDir, opts = {}) {
|
|
|
183
290
|
const remoteStepsText = remote.steps.map((s) => s.action + '|' + s.expected).join('\n');
|
|
184
291
|
const localStepsText = test.steps.map((s) => s.keyword + ' ' + s.text + '|' + (s.expected ?? '')).join('\n');
|
|
185
292
|
const stepsChanged = remoteStepsText !== localStepsText;
|
|
186
|
-
|
|
293
|
+
const descriptionChanged = (remote.description ?? '') !== (test.description ?? '');
|
|
294
|
+
if (!titleChanged && !stepsChanged && !descriptionChanged) {
|
|
187
295
|
results.push({ action: 'skipped', filePath: test.filePath, title: test.title, azureId: test.azureId });
|
|
188
296
|
continue;
|
|
189
297
|
}
|
|
190
298
|
if (!opts.dryRun) {
|
|
191
|
-
|
|
299
|
+
if (!disableLocal) {
|
|
300
|
+
applyRemoteToLocal(test, remote.title, remote.steps.map((s) => ({ keyword: 'Step', text: s.action, expected: s.expected })), remote.description, config.local.type);
|
|
301
|
+
}
|
|
302
|
+
updateCacheEntry(cache, test, remote);
|
|
192
303
|
}
|
|
193
304
|
results.push({
|
|
194
305
|
action: 'pulled',
|
|
195
306
|
filePath: test.filePath,
|
|
196
307
|
title: remote.title,
|
|
197
308
|
azureId: test.azureId,
|
|
198
|
-
detail: [
|
|
309
|
+
detail: [
|
|
310
|
+
titleChanged && 'title',
|
|
311
|
+
stepsChanged && 'steps',
|
|
312
|
+
descriptionChanged && 'description',
|
|
313
|
+
].filter(Boolean).join(', ') + ' changed' + (disableLocal ? ' (local changes skipped)' : ''),
|
|
199
314
|
});
|
|
200
315
|
}
|
|
201
316
|
catch (err) {
|
|
202
317
|
results.push({ action: 'error', filePath: test.filePath, title: test.title, azureId: test.azureId, detail: err.message });
|
|
203
318
|
}
|
|
204
319
|
}
|
|
320
|
+
if (!opts.dryRun) {
|
|
321
|
+
(0, cache_1.saveCache)(configDir, cache);
|
|
322
|
+
}
|
|
205
323
|
return results;
|
|
206
324
|
}
|
|
207
325
|
// ─── Status ───────────────────────────────────────────────────────────────────
|
|
208
326
|
async function status(config, configDir, opts = {}) {
|
|
209
327
|
return push(config, configDir, { dryRun: true, tags: opts.tags });
|
|
210
328
|
}
|
|
329
|
+
// ─── Cache helpers ────────────────────────────────────────────────────────────
|
|
330
|
+
function updateCacheEntry(cache, test, remote) {
|
|
331
|
+
if (!remote.changedDate)
|
|
332
|
+
return;
|
|
333
|
+
cache[remote.id] = {
|
|
334
|
+
title: remote.title,
|
|
335
|
+
stepsHash: (0, cache_1.hashSteps)(remote.steps),
|
|
336
|
+
descriptionHash: (0, cache_1.hashString)(remote.description),
|
|
337
|
+
changedDate: remote.changedDate,
|
|
338
|
+
filePath: test.filePath,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
211
341
|
// ─── Apply remote changes to local file ───────────────────────────────────────
|
|
212
|
-
function applyRemoteToLocal(test, newTitle, newSteps, localType) {
|
|
342
|
+
function applyRemoteToLocal(test, newTitle, newSteps, newDescription, localType) {
|
|
213
343
|
if (localType === 'gherkin') {
|
|
214
344
|
applyRemoteToGherkin(test, newTitle, newSteps);
|
|
215
345
|
}
|
|
216
346
|
else {
|
|
217
|
-
applyRemoteToMarkdown(test, newTitle, newSteps);
|
|
347
|
+
applyRemoteToMarkdown(test, newTitle, newSteps, newDescription);
|
|
218
348
|
}
|
|
219
349
|
}
|
|
220
350
|
function applyRemoteToGherkin(test, newTitle, newSteps) {
|
|
@@ -234,26 +364,48 @@ function applyRemoteToGherkin(test, newTitle, newSteps) {
|
|
|
234
364
|
lines.splice(stepStart, stepEnd - stepStart, ...stepLines);
|
|
235
365
|
fs.writeFileSync(test.filePath, lines.join('\n'), 'utf8');
|
|
236
366
|
}
|
|
237
|
-
|
|
367
|
+
/** Strip HTML tags from Azure rich-text description. */
|
|
368
|
+
function stripHtml(html) {
|
|
369
|
+
return html
|
|
370
|
+
.replace(/<br\s*\/?>/gi, '\n')
|
|
371
|
+
.replace(/<\/p>/gi, '\n')
|
|
372
|
+
.replace(/<[^>]+>/g, '')
|
|
373
|
+
.replace(/&/g, '&')
|
|
374
|
+
.replace(/</g, '<')
|
|
375
|
+
.replace(/>/g, '>')
|
|
376
|
+
.replace(/"/g, '"')
|
|
377
|
+
.replace(/ /g, ' ')
|
|
378
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
379
|
+
.trim();
|
|
380
|
+
}
|
|
381
|
+
function applyRemoteToMarkdown(test, newTitle, newSteps, newDescription) {
|
|
238
382
|
const raw = fs.readFileSync(test.filePath, 'utf8');
|
|
239
383
|
const lines = raw.split('\n');
|
|
240
384
|
const headingLineIdx = test.line - 1;
|
|
385
|
+
// Update title
|
|
241
386
|
lines[headingLineIdx] = lines[headingLineIdx].replace(/^(###\s+(?:\d+\.\s+)?)(.*)$/, `$1${newTitle}`);
|
|
242
387
|
const STEPS_RE = /^steps\s*:/i;
|
|
243
388
|
const EXPECTED_RE = /^expected\s+results?\s*:/i;
|
|
244
389
|
const SEPARATOR_RE = /^---+\s*$/;
|
|
245
390
|
const HEADING_RE = /^#{1,6}\s/;
|
|
391
|
+
const COMMENT_RE = /^<!--/;
|
|
392
|
+
// Find boundaries: description block, steps block, expected block
|
|
393
|
+
let descEnd = -1; // line index where description content ends (exclusive)
|
|
246
394
|
let stepsStart = -1;
|
|
247
395
|
let stepsEnd = -1;
|
|
248
396
|
let expectedStart = -1;
|
|
397
|
+
let sectionEnd = lines.length;
|
|
249
398
|
for (let i = headingLineIdx + 1; i < lines.length; i++) {
|
|
250
399
|
const trimmed = lines[i].trim();
|
|
251
400
|
if (HEADING_RE.test(lines[i]) || SEPARATOR_RE.test(trimmed)) {
|
|
401
|
+
sectionEnd = i;
|
|
252
402
|
if (stepsStart !== -1 && stepsEnd === -1)
|
|
253
403
|
stepsEnd = i;
|
|
254
404
|
break;
|
|
255
405
|
}
|
|
256
406
|
if (STEPS_RE.test(trimmed)) {
|
|
407
|
+
if (descEnd === -1)
|
|
408
|
+
descEnd = i;
|
|
257
409
|
stepsStart = i;
|
|
258
410
|
continue;
|
|
259
411
|
}
|
|
@@ -264,11 +416,29 @@ function applyRemoteToMarkdown(test, newTitle, newSteps) {
|
|
|
264
416
|
continue;
|
|
265
417
|
}
|
|
266
418
|
}
|
|
419
|
+
if (stepsEnd === -1 && stepsStart !== -1)
|
|
420
|
+
stepsEnd = sectionEnd;
|
|
421
|
+
// Build new step lines
|
|
267
422
|
const newStepLines = newSteps.map((s, idx) => `${idx + 1}. ${s.text}`);
|
|
423
|
+
// Replace steps section
|
|
268
424
|
if (stepsStart !== -1 && stepsEnd !== -1) {
|
|
269
425
|
lines.splice(stepsStart, stepsEnd - stepsStart, 'Steps:', ...newStepLines);
|
|
270
426
|
}
|
|
271
|
-
//
|
|
427
|
+
// Update description (Gap 8)
|
|
428
|
+
if (newDescription !== undefined && descEnd !== -1) {
|
|
429
|
+
const cleanDesc = stripHtml(newDescription);
|
|
430
|
+
if (cleanDesc) {
|
|
431
|
+
// Description block is headingLineIdx+1 .. descEnd (skip comment lines)
|
|
432
|
+
let descBlockStart = headingLineIdx + 1;
|
|
433
|
+
// Skip over ID/tags comment lines right after heading
|
|
434
|
+
while (descBlockStart < descEnd && COMMENT_RE.test(lines[descBlockStart].trim())) {
|
|
435
|
+
descBlockStart++;
|
|
436
|
+
}
|
|
437
|
+
const descLines = cleanDesc.split('\n');
|
|
438
|
+
lines.splice(descBlockStart, descEnd - descBlockStart, ...descLines, '');
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// Recalculate expected section position after splices
|
|
272
442
|
const updatedLines = lines.join('\n').split('\n');
|
|
273
443
|
let newExpStart = -1;
|
|
274
444
|
let newExpEnd = -1;
|
package/dist/sync/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/sync/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/sync/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
* Shared types for azure-test-sync
|
|
3
3
|
*/
|
|
4
4
|
export type AuthType = 'pat' | 'accessToken' | 'managedIdentity';
|
|
5
|
+
export interface LinkConfig {
|
|
6
|
+
/** Tag prefix to match, e.g. 'story', 'bug' */
|
|
7
|
+
prefix: string;
|
|
8
|
+
/** ADO relation type. Default: 'System.LinkTypes.Related' */
|
|
9
|
+
relationship?: string;
|
|
10
|
+
/** Optional: restrict to a specific work item type */
|
|
11
|
+
workItemType?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TestPlanEntry {
|
|
14
|
+
id: number;
|
|
15
|
+
suiteId?: number;
|
|
16
|
+
/** 'flat' (default) or 'byFolder' to mirror folder structure as nested suites */
|
|
17
|
+
suiteMapping?: 'flat' | 'byFolder';
|
|
18
|
+
/** Override local.include for this plan */
|
|
19
|
+
include?: string | string[];
|
|
20
|
+
/** Override local.exclude for this plan */
|
|
21
|
+
exclude?: string | string[];
|
|
22
|
+
}
|
|
5
23
|
export interface SyncConfig {
|
|
6
24
|
/** Azure DevOps organisation URL, e.g. https://dev.azure.com/myorg */
|
|
7
25
|
orgUrl: string;
|
|
@@ -15,12 +33,16 @@ export interface SyncConfig {
|
|
|
15
33
|
/** Required when type === 'managedIdentity' */
|
|
16
34
|
applicationIdURI?: string;
|
|
17
35
|
};
|
|
18
|
-
/** Target test plan / suite */
|
|
36
|
+
/** Target test plan / suite (single-plan mode) */
|
|
19
37
|
testPlan: {
|
|
20
38
|
id: number;
|
|
21
39
|
/** Root suite to create new test cases under. Defaults to plan root suite. */
|
|
22
40
|
suiteId?: number;
|
|
41
|
+
/** 'flat' (default) or 'byFolder' to mirror folder structure as nested suites */
|
|
42
|
+
suiteMapping?: 'flat' | 'byFolder';
|
|
23
43
|
};
|
|
44
|
+
/** Multi-plan mode: if present, overrides testPlan for each entry */
|
|
45
|
+
testPlans?: TestPlanEntry[];
|
|
24
46
|
/** Local spec sources */
|
|
25
47
|
local: {
|
|
26
48
|
/** 'gherkin' for .feature files, 'markdown' for .md spec files */
|
|
@@ -40,6 +62,23 @@ export interface SyncConfig {
|
|
|
40
62
|
areaPath?: string;
|
|
41
63
|
/** Default iteration path for new test cases */
|
|
42
64
|
iterationPath?: string;
|
|
65
|
+
/**
|
|
66
|
+
* When true, no local files are modified (no ID writeback, no pull apply).
|
|
67
|
+
* Useful for CI pipelines that should not commit file changes.
|
|
68
|
+
*/
|
|
69
|
+
disableLocalChanges?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* How to handle conflicts (remote changed since last sync AND local also differs).
|
|
72
|
+
* 'overwrite' (default): push local version to Azure.
|
|
73
|
+
* 'skip': emit a conflict result and leave both sides unchanged.
|
|
74
|
+
* 'fail': throw an error listing all conflicts.
|
|
75
|
+
*/
|
|
76
|
+
conflictAction?: 'overwrite' | 'skip' | 'fail';
|
|
77
|
+
/**
|
|
78
|
+
* Work item link configurations. Tags matching a configured prefix
|
|
79
|
+
* (e.g. @story:123) will create/maintain ADO work item relations.
|
|
80
|
+
*/
|
|
81
|
+
links?: LinkConfig[];
|
|
43
82
|
};
|
|
44
83
|
}
|
|
45
84
|
export interface ParsedStep {
|
|
@@ -62,6 +101,22 @@ export interface ParsedTest {
|
|
|
62
101
|
azureId?: number;
|
|
63
102
|
/** Line number in the file where the scenario / heading starts (1-based) */
|
|
64
103
|
line: number;
|
|
104
|
+
/**
|
|
105
|
+
* Present for Scenario Outlines. Contains the examples table so Azure can
|
|
106
|
+
* create a parametrized test case instead of one TC per example row.
|
|
107
|
+
*/
|
|
108
|
+
outlineParameters?: {
|
|
109
|
+
headers: string[];
|
|
110
|
+
rows: string[][];
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Work item link references extracted from tags matching sync.links config.
|
|
114
|
+
* e.g. @story:123 → { prefix: 'story', id: 123 }
|
|
115
|
+
*/
|
|
116
|
+
linkRefs?: Array<{
|
|
117
|
+
prefix: string;
|
|
118
|
+
id: number;
|
|
119
|
+
}>;
|
|
65
120
|
}
|
|
66
121
|
export interface AzureTestCase {
|
|
67
122
|
id: number;
|
|
@@ -78,7 +133,7 @@ export interface AzureStep {
|
|
|
78
133
|
action: string;
|
|
79
134
|
expected: string;
|
|
80
135
|
}
|
|
81
|
-
export type SyncAction = 'created' | 'updated' | 'skipped' | 'conflict' | 'pulled' | 'error';
|
|
136
|
+
export type SyncAction = 'created' | 'updated' | 'skipped' | 'conflict' | 'pulled' | 'removed' | 'error';
|
|
82
137
|
export interface SyncResult {
|
|
83
138
|
action: SyncAction;
|
|
84
139
|
filePath: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ado-sync",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Bidirectional sync between local test specs (Cucumber/Markdown) and Azure DevOps Test Cases",
|
|
5
5
|
"bin": {
|
|
6
6
|
"ado-sync": "./dist/cli.js"
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"commander": "^12.1.0",
|
|
41
41
|
"dotenv": "^16.4.5",
|
|
42
42
|
"fast-xml-parser": "^4.4.1",
|
|
43
|
-
"glob": "^
|
|
43
|
+
"glob": "^13.0.6",
|
|
44
44
|
"js-yaml": "^4.1.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|