ado-sync 0.1.41 → 0.1.43
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/ai/summarizer.d.ts +1 -1
- package/dist/ai/summarizer.js.map +1 -1
- package/dist/azure/test-cases.js +2 -0
- package/dist/azure/test-cases.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/parsers/csharp.js +4 -2
- package/dist/parsers/csharp.js.map +1 -1
- package/dist/parsers/dart.js +1 -0
- package/dist/parsers/dart.js.map +1 -1
- package/dist/parsers/go.d.ts +18 -0
- package/dist/parsers/go.js +201 -0
- package/dist/parsers/go.js.map +1 -0
- package/dist/parsers/java.js +4 -2
- package/dist/parsers/java.js.map +1 -1
- package/dist/parsers/javascript.js +1 -0
- package/dist/parsers/javascript.js.map +1 -1
- package/dist/parsers/kotlin.d.ts +20 -0
- package/dist/parsers/kotlin.js +257 -0
- package/dist/parsers/kotlin.js.map +1 -0
- package/dist/parsers/php.d.ts +22 -0
- package/dist/parsers/php.js +205 -0
- package/dist/parsers/php.js.map +1 -0
- package/dist/parsers/python.js +4 -2
- package/dist/parsers/python.js.map +1 -1
- package/dist/parsers/robot.d.ts +22 -0
- package/dist/parsers/robot.js +230 -0
- package/dist/parsers/robot.js.map +1 -0
- package/dist/parsers/ruby.d.ts +20 -0
- package/dist/parsers/ruby.js +185 -0
- package/dist/parsers/ruby.js.map +1 -0
- package/dist/parsers/rust.d.ts +18 -0
- package/dist/parsers/rust.js +193 -0
- package/dist/parsers/rust.js.map +1 -0
- package/dist/parsers/testcafe.js +1 -0
- package/dist/parsers/testcafe.js.map +1 -1
- package/dist/sync/engine.js +75 -3
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/publish-results.js +403 -1
- package/dist/sync/publish-results.js.map +1 -1
- package/dist/sync/writeback.d.ts +27 -1
- package/dist/sync/writeback.js +177 -2
- package/dist/sync/writeback.js.map +1 -1
- package/dist/types.d.ts +13 -1
- package/package.json +1 -1
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ruby RSpec parser for azure-test-sync.
|
|
4
|
+
*
|
|
5
|
+
* Detects it 'description' and it "description" blocks in *_spec.rb files.
|
|
6
|
+
*
|
|
7
|
+
* Source mapping:
|
|
8
|
+
* it 'title' → TC Title (with enclosing describe/context prefix)
|
|
9
|
+
* # Numbered lines in comment above → TC Steps
|
|
10
|
+
* # @{tagPrefix}:N above it → Azure TC ID
|
|
11
|
+
* # @tags: smoke, regression → TC Tags
|
|
12
|
+
* # @smoke (single-word) → TC Tag
|
|
13
|
+
* filePath::full description → automatedTestName
|
|
14
|
+
*
|
|
15
|
+
* ID writeback:
|
|
16
|
+
* Inserts / updates # @tc:12345 immediately above the it line.
|
|
17
|
+
*
|
|
18
|
+
* Path-based auto-tagging: directory segments starting with '@' become tags.
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.parseRubyFile = parseRubyFile;
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const shared_1 = require("./shared");
|
|
58
|
+
// ─── Test detection ───────────────────────────────────────────────────────────
|
|
59
|
+
// Matches: it 'title' or it "title" (with optional whitespace)
|
|
60
|
+
const IT_RE = /^\s*it\s+(['"])(.*?)\1/;
|
|
61
|
+
// Matches: describe/context/RSpec.describe blocks
|
|
62
|
+
const DESCRIBE_RE = /^\s*(?:RSpec\.)?(?:describe|context|feature)\s+(['"])(.*?)\1/;
|
|
63
|
+
function findEnclosingContexts(lines, itLineIdx) {
|
|
64
|
+
const itIndent = getIndent(lines[itLineIdx]);
|
|
65
|
+
const contexts = [];
|
|
66
|
+
for (let i = itLineIdx - 1; i >= 0; i--) {
|
|
67
|
+
const line = lines[i];
|
|
68
|
+
if (!line.trim())
|
|
69
|
+
continue;
|
|
70
|
+
const lineIndent = getIndent(line);
|
|
71
|
+
if (lineIndent >= itIndent)
|
|
72
|
+
continue;
|
|
73
|
+
const m = line.match(DESCRIBE_RE);
|
|
74
|
+
if (m) {
|
|
75
|
+
contexts.unshift({ description: m[2], indent: lineIndent });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return contexts.map((c) => c.description);
|
|
79
|
+
}
|
|
80
|
+
function getIndent(line) {
|
|
81
|
+
return (line.match(/^(\s*)/) ?? ['', ''])[1].length;
|
|
82
|
+
}
|
|
83
|
+
function extractCommentBlockAbove(lines, itLineIdx, tagPrefix) {
|
|
84
|
+
const docLines = [];
|
|
85
|
+
let azureId;
|
|
86
|
+
const tags = [];
|
|
87
|
+
const idRe = new RegExp(`#\\s*@${tagPrefix}:(\\d+)`);
|
|
88
|
+
const tagsRe = /^#\s*@tags:\s*(.+)/i;
|
|
89
|
+
const singleTagRe = /^#\s*@(\w+)\s*$/;
|
|
90
|
+
for (let i = itLineIdx - 1; i >= 0 && i >= itLineIdx - 30; i--) {
|
|
91
|
+
const trimmed = lines[i].trim();
|
|
92
|
+
if (trimmed === '')
|
|
93
|
+
break;
|
|
94
|
+
if (!trimmed.startsWith('#'))
|
|
95
|
+
break;
|
|
96
|
+
// Stop at enclosing block boundary keywords
|
|
97
|
+
if (/^\s*(?:describe|context|before|after|let|subject)\b/.test(lines[i]))
|
|
98
|
+
break;
|
|
99
|
+
const idMatch = trimmed.match(idRe);
|
|
100
|
+
if (idMatch) {
|
|
101
|
+
if (azureId === undefined)
|
|
102
|
+
azureId = parseInt(idMatch[1], 10);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const tagsMatch = trimmed.match(tagsRe);
|
|
106
|
+
if (tagsMatch) {
|
|
107
|
+
for (const t of tagsMatch[1].split(',').map((s) => s.trim()).filter(Boolean)) {
|
|
108
|
+
tags.push(t);
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const singleTagMatch = trimmed.match(singleTagRe);
|
|
113
|
+
if (singleTagMatch && singleTagMatch[1] !== tagPrefix) {
|
|
114
|
+
tags.push(singleTagMatch[1]);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const content = trimmed.replace(/^#\s?/, '');
|
|
118
|
+
if (content)
|
|
119
|
+
docLines.unshift(content);
|
|
120
|
+
}
|
|
121
|
+
return { docLines, azureId, tags };
|
|
122
|
+
}
|
|
123
|
+
// ─── Title / steps from comment block ────────────────────────────────────────
|
|
124
|
+
const NUMBERED_STEP_RE = /^\d+\.\s+(.+)$/;
|
|
125
|
+
const CHECK_RE = /^[Cc]heck:\s+(.+)$/;
|
|
126
|
+
const META_RE = /^(?:test\s+case|user\s+story)[\s:]/i;
|
|
127
|
+
function parseSummary(docLines, itDescription, contexts) {
|
|
128
|
+
let titleFromDoc = '';
|
|
129
|
+
const steps = [];
|
|
130
|
+
for (const line of docLines) {
|
|
131
|
+
if (!line || META_RE.test(line))
|
|
132
|
+
continue;
|
|
133
|
+
const numMatch = NUMBERED_STEP_RE.exec(line);
|
|
134
|
+
if (numMatch) {
|
|
135
|
+
const content = numMatch[1].trim();
|
|
136
|
+
const checkMatch = CHECK_RE.exec(content);
|
|
137
|
+
if (checkMatch) {
|
|
138
|
+
steps.push({ keyword: 'Then', text: checkMatch[1].trim() });
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
steps.push({ keyword: 'Step', text: content });
|
|
142
|
+
}
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (!titleFromDoc)
|
|
146
|
+
titleFromDoc = line;
|
|
147
|
+
}
|
|
148
|
+
const contextPrefix = contexts.length > 0 ? `${contexts.join(' ')} ` : '';
|
|
149
|
+
const title = titleFromDoc || `${contextPrefix}${itDescription}`.trim();
|
|
150
|
+
return { title, steps };
|
|
151
|
+
}
|
|
152
|
+
// ─── Public parser ────────────────────────────────────────────────────────────
|
|
153
|
+
function parseRubyFile(filePath, tagPrefix, linkConfigs) {
|
|
154
|
+
const source = fs.readFileSync(filePath, 'utf8');
|
|
155
|
+
const lines = source.split('\n');
|
|
156
|
+
const pathTags = (0, shared_1.extractPathTags)(filePath);
|
|
157
|
+
const results = [];
|
|
158
|
+
// Derive a relative path for automatedTestName
|
|
159
|
+
const relPath = path.relative(process.cwd(), filePath).replace(/\\/g, '/');
|
|
160
|
+
for (let i = 0; i < lines.length; i++) {
|
|
161
|
+
const m = lines[i].match(IT_RE);
|
|
162
|
+
if (!m)
|
|
163
|
+
continue;
|
|
164
|
+
const itDescription = m[2];
|
|
165
|
+
const { docLines, azureId, tags: commentTags } = extractCommentBlockAbove(lines, i, tagPrefix);
|
|
166
|
+
const contexts = findEnclosingContexts(lines, i);
|
|
167
|
+
const allTags = [...new Set([...pathTags, ...commentTags])];
|
|
168
|
+
const { title, steps } = parseSummary(docLines, itDescription, contexts);
|
|
169
|
+
const fullDescription = [...contexts, itDescription].join(' ');
|
|
170
|
+
const automatedTestName = `${relPath}::${fullDescription}`;
|
|
171
|
+
results.push({
|
|
172
|
+
filePath,
|
|
173
|
+
title,
|
|
174
|
+
steps,
|
|
175
|
+
tags: allTags,
|
|
176
|
+
azureId: azureId !== undefined && !isNaN(azureId) ? azureId : undefined,
|
|
177
|
+
line: i + 1,
|
|
178
|
+
linkRefs: (0, shared_1.extractLinkRefs)(allTags, linkConfigs),
|
|
179
|
+
automatedTestName,
|
|
180
|
+
titleIsHeuristic: false,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return results;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=ruby.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../src/parsers/ruby.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rust testing parser for azure-test-sync.
|
|
3
|
+
*
|
|
4
|
+
* Detects #[test] attributed functions in Rust source files.
|
|
5
|
+
*
|
|
6
|
+
* Source mapping:
|
|
7
|
+
* /// or // doc comment above #[test] → TC Title + Steps
|
|
8
|
+
* // @{tagPrefix}:N above #[test] → Azure TC ID
|
|
9
|
+
* // @tags: smoke, regression → TC Tags
|
|
10
|
+
* module::function_name → automatedTestName
|
|
11
|
+
*
|
|
12
|
+
* ID writeback:
|
|
13
|
+
* Inserts / updates // @tc:12345 immediately above the #[test] line.
|
|
14
|
+
*
|
|
15
|
+
* Path-based auto-tagging: directory segments starting with '@' become tags.
|
|
16
|
+
*/
|
|
17
|
+
import { LinkConfig, ParsedTest } from '../types';
|
|
18
|
+
export declare function parseRustFile(filePath: string, tagPrefix: string, linkConfigs?: LinkConfig[]): ParsedTest[];
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Rust testing parser for azure-test-sync.
|
|
4
|
+
*
|
|
5
|
+
* Detects #[test] attributed functions in Rust source files.
|
|
6
|
+
*
|
|
7
|
+
* Source mapping:
|
|
8
|
+
* /// or // doc comment above #[test] → TC Title + Steps
|
|
9
|
+
* // @{tagPrefix}:N above #[test] → Azure TC ID
|
|
10
|
+
* // @tags: smoke, regression → TC Tags
|
|
11
|
+
* module::function_name → automatedTestName
|
|
12
|
+
*
|
|
13
|
+
* ID writeback:
|
|
14
|
+
* Inserts / updates // @tc:12345 immediately above the #[test] line.
|
|
15
|
+
*
|
|
16
|
+
* Path-based auto-tagging: directory segments starting with '@' become tags.
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.parseRustFile = parseRustFile;
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const shared_1 = require("./shared");
|
|
55
|
+
// ─── Test attribute detection ─────────────────────────────────────────────────
|
|
56
|
+
const TEST_ATTR_RE = /^\s*#\[(?:tokio::)?test(?:\(.*\))?\]\s*$/;
|
|
57
|
+
const FN_RE = /^\s*(?:pub\s+)?(?:async\s+)?fn\s+(\w+)\s*\(/;
|
|
58
|
+
// ─── Module path building ─────────────────────────────────────────────────────
|
|
59
|
+
function findModulePath(lines, testAttrLineIdx) {
|
|
60
|
+
const testIndent = (lines[testAttrLineIdx].match(/^(\s*)/) ?? ['', ''])[1].length;
|
|
61
|
+
const modules = [];
|
|
62
|
+
for (let i = testAttrLineIdx - 1; i >= 0; i--) {
|
|
63
|
+
const line = lines[i];
|
|
64
|
+
const lineIndent = (line.match(/^(\s*)/) ?? ['', ''])[1].length;
|
|
65
|
+
if (lineIndent >= testIndent)
|
|
66
|
+
continue;
|
|
67
|
+
const m = line.trim().match(/^(?:pub\s+)?mod\s+(\w+)\s*\{?/);
|
|
68
|
+
if (m) {
|
|
69
|
+
modules.unshift(m[1]);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return modules.join('::');
|
|
73
|
+
}
|
|
74
|
+
function extractCommentBlockAbove(lines, attrLineIdx, tagPrefix) {
|
|
75
|
+
const docLines = [];
|
|
76
|
+
let azureId;
|
|
77
|
+
const tags = [];
|
|
78
|
+
const idRe = new RegExp(`//\\s*@${tagPrefix}:(\\d+)`);
|
|
79
|
+
const tagsRe = /\/\/\s*@tags:\s*(.+)/i;
|
|
80
|
+
const singleTagRe = /\/\/\s*@(\w+)\s*$/;
|
|
81
|
+
const docRe = /^\/\/[\/!]?\s?(.*)$/; // matches //, ///, //!
|
|
82
|
+
for (let i = attrLineIdx - 1; i >= 0 && i >= attrLineIdx - 40; i--) {
|
|
83
|
+
const trimmed = lines[i].trim();
|
|
84
|
+
if (trimmed === '')
|
|
85
|
+
break;
|
|
86
|
+
// Must be a comment line
|
|
87
|
+
if (!trimmed.startsWith('//') && !trimmed.startsWith('#['))
|
|
88
|
+
break;
|
|
89
|
+
// Skip other attributes like #[ignore], #[should_panic]
|
|
90
|
+
if (trimmed.startsWith('#['))
|
|
91
|
+
continue;
|
|
92
|
+
const idMatch = trimmed.match(idRe);
|
|
93
|
+
if (idMatch) {
|
|
94
|
+
if (azureId === undefined)
|
|
95
|
+
azureId = parseInt(idMatch[1], 10);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const tagsMatch = trimmed.match(tagsRe);
|
|
99
|
+
if (tagsMatch) {
|
|
100
|
+
for (const t of tagsMatch[1].split(',').map((s) => s.trim()).filter(Boolean)) {
|
|
101
|
+
tags.push(t);
|
|
102
|
+
}
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const singleTagMatch = trimmed.match(singleTagRe);
|
|
106
|
+
if (singleTagMatch && singleTagMatch[1] !== tagPrefix) {
|
|
107
|
+
tags.push(singleTagMatch[1]);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const docMatch = trimmed.match(docRe);
|
|
111
|
+
if (docMatch && docMatch[1] !== undefined) {
|
|
112
|
+
docLines.unshift(docMatch[1]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return { docLines, azureId, tags };
|
|
116
|
+
}
|
|
117
|
+
// ─── Title / steps ────────────────────────────────────────────────────────────
|
|
118
|
+
const NUMBERED_STEP_RE = /^\d+\.\s+(.+)$/;
|
|
119
|
+
const CHECK_RE = /^[Cc]heck:\s+(.+)$/;
|
|
120
|
+
const META_RE = /^(?:test\s+case|user\s+story)[\s:]/i;
|
|
121
|
+
function parseSummary(docLines, fnName) {
|
|
122
|
+
let title = '';
|
|
123
|
+
const steps = [];
|
|
124
|
+
for (const line of docLines) {
|
|
125
|
+
if (!line || META_RE.test(line))
|
|
126
|
+
continue;
|
|
127
|
+
const numMatch = NUMBERED_STEP_RE.exec(line);
|
|
128
|
+
if (numMatch) {
|
|
129
|
+
const content = numMatch[1].trim();
|
|
130
|
+
const checkMatch = CHECK_RE.exec(content);
|
|
131
|
+
if (checkMatch) {
|
|
132
|
+
steps.push({ keyword: 'Then', text: checkMatch[1].trim() });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
steps.push({ keyword: 'Step', text: content });
|
|
136
|
+
}
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (!title)
|
|
140
|
+
title = line;
|
|
141
|
+
}
|
|
142
|
+
const titleIsHeuristic = !title;
|
|
143
|
+
if (!title) {
|
|
144
|
+
// it_works → It works
|
|
145
|
+
title = fnName.replace(/_/g, ' ').replace(/^\w/, (c) => c.toUpperCase());
|
|
146
|
+
}
|
|
147
|
+
return { title, steps, titleIsHeuristic };
|
|
148
|
+
}
|
|
149
|
+
// ─── Public parser ────────────────────────────────────────────────────────────
|
|
150
|
+
function parseRustFile(filePath, tagPrefix, linkConfigs) {
|
|
151
|
+
const source = fs.readFileSync(filePath, 'utf8');
|
|
152
|
+
const lines = source.split('\n');
|
|
153
|
+
const pathTags = (0, shared_1.extractPathTags)(filePath);
|
|
154
|
+
const results = [];
|
|
155
|
+
for (let i = 0; i < lines.length; i++) {
|
|
156
|
+
const trimmed = lines[i].trim();
|
|
157
|
+
if (!TEST_ATTR_RE.test(trimmed))
|
|
158
|
+
continue;
|
|
159
|
+
// Find the fn declaration (within the next 5 lines)
|
|
160
|
+
let fnName = '';
|
|
161
|
+
let fnLineIdx = -1;
|
|
162
|
+
for (let j = i + 1; j < lines.length && j <= i + 5; j++) {
|
|
163
|
+
const m = lines[j].trim().match(FN_RE);
|
|
164
|
+
if (m) {
|
|
165
|
+
fnName = m[1];
|
|
166
|
+
fnLineIdx = j;
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (!fnName)
|
|
171
|
+
continue;
|
|
172
|
+
const modulePath = findModulePath(lines, i);
|
|
173
|
+
const { docLines, azureId, tags: commentTags } = extractCommentBlockAbove(lines, i, tagPrefix);
|
|
174
|
+
const allTags = [...new Set([...pathTags, ...commentTags])];
|
|
175
|
+
const { title, steps, titleIsHeuristic } = parseSummary(docLines, fnName);
|
|
176
|
+
const automatedTestName = modulePath ? `${modulePath}::${fnName}` : fnName;
|
|
177
|
+
results.push({
|
|
178
|
+
filePath,
|
|
179
|
+
title,
|
|
180
|
+
steps,
|
|
181
|
+
tags: allTags,
|
|
182
|
+
azureId: azureId !== undefined && !isNaN(azureId) ? azureId : undefined,
|
|
183
|
+
line: i + 1, // 1-based line of #[test]
|
|
184
|
+
linkRefs: (0, shared_1.extractLinkRefs)(allTags, linkConfigs),
|
|
185
|
+
automatedTestName,
|
|
186
|
+
titleIsHeuristic,
|
|
187
|
+
});
|
|
188
|
+
// Skip to after fn declaration to avoid re-processing
|
|
189
|
+
i = fnLineIdx;
|
|
190
|
+
}
|
|
191
|
+
return results;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=rust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rust.js","sourceRoot":"","sources":["../../src/parsers/rust.ts"],"names":[],"mappings":"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"}
|
package/dist/parsers/testcafe.js
CHANGED
|
@@ -317,6 +317,7 @@ function parseTestCafeFile(filePath, tagPrefix, linkConfigs) {
|
|
|
317
317
|
line: testLineIdx + 1, // 1-based; writeback starts from here
|
|
318
318
|
linkRefs: (0, shared_1.extractLinkRefs)(allTags, linkConfigs),
|
|
319
319
|
automatedTestName,
|
|
320
|
+
titleIsHeuristic: false,
|
|
320
321
|
});
|
|
321
322
|
}
|
|
322
323
|
return results;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testcafe.js","sourceRoot":"","sources":["../../src/parsers/testcafe.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoQH,
|
|
1
|
+
{"version":3,"file":"testcafe.js","sourceRoot":"","sources":["../../src/parsers/testcafe.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/engine.js
CHANGED
|
@@ -54,10 +54,16 @@ const csv_1 = require("../parsers/csv");
|
|
|
54
54
|
const dart_1 = require("../parsers/dart");
|
|
55
55
|
const excel_1 = require("../parsers/excel");
|
|
56
56
|
const gherkin_1 = require("../parsers/gherkin");
|
|
57
|
+
const go_1 = require("../parsers/go");
|
|
57
58
|
const java_1 = require("../parsers/java");
|
|
58
59
|
const javascript_1 = require("../parsers/javascript");
|
|
60
|
+
const kotlin_1 = require("../parsers/kotlin");
|
|
59
61
|
const markdown_1 = require("../parsers/markdown");
|
|
62
|
+
const php_1 = require("../parsers/php");
|
|
60
63
|
const python_1 = require("../parsers/python");
|
|
64
|
+
const robot_1 = require("../parsers/robot");
|
|
65
|
+
const ruby_1 = require("../parsers/ruby");
|
|
66
|
+
const rust_1 = require("../parsers/rust");
|
|
61
67
|
const swift_1 = require("../parsers/swift");
|
|
62
68
|
const testcafe_1 = require("../parsers/testcafe");
|
|
63
69
|
const cache_1 = require("./cache");
|
|
@@ -139,6 +145,24 @@ async function parseLocalFiles(filePaths, config, tagsFilter) {
|
|
|
139
145
|
case 'flutter':
|
|
140
146
|
tests = (0, dart_1.parseDartFile)(fp, tagPrefix, linkConfigs);
|
|
141
147
|
break;
|
|
148
|
+
case 'robot':
|
|
149
|
+
tests = (0, robot_1.parseRobotFile)(fp, tagPrefix, linkConfigs);
|
|
150
|
+
break;
|
|
151
|
+
case 'go':
|
|
152
|
+
tests = (0, go_1.parseGoFile)(fp, tagPrefix, linkConfigs);
|
|
153
|
+
break;
|
|
154
|
+
case 'rspec':
|
|
155
|
+
tests = (0, ruby_1.parseRubyFile)(fp, tagPrefix, linkConfigs);
|
|
156
|
+
break;
|
|
157
|
+
case 'phpunit':
|
|
158
|
+
tests = (0, php_1.parsePhpFile)(fp, tagPrefix, linkConfigs);
|
|
159
|
+
break;
|
|
160
|
+
case 'rust':
|
|
161
|
+
tests = (0, rust_1.parseRustFile)(fp, tagPrefix, linkConfigs);
|
|
162
|
+
break;
|
|
163
|
+
case 'kotlin':
|
|
164
|
+
tests = (0, kotlin_1.parseKotlinFile)(fp, tagPrefix, linkConfigs);
|
|
165
|
+
break;
|
|
142
166
|
default:
|
|
143
167
|
tests = (0, markdown_1.parseMarkdownFile)(fp, tagPrefix, linkConfigs, attachmentsConfig);
|
|
144
168
|
}
|
|
@@ -245,7 +269,8 @@ async function push(config, configDir, opts = {}) {
|
|
|
245
269
|
aiDone++;
|
|
246
270
|
opts.onAiProgress?.(aiDone, allTargets.length, test.title);
|
|
247
271
|
if (needsSteps) {
|
|
248
|
-
test.
|
|
272
|
+
if (test.titleIsHeuristic !== false)
|
|
273
|
+
test.title = result.title;
|
|
249
274
|
test.steps = result.steps;
|
|
250
275
|
}
|
|
251
276
|
if (needsDescription && result.description)
|
|
@@ -290,7 +315,13 @@ async function pushSingle(config, configDir, opts) {
|
|
|
290
315
|
aiDone++;
|
|
291
316
|
opts.onAiProgress?.(aiDone, aiTargets.length, test.title);
|
|
292
317
|
if (needsSteps) {
|
|
293
|
-
|
|
318
|
+
// Only replace the title when it was heuristically generated (e.g. from a
|
|
319
|
+
// method name transformation). If titleIsHeuristic is false the title came
|
|
320
|
+
// directly from the source file (it('…'), test('…'), etc.) and must not be
|
|
321
|
+
// overridden — that would produce a different title on every push and break
|
|
322
|
+
// the Azure ID match on subsequent runs.
|
|
323
|
+
if (test.titleIsHeuristic !== false)
|
|
324
|
+
test.title = result.title;
|
|
294
325
|
test.steps = result.steps;
|
|
295
326
|
}
|
|
296
327
|
if (needsDescription && result.description) {
|
|
@@ -315,6 +346,33 @@ async function pushSingle(config, configDir, opts) {
|
|
|
315
346
|
const pendingWritebacks = [];
|
|
316
347
|
// Load local cache for conflict detection and skip optimisation
|
|
317
348
|
const cache = (0, cache_1.loadCache)(configDir);
|
|
349
|
+
// ── automatedTestName fallback matching ───────────────────────────────────
|
|
350
|
+
// When markAutomated is true and a local test has no @tc:ID annotation, try
|
|
351
|
+
// to find its existing TC in Azure by AutomatedTestName. This recovers from
|
|
352
|
+
// situations where writeback files were not committed (e.g. first push was a
|
|
353
|
+
// dry-run, or the developer didn't stage the file changes). Without this,
|
|
354
|
+
// every unlinked test would be created as a new TC on each push, causing the
|
|
355
|
+
// plan to grow unboundedly while old TCs accumulate as ado-sync:removed.
|
|
356
|
+
const markAutomated = config.sync?.markAutomated ?? false;
|
|
357
|
+
const recoveredIds = new Set(); // "filePath:line" keys
|
|
358
|
+
let preloadedRemoteTcs;
|
|
359
|
+
const unlinkedWithAtName = tests.filter(t => !t.azureId && t.automatedTestName);
|
|
360
|
+
if (markAutomated && unlinkedWithAtName.length > 0) {
|
|
361
|
+
try {
|
|
362
|
+
preloadedRemoteTcs = await (0, test_cases_1.getTestCasesInSuite)(client, config);
|
|
363
|
+
const byAtName = new Map(preloadedRemoteTcs
|
|
364
|
+
.filter(tc => tc.automatedTestName)
|
|
365
|
+
.map(tc => [tc.automatedTestName, tc]));
|
|
366
|
+
for (const test of unlinkedWithAtName) {
|
|
367
|
+
const match = byAtName.get(test.automatedTestName);
|
|
368
|
+
if (match) {
|
|
369
|
+
test.azureId = match.id;
|
|
370
|
+
recoveredIds.add(`${test.filePath}:${test.line}`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch { /* best-effort: if pre-load fails, continue without matching */ }
|
|
375
|
+
}
|
|
318
376
|
let done = 0;
|
|
319
377
|
const reportProgress = (result) => {
|
|
320
378
|
results.push(result);
|
|
@@ -455,6 +513,18 @@ async function pushSingle(config, configDir, opts) {
|
|
|
455
513
|
}
|
|
456
514
|
}
|
|
457
515
|
}
|
|
516
|
+
// Write back recovered IDs (matched by automatedTestName above).
|
|
517
|
+
// These tests had their azureId set in the pre-pass but were not in pendingWritebacks
|
|
518
|
+
// (no new TC was created). Queue them so the source annotation is restored.
|
|
519
|
+
if (!opts.dryRun && !disableLocal && recoveredIds.size > 0) {
|
|
520
|
+
const alreadyQueued = new Set(pendingWritebacks.map((wb) => `${wb.test.filePath}:${wb.test.line}`));
|
|
521
|
+
for (const test of tests) {
|
|
522
|
+
const key = `${test.filePath}:${test.line}`;
|
|
523
|
+
if (test.azureId && recoveredIds.has(key) && !alreadyQueued.has(key)) {
|
|
524
|
+
pendingWritebacks.push({ test, newId: test.azureId });
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
458
528
|
// Apply ID writebacks in descending line order per file so earlier insertions
|
|
459
529
|
// don't shift line numbers for subsequent writebacks in the same file.
|
|
460
530
|
if (!opts.dryRun && pendingWritebacks.length) {
|
|
@@ -475,7 +545,9 @@ async function pushSingle(config, configDir, opts) {
|
|
|
475
545
|
// Removed TC detection: find suite TCs not referenced by any local test
|
|
476
546
|
if (!opts.dryRun || true /* show removed in dry-run too */) {
|
|
477
547
|
try {
|
|
478
|
-
|
|
548
|
+
// Reuse the pre-loaded remote TCs if we already fetched them for automatedTestName
|
|
549
|
+
// matching, otherwise fetch now. This avoids a redundant round-trip.
|
|
550
|
+
const remoteTcs = preloadedRemoteTcs ?? await (0, test_cases_1.getTestCasesInSuite)(client, config);
|
|
479
551
|
const localIds = new Set([
|
|
480
552
|
...tests.map((t) => t.azureId).filter(Boolean),
|
|
481
553
|
...createdIds,
|