@blockspool/core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/scout/index.d.ts +1 -1
- package/dist/scout/index.d.ts.map +1 -1
- package/dist/scout/index.js +6 -5
- package/dist/scout/index.js.map +1 -1
- package/dist/scout/runner.d.ts +36 -4
- package/dist/scout/runner.d.ts.map +1 -1
- package/dist/scout/runner.js +109 -1
- package/dist/scout/runner.js.map +1 -1
- package/dist/scout/types.d.ts +2 -0
- package/dist/scout/types.d.ts.map +1 -1
- package/dist/scout/types.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/scout.d.ts +3 -1
- package/dist/services/scout.d.ts.map +1 -1
- package/dist/services/scout.js +1 -0
- package/dist/services/scout.js.map +1 -1
- package/dist/test/db-contract-sqlite.test.d.ts +2 -0
- package/dist/test/db-contract-sqlite.test.d.ts.map +1 -0
- package/dist/test/db-contract-sqlite.test.js +176 -0
- package/dist/test/db-contract-sqlite.test.js.map +1 -0
- package/dist/test/learnings-format.test.d.ts +9 -0
- package/dist/test/learnings-format.test.d.ts.map +1 -0
- package/dist/test/learnings-format.test.js +174 -0
- package/dist/test/learnings-format.test.js.map +1 -0
- package/dist/test/repos-integration.test.d.ts +2 -0
- package/dist/test/repos-integration.test.d.ts.map +1 -0
- package/dist/test/repos-integration.test.js +565 -0
- package/dist/test/repos-integration.test.js.map +1 -0
- package/dist/test/scout-full-pure.test.d.ts +2 -0
- package/dist/test/scout-full-pure.test.d.ts.map +1 -0
- package/dist/test/scout-full-pure.test.js +122 -0
- package/dist/test/scout-full-pure.test.js.map +1 -0
- package/dist/test/scout-integration.test.d.ts +13 -0
- package/dist/test/scout-integration.test.d.ts.map +1 -0
- package/dist/test/scout-integration.test.js +229 -0
- package/dist/test/scout-integration.test.js.map +1 -0
- package/dist/test/scout-prompt.test.d.ts +2 -0
- package/dist/test/scout-prompt.test.d.ts.map +1 -0
- package/dist/test/scout-prompt.test.js +79 -0
- package/dist/test/scout-prompt.test.js.map +1 -0
- package/dist/test/scout-runner-parse.test.d.ts +2 -0
- package/dist/test/scout-runner-parse.test.d.ts.map +1 -0
- package/dist/test/scout-runner-parse.test.js +44 -0
- package/dist/test/scout-runner-parse.test.js.map +1 -0
- package/dist/test/scout-runner-spawn.test.d.ts +11 -0
- package/dist/test/scout-runner-spawn.test.d.ts.map +1 -0
- package/dist/test/scout-runner-spawn.test.js +359 -0
- package/dist/test/scout-runner-spawn.test.js.map +1 -0
- package/dist/test/scout-scanner-fs.test.d.ts +2 -0
- package/dist/test/scout-scanner-fs.test.d.ts.map +1 -0
- package/dist/test/scout-scanner-fs.test.js +188 -0
- package/dist/test/scout-scanner-fs.test.js.map +1 -0
- package/dist/test/scout-scanner-pure.test.d.ts +2 -0
- package/dist/test/scout-scanner-pure.test.d.ts.map +1 -0
- package/dist/test/scout-scanner-pure.test.js +131 -0
- package/dist/test/scout-scanner-pure.test.js.map +1 -0
- package/dist/test/services-integration.test.d.ts +2 -0
- package/dist/test/services-integration.test.d.ts.map +1 -0
- package/dist/test/services-integration.test.js +327 -0
- package/dist/test/services-integration.test.js.map +1 -0
- package/dist/test/services-qa.test.d.ts +2 -0
- package/dist/test/services-qa.test.d.ts.map +1 -0
- package/dist/test/services-qa.test.js +255 -0
- package/dist/test/services-qa.test.js.map +1 -0
- package/dist/test/services-scout.test.d.ts +2 -0
- package/dist/test/services-scout.test.d.ts.map +1 -0
- package/dist/test/services-scout.test.js +269 -0
- package/dist/test/services-scout.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
2
|
+
import { createSQLiteAdapter } from '@blockspool/sqlite';
|
|
3
|
+
import * as projects from '../repos/projects.js';
|
|
4
|
+
import * as tickets from '../repos/tickets.js';
|
|
5
|
+
import * as runs from '../repos/runs.js';
|
|
6
|
+
import * as runSteps from '../repos/run_steps.js';
|
|
7
|
+
let db;
|
|
8
|
+
beforeAll(async () => {
|
|
9
|
+
db = await createSQLiteAdapter({ url: ':memory:' });
|
|
10
|
+
});
|
|
11
|
+
afterAll(async () => {
|
|
12
|
+
await db.close();
|
|
13
|
+
});
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Projects
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
describe('projects repo — extended', () => {
|
|
18
|
+
it('getById returns null for non-existent id', async () => {
|
|
19
|
+
const result = await projects.getById(db, 'proj_nonexistent');
|
|
20
|
+
expect(result).toBeNull();
|
|
21
|
+
});
|
|
22
|
+
it('getByRepoRoot returns null when no match', async () => {
|
|
23
|
+
const result = await projects.getByRepoRoot(db, '/no/such/path');
|
|
24
|
+
expect(result).toBeNull();
|
|
25
|
+
});
|
|
26
|
+
it('ensureForRepo creates with generated id when id omitted', async () => {
|
|
27
|
+
const p = await projects.ensureForRepo(db, {
|
|
28
|
+
name: 'auto-id-proj',
|
|
29
|
+
rootPath: '/tmp/auto-id-proj',
|
|
30
|
+
});
|
|
31
|
+
expect(p.id).toMatch(/^proj_/);
|
|
32
|
+
expect(p.repoUrl).toBeNull();
|
|
33
|
+
});
|
|
34
|
+
it('ensureForRepo is idempotent on rootPath', async () => {
|
|
35
|
+
const p1 = await projects.ensureForRepo(db, {
|
|
36
|
+
name: 'idem',
|
|
37
|
+
rootPath: '/tmp/idempotent',
|
|
38
|
+
repoUrl: 'https://github.com/a/b',
|
|
39
|
+
});
|
|
40
|
+
const p2 = await projects.ensureForRepo(db, {
|
|
41
|
+
name: 'idem-different',
|
|
42
|
+
rootPath: '/tmp/idempotent',
|
|
43
|
+
});
|
|
44
|
+
expect(p1.id).toBe(p2.id);
|
|
45
|
+
expect(p2.name).toBe('idem'); // original name kept
|
|
46
|
+
});
|
|
47
|
+
it('remove deletes project and cascaded data', async () => {
|
|
48
|
+
const p = await projects.ensureForRepo(db, {
|
|
49
|
+
id: 'proj_del',
|
|
50
|
+
name: 'to-delete',
|
|
51
|
+
rootPath: '/tmp/to-delete',
|
|
52
|
+
});
|
|
53
|
+
// create a ticket + run linked to ticket so cascade works
|
|
54
|
+
const tkt = await tickets.create(db, { projectId: p.id, title: 'will-die' });
|
|
55
|
+
await runs.create(db, { projectId: p.id, ticketId: tkt.id, type: 'scout' });
|
|
56
|
+
await projects.remove(db, p.id);
|
|
57
|
+
expect(await projects.getById(db, p.id)).toBeNull();
|
|
58
|
+
expect(await tickets.getById(db, tkt.id)).toBeNull();
|
|
59
|
+
});
|
|
60
|
+
it('list orders by updated_at DESC', async () => {
|
|
61
|
+
const all = await projects.list(db);
|
|
62
|
+
for (let i = 1; i < all.length; i++) {
|
|
63
|
+
expect(all[i - 1].updatedAt.getTime()).toBeGreaterThanOrEqual(all[i].updatedAt.getTime());
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Tickets
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
describe('tickets repo — extended', () => {
|
|
71
|
+
let projId;
|
|
72
|
+
beforeAll(async () => {
|
|
73
|
+
const p = await projects.ensureForRepo(db, {
|
|
74
|
+
id: 'proj_tkt_ext',
|
|
75
|
+
name: 'tickets-ext',
|
|
76
|
+
rootPath: '/tmp/tickets-ext',
|
|
77
|
+
});
|
|
78
|
+
projId = p.id;
|
|
79
|
+
});
|
|
80
|
+
it('creates ticket with all optional fields', async () => {
|
|
81
|
+
const tkt = await tickets.create(db, {
|
|
82
|
+
projectId: projId,
|
|
83
|
+
title: 'Full ticket',
|
|
84
|
+
description: 'Detailed description',
|
|
85
|
+
status: 'backlog',
|
|
86
|
+
priority: 99,
|
|
87
|
+
shard: 'packages/core',
|
|
88
|
+
category: 'security',
|
|
89
|
+
allowedPaths: ['src/a.ts', 'src/b.ts'],
|
|
90
|
+
forbiddenPaths: ['node_modules'],
|
|
91
|
+
verificationCommands: ['npm run build', 'npm test'],
|
|
92
|
+
maxRetries: 5,
|
|
93
|
+
});
|
|
94
|
+
expect(tkt.status).toBe('backlog');
|
|
95
|
+
expect(tkt.priority).toBe(99);
|
|
96
|
+
expect(tkt.shard).toBe('packages/core');
|
|
97
|
+
expect(tkt.category).toBe('security');
|
|
98
|
+
expect(tkt.allowedPaths).toEqual(['src/a.ts', 'src/b.ts']);
|
|
99
|
+
expect(tkt.forbiddenPaths).toEqual(['node_modules']);
|
|
100
|
+
expect(tkt.verificationCommands).toEqual(['npm run build', 'npm test']);
|
|
101
|
+
expect(tkt.maxRetries).toBe(5);
|
|
102
|
+
expect(tkt.retryCount).toBe(0);
|
|
103
|
+
});
|
|
104
|
+
it('creates ticket with defaults when optionals omitted', async () => {
|
|
105
|
+
const tkt = await tickets.create(db, {
|
|
106
|
+
projectId: projId,
|
|
107
|
+
title: 'Minimal ticket',
|
|
108
|
+
});
|
|
109
|
+
expect(tkt.status).toBe('ready');
|
|
110
|
+
expect(tkt.priority).toBe(0);
|
|
111
|
+
expect(tkt.shard).toBeNull();
|
|
112
|
+
expect(tkt.category).toBeNull();
|
|
113
|
+
expect(tkt.allowedPaths).toEqual([]);
|
|
114
|
+
expect(tkt.forbiddenPaths).toEqual([]);
|
|
115
|
+
expect(tkt.verificationCommands).toEqual([]);
|
|
116
|
+
expect(tkt.maxRetries).toBe(3);
|
|
117
|
+
expect(tkt.description).toBeNull();
|
|
118
|
+
});
|
|
119
|
+
it('getById returns null for missing ticket', async () => {
|
|
120
|
+
expect(await tickets.getById(db, 'tkt_nonexistent')).toBeNull();
|
|
121
|
+
});
|
|
122
|
+
it('createMany creates multiple tickets transactionally', async () => {
|
|
123
|
+
const created = await tickets.createMany(db, [
|
|
124
|
+
{ projectId: projId, title: 'Batch A', priority: 10 },
|
|
125
|
+
{ projectId: projId, title: 'Batch B', priority: 20 },
|
|
126
|
+
{ projectId: projId, title: 'Batch C', priority: 30 },
|
|
127
|
+
]);
|
|
128
|
+
expect(created).toHaveLength(3);
|
|
129
|
+
expect(created.map(t => t.title)).toEqual(['Batch A', 'Batch B', 'Batch C']);
|
|
130
|
+
});
|
|
131
|
+
it('listByProject with array of statuses', async () => {
|
|
132
|
+
await tickets.create(db, { projectId: projId, title: 'Blocked', status: 'blocked' });
|
|
133
|
+
await tickets.create(db, { projectId: projId, title: 'Aborted', status: 'aborted' });
|
|
134
|
+
const result = await tickets.listByProject(db, projId, {
|
|
135
|
+
status: ['blocked', 'aborted'],
|
|
136
|
+
});
|
|
137
|
+
expect(result.length).toBeGreaterThanOrEqual(2);
|
|
138
|
+
for (const t of result) {
|
|
139
|
+
expect(['blocked', 'aborted']).toContain(t.status);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
it('listByProject respects limit', async () => {
|
|
143
|
+
const result = await tickets.listByProject(db, projId, { limit: 2 });
|
|
144
|
+
expect(result.length).toBeLessThanOrEqual(2);
|
|
145
|
+
});
|
|
146
|
+
it('listByProject orders by priority DESC then created_at DESC', async () => {
|
|
147
|
+
const all = await tickets.listByProject(db, projId);
|
|
148
|
+
for (let i = 1; i < all.length; i++) {
|
|
149
|
+
if (all[i - 1].priority === all[i].priority) {
|
|
150
|
+
expect(all[i - 1].createdAt.getTime()).toBeGreaterThanOrEqual(all[i].createdAt.getTime());
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
expect(all[i - 1].priority).toBeGreaterThanOrEqual(all[i].priority);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
it('updateStatus transitions through multiple states', async () => {
|
|
158
|
+
const tkt = await tickets.create(db, { projectId: projId, title: 'Transition' });
|
|
159
|
+
expect(tkt.status).toBe('ready');
|
|
160
|
+
await tickets.updateStatus(db, tkt.id, 'leased');
|
|
161
|
+
await tickets.updateStatus(db, tkt.id, 'in_progress');
|
|
162
|
+
await tickets.updateStatus(db, tkt.id, 'in_review');
|
|
163
|
+
const final = await tickets.updateStatus(db, tkt.id, 'done');
|
|
164
|
+
expect(final.status).toBe('done');
|
|
165
|
+
});
|
|
166
|
+
it('updateStatus returns null for non-existent ticket', async () => {
|
|
167
|
+
// updateStatus does UPDATE then getById; getById returns null
|
|
168
|
+
const result = await tickets.updateStatus(db, 'tkt_gone', 'done');
|
|
169
|
+
// The row won't exist so getById returns null
|
|
170
|
+
expect(result).toBeNull();
|
|
171
|
+
});
|
|
172
|
+
it('getRecentlyCompleted returns done tickets', async () => {
|
|
173
|
+
const recent = await tickets.getRecentlyCompleted(db, projId, 5);
|
|
174
|
+
for (const t of recent) {
|
|
175
|
+
expect(t.status).toBe('done');
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
it('countByStatus returns correct counts', async () => {
|
|
179
|
+
const counts = await tickets.countByStatus(db, projId);
|
|
180
|
+
expect(typeof counts.ready).toBe('number');
|
|
181
|
+
expect(typeof counts.done).toBe('number');
|
|
182
|
+
// at least the ones we created above
|
|
183
|
+
expect((counts.ready ?? 0) + (counts.done ?? 0)).toBeGreaterThan(0);
|
|
184
|
+
});
|
|
185
|
+
it('findSimilarByTitle is case-insensitive', async () => {
|
|
186
|
+
await tickets.create(db, { projectId: projId, title: 'Unique Title XYZ' });
|
|
187
|
+
const found = await tickets.findSimilarByTitle(db, projId, 'unique title xyz');
|
|
188
|
+
expect(found).not.toBeNull();
|
|
189
|
+
expect(found.title).toBe('Unique Title XYZ');
|
|
190
|
+
});
|
|
191
|
+
it('findSimilarByTitle returns null when no match', async () => {
|
|
192
|
+
const found = await tickets.findSimilarByTitle(db, projId, 'no match here 123456');
|
|
193
|
+
expect(found).toBeNull();
|
|
194
|
+
});
|
|
195
|
+
it('listByProject returns empty for unknown project', async () => {
|
|
196
|
+
const result = await tickets.listByProject(db, 'proj_nonexistent');
|
|
197
|
+
expect(result).toEqual([]);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// Runs
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
describe('runs repo — extended', () => {
|
|
204
|
+
let projId;
|
|
205
|
+
beforeAll(async () => {
|
|
206
|
+
const p = await projects.ensureForRepo(db, {
|
|
207
|
+
id: 'proj_runs_ext',
|
|
208
|
+
name: 'runs-ext',
|
|
209
|
+
rootPath: '/tmp/runs-ext',
|
|
210
|
+
});
|
|
211
|
+
projId = p.id;
|
|
212
|
+
});
|
|
213
|
+
it('creates run with ticketId', async () => {
|
|
214
|
+
const tkt = await tickets.create(db, { projectId: projId, title: 'For run' });
|
|
215
|
+
const run = await runs.create(db, {
|
|
216
|
+
projectId: projId,
|
|
217
|
+
type: 'worker',
|
|
218
|
+
ticketId: tkt.id,
|
|
219
|
+
maxIterations: 5,
|
|
220
|
+
metadata: { branch: 'feat/x' },
|
|
221
|
+
});
|
|
222
|
+
expect(run.ticketId).toBe(tkt.id);
|
|
223
|
+
expect(run.maxIterations).toBe(5);
|
|
224
|
+
expect(run.metadata).toEqual({ branch: 'feat/x' });
|
|
225
|
+
expect(run.startedAt).not.toBeNull();
|
|
226
|
+
});
|
|
227
|
+
it('getById returns null for non-existent run', async () => {
|
|
228
|
+
expect(await runs.getById(db, 'run_nonexistent')).toBeNull();
|
|
229
|
+
});
|
|
230
|
+
it('markSuccess merges metadata', async () => {
|
|
231
|
+
const run = await runs.create(db, {
|
|
232
|
+
projectId: projId,
|
|
233
|
+
type: 'qa',
|
|
234
|
+
metadata: { a: 1 },
|
|
235
|
+
});
|
|
236
|
+
const updated = await runs.markSuccess(db, run.id, { b: 2 });
|
|
237
|
+
expect(updated.metadata).toEqual({ a: 1, b: 2 });
|
|
238
|
+
expect(updated.status).toBe('success');
|
|
239
|
+
expect(updated.completedAt).not.toBeNull();
|
|
240
|
+
});
|
|
241
|
+
it('markFailure with string error', async () => {
|
|
242
|
+
const run = await runs.create(db, { projectId: projId, type: 'scout' });
|
|
243
|
+
const updated = await runs.markFailure(db, run.id, 'string error');
|
|
244
|
+
expect(updated.error).toBe('string error');
|
|
245
|
+
expect(updated.status).toBe('failure');
|
|
246
|
+
});
|
|
247
|
+
it('markSuccess returns null for non-existent run', async () => {
|
|
248
|
+
expect(await runs.markSuccess(db, 'run_nope')).toBeNull();
|
|
249
|
+
});
|
|
250
|
+
it('markFailure returns null for non-existent run', async () => {
|
|
251
|
+
expect(await runs.markFailure(db, 'run_nope', 'err')).toBeNull();
|
|
252
|
+
});
|
|
253
|
+
it('listByProject filters by status array', async () => {
|
|
254
|
+
const result = await runs.listByProject(db, projId, {
|
|
255
|
+
status: ['success', 'failure'],
|
|
256
|
+
});
|
|
257
|
+
for (const r of result) {
|
|
258
|
+
expect(['success', 'failure']).toContain(r.status);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
it('listByProject filters by type and status combined', async () => {
|
|
262
|
+
const result = await runs.listByProject(db, projId, {
|
|
263
|
+
type: 'qa',
|
|
264
|
+
status: 'success',
|
|
265
|
+
});
|
|
266
|
+
for (const r of result) {
|
|
267
|
+
expect(r.type).toBe('qa');
|
|
268
|
+
expect(r.status).toBe('success');
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
it('listByProject respects limit', async () => {
|
|
272
|
+
const result = await runs.listByProject(db, projId, { limit: 1 });
|
|
273
|
+
expect(result.length).toBeLessThanOrEqual(1);
|
|
274
|
+
});
|
|
275
|
+
it('countActive counts pending and running', async () => {
|
|
276
|
+
// We created several runs; the ones not marked should be running
|
|
277
|
+
const count = await runs.countActive(db, projId);
|
|
278
|
+
expect(count).toBeGreaterThanOrEqual(0);
|
|
279
|
+
});
|
|
280
|
+
it('countActive without projectId counts globally', async () => {
|
|
281
|
+
const count = await runs.countActive(db);
|
|
282
|
+
expect(typeof count).toBe('number');
|
|
283
|
+
});
|
|
284
|
+
it('getLatestByType returns most recent', async () => {
|
|
285
|
+
const r1 = await runs.create(db, { projectId: projId, type: 'merge' });
|
|
286
|
+
const r2 = await runs.create(db, { projectId: projId, type: 'merge' });
|
|
287
|
+
const latest = await runs.getLatestByType(db, projId, 'merge');
|
|
288
|
+
expect(latest).not.toBeNull();
|
|
289
|
+
// Both created in same millisecond; just verify one is returned
|
|
290
|
+
expect([r1.id, r2.id]).toContain(latest.id);
|
|
291
|
+
});
|
|
292
|
+
it('getLatestByType returns null when none exist', async () => {
|
|
293
|
+
const p = await projects.ensureForRepo(db, {
|
|
294
|
+
name: 'empty-runs',
|
|
295
|
+
rootPath: '/tmp/empty-runs-test',
|
|
296
|
+
});
|
|
297
|
+
const latest = await runs.getLatestByType(db, p.id, 'worker');
|
|
298
|
+
expect(latest).toBeNull();
|
|
299
|
+
});
|
|
300
|
+
it('getSummary returns structured data', async () => {
|
|
301
|
+
const summary = await runs.getSummary(db, projId);
|
|
302
|
+
expect(summary).toHaveProperty('lastScout');
|
|
303
|
+
expect(summary).toHaveProperty('lastQa');
|
|
304
|
+
expect(summary).toHaveProperty('lastExecute');
|
|
305
|
+
expect(typeof summary.activeRuns).toBe('number');
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
// ---------------------------------------------------------------------------
|
|
309
|
+
// Run Steps
|
|
310
|
+
// ---------------------------------------------------------------------------
|
|
311
|
+
describe('run_steps repo — extended', () => {
|
|
312
|
+
let projId;
|
|
313
|
+
let runId;
|
|
314
|
+
beforeAll(async () => {
|
|
315
|
+
const p = await projects.ensureForRepo(db, {
|
|
316
|
+
id: 'proj_steps_ext',
|
|
317
|
+
name: 'steps-ext',
|
|
318
|
+
rootPath: '/tmp/steps-ext',
|
|
319
|
+
});
|
|
320
|
+
projId = p.id;
|
|
321
|
+
const run = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
322
|
+
runId = run.id;
|
|
323
|
+
});
|
|
324
|
+
it('creates a step with all fields', async () => {
|
|
325
|
+
const step = await runSteps.create(db, {
|
|
326
|
+
runId,
|
|
327
|
+
ordinal: 0,
|
|
328
|
+
name: 'build',
|
|
329
|
+
kind: 'command',
|
|
330
|
+
cmd: 'npm run build',
|
|
331
|
+
cwd: '/tmp',
|
|
332
|
+
timeoutMs: 30000,
|
|
333
|
+
metadata: { env: 'test' },
|
|
334
|
+
});
|
|
335
|
+
expect(step.runId).toBe(runId);
|
|
336
|
+
expect(step.ordinal).toBe(0);
|
|
337
|
+
expect(step.kind).toBe('command');
|
|
338
|
+
expect(step.status).toBe('queued');
|
|
339
|
+
expect(step.cmd).toBe('npm run build');
|
|
340
|
+
expect(step.cwd).toBe('/tmp');
|
|
341
|
+
expect(step.timeoutMs).toBe(30000);
|
|
342
|
+
expect(step.metadata).toEqual({ env: 'test' });
|
|
343
|
+
expect(step.stdoutBytes).toBe(0);
|
|
344
|
+
expect(step.stderrBytes).toBe(0);
|
|
345
|
+
expect(step.stdoutTruncated).toBe(false);
|
|
346
|
+
expect(step.stderrTruncated).toBe(false);
|
|
347
|
+
});
|
|
348
|
+
it('creates step with defaults', async () => {
|
|
349
|
+
const step = await runSteps.create(db, {
|
|
350
|
+
runId,
|
|
351
|
+
ordinal: 1,
|
|
352
|
+
name: 'test',
|
|
353
|
+
});
|
|
354
|
+
expect(step.attempt).toBe(1);
|
|
355
|
+
expect(step.kind).toBe('command');
|
|
356
|
+
expect(step.cmd).toBeNull();
|
|
357
|
+
expect(step.cwd).toBeNull();
|
|
358
|
+
expect(step.timeoutMs).toBeNull();
|
|
359
|
+
});
|
|
360
|
+
it('getById returns null for missing step', async () => {
|
|
361
|
+
expect(await runSteps.getById(db, 'stp_nonexistent')).toBeNull();
|
|
362
|
+
});
|
|
363
|
+
it('createMany creates ordered steps', async () => {
|
|
364
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
365
|
+
const steps = await runSteps.createMany(db, newRun.id, [
|
|
366
|
+
{ name: 'lint', cmd: 'npm run lint' },
|
|
367
|
+
{ name: 'build', cmd: 'npm run build' },
|
|
368
|
+
{ name: 'test', cmd: 'npm test', timeoutMs: 60000 },
|
|
369
|
+
]);
|
|
370
|
+
expect(steps).toHaveLength(3);
|
|
371
|
+
expect(steps[0].ordinal).toBe(0);
|
|
372
|
+
expect(steps[1].ordinal).toBe(1);
|
|
373
|
+
expect(steps[2].ordinal).toBe(2);
|
|
374
|
+
expect(steps[2].timeoutMs).toBe(60000);
|
|
375
|
+
});
|
|
376
|
+
it('createMany with custom attempt', async () => {
|
|
377
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
378
|
+
const steps = await runSteps.createMany(db, newRun.id, [{ name: 'retry-build', cmd: 'npm run build' }], 3);
|
|
379
|
+
expect(steps[0].attempt).toBe(3);
|
|
380
|
+
});
|
|
381
|
+
it('markStarted sets running and started_at_ms', async () => {
|
|
382
|
+
const step = await runSteps.create(db, { runId, ordinal: 10, name: 'start-test' });
|
|
383
|
+
const started = await runSteps.markStarted(db, step.id);
|
|
384
|
+
expect(started.status).toBe('running');
|
|
385
|
+
expect(started.startedAtMs).not.toBeNull();
|
|
386
|
+
});
|
|
387
|
+
it('markSuccess records output details', async () => {
|
|
388
|
+
const step = await runSteps.create(db, { runId, ordinal: 11, name: 'success-test' });
|
|
389
|
+
await runSteps.markStarted(db, step.id);
|
|
390
|
+
const done = await runSteps.markSuccess(db, step.id, {
|
|
391
|
+
exitCode: 0,
|
|
392
|
+
stdoutPath: '/logs/stdout.log',
|
|
393
|
+
stderrPath: '/logs/stderr.log',
|
|
394
|
+
stdoutBytes: 1024,
|
|
395
|
+
stderrBytes: 256,
|
|
396
|
+
stdoutTruncated: true,
|
|
397
|
+
stderrTruncated: false,
|
|
398
|
+
stdoutTail: 'last lines...',
|
|
399
|
+
stderrTail: 'err tail',
|
|
400
|
+
metadata: { extra: true },
|
|
401
|
+
});
|
|
402
|
+
expect(done.status).toBe('success');
|
|
403
|
+
expect(done.exitCode).toBe(0);
|
|
404
|
+
expect(done.stdoutPath).toBe('/logs/stdout.log');
|
|
405
|
+
expect(done.stdoutBytes).toBe(1024);
|
|
406
|
+
expect(done.stdoutTruncated).toBe(true);
|
|
407
|
+
expect(done.stderrTruncated).toBe(false);
|
|
408
|
+
expect(done.stdoutTail).toBe('last lines...');
|
|
409
|
+
expect(done.durationMs).not.toBeNull();
|
|
410
|
+
expect(done.metadata).toEqual(expect.objectContaining({ extra: true }));
|
|
411
|
+
});
|
|
412
|
+
it('markSuccess returns null for missing step', async () => {
|
|
413
|
+
expect(await runSteps.markSuccess(db, 'stp_gone')).toBeNull();
|
|
414
|
+
});
|
|
415
|
+
it('markFailed records error info', async () => {
|
|
416
|
+
const step = await runSteps.create(db, { runId, ordinal: 12, name: 'fail-test' });
|
|
417
|
+
await runSteps.markStarted(db, step.id);
|
|
418
|
+
const failed = await runSteps.markFailed(db, step.id, {
|
|
419
|
+
exitCode: 1,
|
|
420
|
+
signal: 'SIGTERM',
|
|
421
|
+
errorMessage: 'Segfault',
|
|
422
|
+
stdoutTail: 'output before crash',
|
|
423
|
+
stderrTail: 'segfault at 0x0',
|
|
424
|
+
});
|
|
425
|
+
expect(failed.status).toBe('failed');
|
|
426
|
+
expect(failed.exitCode).toBe(1);
|
|
427
|
+
expect(failed.signal).toBe('SIGTERM');
|
|
428
|
+
expect(failed.errorMessage).toBe('Segfault');
|
|
429
|
+
});
|
|
430
|
+
it('markFailed returns null for missing step', async () => {
|
|
431
|
+
expect(await runSteps.markFailed(db, 'stp_gone', { errorMessage: 'x' })).toBeNull();
|
|
432
|
+
});
|
|
433
|
+
it('markSkipped sets status and reason', async () => {
|
|
434
|
+
const step = await runSteps.create(db, { runId, ordinal: 13, name: 'skip-test' });
|
|
435
|
+
const skipped = await runSteps.markSkipped(db, step.id, 'Previous step failed');
|
|
436
|
+
expect(skipped.status).toBe('skipped');
|
|
437
|
+
expect(skipped.errorMessage).toBe('Previous step failed');
|
|
438
|
+
});
|
|
439
|
+
it('markCanceled sets status and reason', async () => {
|
|
440
|
+
const step = await runSteps.create(db, { runId, ordinal: 14, name: 'cancel-test' });
|
|
441
|
+
const canceled = await runSteps.markCanceled(db, step.id, 'User canceled');
|
|
442
|
+
expect(canceled.status).toBe('canceled');
|
|
443
|
+
expect(canceled.errorMessage).toBe('User canceled');
|
|
444
|
+
});
|
|
445
|
+
it('listByRun returns steps ordered by attempt,ordinal', async () => {
|
|
446
|
+
const steps = await runSteps.listByRun(db, runId);
|
|
447
|
+
for (let i = 1; i < steps.length; i++) {
|
|
448
|
+
if (steps[i - 1].attempt === steps[i].attempt) {
|
|
449
|
+
expect(steps[i - 1].ordinal).toBeLessThanOrEqual(steps[i].ordinal);
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
expect(steps[i - 1].attempt).toBeLessThanOrEqual(steps[i].attempt);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
it('listByRun filters by attempt', async () => {
|
|
457
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
458
|
+
await runSteps.createMany(db, newRun.id, [{ name: 'a1', cmd: 'echo 1' }], 1);
|
|
459
|
+
await runSteps.createMany(db, newRun.id, [{ name: 'a2', cmd: 'echo 2' }], 2);
|
|
460
|
+
const attempt1 = await runSteps.listByRun(db, newRun.id, { attempt: 1 });
|
|
461
|
+
expect(attempt1).toHaveLength(1);
|
|
462
|
+
expect(attempt1[0].name).toBe('a1');
|
|
463
|
+
});
|
|
464
|
+
it('listByRun filters by status', async () => {
|
|
465
|
+
const steps = await runSteps.listByRun(db, runId, { status: 'success' });
|
|
466
|
+
for (const s of steps) {
|
|
467
|
+
expect(s.status).toBe('success');
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
it('listByRun filters by status array', async () => {
|
|
471
|
+
const steps = await runSteps.listByRun(db, runId, { status: ['failed', 'canceled'] });
|
|
472
|
+
for (const s of steps) {
|
|
473
|
+
expect(['failed', 'canceled']).toContain(s.status);
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
it('getLatestAttempt returns 0 for run with no steps', async () => {
|
|
477
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
478
|
+
const attempt = await runSteps.getLatestAttempt(db, newRun.id);
|
|
479
|
+
expect(attempt).toBe(0);
|
|
480
|
+
});
|
|
481
|
+
it('getLatestAttempt returns max attempt', async () => {
|
|
482
|
+
const attempt = await runSteps.getLatestAttempt(db, runId);
|
|
483
|
+
expect(attempt).toBeGreaterThanOrEqual(1);
|
|
484
|
+
});
|
|
485
|
+
it('getStepCounts returns correct aggregates', async () => {
|
|
486
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
487
|
+
const steps = await runSteps.createMany(db, newRun.id, [
|
|
488
|
+
{ name: 's1', cmd: 'echo 1' },
|
|
489
|
+
{ name: 's2', cmd: 'echo 2' },
|
|
490
|
+
{ name: 's3', cmd: 'echo 3' },
|
|
491
|
+
]);
|
|
492
|
+
await runSteps.markStarted(db, steps[0].id);
|
|
493
|
+
await runSteps.markSuccess(db, steps[0].id);
|
|
494
|
+
await runSteps.markStarted(db, steps[1].id);
|
|
495
|
+
await runSteps.markFailed(db, steps[1].id, { errorMessage: 'err' });
|
|
496
|
+
await runSteps.markSkipped(db, steps[2].id, 'skipped');
|
|
497
|
+
const counts = await runSteps.getStepCounts(db, newRun.id, 1);
|
|
498
|
+
expect(counts.passed).toBe(1);
|
|
499
|
+
expect(counts.failed).toBe(1);
|
|
500
|
+
expect(counts.skipped).toBe(1);
|
|
501
|
+
expect(counts.active).toBe(0);
|
|
502
|
+
expect(counts.total).toBe(3);
|
|
503
|
+
});
|
|
504
|
+
it('getFirstFailedStep returns first by ordinal', async () => {
|
|
505
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
506
|
+
const steps = await runSteps.createMany(db, newRun.id, [
|
|
507
|
+
{ name: 'first', cmd: 'a' },
|
|
508
|
+
{ name: 'second', cmd: 'b' },
|
|
509
|
+
]);
|
|
510
|
+
await runSteps.markStarted(db, steps[0].id);
|
|
511
|
+
await runSteps.markFailed(db, steps[0].id, { errorMessage: 'e1' });
|
|
512
|
+
await runSteps.markStarted(db, steps[1].id);
|
|
513
|
+
await runSteps.markFailed(db, steps[1].id, { errorMessage: 'e2' });
|
|
514
|
+
const first = await runSteps.getFirstFailedStep(db, newRun.id);
|
|
515
|
+
expect(first).not.toBeNull();
|
|
516
|
+
expect(first.name).toBe('first');
|
|
517
|
+
});
|
|
518
|
+
it('getFirstFailedStep returns null when no failures', async () => {
|
|
519
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
520
|
+
const steps = await runSteps.createMany(db, newRun.id, [{ name: 'ok', cmd: 'x' }]);
|
|
521
|
+
await runSteps.markStarted(db, steps[0].id);
|
|
522
|
+
await runSteps.markSuccess(db, steps[0].id);
|
|
523
|
+
expect(await runSteps.getFirstFailedStep(db, newRun.id)).toBeNull();
|
|
524
|
+
});
|
|
525
|
+
it('getRunningStep returns currently running step', async () => {
|
|
526
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
527
|
+
const steps = await runSteps.createMany(db, newRun.id, [
|
|
528
|
+
{ name: 'done', cmd: 'x' },
|
|
529
|
+
{ name: 'active', cmd: 'y' },
|
|
530
|
+
]);
|
|
531
|
+
await runSteps.markStarted(db, steps[0].id);
|
|
532
|
+
await runSteps.markSuccess(db, steps[0].id);
|
|
533
|
+
await runSteps.markStarted(db, steps[1].id);
|
|
534
|
+
const running = await runSteps.getRunningStep(db, newRun.id);
|
|
535
|
+
expect(running).not.toBeNull();
|
|
536
|
+
expect(running.name).toBe('active');
|
|
537
|
+
});
|
|
538
|
+
it('getSummary for run with no steps returns zeros', async () => {
|
|
539
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
540
|
+
const summary = await runSteps.getSummary(db, newRun.id);
|
|
541
|
+
expect(summary.latestAttempt).toBe(0);
|
|
542
|
+
expect(summary.counts.total).toBe(0);
|
|
543
|
+
expect(summary.firstFailedStep).toBeNull();
|
|
544
|
+
expect(summary.runningStep).toBeNull();
|
|
545
|
+
expect(summary.totalDurationMs).toBe(0);
|
|
546
|
+
});
|
|
547
|
+
it('getSummary returns populated data', async () => {
|
|
548
|
+
const newRun = await runs.create(db, { projectId: projId, type: 'qa' });
|
|
549
|
+
const steps = await runSteps.createMany(db, newRun.id, [
|
|
550
|
+
{ name: 'lint', cmd: 'npm run lint' },
|
|
551
|
+
{ name: 'build', cmd: 'npm run build' },
|
|
552
|
+
]);
|
|
553
|
+
await runSteps.markStarted(db, steps[0].id);
|
|
554
|
+
await runSteps.markSuccess(db, steps[0].id);
|
|
555
|
+
await runSteps.markStarted(db, steps[1].id);
|
|
556
|
+
await runSteps.markFailed(db, steps[1].id, { errorMessage: 'build failed' });
|
|
557
|
+
const summary = await runSteps.getSummary(db, newRun.id);
|
|
558
|
+
expect(summary.latestAttempt).toBe(1);
|
|
559
|
+
expect(summary.counts.passed).toBe(1);
|
|
560
|
+
expect(summary.counts.failed).toBe(1);
|
|
561
|
+
expect(summary.firstFailedStep).toBe('build');
|
|
562
|
+
expect(summary.runningStep).toBeNull();
|
|
563
|
+
});
|
|
564
|
+
});
|
|
565
|
+
//# sourceMappingURL=repos-integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repos-integration.test.js","sourceRoot":"","sources":["../../src/test/repos-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout-full-pure.test.d.ts","sourceRoot":"","sources":["../../src/test/scout-full-pure.test.ts"],"names":[],"mappings":""}
|