tryassay 0.29.0 → 0.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/generate.js +1 -0
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/harvest.d.ts +9 -0
- package/dist/commands/harvest.js +76 -0
- package/dist/commands/harvest.js.map +1 -0
- package/dist/lib/__tests__/learned-rules.test.d.ts +1 -0
- package/dist/lib/__tests__/learned-rules.test.js +260 -0
- package/dist/lib/__tests__/learned-rules.test.js.map +1 -0
- package/dist/lib/__tests__/pr-harvester-types.test.d.ts +1 -0
- package/dist/lib/__tests__/pr-harvester-types.test.js +43 -0
- package/dist/lib/__tests__/pr-harvester-types.test.js.map +1 -0
- package/dist/lib/__tests__/pr-harvester.test.d.ts +1 -0
- package/dist/lib/__tests__/pr-harvester.test.js +341 -0
- package/dist/lib/__tests__/pr-harvester.test.js.map +1 -0
- package/dist/lib/__tests__/rule-harvester.test.d.ts +1 -0
- package/dist/lib/__tests__/rule-harvester.test.js +526 -0
- package/dist/lib/__tests__/rule-harvester.test.js.map +1 -0
- package/dist/lib/learned-rules/category-map.d.ts +28 -0
- package/dist/lib/learned-rules/category-map.js +110 -0
- package/dist/lib/learned-rules/category-map.js.map +1 -0
- package/dist/lib/learned-rules/index.d.ts +105 -0
- package/dist/lib/learned-rules/index.js +198 -0
- package/dist/lib/learned-rules/index.js.map +1 -0
- package/dist/lib/learned-rules/learned-catalog.d.ts +62 -0
- package/dist/lib/learned-rules/learned-catalog.js +161 -0
- package/dist/lib/learned-rules/learned-catalog.js.map +1 -0
- package/dist/lib/learned-rules/pattern-extractor.d.ts +25 -0
- package/dist/lib/learned-rules/pattern-extractor.js +351 -0
- package/dist/lib/learned-rules/pattern-extractor.js.map +1 -0
- package/dist/lib/learned-rules/rule-codifier.d.ts +41 -0
- package/dist/lib/learned-rules/rule-codifier.js +138 -0
- package/dist/lib/learned-rules/rule-codifier.js.map +1 -0
- package/dist/lib/learned-rules/starter-catalog.d.ts +16 -0
- package/dist/lib/learned-rules/starter-catalog.js +402 -0
- package/dist/lib/learned-rules/starter-catalog.js.map +1 -0
- package/dist/lib/learned-rules/types.d.ts +196 -0
- package/dist/lib/learned-rules/types.js +9 -0
- package/dist/lib/learned-rules/types.js.map +1 -0
- package/dist/lib/learned-rules/validation-harness.d.ts +26 -0
- package/dist/lib/learned-rules/validation-harness.js +260 -0
- package/dist/lib/learned-rules/validation-harness.js.map +1 -0
- package/dist/lib/rule-harvester/diff-parser.d.ts +9 -0
- package/dist/lib/rule-harvester/diff-parser.js +77 -0
- package/dist/lib/rule-harvester/diff-parser.js.map +1 -0
- package/dist/lib/rule-harvester/file-selector.d.ts +10 -0
- package/dist/lib/rule-harvester/file-selector.js +59 -0
- package/dist/lib/rule-harvester/file-selector.js.map +1 -0
- package/dist/lib/rule-harvester/ground-truth.d.ts +19 -0
- package/dist/lib/rule-harvester/ground-truth.js +156 -0
- package/dist/lib/rule-harvester/ground-truth.js.map +1 -0
- package/dist/lib/rule-harvester/harvest.d.ts +26 -0
- package/dist/lib/rule-harvester/harvest.js +307 -0
- package/dist/lib/rule-harvester/harvest.js.map +1 -0
- package/dist/lib/rule-harvester/pr-discovery.d.ts +49 -0
- package/dist/lib/rule-harvester/pr-discovery.js +168 -0
- package/dist/lib/rule-harvester/pr-discovery.js.map +1 -0
- package/dist/lib/rule-harvester/pr-harvest.d.ts +53 -0
- package/dist/lib/rule-harvester/pr-harvest.js +326 -0
- package/dist/lib/rule-harvester/pr-harvest.js.map +1 -0
- package/dist/lib/rule-harvester/progress.d.ts +13 -0
- package/dist/lib/rule-harvester/progress.js +50 -0
- package/dist/lib/rule-harvester/progress.js.map +1 -0
- package/dist/lib/rule-harvester/reporter.d.ts +35 -0
- package/dist/lib/rule-harvester/reporter.js +46 -0
- package/dist/lib/rule-harvester/reporter.js.map +1 -0
- package/dist/lib/rule-harvester/rule-generalizer.d.ts +25 -0
- package/dist/lib/rule-harvester/rule-generalizer.js +135 -0
- package/dist/lib/rule-harvester/rule-generalizer.js.map +1 -0
- package/dist/lib/rule-harvester/scanner.d.ts +20 -0
- package/dist/lib/rule-harvester/scanner.js +37 -0
- package/dist/lib/rule-harvester/scanner.js.map +1 -0
- package/dist/sdk/forward-verify.d.ts +3 -1
- package/dist/sdk/forward-verify.js +68 -5
- package/dist/sdk/forward-verify.js.map +1 -1
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/types.d.ts +21 -0
- package/package.json +1 -1
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parsePatch, filterHunks } from '../rule-harvester/diff-parser.js';
|
|
3
|
+
describe('Diff Parser', () => {
|
|
4
|
+
it('parses a simple unified diff patch', () => {
|
|
5
|
+
const patch = `@@ -10,4 +10,4 @@ function getUser(id: string) {
|
|
6
|
+
const user = db.query(id);
|
|
7
|
+
- return user.name;
|
|
8
|
+
+ return user?.name;
|
|
9
|
+
// end`;
|
|
10
|
+
const hunks = parsePatch('src/utils/user.ts', patch);
|
|
11
|
+
expect(hunks).toHaveLength(1);
|
|
12
|
+
expect(hunks[0].file).toBe('src/utils/user.ts');
|
|
13
|
+
expect(hunks[0].removedLines).toEqual([' return user.name;']);
|
|
14
|
+
expect(hunks[0].addedLines).toEqual([' return user?.name;']);
|
|
15
|
+
expect(hunks[0].context).toContain(' const user = db.query(id);');
|
|
16
|
+
expect(hunks[0].startLine).toBe(10);
|
|
17
|
+
});
|
|
18
|
+
it('parses multi-hunk patch', () => {
|
|
19
|
+
const patch = `@@ -5,3 +5,3 @@ import { db } from './db';
|
|
20
|
+
-const x = 1;
|
|
21
|
+
+const x = 2;
|
|
22
|
+
// mid
|
|
23
|
+
@@ -20,3 +20,3 @@ function foo() {
|
|
24
|
+
-const y = 3;
|
|
25
|
+
+const y = 4;
|
|
26
|
+
// end`;
|
|
27
|
+
const hunks = parsePatch('src/file.ts', patch);
|
|
28
|
+
expect(hunks).toHaveLength(2);
|
|
29
|
+
expect(hunks[0].startLine).toBe(5);
|
|
30
|
+
expect(hunks[1].startLine).toBe(20);
|
|
31
|
+
});
|
|
32
|
+
it('returns empty array for null/empty patch', () => {
|
|
33
|
+
expect(parsePatch('file.ts', null)).toEqual([]);
|
|
34
|
+
expect(parsePatch('file.ts', '')).toEqual([]);
|
|
35
|
+
});
|
|
36
|
+
describe('filterHunks', () => {
|
|
37
|
+
it('filters out import-only changes', () => {
|
|
38
|
+
const hunks = [
|
|
39
|
+
{
|
|
40
|
+
file: 'src/file.ts',
|
|
41
|
+
removedLines: ["import { foo } from './foo';", "import { bar } from './bar';"],
|
|
42
|
+
addedLines: ["import { foo, bar } from './foo';", "import { baz } from './baz';"],
|
|
43
|
+
context: [],
|
|
44
|
+
startLine: 1,
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
expect(filterHunks(hunks)).toEqual([]);
|
|
48
|
+
});
|
|
49
|
+
it('filters out comment-only changes', () => {
|
|
50
|
+
const hunks = [
|
|
51
|
+
{
|
|
52
|
+
file: 'src/file.ts',
|
|
53
|
+
removedLines: ['// old comment', '// another old'],
|
|
54
|
+
addedLines: ['// new comment', '// another new'],
|
|
55
|
+
context: [],
|
|
56
|
+
startLine: 5,
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
expect(filterHunks(hunks)).toEqual([]);
|
|
60
|
+
});
|
|
61
|
+
it('filters out hunks with <2 meaningful lines', () => {
|
|
62
|
+
const hunks = [
|
|
63
|
+
{
|
|
64
|
+
file: 'src/file.ts',
|
|
65
|
+
removedLines: ['const x = 1;'],
|
|
66
|
+
addedLines: ['const x = 2;'],
|
|
67
|
+
context: [],
|
|
68
|
+
startLine: 5,
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
expect(filterHunks(hunks)).toEqual([]);
|
|
72
|
+
});
|
|
73
|
+
it('keeps hunks with meaningful code changes', () => {
|
|
74
|
+
const hunks = [
|
|
75
|
+
{
|
|
76
|
+
file: 'src/file.ts',
|
|
77
|
+
removedLines: ['const x = obj.prop;', 'const y = obj.other;'],
|
|
78
|
+
addedLines: ['const x = obj?.prop;', 'const y = obj?.other;'],
|
|
79
|
+
context: ['function getStuff() {'],
|
|
80
|
+
startLine: 10,
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
expect(filterHunks(hunks)).toHaveLength(1);
|
|
84
|
+
});
|
|
85
|
+
it('filters out whitespace-only changes', () => {
|
|
86
|
+
const hunks = [
|
|
87
|
+
{
|
|
88
|
+
file: 'src/file.ts',
|
|
89
|
+
removedLines: [' const x = 1;', ' const y = 2;'],
|
|
90
|
+
addedLines: [' const x = 1;', ' const y = 2;'],
|
|
91
|
+
context: [],
|
|
92
|
+
startLine: 5,
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
expect(filterHunks(hunks)).toEqual([]);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
// ── Rule Generalizer Tests ─────────────────────────────────
|
|
100
|
+
import { buildGeneralizationPrompt, mapToExtractedPattern, } from '../rule-harvester/rule-generalizer.js';
|
|
101
|
+
describe('Rule Generalizer', () => {
|
|
102
|
+
describe('buildGeneralizationPrompt', () => {
|
|
103
|
+
it('includes before/after code', () => {
|
|
104
|
+
const hunk = {
|
|
105
|
+
file: 'src/utils/user.ts',
|
|
106
|
+
removedLines: [' return user.name;'],
|
|
107
|
+
addedLines: [' return user?.name;'],
|
|
108
|
+
context: ['function getUser() {'],
|
|
109
|
+
startLine: 10,
|
|
110
|
+
};
|
|
111
|
+
const prompt = buildGeneralizationPrompt(hunk, 'calcom/cal.com', 123, 'fix: null check on user access');
|
|
112
|
+
expect(prompt).toContain('return user.name;');
|
|
113
|
+
expect(prompt).toContain('return user?.name;');
|
|
114
|
+
expect(prompt).toContain('calcom/cal.com');
|
|
115
|
+
expect(prompt).toContain('123');
|
|
116
|
+
});
|
|
117
|
+
it('includes review comment when provided', () => {
|
|
118
|
+
const hunk = {
|
|
119
|
+
file: 'src/utils/user.ts',
|
|
120
|
+
removedLines: ['x'],
|
|
121
|
+
addedLines: ['y'],
|
|
122
|
+
context: [],
|
|
123
|
+
startLine: 1,
|
|
124
|
+
};
|
|
125
|
+
const prompt = buildGeneralizationPrompt(hunk, 'repo', 1, 'fix', 'This crashes when user is null');
|
|
126
|
+
expect(prompt).toContain('This crashes when user is null');
|
|
127
|
+
});
|
|
128
|
+
it('omits review comment section when not provided', () => {
|
|
129
|
+
const hunk = {
|
|
130
|
+
file: 'src/utils/user.ts',
|
|
131
|
+
removedLines: ['x'],
|
|
132
|
+
addedLines: ['y'],
|
|
133
|
+
context: [],
|
|
134
|
+
startLine: 1,
|
|
135
|
+
};
|
|
136
|
+
const prompt = buildGeneralizationPrompt(hunk, 'repo', 1, 'fix');
|
|
137
|
+
expect(prompt).not.toContain('Reviewer comment');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('mapToExtractedPattern', () => {
|
|
141
|
+
it('maps GeneralizedRule to ExtractedPattern', () => {
|
|
142
|
+
const rule = {
|
|
143
|
+
category: 'null-safety',
|
|
144
|
+
severity: 'high',
|
|
145
|
+
description: 'Check for null before property access',
|
|
146
|
+
detection: { pattern: '\\w+\\.\\w+\\.\\w+', language: 'typescript' },
|
|
147
|
+
fix: { description: 'Use optional chaining', pattern: '\\w+\\?\\.\\w+' },
|
|
148
|
+
fileGlob: '**/*.ts',
|
|
149
|
+
matchBehavior: 'presence_is_bad',
|
|
150
|
+
evidenceTemplate: 'Unsafe access: {match} in {file}',
|
|
151
|
+
provenance: { repo: 'calcom/cal.com', pr: 123, file: 'src/utils/user.ts' },
|
|
152
|
+
};
|
|
153
|
+
const pattern = mapToExtractedPattern(rule, 'lp_0042');
|
|
154
|
+
expect(pattern.id).toBe('lp_0042');
|
|
155
|
+
expect(pattern.regexPattern).toBe('\\w+\\.\\w+\\.\\w+');
|
|
156
|
+
expect(pattern.claimCategory).toBe('error-handling');
|
|
157
|
+
expect(pattern.severity).toBe('high');
|
|
158
|
+
expect(pattern.fileGlob).toBe('**/*.ts');
|
|
159
|
+
expect(pattern.matchBehavior).toBe('presence_is_bad');
|
|
160
|
+
expect(pattern.kind).toBe('regex');
|
|
161
|
+
expect(pattern.languages).toEqual(['typescript']);
|
|
162
|
+
});
|
|
163
|
+
it('coerces severity low to medium', () => {
|
|
164
|
+
const rule = {
|
|
165
|
+
category: 'style',
|
|
166
|
+
severity: 'low',
|
|
167
|
+
description: 'desc',
|
|
168
|
+
detection: { pattern: 'x', language: 'typescript' },
|
|
169
|
+
fix: { description: 'fix', pattern: 'y' },
|
|
170
|
+
fileGlob: '**/*.ts',
|
|
171
|
+
matchBehavior: 'presence_is_bad',
|
|
172
|
+
evidenceTemplate: '{match}',
|
|
173
|
+
provenance: { repo: 'r', pr: 1, file: 'f' },
|
|
174
|
+
};
|
|
175
|
+
const pattern = mapToExtractedPattern(rule, 'lp_0001');
|
|
176
|
+
expect(pattern.severity).toBe('medium');
|
|
177
|
+
});
|
|
178
|
+
it('defaults fileGlob when empty', () => {
|
|
179
|
+
const rule = {
|
|
180
|
+
category: 'test',
|
|
181
|
+
severity: 'medium',
|
|
182
|
+
description: 'desc',
|
|
183
|
+
detection: { pattern: 'x', language: 'typescript' },
|
|
184
|
+
fix: { description: 'fix', pattern: 'y' },
|
|
185
|
+
fileGlob: '',
|
|
186
|
+
matchBehavior: 'presence_is_bad',
|
|
187
|
+
evidenceTemplate: '{match}',
|
|
188
|
+
provenance: { repo: 'r', pr: 1, file: 'f' },
|
|
189
|
+
};
|
|
190
|
+
const pattern = mapToExtractedPattern(rule, 'lp_0001');
|
|
191
|
+
expect(pattern.fileGlob).toBe('**/*.{ts,tsx,js,jsx}');
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
// ── PR Discovery Tests ─────────────────────────────────────────
|
|
196
|
+
import { matchesBugLabels, matchesBugTitle, isTargetFile, DEFAULT_BUG_LABELS, } from '../rule-harvester/pr-discovery.js';
|
|
197
|
+
describe('PR Discovery', () => {
|
|
198
|
+
describe('matchesBugLabels', () => {
|
|
199
|
+
it('matches standard bug labels', () => {
|
|
200
|
+
expect(matchesBugLabels(['bug'])).toBe(true);
|
|
201
|
+
expect(matchesBugLabels(['fix'])).toBe(true);
|
|
202
|
+
expect(matchesBugLabels(['security'])).toBe(true);
|
|
203
|
+
expect(matchesBugLabels(['hotfix'])).toBe(true);
|
|
204
|
+
expect(matchesBugLabels(['bugfix'])).toBe(true);
|
|
205
|
+
expect(matchesBugLabels(['patch'])).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
it('matches case-insensitively', () => {
|
|
208
|
+
expect(matchesBugLabels(['Bug'])).toBe(true);
|
|
209
|
+
expect(matchesBugLabels(['BUG'])).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
it('matches compound labels', () => {
|
|
212
|
+
expect(matchesBugLabels(['type: bug'])).toBe(true);
|
|
213
|
+
expect(matchesBugLabels(['kind/bug'])).toBe(true);
|
|
214
|
+
});
|
|
215
|
+
it('rejects non-bug labels', () => {
|
|
216
|
+
expect(matchesBugLabels(['enhancement'])).toBe(false);
|
|
217
|
+
expect(matchesBugLabels(['feature'])).toBe(false);
|
|
218
|
+
expect(matchesBugLabels(['docs'])).toBe(false);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
describe('matchesBugTitle', () => {
|
|
222
|
+
it('matches fix-related titles', () => {
|
|
223
|
+
expect(matchesBugTitle('fix: null check on booking input')).toBe(true);
|
|
224
|
+
expect(matchesBugTitle('Fix race condition in auth')).toBe(true);
|
|
225
|
+
expect(matchesBugTitle('bug: missing validation')).toBe(true);
|
|
226
|
+
expect(matchesBugTitle('resolve crash on empty input')).toBe(true);
|
|
227
|
+
expect(matchesBugTitle('patch: handle undefined user')).toBe(true);
|
|
228
|
+
});
|
|
229
|
+
it('rejects non-fix titles', () => {
|
|
230
|
+
expect(matchesBugTitle('feat: add new button')).toBe(false);
|
|
231
|
+
expect(matchesBugTitle('chore: update deps')).toBe(false);
|
|
232
|
+
expect(matchesBugTitle('refactor: clean up utils')).toBe(false);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe('isTargetFile', () => {
|
|
236
|
+
it('accepts TypeScript/JavaScript files', () => {
|
|
237
|
+
expect(isTargetFile('src/utils/booking.ts')).toBe(true);
|
|
238
|
+
expect(isTargetFile('src/components/App.tsx')).toBe(true);
|
|
239
|
+
expect(isTargetFile('src/utils/helper.js')).toBe(true);
|
|
240
|
+
expect(isTargetFile('src/components/Form.jsx')).toBe(true);
|
|
241
|
+
});
|
|
242
|
+
it('rejects non-target files', () => {
|
|
243
|
+
expect(isTargetFile('package.json')).toBe(false);
|
|
244
|
+
expect(isTargetFile('README.md')).toBe(false);
|
|
245
|
+
expect(isTargetFile('styles.css')).toBe(false);
|
|
246
|
+
expect(isTargetFile('src/types.d.ts')).toBe(false);
|
|
247
|
+
});
|
|
248
|
+
it('rejects test files', () => {
|
|
249
|
+
expect(isTargetFile('src/utils/booking.test.ts')).toBe(false);
|
|
250
|
+
expect(isTargetFile('src/__tests__/app.ts')).toBe(false);
|
|
251
|
+
expect(isTargetFile('src/utils/booking.spec.ts')).toBe(false);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
describe('DEFAULT_BUG_LABELS', () => {
|
|
255
|
+
it('contains expected labels', () => {
|
|
256
|
+
expect(DEFAULT_BUG_LABELS).toContain('bug');
|
|
257
|
+
expect(DEFAULT_BUG_LABELS).toContain('fix');
|
|
258
|
+
expect(DEFAULT_BUG_LABELS).toContain('security');
|
|
259
|
+
expect(DEFAULT_BUG_LABELS).toContain('regression');
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
// ── PR Harvest Orchestrator Tests ─────────────────────────────
|
|
264
|
+
import { createPRProgress, markPRProcessed, isPRProcessed, getPRProgressStats, diceCoefficient, } from '../rule-harvester/pr-harvest.js';
|
|
265
|
+
describe('PR Harvest Orchestrator', () => {
|
|
266
|
+
describe('PR Progress Tracking', () => {
|
|
267
|
+
it('creates empty progress', () => {
|
|
268
|
+
const progress = createPRProgress();
|
|
269
|
+
expect(progress).toEqual({});
|
|
270
|
+
});
|
|
271
|
+
it('marks PRs as processed', () => {
|
|
272
|
+
let progress = createPRProgress();
|
|
273
|
+
progress = markPRProcessed(progress, 'calcom/cal.com', 123);
|
|
274
|
+
expect(isPRProcessed(progress, 'calcom/cal.com', 123)).toBe(true);
|
|
275
|
+
expect(isPRProcessed(progress, 'calcom/cal.com', 456)).toBe(false);
|
|
276
|
+
});
|
|
277
|
+
it('tracks stats per repo', () => {
|
|
278
|
+
let progress = createPRProgress();
|
|
279
|
+
progress = markPRProcessed(progress, 'calcom/cal.com', 123);
|
|
280
|
+
progress = markPRProcessed(progress, 'calcom/cal.com', 456);
|
|
281
|
+
const stats = getPRProgressStats(progress, 'calcom/cal.com');
|
|
282
|
+
expect(stats.processedPRs).toBe(2);
|
|
283
|
+
});
|
|
284
|
+
it('does not duplicate PR numbers on re-mark', () => {
|
|
285
|
+
let progress = createPRProgress();
|
|
286
|
+
progress = markPRProcessed(progress, 'calcom/cal.com', 123);
|
|
287
|
+
progress = markPRProcessed(progress, 'calcom/cal.com', 123);
|
|
288
|
+
const stats = getPRProgressStats(progress, 'calcom/cal.com');
|
|
289
|
+
expect(stats.processedPRs).toBe(1);
|
|
290
|
+
});
|
|
291
|
+
it('tracks multiple repos independently', () => {
|
|
292
|
+
let progress = createPRProgress();
|
|
293
|
+
progress = markPRProcessed(progress, 'calcom/cal.com', 1);
|
|
294
|
+
progress = markPRProcessed(progress, 'vercel/next.js', 2);
|
|
295
|
+
expect(isPRProcessed(progress, 'calcom/cal.com', 1)).toBe(true);
|
|
296
|
+
expect(isPRProcessed(progress, 'calcom/cal.com', 2)).toBe(false);
|
|
297
|
+
expect(isPRProcessed(progress, 'vercel/next.js', 2)).toBe(true);
|
|
298
|
+
});
|
|
299
|
+
it('returns 0 stats for unknown repo', () => {
|
|
300
|
+
const progress = createPRProgress();
|
|
301
|
+
const stats = getPRProgressStats(progress, 'unknown/repo');
|
|
302
|
+
expect(stats.processedPRs).toBe(0);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
describe('Fuzzy Deduplication', () => {
|
|
306
|
+
it('detects high similarity', () => {
|
|
307
|
+
const a = 'Check for null before accessing nested properties';
|
|
308
|
+
const b = 'Check for null before accessing nested object properties';
|
|
309
|
+
expect(diceCoefficient(a, b)).toBeGreaterThan(0.7);
|
|
310
|
+
});
|
|
311
|
+
it('detects low similarity', () => {
|
|
312
|
+
const a = 'Check for null before accessing nested properties';
|
|
313
|
+
const b = 'Use try-catch around async database operations';
|
|
314
|
+
expect(diceCoefficient(a, b)).toBeLessThan(0.3);
|
|
315
|
+
});
|
|
316
|
+
it('returns 1 for identical strings', () => {
|
|
317
|
+
expect(diceCoefficient('hello', 'hello')).toBe(1);
|
|
318
|
+
});
|
|
319
|
+
it('returns 0 for single-char strings', () => {
|
|
320
|
+
expect(diceCoefficient('a', 'b')).toBe(0);
|
|
321
|
+
});
|
|
322
|
+
it('handles empty strings', () => {
|
|
323
|
+
expect(diceCoefficient('', '')).toBe(1);
|
|
324
|
+
expect(diceCoefficient('', 'hello')).toBe(0);
|
|
325
|
+
});
|
|
326
|
+
it('is symmetric', () => {
|
|
327
|
+
const a = 'Check for null safety';
|
|
328
|
+
const b = 'Verify null safety checks';
|
|
329
|
+
expect(diceCoefficient(a, b)).toBeCloseTo(diceCoefficient(b, a), 5);
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
// ── CLI Integration Tests ─────────────────────────────────────────
|
|
334
|
+
describe('CLI Integration', () => {
|
|
335
|
+
it('harvest command module exports harvestCommand', async () => {
|
|
336
|
+
const mod = await import('../../commands/harvest.js');
|
|
337
|
+
expect(mod.harvestCommand).toBeDefined();
|
|
338
|
+
expect(typeof mod.harvestCommand).toBe('function');
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
//# sourceMappingURL=pr-harvester.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-harvester.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/pr-harvester.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|