hungry-ghost-hive 0.11.1 → 0.13.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/db/dao/__tests__/agent.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/agent.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/agent.sqlite-dao.test.js +133 -0
- package/dist/db/dao/__tests__/agent.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/dao-broader.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/dao-broader.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/dao-broader.sqlite-dao.test.js +409 -0
- package/dist/db/dao/__tests__/dao-broader.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/dao-interface.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/dao-interface.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/dao-interface.sqlite-dao.test.js +145 -0
- package/dist/db/dao/__tests__/dao-interface.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/edge-cases.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/edge-cases.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/edge-cases.sqlite-dao.test.js +283 -0
- package/dist/db/dao/__tests__/edge-cases.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/escalation.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/escalation.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/escalation.sqlite-dao.test.js +156 -0
- package/dist/db/dao/__tests__/escalation.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/helpers.d.ts +6 -0
- package/dist/db/dao/__tests__/helpers.d.ts.map +1 -0
- package/dist/db/dao/__tests__/helpers.js +150 -0
- package/dist/db/dao/__tests__/helpers.js.map +1 -0
- package/dist/db/dao/__tests__/hive-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/hive-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/hive-dao.test.js +110 -0
- package/dist/db/dao/__tests__/hive-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/leveldb-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/leveldb-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/leveldb-dao.test.js +152 -0
- package/dist/db/dao/__tests__/leveldb-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/leveldb-helpers.d.ts +7 -0
- package/dist/db/dao/__tests__/leveldb-helpers.d.ts.map +1 -0
- package/dist/db/dao/__tests__/leveldb-helpers.js +17 -0
- package/dist/db/dao/__tests__/leveldb-helpers.js.map +1 -0
- package/dist/db/dao/__tests__/log.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/log.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/log.sqlite-dao.test.js +148 -0
- package/dist/db/dao/__tests__/log.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/message.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/message.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/message.sqlite-dao.test.js +77 -0
- package/dist/db/dao/__tests__/message.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/pull-request.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/pull-request.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/pull-request.sqlite-dao.test.js +149 -0
- package/dist/db/dao/__tests__/pull-request.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/requirement.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/requirement.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/requirement.sqlite-dao.test.js +98 -0
- package/dist/db/dao/__tests__/requirement.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/story.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/story.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/story.sqlite-dao.test.js +234 -0
- package/dist/db/dao/__tests__/story.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/__tests__/team.sqlite-dao.test.d.ts +2 -0
- package/dist/db/dao/__tests__/team.sqlite-dao.test.d.ts.map +1 -0
- package/dist/db/dao/__tests__/team.sqlite-dao.test.js +73 -0
- package/dist/db/dao/__tests__/team.sqlite-dao.test.js.map +1 -0
- package/dist/db/dao/hive-dao.d.ts +21 -0
- package/dist/db/dao/hive-dao.d.ts.map +1 -0
- package/dist/db/dao/hive-dao.js +21 -0
- package/dist/db/dao/hive-dao.js.map +1 -0
- package/dist/db/dao/index.d.ts +14 -0
- package/dist/db/dao/index.d.ts.map +1 -0
- package/dist/db/dao/index.js +7 -0
- package/dist/db/dao/index.js.map +1 -0
- package/dist/db/dao/interfaces/agent.dao.d.ts +27 -0
- package/dist/db/dao/interfaces/agent.dao.d.ts.map +1 -0
- package/dist/db/dao/interfaces/agent.dao.js +2 -0
- package/dist/db/dao/interfaces/agent.dao.js.map +1 -0
- package/dist/db/dao/interfaces/escalation.dao.d.ts +19 -0
- package/dist/db/dao/interfaces/escalation.dao.d.ts.map +1 -0
- package/dist/db/dao/interfaces/escalation.dao.js +2 -0
- package/dist/db/dao/interfaces/escalation.dao.js.map +1 -0
- package/dist/db/dao/interfaces/index.d.ts +17 -0
- package/dist/db/dao/interfaces/index.d.ts.map +1 -0
- package/dist/db/dao/interfaces/index.js +2 -0
- package/dist/db/dao/interfaces/index.js.map +1 -0
- package/dist/db/dao/interfaces/log.dao.d.ts +14 -0
- package/dist/db/dao/interfaces/log.dao.d.ts.map +1 -0
- package/dist/db/dao/interfaces/log.dao.js +2 -0
- package/dist/db/dao/interfaces/log.dao.js.map +1 -0
- package/dist/db/dao/interfaces/message.dao.d.ts +9 -0
- package/dist/db/dao/interfaces/message.dao.d.ts.map +1 -0
- package/dist/db/dao/interfaces/message.dao.js +2 -0
- package/dist/db/dao/interfaces/message.dao.js.map +1 -0
- package/dist/db/dao/interfaces/pull-request.dao.d.ts +19 -0
- package/dist/db/dao/interfaces/pull-request.dao.d.ts.map +1 -0
- package/dist/db/dao/interfaces/pull-request.dao.js +2 -0
- package/dist/db/dao/interfaces/pull-request.dao.js.map +1 -0
- package/dist/db/dao/interfaces/requirement.dao.d.ts +13 -0
- package/dist/db/dao/interfaces/requirement.dao.d.ts.map +1 -0
- package/dist/db/dao/interfaces/requirement.dao.js +2 -0
- package/dist/db/dao/interfaces/requirement.dao.js.map +1 -0
- package/dist/db/dao/interfaces/story.dao.d.ts +29 -0
- package/dist/db/dao/interfaces/story.dao.d.ts.map +1 -0
- package/dist/db/dao/interfaces/story.dao.js +2 -0
- package/dist/db/dao/interfaces/story.dao.js.map +1 -0
- package/dist/db/dao/interfaces/team.dao.d.ts +11 -0
- package/dist/db/dao/interfaces/team.dao.d.ts.map +1 -0
- package/dist/db/dao/interfaces/team.dao.js +2 -0
- package/dist/db/dao/interfaces/team.dao.js.map +1 -0
- package/dist/db/dao/leveldb/agent.leveldb-dao.d.ts +23 -0
- package/dist/db/dao/leveldb/agent.leveldb-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/agent.leveldb-dao.js +163 -0
- package/dist/db/dao/leveldb/agent.leveldb-dao.js.map +1 -0
- package/dist/db/dao/leveldb/escalation.leveldb-dao.d.ts +22 -0
- package/dist/db/dao/leveldb/escalation.leveldb-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/escalation.leveldb-dao.js +99 -0
- package/dist/db/dao/leveldb/escalation.leveldb-dao.js.map +1 -0
- package/dist/db/dao/leveldb/hive-dao.d.ts +8 -0
- package/dist/db/dao/leveldb/hive-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/hive-dao.js +24 -0
- package/dist/db/dao/leveldb/hive-dao.js.map +1 -0
- package/dist/db/dao/leveldb/index.d.ts +11 -0
- package/dist/db/dao/leveldb/index.d.ts.map +1 -0
- package/dist/db/dao/leveldb/index.js +10 -0
- package/dist/db/dao/leveldb/index.js.map +1 -0
- package/dist/db/dao/leveldb/leveldb-store.d.ts +17 -0
- package/dist/db/dao/leveldb/leveldb-store.d.ts.map +1 -0
- package/dist/db/dao/leveldb/leveldb-store.js +44 -0
- package/dist/db/dao/leveldb/leveldb-store.js.map +1 -0
- package/dist/db/dao/leveldb/log.leveldb-dao.d.ts +17 -0
- package/dist/db/dao/leveldb/log.leveldb-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/log.leveldb-dao.js +71 -0
- package/dist/db/dao/leveldb/log.leveldb-dao.js.map +1 -0
- package/dist/db/dao/leveldb/message.leveldb-dao.d.ts +12 -0
- package/dist/db/dao/leveldb/message.leveldb-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/message.leveldb-dao.js +34 -0
- package/dist/db/dao/leveldb/message.leveldb-dao.js.map +1 -0
- package/dist/db/dao/leveldb/pull-request.leveldb-dao.d.ts +22 -0
- package/dist/db/dao/leveldb/pull-request.leveldb-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/pull-request.leveldb-dao.js +116 -0
- package/dist/db/dao/leveldb/pull-request.leveldb-dao.js.map +1 -0
- package/dist/db/dao/leveldb/requirement.leveldb-dao.d.ts +16 -0
- package/dist/db/dao/leveldb/requirement.leveldb-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/requirement.leveldb-dao.js +68 -0
- package/dist/db/dao/leveldb/requirement.leveldb-dao.js.map +1 -0
- package/dist/db/dao/leveldb/sort.d.ts +23 -0
- package/dist/db/dao/leveldb/sort.d.ts.map +1 -0
- package/dist/db/dao/leveldb/sort.js +25 -0
- package/dist/db/dao/leveldb/sort.js.map +1 -0
- package/dist/db/dao/leveldb/story.leveldb-dao.d.ts +32 -0
- package/dist/db/dao/leveldb/story.leveldb-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/story.leveldb-dao.js +212 -0
- package/dist/db/dao/leveldb/story.leveldb-dao.js.map +1 -0
- package/dist/db/dao/leveldb/team.leveldb-dao.d.ts +14 -0
- package/dist/db/dao/leveldb/team.leveldb-dao.d.ts.map +1 -0
- package/dist/db/dao/leveldb/team.leveldb-dao.js +44 -0
- package/dist/db/dao/leveldb/team.leveldb-dao.js.map +1 -0
- package/dist/db/dao/sqlite/agent.sqlite-dao.d.ts +22 -0
- package/dist/db/dao/sqlite/agent.sqlite-dao.d.ts.map +1 -0
- package/dist/db/dao/sqlite/agent.sqlite-dao.js +131 -0
- package/dist/db/dao/sqlite/agent.sqlite-dao.js.map +1 -0
- package/dist/db/dao/sqlite/escalation.sqlite-dao.d.ts +21 -0
- package/dist/db/dao/sqlite/escalation.sqlite-dao.d.ts.map +1 -0
- package/dist/db/dao/sqlite/escalation.sqlite-dao.js +111 -0
- package/dist/db/dao/sqlite/escalation.sqlite-dao.js.map +1 -0
- package/dist/db/dao/sqlite/index.d.ts +9 -0
- package/dist/db/dao/sqlite/index.d.ts.map +1 -0
- package/dist/db/dao/sqlite/index.js +9 -0
- package/dist/db/dao/sqlite/index.js.map +1 -0
- package/dist/db/dao/sqlite/log.sqlite-dao.d.ts +16 -0
- package/dist/db/dao/sqlite/log.sqlite-dao.d.ts.map +1 -0
- package/dist/db/dao/sqlite/log.sqlite-dao.js +76 -0
- package/dist/db/dao/sqlite/log.sqlite-dao.js.map +1 -0
- package/dist/db/dao/sqlite/message.sqlite-dao.d.ts +12 -0
- package/dist/db/dao/sqlite/message.sqlite-dao.d.ts.map +1 -0
- package/dist/db/dao/sqlite/message.sqlite-dao.js +28 -0
- package/dist/db/dao/sqlite/message.sqlite-dao.js.map +1 -0
- package/dist/db/dao/sqlite/pull-request.sqlite-dao.d.ts +21 -0
- package/dist/db/dao/sqlite/pull-request.sqlite-dao.d.ts.map +1 -0
- package/dist/db/dao/sqlite/pull-request.sqlite-dao.js +135 -0
- package/dist/db/dao/sqlite/pull-request.sqlite-dao.js.map +1 -0
- package/dist/db/dao/sqlite/requirement.sqlite-dao.d.ts +15 -0
- package/dist/db/dao/sqlite/requirement.sqlite-dao.d.ts.map +1 -0
- package/dist/db/dao/sqlite/requirement.sqlite-dao.js +59 -0
- package/dist/db/dao/sqlite/requirement.sqlite-dao.js.map +1 -0
- package/dist/db/dao/sqlite/story.sqlite-dao.d.ts +31 -0
- package/dist/db/dao/sqlite/story.sqlite-dao.d.ts.map +1 -0
- package/dist/db/dao/sqlite/story.sqlite-dao.js +185 -0
- package/dist/db/dao/sqlite/story.sqlite-dao.js.map +1 -0
- package/dist/db/dao/sqlite/team.sqlite-dao.d.ts +13 -0
- package/dist/db/dao/sqlite/team.sqlite-dao.d.ts.map +1 -0
- package/dist/db/dao/sqlite/team.sqlite-dao.js +30 -0
- package/dist/db/dao/sqlite/team.sqlite-dao.js.map +1 -0
- package/dist/db/queries/requirements.js +3 -3
- package/dist/db/queries/requirements.js.map +1 -1
- package/package.json +5 -2
- package/src/db/dao/__tests__/agent.sqlite-dao.test.ts +164 -0
- package/src/db/dao/__tests__/dao-broader.sqlite-dao.test.ts +542 -0
- package/src/db/dao/__tests__/dao-interface.sqlite-dao.test.ts +177 -0
- package/src/db/dao/__tests__/edge-cases.sqlite-dao.test.ts +329 -0
- package/src/db/dao/__tests__/escalation.sqlite-dao.test.ts +193 -0
- package/src/db/dao/__tests__/helpers.ts +164 -0
- package/src/db/dao/__tests__/hive-dao.test.ts +136 -0
- package/src/db/dao/__tests__/leveldb-dao.test.ts +182 -0
- package/src/db/dao/__tests__/leveldb-helpers.ts +23 -0
- package/src/db/dao/__tests__/log.sqlite-dao.test.ts +186 -0
- package/src/db/dao/__tests__/message.sqlite-dao.test.ts +98 -0
- package/src/db/dao/__tests__/pull-request.sqlite-dao.test.ts +185 -0
- package/src/db/dao/__tests__/requirement.sqlite-dao.test.ts +120 -0
- package/src/db/dao/__tests__/story.sqlite-dao.test.ts +289 -0
- package/src/db/dao/__tests__/team.sqlite-dao.test.ts +89 -0
- package/src/db/dao/hive-dao.ts +41 -0
- package/src/db/dao/index.ts +39 -0
- package/src/db/dao/interfaces/agent.dao.ts +30 -0
- package/src/db/dao/interfaces/escalation.dao.ts +20 -0
- package/src/db/dao/interfaces/index.ts +18 -0
- package/src/db/dao/interfaces/log.dao.ts +15 -0
- package/src/db/dao/interfaces/message.dao.ts +10 -0
- package/src/db/dao/interfaces/pull-request.dao.ts +20 -0
- package/src/db/dao/interfaces/requirement.dao.ts +14 -0
- package/src/db/dao/interfaces/story.dao.ts +27 -0
- package/src/db/dao/interfaces/team.dao.ts +12 -0
- package/src/db/dao/leveldb/agent.leveldb-dao.ts +179 -0
- package/src/db/dao/leveldb/escalation.leveldb-dao.ts +117 -0
- package/src/db/dao/leveldb/hive-dao.ts +31 -0
- package/src/db/dao/leveldb/index.ts +10 -0
- package/src/db/dao/leveldb/leveldb-store.ts +52 -0
- package/src/db/dao/leveldb/log.leveldb-dao.ts +85 -0
- package/src/db/dao/leveldb/message.leveldb-dao.ts +38 -0
- package/src/db/dao/leveldb/pull-request.leveldb-dao.ts +132 -0
- package/src/db/dao/leveldb/requirement.leveldb-dao.ts +79 -0
- package/src/db/dao/leveldb/sort.ts +23 -0
- package/src/db/dao/leveldb/story.leveldb-dao.ts +234 -0
- package/src/db/dao/leveldb/team.leveldb-dao.ts +52 -0
- package/src/db/dao/sqlite/agent.sqlite-dao.ts +159 -0
- package/src/db/dao/sqlite/escalation.sqlite-dao.ts +129 -0
- package/src/db/dao/sqlite/index.ts +8 -0
- package/src/db/dao/sqlite/log.sqlite-dao.ts +89 -0
- package/src/db/dao/sqlite/message.sqlite-dao.ts +32 -0
- package/src/db/dao/sqlite/pull-request.sqlite-dao.ts +153 -0
- package/src/db/dao/sqlite/requirement.sqlite-dao.ts +71 -0
- package/src/db/dao/sqlite/story.sqlite-dao.ts +216 -0
- package/src/db/dao/sqlite/team.sqlite-dao.ts +37 -0
- package/src/db/queries/requirements.ts +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.sqlite-dao.test.d.ts","sourceRoot":"","sources":["../../../../src/db/dao/__tests__/agent.sqlite-dao.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { createTestDb } from './helpers.js';
|
|
3
|
+
import { SqliteAgentDao } from '../sqlite/agent.sqlite-dao.js';
|
|
4
|
+
import { SqliteTeamDao } from '../sqlite/team.sqlite-dao.js';
|
|
5
|
+
describe('SqliteAgentDao', () => {
|
|
6
|
+
let db;
|
|
7
|
+
let dao;
|
|
8
|
+
let teamDao;
|
|
9
|
+
let teamId;
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
db = await createTestDb();
|
|
12
|
+
dao = new SqliteAgentDao(db);
|
|
13
|
+
teamDao = new SqliteTeamDao(db);
|
|
14
|
+
const team = await teamDao.createTeam({ repoUrl: 'url', repoPath: '/p', name: 'Team' });
|
|
15
|
+
teamId = team.id;
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
db.close();
|
|
19
|
+
});
|
|
20
|
+
it('agent.sqlite-dao case 1', async () => {
|
|
21
|
+
const agent = await dao.createAgent({ type: 'senior', teamId });
|
|
22
|
+
expect(agent.id).toMatch(/^senior-/);
|
|
23
|
+
expect(agent.type).toBe('senior');
|
|
24
|
+
expect(agent.team_id).toBe(teamId);
|
|
25
|
+
expect(agent.status).toBe('idle');
|
|
26
|
+
});
|
|
27
|
+
it('agent.sqlite-dao case 2', async () => {
|
|
28
|
+
const agent = await dao.createAgent({ type: 'tech_lead', teamId });
|
|
29
|
+
expect(agent.id).toBe('tech-lead');
|
|
30
|
+
expect(agent.type).toBe('tech_lead');
|
|
31
|
+
});
|
|
32
|
+
it('agent.sqlite-dao case 3', async () => {
|
|
33
|
+
const created = await dao.createAgent({ type: 'junior', teamId });
|
|
34
|
+
const found = await dao.getAgentById(created.id);
|
|
35
|
+
expect(found).toEqual(created);
|
|
36
|
+
});
|
|
37
|
+
it('agent.sqlite-dao case 4', async () => {
|
|
38
|
+
expect(await dao.getAgentById('nonexistent')).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
it('agent.sqlite-dao case 5', async () => {
|
|
41
|
+
await dao.createAgent({ type: 'senior', teamId });
|
|
42
|
+
await dao.createAgent({ type: 'junior', teamId });
|
|
43
|
+
const team2 = await teamDao.createTeam({ repoUrl: 'url2', repoPath: '/p2', name: 'Team2' });
|
|
44
|
+
await dao.createAgent({ type: 'qa', teamId: team2.id });
|
|
45
|
+
const agents = await dao.getAgentsByTeam(teamId);
|
|
46
|
+
expect(agents).toHaveLength(2);
|
|
47
|
+
});
|
|
48
|
+
it('agent.sqlite-dao case 6', async () => {
|
|
49
|
+
await dao.createAgent({ type: 'senior', teamId });
|
|
50
|
+
await dao.createAgent({ type: 'senior', teamId });
|
|
51
|
+
await dao.createAgent({ type: 'junior', teamId });
|
|
52
|
+
const seniors = await dao.getAgentsByType('senior');
|
|
53
|
+
expect(seniors).toHaveLength(2);
|
|
54
|
+
});
|
|
55
|
+
it('agent.sqlite-dao case 7', async () => {
|
|
56
|
+
const agent = await dao.createAgent({ type: 'senior', teamId });
|
|
57
|
+
await dao.updateAgent(agent.id, { status: 'working' });
|
|
58
|
+
const working = await dao.getAgentsByStatus('working');
|
|
59
|
+
expect(working).toHaveLength(1);
|
|
60
|
+
expect(working[0].id).toBe(agent.id);
|
|
61
|
+
});
|
|
62
|
+
it('agent.sqlite-dao case 8', async () => {
|
|
63
|
+
await dao.createAgent({ type: 'senior', teamId });
|
|
64
|
+
await dao.createAgent({ type: 'junior', teamId });
|
|
65
|
+
const all = await dao.getAllAgents();
|
|
66
|
+
expect(all).toHaveLength(2);
|
|
67
|
+
});
|
|
68
|
+
it('agent.sqlite-dao case 9', async () => {
|
|
69
|
+
const a1 = await dao.createAgent({ type: 'senior', teamId });
|
|
70
|
+
await dao.createAgent({ type: 'junior', teamId });
|
|
71
|
+
await dao.terminateAgent(a1.id);
|
|
72
|
+
const active = await dao.getActiveAgents();
|
|
73
|
+
expect(active).toHaveLength(1);
|
|
74
|
+
expect(active[0].status).not.toBe('terminated');
|
|
75
|
+
});
|
|
76
|
+
it('agent.sqlite-dao case 10', async () => {
|
|
77
|
+
await dao.createAgent({ type: 'tech_lead', teamId });
|
|
78
|
+
await dao.createAgent({ type: 'senior', teamId });
|
|
79
|
+
const tl = await dao.getTechLead();
|
|
80
|
+
expect(tl).toBeDefined();
|
|
81
|
+
expect(tl.type).toBe('tech_lead');
|
|
82
|
+
});
|
|
83
|
+
it('agent.sqlite-dao case 11', async () => {
|
|
84
|
+
expect(await dao.getTechLead()).toBeUndefined();
|
|
85
|
+
});
|
|
86
|
+
it('agent.sqlite-dao case 12', async () => {
|
|
87
|
+
const agent = await dao.createAgent({ type: 'senior', teamId });
|
|
88
|
+
const updated = await dao.updateAgent(agent.id, {
|
|
89
|
+
status: 'working',
|
|
90
|
+
tmuxSession: 'tmux-123',
|
|
91
|
+
currentStoryId: 'STORY-ABC',
|
|
92
|
+
});
|
|
93
|
+
expect(updated.status).toBe('working');
|
|
94
|
+
expect(updated.tmux_session).toBe('tmux-123');
|
|
95
|
+
expect(updated.current_story_id).toBe('STORY-ABC');
|
|
96
|
+
});
|
|
97
|
+
it('agent.sqlite-dao case 13', async () => {
|
|
98
|
+
const agent = await dao.createAgent({ type: 'junior', teamId });
|
|
99
|
+
await dao.deleteAgent(agent.id);
|
|
100
|
+
expect(await dao.getAgentById(agent.id)).toBeUndefined();
|
|
101
|
+
});
|
|
102
|
+
it('agent.sqlite-dao case 14', async () => {
|
|
103
|
+
const agent = await dao.createAgent({ type: 'senior', teamId, tmuxSession: 'tmux-session' });
|
|
104
|
+
await dao.terminateAgent(agent.id);
|
|
105
|
+
const terminated = await dao.getAgentById(agent.id);
|
|
106
|
+
expect(terminated.status).toBe('terminated');
|
|
107
|
+
expect(terminated.tmux_session).toBeNull();
|
|
108
|
+
});
|
|
109
|
+
describe('heartbeat', () => {
|
|
110
|
+
it('agent.sqlite-dao case 14', async () => {
|
|
111
|
+
const agent = await dao.createAgent({ type: 'senior', teamId });
|
|
112
|
+
await dao.updateAgentHeartbeat(agent.id);
|
|
113
|
+
const updated = await dao.getAgentById(agent.id);
|
|
114
|
+
expect(updated.last_seen).toBeDefined();
|
|
115
|
+
});
|
|
116
|
+
it('agent.sqlite-dao case 15', async () => {
|
|
117
|
+
const agent = await dao.createAgent({ type: 'senior', teamId });
|
|
118
|
+
// Agent just created with last_seen = now, so heartbeat should be current
|
|
119
|
+
const isCurrent = await dao.isAgentHeartbeatCurrent(agent.id, 60);
|
|
120
|
+
expect(isCurrent).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
it('agent.sqlite-dao case 16', async () => {
|
|
123
|
+
const isCurrent = await dao.isAgentHeartbeatCurrent('nonexistent', 15);
|
|
124
|
+
expect(isCurrent).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
it('agent.sqlite-dao case 17', async () => {
|
|
127
|
+
await dao.createAgent({ type: 'senior', teamId });
|
|
128
|
+
const stale = await dao.getStaleAgents(9999);
|
|
129
|
+
expect(stale).toEqual([]);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=agent.sqlite-dao.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.sqlite-dao.test.js","sourceRoot":"","sources":["../../../../src/db/dao/__tests__/agent.sqlite-dao.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dao-broader.sqlite-dao.test.d.ts","sourceRoot":"","sources":["../../../../src/db/dao/__tests__/dao-broader.sqlite-dao.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { createTestDb } from './helpers.js';
|
|
3
|
+
import { SqliteTeamDao } from '../sqlite/team.sqlite-dao.js';
|
|
4
|
+
import { SqliteAgentDao } from '../sqlite/agent.sqlite-dao.js';
|
|
5
|
+
import { SqliteStoryDao } from '../sqlite/story.sqlite-dao.js';
|
|
6
|
+
import { SqliteRequirementDao } from '../sqlite/requirement.sqlite-dao.js';
|
|
7
|
+
import { SqlitePullRequestDao } from '../sqlite/pull-request.sqlite-dao.js';
|
|
8
|
+
import { SqliteEscalationDao } from '../sqlite/escalation.sqlite-dao.js';
|
|
9
|
+
import { SqliteLogDao } from '../sqlite/log.sqlite-dao.js';
|
|
10
|
+
import { SqliteMessageDao } from '../sqlite/message.sqlite-dao.js';
|
|
11
|
+
describe('Broader DAO contract', () => {
|
|
12
|
+
let db;
|
|
13
|
+
let teamDao;
|
|
14
|
+
let agentDao;
|
|
15
|
+
let storyDao;
|
|
16
|
+
let reqDao;
|
|
17
|
+
let prDao;
|
|
18
|
+
let escDao;
|
|
19
|
+
let logDao;
|
|
20
|
+
let msgDao;
|
|
21
|
+
let teamId;
|
|
22
|
+
beforeEach(async () => {
|
|
23
|
+
db = await createTestDb();
|
|
24
|
+
teamDao = new SqliteTeamDao(db);
|
|
25
|
+
agentDao = new SqliteAgentDao(db);
|
|
26
|
+
storyDao = new SqliteStoryDao(db);
|
|
27
|
+
reqDao = new SqliteRequirementDao(db);
|
|
28
|
+
prDao = new SqlitePullRequestDao(db);
|
|
29
|
+
escDao = new SqliteEscalationDao(db);
|
|
30
|
+
logDao = new SqliteLogDao(db);
|
|
31
|
+
msgDao = new SqliteMessageDao(db);
|
|
32
|
+
const team = await teamDao.createTeam({ repoUrl: 'url', repoPath: '/p', name: 'Team' });
|
|
33
|
+
teamId = team.id;
|
|
34
|
+
});
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
db.close();
|
|
37
|
+
});
|
|
38
|
+
it('dao-broader.sqlite-dao case 1', async () => {
|
|
39
|
+
const t1 = await teamDao.createTeam({ repoUrl: 'url1', repoPath: '/p1', name: 'Team 1' });
|
|
40
|
+
const t2 = await teamDao.createTeam({ repoUrl: 'url2', repoPath: '/p2', name: 'Team 2' });
|
|
41
|
+
db.run('UPDATE teams SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', teamId]);
|
|
42
|
+
db.run('UPDATE teams SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', t1.id]);
|
|
43
|
+
db.run('UPDATE teams SET created_at = ? WHERE id = ?', ['2025-01-03T00:00:00.000Z', t2.id]);
|
|
44
|
+
const all = await teamDao.getAllTeams();
|
|
45
|
+
expect(all.map(team => team.id)).toEqual([t1.id, teamId, t2.id]);
|
|
46
|
+
});
|
|
47
|
+
it('dao-broader.sqlite-dao case 2', async () => {
|
|
48
|
+
const r1 = await reqDao.createRequirement({ title: 'Old', description: 'Desc' });
|
|
49
|
+
const r2 = await reqDao.createRequirement({ title: 'New', description: 'Desc' });
|
|
50
|
+
await reqDao.updateRequirement(r1.id, { status: 'planned' });
|
|
51
|
+
await reqDao.updateRequirement(r2.id, { status: 'planned' });
|
|
52
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', r1.id]);
|
|
53
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', r2.id]);
|
|
54
|
+
const planned = await reqDao.getRequirementsByStatus('planned');
|
|
55
|
+
expect(planned.map(req => req.id)).toEqual([r2.id, r1.id]);
|
|
56
|
+
});
|
|
57
|
+
it('dao-broader.sqlite-dao case 3', async () => {
|
|
58
|
+
const r1 = await reqDao.createRequirement({ title: 'Old', description: 'Desc' });
|
|
59
|
+
const r2 = await reqDao.createRequirement({ title: 'New', description: 'Desc' });
|
|
60
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', r1.id]);
|
|
61
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', r2.id]);
|
|
62
|
+
const pending = await reqDao.getPendingRequirements();
|
|
63
|
+
expect(pending.map(req => req.id)).toEqual([r1.id, r2.id]);
|
|
64
|
+
});
|
|
65
|
+
it('dao-broader.sqlite-dao case 4', async () => {
|
|
66
|
+
const req = await reqDao.createRequirement({
|
|
67
|
+
title: 'Original',
|
|
68
|
+
description: 'Desc',
|
|
69
|
+
submittedBy: 'tech-lead',
|
|
70
|
+
});
|
|
71
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', req.id]);
|
|
72
|
+
const updated = await reqDao.updateRequirement(req.id, { title: 'Updated' });
|
|
73
|
+
expect(updated.submitted_by).toBe('tech-lead');
|
|
74
|
+
expect(updated.created_at).toBe('2025-01-01T00:00:00.000Z');
|
|
75
|
+
});
|
|
76
|
+
it('dao-broader.sqlite-dao case 5', async () => {
|
|
77
|
+
const req = await reqDao.createRequirement({ title: 'Req', description: 'Desc' });
|
|
78
|
+
const s1 = await storyDao.createStory({ title: 'Old', description: 'D1', requirementId: req.id });
|
|
79
|
+
const s2 = await storyDao.createStory({ title: 'New', description: 'D2', requirementId: req.id });
|
|
80
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', s1.id]);
|
|
81
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', s2.id]);
|
|
82
|
+
const stories = await storyDao.getStoriesByRequirement(req.id);
|
|
83
|
+
expect(stories.map(story => story.id)).toEqual([s1.id, s2.id]);
|
|
84
|
+
});
|
|
85
|
+
it('dao-broader.sqlite-dao case 6', async () => {
|
|
86
|
+
const s1 = await storyDao.createStory({ title: 'Old', description: 'D1' });
|
|
87
|
+
const s2 = await storyDao.createStory({ title: 'New', description: 'D2' });
|
|
88
|
+
await storyDao.updateStory(s1.id, { status: 'planned', storyPoints: 5 });
|
|
89
|
+
await storyDao.updateStory(s2.id, { status: 'planned', storyPoints: 5 });
|
|
90
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', s1.id]);
|
|
91
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', s2.id]);
|
|
92
|
+
const planned = await storyDao.getPlannedStories();
|
|
93
|
+
expect(planned.map(story => story.id)).toEqual([s1.id, s2.id]);
|
|
94
|
+
});
|
|
95
|
+
it('dao-broader.sqlite-dao case 7', async () => {
|
|
96
|
+
const s1 = await storyDao.createStory({ title: 'Old', description: 'D1' });
|
|
97
|
+
const s2 = await storyDao.createStory({ title: 'New', description: 'D2' });
|
|
98
|
+
await storyDao.updateStory(s1.id, { status: 'in_progress' });
|
|
99
|
+
await storyDao.updateStory(s2.id, { status: 'review' });
|
|
100
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', s1.id]);
|
|
101
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', s2.id]);
|
|
102
|
+
const inProgress = await storyDao.getInProgressStories();
|
|
103
|
+
expect(inProgress.map(story => story.id)).toEqual([s1.id, s2.id]);
|
|
104
|
+
});
|
|
105
|
+
it('dao-broader.sqlite-dao case 8', async () => {
|
|
106
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
107
|
+
const story = await storyDao.createStory({ title: 'Story', description: 'Desc' });
|
|
108
|
+
await storyDao.updateStory(story.id, { assignedAgentId: agent.id });
|
|
109
|
+
const updated = await storyDao.updateStory(story.id, { assignedAgentId: null });
|
|
110
|
+
expect(updated.assigned_agent_id).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
it('dao-broader.sqlite-dao case 9', async () => {
|
|
113
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
114
|
+
const story = await storyDao.createStory({ title: 'Story', description: 'Desc', teamId });
|
|
115
|
+
await storyDao.updateStory(story.id, { assignedAgentId: agent.id });
|
|
116
|
+
const orphaned = await storyDao.getStoriesWithOrphanedAssignments();
|
|
117
|
+
expect(orphaned).toEqual([]);
|
|
118
|
+
});
|
|
119
|
+
it('dao-broader.sqlite-dao case 10', async () => {
|
|
120
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
121
|
+
db.run('UPDATE agents SET updated_at = ? WHERE id = ?', ['2000-01-01T00:00:00.000Z', agent.id]);
|
|
122
|
+
const updated = await agentDao.updateAgent(agent.id, { status: 'working' });
|
|
123
|
+
expect(updated.updated_at).not.toBe('2000-01-01T00:00:00.000Z');
|
|
124
|
+
});
|
|
125
|
+
it('dao-broader.sqlite-dao case 11', async () => {
|
|
126
|
+
await agentDao.createAgent({ type: 'senior' });
|
|
127
|
+
const assigned = await agentDao.createAgent({ type: 'junior', teamId });
|
|
128
|
+
const agents = await agentDao.getAgentsByTeam(teamId);
|
|
129
|
+
expect(agents.map(agent => agent.id)).toEqual([assigned.id]);
|
|
130
|
+
});
|
|
131
|
+
it('dao-broader.sqlite-dao case 12', async () => {
|
|
132
|
+
const pr1 = await prDao.createPullRequest({ branchName: 'b1', teamId });
|
|
133
|
+
const pr2 = await prDao.createPullRequest({ branchName: 'b2', teamId });
|
|
134
|
+
db.run('UPDATE pull_requests SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', pr1.id]);
|
|
135
|
+
db.run('UPDATE pull_requests SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', pr2.id]);
|
|
136
|
+
const queue = await prDao.getMergeQueue(teamId);
|
|
137
|
+
expect(queue.map(pr => pr.id)).toEqual([pr1.id, pr2.id]);
|
|
138
|
+
});
|
|
139
|
+
it('dao-broader.sqlite-dao case 13', async () => {
|
|
140
|
+
const pr1 = await prDao.createPullRequest({ branchName: 'b1', teamId });
|
|
141
|
+
const pr2 = await prDao.createPullRequest({ branchName: 'b2', teamId });
|
|
142
|
+
await prDao.updatePullRequest(pr1.id, { status: 'approved' });
|
|
143
|
+
await prDao.updatePullRequest(pr2.id, { status: 'approved' });
|
|
144
|
+
db.run('UPDATE pull_requests SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', pr1.id]);
|
|
145
|
+
db.run('UPDATE pull_requests SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', pr2.id]);
|
|
146
|
+
const approved = await prDao.getApprovedPullRequests();
|
|
147
|
+
expect(approved.map(pr => pr.id)).toEqual([pr2.id, pr1.id]);
|
|
148
|
+
});
|
|
149
|
+
it('dao-broader.sqlite-dao case 14', async () => {
|
|
150
|
+
const pr = await prDao.createPullRequest({ branchName: 'b1', teamId });
|
|
151
|
+
const updated = await prDao.updatePullRequest(pr.id, { status: 'queued' });
|
|
152
|
+
expect(updated.reviewed_at).toBeNull();
|
|
153
|
+
});
|
|
154
|
+
it('dao-broader.sqlite-dao case 15', async () => {
|
|
155
|
+
const pr1 = await prDao.createPullRequest({ branchName: 'b1', teamId });
|
|
156
|
+
const pr2 = await prDao.createPullRequest({ branchName: 'b2', teamId });
|
|
157
|
+
await prDao.updatePullRequest(pr1.id, { status: 'rejected' });
|
|
158
|
+
await prDao.updatePullRequest(pr2.id, { status: 'rejected' });
|
|
159
|
+
db.run('UPDATE pull_requests SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', pr1.id]);
|
|
160
|
+
db.run('UPDATE pull_requests SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', pr2.id]);
|
|
161
|
+
const rejected = await prDao.getPullRequestsByStatus('rejected');
|
|
162
|
+
expect(rejected.map(pr => pr.id)).toEqual([pr2.id, pr1.id]);
|
|
163
|
+
});
|
|
164
|
+
it('dao-broader.sqlite-dao case 16', async () => {
|
|
165
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
166
|
+
const story = await storyDao.createStory({ title: 'Story', description: 'Desc', teamId });
|
|
167
|
+
const e1 = await escDao.createEscalation({ storyId: story.id, fromAgentId: agent.id, reason: 'Old' });
|
|
168
|
+
const e2 = await escDao.createEscalation({ storyId: story.id, fromAgentId: agent.id, reason: 'New' });
|
|
169
|
+
db.run('UPDATE escalations SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', e1.id]);
|
|
170
|
+
db.run('UPDATE escalations SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', e2.id]);
|
|
171
|
+
const escalations = await escDao.getEscalationsByStory(story.id);
|
|
172
|
+
expect(escalations.map(esc => esc.id)).toEqual([e2.id, e1.id]);
|
|
173
|
+
});
|
|
174
|
+
it('dao-broader.sqlite-dao case 17', async () => {
|
|
175
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
176
|
+
const e1 = await escDao.createEscalation({ fromAgentId: agent.id, reason: 'Old' });
|
|
177
|
+
const e2 = await escDao.createEscalation({ fromAgentId: agent.id, reason: 'New' });
|
|
178
|
+
db.run('UPDATE escalations SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', e1.id]);
|
|
179
|
+
db.run('UPDATE escalations SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', e2.id]);
|
|
180
|
+
const pending = await escDao.getPendingHumanEscalations();
|
|
181
|
+
expect(pending.map(esc => esc.id)).toEqual([e1.id, e2.id]);
|
|
182
|
+
});
|
|
183
|
+
it('dao-broader.sqlite-dao case 18', async () => {
|
|
184
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
185
|
+
const reviewer = await agentDao.createAgent({ type: 'tech_lead', teamId });
|
|
186
|
+
const esc = await escDao.createEscalation({
|
|
187
|
+
fromAgentId: agent.id,
|
|
188
|
+
toAgentId: reviewer.id,
|
|
189
|
+
reason: 'Needs review',
|
|
190
|
+
});
|
|
191
|
+
const updated = await escDao.updateEscalation(esc.id, { toAgentId: null });
|
|
192
|
+
expect(updated.to_agent_id).toBeNull();
|
|
193
|
+
});
|
|
194
|
+
it('dao-broader.sqlite-dao case 19', async () => {
|
|
195
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
196
|
+
const log = await logDao.createLog({ agentId: agent.id, eventType: 'AGENT_SPAWNED' });
|
|
197
|
+
expect(log.metadata).toBeNull();
|
|
198
|
+
});
|
|
199
|
+
it('dao-broader.sqlite-dao case 20', async () => {
|
|
200
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
201
|
+
const l1 = await logDao.createLog({ agentId: agent.id, eventType: 'AGENT_SPAWNED' });
|
|
202
|
+
const l2 = await logDao.createLog({ agentId: agent.id, eventType: 'AGENT_SPAWNED' });
|
|
203
|
+
db.run('UPDATE agent_logs SET timestamp = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', l1.id]);
|
|
204
|
+
db.run('UPDATE agent_logs SET timestamp = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', l2.id]);
|
|
205
|
+
const logs = await logDao.getLogsByEventType('AGENT_SPAWNED');
|
|
206
|
+
expect(logs.map(log => log.id)).toEqual([l2.id, l1.id]);
|
|
207
|
+
});
|
|
208
|
+
it('dao-broader.sqlite-dao case 21', async () => {
|
|
209
|
+
db.run(`INSERT INTO messages (id, from_session, to_session, body, status, created_at)
|
|
210
|
+
VALUES (?, ?, ?, ?, 'pending', ?)`, ['m1', 'a', 'b', 'First', '2025-01-02T00:00:00.000Z']);
|
|
211
|
+
db.run(`INSERT INTO messages (id, from_session, to_session, body, status, created_at)
|
|
212
|
+
VALUES (?, ?, ?, ?, 'pending', ?)`, ['m2', 'a', 'b', 'Second', '2025-01-01T00:00:00.000Z']);
|
|
213
|
+
const pending = await msgDao.getAllPendingMessages();
|
|
214
|
+
expect(pending.map(msg => msg.id)).toEqual(['m2', 'm1']);
|
|
215
|
+
});
|
|
216
|
+
it('dao-broader.sqlite-dao case 22', async () => {
|
|
217
|
+
const alpha = await teamDao.createTeam({ repoUrl: 'url-a', repoPath: '/a', name: 'Alpha' });
|
|
218
|
+
const found = await teamDao.getTeamByName('Alpha');
|
|
219
|
+
const missing = await teamDao.getTeamByName('Missing');
|
|
220
|
+
expect(found.id).toBe(alpha.id);
|
|
221
|
+
expect(missing).toBeUndefined();
|
|
222
|
+
});
|
|
223
|
+
it('dao-broader.sqlite-dao case 23', async () => {
|
|
224
|
+
const t1 = await teamDao.createTeam({ repoUrl: 'url-1', repoPath: '/one', name: 'One' });
|
|
225
|
+
const t2 = await teamDao.createTeam({ repoUrl: 'url-2', repoPath: '/two', name: 'Two' });
|
|
226
|
+
await teamDao.deleteTeam(t1.id);
|
|
227
|
+
const ids = (await teamDao.getAllTeams()).map(team => team.id);
|
|
228
|
+
expect(ids).toContain(teamId);
|
|
229
|
+
expect(ids).toContain(t2.id);
|
|
230
|
+
expect(ids).not.toContain(t1.id);
|
|
231
|
+
});
|
|
232
|
+
it('dao-broader.sqlite-dao case 24', async () => {
|
|
233
|
+
const senior = await agentDao.createAgent({ type: 'senior', teamId });
|
|
234
|
+
await agentDao.createAgent({ type: 'junior', teamId });
|
|
235
|
+
const seniors = await agentDao.getAgentsByType('senior');
|
|
236
|
+
expect(seniors.map(agent => agent.id)).toEqual([senior.id]);
|
|
237
|
+
});
|
|
238
|
+
it('dao-broader.sqlite-dao case 25', async () => {
|
|
239
|
+
const idle = await agentDao.createAgent({ type: 'senior', teamId });
|
|
240
|
+
const working = await agentDao.createAgent({ type: 'junior', teamId });
|
|
241
|
+
await agentDao.updateAgent(working.id, { status: 'working' });
|
|
242
|
+
const workingAgents = await agentDao.getAgentsByStatus('working');
|
|
243
|
+
const ids = workingAgents.map(agent => agent.id);
|
|
244
|
+
expect(ids).toContain(working.id);
|
|
245
|
+
expect(ids).not.toContain(idle.id);
|
|
246
|
+
});
|
|
247
|
+
it('dao-broader.sqlite-dao case 26', async () => {
|
|
248
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId, tmuxSession: 'tmux-1' });
|
|
249
|
+
await agentDao.terminateAgent(agent.id);
|
|
250
|
+
const updated = await agentDao.getAgentById(agent.id);
|
|
251
|
+
expect(updated.status).toBe('terminated');
|
|
252
|
+
expect(updated.tmux_session).toBeNull();
|
|
253
|
+
});
|
|
254
|
+
it('dao-broader.sqlite-dao case 27', async () => {
|
|
255
|
+
const s1 = await storyDao.createStory({ title: 'Old', description: 'D1' });
|
|
256
|
+
const s2 = await storyDao.createStory({ title: 'New', description: 'D2' });
|
|
257
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', s1.id]);
|
|
258
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', s2.id]);
|
|
259
|
+
const all = await storyDao.getAllStories();
|
|
260
|
+
expect(all.map(story => story.id)).toEqual([s2.id, s1.id]);
|
|
261
|
+
});
|
|
262
|
+
it('dao-broader.sqlite-dao case 28', async () => {
|
|
263
|
+
const otherTeam = await teamDao.createTeam({ repoUrl: 'url-o', repoPath: '/o', name: 'Other' });
|
|
264
|
+
const s1 = await storyDao.createStory({ title: 'Old', description: 'D1', teamId });
|
|
265
|
+
const s2 = await storyDao.createStory({ title: 'New', description: 'D2', teamId });
|
|
266
|
+
await storyDao.createStory({ title: 'Other', description: 'D3', teamId: otherTeam.id });
|
|
267
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', s1.id]);
|
|
268
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', s2.id]);
|
|
269
|
+
const teamStories = await storyDao.getStoriesByTeam(teamId);
|
|
270
|
+
expect(teamStories.map(story => story.id)).toEqual([s1.id, s2.id]);
|
|
271
|
+
});
|
|
272
|
+
it('dao-broader.sqlite-dao case 29', async () => {
|
|
273
|
+
const s1 = await storyDao.createStory({ title: 'Old', description: 'D1' });
|
|
274
|
+
const s2 = await storyDao.createStory({ title: 'New', description: 'D2' });
|
|
275
|
+
await storyDao.updateStory(s1.id, { status: 'planned' });
|
|
276
|
+
await storyDao.updateStory(s2.id, { status: 'planned' });
|
|
277
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', s1.id]);
|
|
278
|
+
db.run('UPDATE stories SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', s2.id]);
|
|
279
|
+
const planned = await storyDao.getStoriesByStatus('planned');
|
|
280
|
+
expect(planned.map(story => story.id)).toEqual([s1.id, s2.id]);
|
|
281
|
+
});
|
|
282
|
+
it('dao-broader.sqlite-dao case 30', async () => {
|
|
283
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
284
|
+
const planned = await storyDao.createStory({ title: 'Planned', description: 'D1' });
|
|
285
|
+
const review = await storyDao.createStory({ title: 'Review', description: 'D2' });
|
|
286
|
+
const merged = await storyDao.createStory({ title: 'Merged', description: 'D3' });
|
|
287
|
+
await storyDao.updateStory(planned.id, { status: 'planned', assignedAgentId: agent.id });
|
|
288
|
+
await storyDao.updateStory(review.id, { status: 'review', assignedAgentId: agent.id });
|
|
289
|
+
await storyDao.updateStory(merged.id, { status: 'merged', assignedAgentId: agent.id });
|
|
290
|
+
const active = await storyDao.getActiveStoriesByAgent(agent.id);
|
|
291
|
+
const ids = active.map(story => story.id);
|
|
292
|
+
expect(ids).toContain(planned.id);
|
|
293
|
+
expect(ids).toContain(review.id);
|
|
294
|
+
expect(ids).not.toContain(merged.id);
|
|
295
|
+
});
|
|
296
|
+
it('dao-broader.sqlite-dao case 31', async () => {
|
|
297
|
+
const s1 = await storyDao.createStory({ title: 'Planned', description: 'D1', teamId });
|
|
298
|
+
const s2 = await storyDao.createStory({ title: 'In Progress', description: 'D2', teamId });
|
|
299
|
+
const s3 = await storyDao.createStory({ title: 'Review', description: 'D3', teamId });
|
|
300
|
+
const s4 = await storyDao.createStory({ title: 'QA', description: 'D4', teamId });
|
|
301
|
+
const s5 = await storyDao.createStory({ title: 'Merged', description: 'D5', teamId });
|
|
302
|
+
await storyDao.updateStory(s1.id, { status: 'planned', storyPoints: 3 });
|
|
303
|
+
await storyDao.updateStory(s2.id, { status: 'in_progress', storyPoints: 5 });
|
|
304
|
+
await storyDao.updateStory(s3.id, { status: 'review', storyPoints: 2 });
|
|
305
|
+
await storyDao.updateStory(s4.id, { status: 'qa', storyPoints: 1 });
|
|
306
|
+
await storyDao.updateStory(s5.id, { status: 'merged', storyPoints: 8 });
|
|
307
|
+
const total = await storyDao.getStoryPointsByTeam(teamId);
|
|
308
|
+
expect(total).toBe(11);
|
|
309
|
+
});
|
|
310
|
+
it('dao-broader.sqlite-dao case 32', async () => {
|
|
311
|
+
const base = await storyDao.createStory({ title: 'Base', description: 'D1' });
|
|
312
|
+
const dependent = await storyDao.createStory({ title: 'Dependent', description: 'D2' });
|
|
313
|
+
await storyDao.addStoryDependency(dependent.id, base.id);
|
|
314
|
+
await storyDao.deleteStory(base.id);
|
|
315
|
+
const depending = await storyDao.getStoriesDependingOn(base.id);
|
|
316
|
+
expect(depending).toEqual([]);
|
|
317
|
+
});
|
|
318
|
+
it('dao-broader.sqlite-dao case 33', async () => {
|
|
319
|
+
const r1 = await reqDao.createRequirement({ title: 'First', description: 'Desc' });
|
|
320
|
+
const r2 = await reqDao.createRequirement({ title: 'Second', description: 'Desc' });
|
|
321
|
+
const sameTime = '2025-01-01T00:00:00.000Z';
|
|
322
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', [sameTime, r1.id]);
|
|
323
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', [sameTime, r2.id]);
|
|
324
|
+
const all = await reqDao.getAllRequirements();
|
|
325
|
+
expect(all.map(req => req.id)).toEqual([r2.id, r1.id]);
|
|
326
|
+
});
|
|
327
|
+
it('dao-broader.sqlite-dao case 34', async () => {
|
|
328
|
+
const rPending = await reqDao.createRequirement({ title: 'Pending', description: 'Desc' });
|
|
329
|
+
const rPlanning = await reqDao.createRequirement({ title: 'Planning', description: 'Desc' });
|
|
330
|
+
const rInProgress = await reqDao.createRequirement({ title: 'In Progress', description: 'Desc' });
|
|
331
|
+
const rDone = await reqDao.createRequirement({ title: 'Done', description: 'Desc' });
|
|
332
|
+
await reqDao.updateRequirement(rPlanning.id, { status: 'planning' });
|
|
333
|
+
await reqDao.updateRequirement(rInProgress.id, { status: 'in_progress' });
|
|
334
|
+
await reqDao.updateRequirement(rDone.id, { status: 'completed' });
|
|
335
|
+
const sameTime = '2025-01-01T00:00:00.000Z';
|
|
336
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', [sameTime, rPending.id]);
|
|
337
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', [sameTime, rPlanning.id]);
|
|
338
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', [sameTime, rInProgress.id]);
|
|
339
|
+
db.run('UPDATE requirements SET created_at = ? WHERE id = ?', [sameTime, rDone.id]);
|
|
340
|
+
const pending = await reqDao.getPendingRequirements();
|
|
341
|
+
expect(pending.map(req => req.id)).toEqual([rPending.id, rPlanning.id, rInProgress.id]);
|
|
342
|
+
});
|
|
343
|
+
it('dao-broader.sqlite-dao case 35', async () => {
|
|
344
|
+
const pr = await prDao.createPullRequest({
|
|
345
|
+
branchName: 'branch',
|
|
346
|
+
teamId,
|
|
347
|
+
githubPrNumber: 123,
|
|
348
|
+
githubPrUrl: 'https://example.com/pr/123',
|
|
349
|
+
});
|
|
350
|
+
const found = await prDao.getPullRequestByGithubNumber(123);
|
|
351
|
+
expect(found.id).toBe(pr.id);
|
|
352
|
+
});
|
|
353
|
+
it('dao-broader.sqlite-dao case 36', async () => {
|
|
354
|
+
const pr = await prDao.createPullRequest({ branchName: 'branch', teamId });
|
|
355
|
+
const updated = await prDao.updatePullRequest(pr.id, { status: 'approved', reviewedBy: 'lead' });
|
|
356
|
+
expect(updated.status).toBe('approved');
|
|
357
|
+
expect(updated.reviewed_at).not.toBeNull();
|
|
358
|
+
});
|
|
359
|
+
it('dao-broader.sqlite-dao case 37', async () => {
|
|
360
|
+
const pr1 = await prDao.createPullRequest({ branchName: 'b1', teamId });
|
|
361
|
+
const pr2 = await prDao.createPullRequest({ branchName: 'b2', teamId });
|
|
362
|
+
db.run('UPDATE pull_requests SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', pr1.id]);
|
|
363
|
+
db.run('UPDATE pull_requests SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', pr2.id]);
|
|
364
|
+
await prDao.updatePullRequest(pr1.id, { status: 'reviewing' });
|
|
365
|
+
const next = await prDao.getNextInQueue(teamId);
|
|
366
|
+
expect(next.id).toBe(pr2.id);
|
|
367
|
+
});
|
|
368
|
+
it('dao-broader.sqlite-dao case 38', async () => {
|
|
369
|
+
const pr = await prDao.createPullRequest({ branchName: 'b1', teamId });
|
|
370
|
+
await prDao.updatePullRequest(pr.id, { status: 'merged' });
|
|
371
|
+
const position = await prDao.getQueuePosition(pr.id);
|
|
372
|
+
expect(position).toBe(-1);
|
|
373
|
+
});
|
|
374
|
+
it('dao-broader.sqlite-dao case 39', async () => {
|
|
375
|
+
const agent1 = await agentDao.createAgent({ type: 'senior', teamId });
|
|
376
|
+
const agent2 = await agentDao.createAgent({ type: 'junior', teamId });
|
|
377
|
+
const e1 = await escDao.createEscalation({ fromAgentId: agent1.id, reason: 'Old' });
|
|
378
|
+
const e2 = await escDao.createEscalation({ fromAgentId: agent1.id, reason: 'New' });
|
|
379
|
+
await escDao.createEscalation({ fromAgentId: agent2.id, reason: 'Other' });
|
|
380
|
+
db.run('UPDATE escalations SET created_at = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', e1.id]);
|
|
381
|
+
db.run('UPDATE escalations SET created_at = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', e2.id]);
|
|
382
|
+
const fromAgent1 = await escDao.getEscalationsByFromAgent(agent1.id);
|
|
383
|
+
expect(fromAgent1.map(esc => esc.id)).toEqual([e2.id, e1.id]);
|
|
384
|
+
});
|
|
385
|
+
it('dao-broader.sqlite-dao case 40', async () => {
|
|
386
|
+
const agent = await agentDao.createAgent({ type: 'senior', teamId });
|
|
387
|
+
const l1 = await logDao.createLog({ agentId: agent.id, eventType: 'AGENT_SPAWNED' });
|
|
388
|
+
const l2 = await logDao.createLog({ agentId: agent.id, eventType: 'AGENT_SPAWNED' });
|
|
389
|
+
const l3 = await logDao.createLog({ agentId: agent.id, eventType: 'AGENT_SPAWNED' });
|
|
390
|
+
db.run('UPDATE agent_logs SET timestamp = ? WHERE id = ?', ['2025-01-01T00:00:00.000Z', l1.id]);
|
|
391
|
+
db.run('UPDATE agent_logs SET timestamp = ? WHERE id = ?', ['2025-01-02T00:00:00.000Z', l2.id]);
|
|
392
|
+
db.run('UPDATE agent_logs SET timestamp = ? WHERE id = ?', ['2025-01-03T00:00:00.000Z', l3.id]);
|
|
393
|
+
const since = await logDao.getLogsSince('2025-01-01T12:00:00.000Z');
|
|
394
|
+
expect(since.map(log => log.id)).toEqual([l2.id, l3.id]);
|
|
395
|
+
});
|
|
396
|
+
it('dao-broader.sqlite-dao case 41', async () => {
|
|
397
|
+
db.run(`INSERT INTO messages (id, from_session, to_session, subject, body, reply, status, created_at, replied_at)
|
|
398
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, ['m1', 'a', 'b', null, 'First', null, 'pending', '2025-01-02T00:00:00.000Z', null]);
|
|
399
|
+
db.run(`INSERT INTO messages (id, from_session, to_session, subject, body, reply, status, created_at, replied_at)
|
|
400
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, ['m2', 'a', 'b', null, 'Second', null, 'pending', '2025-01-01T00:00:00.000Z', null]);
|
|
401
|
+
db.run(`INSERT INTO messages (id, from_session, to_session, subject, body, reply, status, created_at, replied_at)
|
|
402
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, ['m3', 'a', 'b', null, 'Read', null, 'read', '2025-01-03T00:00:00.000Z', null]);
|
|
403
|
+
db.run(`INSERT INTO messages (id, from_session, to_session, subject, body, reply, status, created_at, replied_at)
|
|
404
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, ['m4', 'a', 'c', null, 'Other', null, 'pending', '2025-01-01T00:00:00.000Z', null]);
|
|
405
|
+
const unread = await msgDao.getUnreadMessages('b');
|
|
406
|
+
expect(unread.map(msg => msg.id)).toEqual(['m2', 'm1']);
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
//# sourceMappingURL=dao-broader.sqlite-dao.test.js.map
|