sqlew 5.2.1 → 5.2.2
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/CHANGELOG.md +29 -0
- package/dist/cli/hooks/on-prompt.d.ts +2 -2
- package/dist/cli/hooks/on-prompt.d.ts.map +1 -1
- package/dist/cli/hooks/on-prompt.js +1 -1
- package/dist/cli/hooks/plan-pattern-extractor.d.ts +2 -0
- package/dist/cli/hooks/plan-pattern-extractor.d.ts.map +1 -1
- package/dist/cli/hooks/plan-pattern-extractor.js +1 -0
- package/dist/cli/hooks/plan-pattern-extractor.js.map +1 -1
- package/dist/cli/hooks/plan-processor.d.ts.map +1 -1
- package/dist/cli/hooks/plan-processor.js +1 -0
- package/dist/cli/hooks/plan-processor.js.map +1 -1
- package/dist/database/migrations/v4/20260613000000_add_constraint_reason.d.ts +9 -0
- package/dist/database/migrations/v4/20260613000000_add_constraint_reason.d.ts.map +1 -0
- package/dist/database/migrations/v4/20260613000000_add_constraint_reason.js +31 -0
- package/dist/database/migrations/v4/20260613000000_add_constraint_reason.js.map +1 -0
- package/dist/help-data/constraint.toml +6 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +4 -5
- package/dist/schema.js.map +1 -1
- package/dist/tests/docker/native/constraint-operations.test.js +38 -0
- package/dist/tests/docker/native/constraint-operations.test.js.map +1 -1
- package/dist/tests/feature/constraint/reason.test.d.ts +7 -0
- package/dist/tests/feature/constraint/reason.test.d.ts.map +1 -0
- package/dist/tests/feature/constraint/reason.test.js +68 -0
- package/dist/tests/feature/constraint/reason.test.js.map +1 -0
- package/dist/tests/unit/hooks/plan-pattern-extractor.test.d.ts +8 -0
- package/dist/tests/unit/hooks/plan-pattern-extractor.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/plan-pattern-extractor.test.js +110 -0
- package/dist/tests/unit/hooks/plan-pattern-extractor.test.js.map +1 -0
- package/dist/tools/constraints/actions/add.d.ts.map +1 -1
- package/dist/tools/constraints/actions/add.js +1 -0
- package/dist/tools/constraints/actions/add.js.map +1 -1
- package/dist/tools/constraints/actions/get.d.ts.map +1 -1
- package/dist/tools/constraints/actions/get.js +4 -2
- package/dist/tools/constraints/actions/get.js.map +1 -1
- package/dist/tools/constraints/help/example.js +1 -1
- package/dist/tools/constraints/help/example.js.map +1 -1
- package/dist/types/constraint/params.d.ts +2 -0
- package/dist/types/constraint/params.d.ts.map +1 -1
- package/dist/types/view-entities.d.ts +1 -0
- package/dist/types/view-entities.d.ts.map +1 -1
- package/dist/utils/action-specs/constraint-specs.d.ts.map +1 -1
- package/dist/utils/action-specs/constraint-specs.js +4 -3
- package/dist/utils/action-specs/constraint-specs.js.map +1 -1
- package/dist/utils/hook-queue.d.ts +2 -0
- package/dist/utils/hook-queue.d.ts.map +1 -1
- package/dist/utils/hook-queue.js.map +1 -1
- package/dist/utils/view-queries.d.ts.map +1 -1
- package/dist/utils/view-queries.js +1 -0
- package/dist/utils/view-queries.js.map +1 -1
- package/dist/watcher/queue-watcher.d.ts.map +1 -1
- package/dist/watcher/queue-watcher.js +1 -0
- package/dist/watcher/queue-watcher.js.map +1 -1
- package/package.json +1 -1
- package/dist/tests/docker/native/help-system.test.d.ts +0 -8
- package/dist/tests/docker/native/help-system.test.d.ts.map +0 -1
- package/dist/tests/docker/native/help-system.test.js +0 -508
- package/dist/tests/docker/native/help-system.test.js.map +0 -1
|
@@ -1,508 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Help System - Native RDBMS Integration Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests help system tables via direct Knex operations
|
|
5
|
-
* on MySQL, MariaDB, and PostgreSQL.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it } from 'node:test';
|
|
8
|
-
import assert from 'node:assert';
|
|
9
|
-
import { runTestsOnAllDatabases } from './test-harness.js';
|
|
10
|
-
runTestsOnAllDatabases('Help System', (getDb, dbType) => {
|
|
11
|
-
let projectId;
|
|
12
|
-
it('should get project ID', async () => {
|
|
13
|
-
const db = getDb();
|
|
14
|
-
const project = await db('m_projects').first();
|
|
15
|
-
assert.ok(project, 'Project should exist');
|
|
16
|
-
projectId = project.id;
|
|
17
|
-
});
|
|
18
|
-
describe('m_help_tools table', () => {
|
|
19
|
-
it('should have decision tool registered', async () => {
|
|
20
|
-
const db = getDb();
|
|
21
|
-
const tool = await db('m_help_tools')
|
|
22
|
-
.where({ tool_name: 'decision' })
|
|
23
|
-
.first();
|
|
24
|
-
assert.ok(tool, 'Decision tool should be registered');
|
|
25
|
-
assert.strictEqual(tool.tool_name, 'decision');
|
|
26
|
-
assert.ok(tool.description, 'Tool should have description');
|
|
27
|
-
assert.ok(tool.description.includes('decision') || tool.description.includes('context'), 'Description should mention decision or context management');
|
|
28
|
-
});
|
|
29
|
-
// Note: Task tool removed in v5.0 (deprecated)
|
|
30
|
-
it('should have constraint tool registered', async () => {
|
|
31
|
-
const db = getDb();
|
|
32
|
-
const tool = await db('m_help_tools')
|
|
33
|
-
.where({ tool_name: 'constraint' })
|
|
34
|
-
.first();
|
|
35
|
-
assert.ok(tool, 'Constraint tool should be registered');
|
|
36
|
-
assert.strictEqual(tool.tool_name, 'constraint');
|
|
37
|
-
assert.ok(tool.description, 'Tool should have description');
|
|
38
|
-
});
|
|
39
|
-
it('should have help and example tools registered', async () => {
|
|
40
|
-
const db = getDb();
|
|
41
|
-
const helpTool = await db('m_help_tools')
|
|
42
|
-
.where({ tool_name: 'help' })
|
|
43
|
-
.first();
|
|
44
|
-
const exampleTool = await db('m_help_tools')
|
|
45
|
-
.where({ tool_name: 'example' })
|
|
46
|
-
.first();
|
|
47
|
-
assert.ok(helpTool, 'Help tool should be registered');
|
|
48
|
-
assert.ok(exampleTool, 'Example tool should be registered');
|
|
49
|
-
});
|
|
50
|
-
it('should have all core tools registered', async () => {
|
|
51
|
-
const db = getDb();
|
|
52
|
-
const tools = await db('m_help_tools')
|
|
53
|
-
.select('tool_name')
|
|
54
|
-
.orderBy('tool_name');
|
|
55
|
-
const toolNames = tools.map((t) => t.tool_name);
|
|
56
|
-
// Core tools that must exist (task removed in v5.0)
|
|
57
|
-
const requiredTools = ['decision', 'constraint', 'help', 'example'];
|
|
58
|
-
for (const requiredTool of requiredTools) {
|
|
59
|
-
assert.ok(toolNames.includes(requiredTool), `Should have ${requiredTool} tool registered`);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
describe('m_help_actions table', () => {
|
|
64
|
-
it('should have decision.set action documented', async () => {
|
|
65
|
-
const db = getDb();
|
|
66
|
-
const action = await db('m_help_actions')
|
|
67
|
-
.where({ tool_name: 'decision', action_name: 'set' })
|
|
68
|
-
.first();
|
|
69
|
-
assert.ok(action, 'decision.set action should be documented');
|
|
70
|
-
assert.strictEqual(action.action_name, 'set');
|
|
71
|
-
assert.ok(action.description, 'Action should have description');
|
|
72
|
-
// Parameters are stored in t_help_action_params table
|
|
73
|
-
const params = await db('t_help_action_params')
|
|
74
|
-
.where({ action_id: action.id })
|
|
75
|
-
.select('*');
|
|
76
|
-
assert.ok(Array.isArray(params), 'Parameters should be an array');
|
|
77
|
-
assert.ok(params.length > 0, 'Should have at least one parameter');
|
|
78
|
-
const paramNames = params.map((p) => p.param_name);
|
|
79
|
-
assert.ok(paramNames.includes('key'), 'Should have key parameter');
|
|
80
|
-
assert.ok(paramNames.includes('value'), 'Should have value parameter');
|
|
81
|
-
});
|
|
82
|
-
// Note: task.create action test removed in v5.0 (task tool deprecated)
|
|
83
|
-
it('should have constraint.add action documented', async () => {
|
|
84
|
-
const db = getDb();
|
|
85
|
-
const action = await db('m_help_actions')
|
|
86
|
-
.where({ tool_name: 'constraint', action_name: 'add' })
|
|
87
|
-
.first();
|
|
88
|
-
assert.ok(action, 'constraint.add action should be documented');
|
|
89
|
-
assert.strictEqual(action.action_name, 'add');
|
|
90
|
-
assert.ok(action.description, 'Action should have description');
|
|
91
|
-
// Parameters are stored in t_help_action_params table
|
|
92
|
-
const params = await db('t_help_action_params')
|
|
93
|
-
.where({ action_id: action.id })
|
|
94
|
-
.select('*');
|
|
95
|
-
assert.ok(Array.isArray(params), 'Should have parameters');
|
|
96
|
-
});
|
|
97
|
-
it('should have multiple actions per tool', async () => {
|
|
98
|
-
const db = getDb();
|
|
99
|
-
const decisionActions = await db('m_help_actions')
|
|
100
|
-
.where({ tool_name: 'decision' })
|
|
101
|
-
.select('action_name');
|
|
102
|
-
// Note: Task tool removed in v5.0
|
|
103
|
-
const constraintActions = await db('m_help_actions')
|
|
104
|
-
.where({ tool_name: 'constraint' })
|
|
105
|
-
.select('action_name');
|
|
106
|
-
assert.ok(decisionActions.length > 1, 'Decision tool should have multiple actions');
|
|
107
|
-
assert.ok(constraintActions.length >= 1, 'Constraint tool should have actions');
|
|
108
|
-
const decisionActionNames = decisionActions.map((a) => a.action_name);
|
|
109
|
-
assert.ok(decisionActionNames.includes('set'), 'Should have set action');
|
|
110
|
-
assert.ok(decisionActionNames.includes('get'), 'Should have get action');
|
|
111
|
-
});
|
|
112
|
-
it('should indicate required vs optional parameters', async () => {
|
|
113
|
-
const db = getDb();
|
|
114
|
-
const action = await db('m_help_actions')
|
|
115
|
-
.where({ tool_name: 'decision', action_name: 'set' })
|
|
116
|
-
.first();
|
|
117
|
-
assert.ok(action, 'Action should exist');
|
|
118
|
-
// Parameters are stored in t_help_action_params table
|
|
119
|
-
const params = await db('t_help_action_params')
|
|
120
|
-
.where({ action_id: action.id })
|
|
121
|
-
.select('*');
|
|
122
|
-
assert.ok(params.length > 0, 'Should have parameters');
|
|
123
|
-
// Check that parameters have required flag (stored as integer 0/1)
|
|
124
|
-
const hasRequiredFlag = params.every((p) => typeof p.required === 'number' || typeof p.required === 'boolean');
|
|
125
|
-
assert.ok(hasRequiredFlag, 'All parameters should have required flag');
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
describe('m_help_actions foreign key constraints', () => {
|
|
129
|
-
it('should enforce FK constraint on tool_name', async () => {
|
|
130
|
-
const db = getDb();
|
|
131
|
-
try {
|
|
132
|
-
// m_help_actions columns: id, tool_name, action_name, description, returns
|
|
133
|
-
// (parameters is stored in separate t_help_action_params table)
|
|
134
|
-
await db('m_help_actions').insert({
|
|
135
|
-
tool_name: 'non_existent_tool',
|
|
136
|
-
action_name: 'test_action',
|
|
137
|
-
description: 'Test description',
|
|
138
|
-
});
|
|
139
|
-
assert.fail('Should have thrown FK constraint error');
|
|
140
|
-
}
|
|
141
|
-
catch (error) {
|
|
142
|
-
// Expected: FK constraint violation
|
|
143
|
-
assert.ok(error.message.includes('foreign key') ||
|
|
144
|
-
error.message.includes('FOREIGN KEY') ||
|
|
145
|
-
error.message.includes('constraint'), 'Should be a foreign key constraint error');
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
it('should allow actions with valid tool_name', async () => {
|
|
149
|
-
const db = getDb();
|
|
150
|
-
const testActionName = `test_action_${Date.now()}`;
|
|
151
|
-
await db('m_help_actions').insert({
|
|
152
|
-
tool_name: 'decision',
|
|
153
|
-
action_name: testActionName,
|
|
154
|
-
description: 'Test action',
|
|
155
|
-
});
|
|
156
|
-
const inserted = await db('m_help_actions')
|
|
157
|
-
.where({ tool_name: 'decision', action_name: testActionName })
|
|
158
|
-
.first();
|
|
159
|
-
assert.ok(inserted, 'Should insert action with valid tool_name');
|
|
160
|
-
await db('m_help_actions')
|
|
161
|
-
.where({ action_name: testActionName })
|
|
162
|
-
.delete();
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
describe('t_help_action_examples table', () => {
|
|
166
|
-
it('should have examples for decision tool', async () => {
|
|
167
|
-
const db = getDb();
|
|
168
|
-
const examples = await db('t_help_action_examples')
|
|
169
|
-
.join('m_help_actions', 't_help_action_examples.action_id', 'm_help_actions.id')
|
|
170
|
-
.where({ 'm_help_actions.tool_name': 'decision' })
|
|
171
|
-
.select('t_help_action_examples.*');
|
|
172
|
-
assert.ok(examples.length >= 0, 'Should return examples (or empty array if none seeded)');
|
|
173
|
-
if (examples.length > 0) {
|
|
174
|
-
const example = examples[0];
|
|
175
|
-
assert.ok(example.title, 'Example should have title');
|
|
176
|
-
assert.ok(example.code, 'Example should have code');
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
it('should filter examples by action', async () => {
|
|
180
|
-
const db = getDb();
|
|
181
|
-
const examples = await db('t_help_action_examples')
|
|
182
|
-
.join('m_help_actions', 't_help_action_examples.action_id', 'm_help_actions.id')
|
|
183
|
-
.where({ 'm_help_actions.tool_name': 'decision', 'm_help_actions.action_name': 'set' })
|
|
184
|
-
.select('t_help_action_examples.*', 'm_help_actions.tool_name', 'm_help_actions.action_name');
|
|
185
|
-
assert.ok(Array.isArray(examples), 'Should return array');
|
|
186
|
-
examples.forEach((ex) => {
|
|
187
|
-
assert.strictEqual(ex.tool_name, 'decision');
|
|
188
|
-
assert.strictEqual(ex.action_name, 'set');
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
it('should have required columns', async () => {
|
|
192
|
-
const db = getDb();
|
|
193
|
-
const examples = await db('t_help_action_examples')
|
|
194
|
-
.limit(5)
|
|
195
|
-
.select('*');
|
|
196
|
-
assert.ok(Array.isArray(examples), 'Should return examples array');
|
|
197
|
-
if (examples.length > 0) {
|
|
198
|
-
const example = examples[0];
|
|
199
|
-
assert.ok('id' in example, 'Should have id');
|
|
200
|
-
assert.ok('action_id' in example, 'Should have action_id');
|
|
201
|
-
assert.ok('title' in example, 'Should have title');
|
|
202
|
-
assert.ok('code' in example, 'Should have code');
|
|
203
|
-
assert.ok('explanation' in example, 'Should have explanation');
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
it('should search examples by keyword in title', async () => {
|
|
207
|
-
const db = getDb();
|
|
208
|
-
const keyword = 'decision';
|
|
209
|
-
const examples = await db('t_help_action_examples')
|
|
210
|
-
.where('title', 'like', `%${keyword}%`)
|
|
211
|
-
.select('*');
|
|
212
|
-
assert.ok(Array.isArray(examples), 'Should return search results');
|
|
213
|
-
examples.forEach((ex) => {
|
|
214
|
-
assert.ok(ex.title.toLowerCase().includes(keyword.toLowerCase()), 'Title should contain keyword');
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
it('should search examples by keyword in explanation', async () => {
|
|
218
|
-
const db = getDb();
|
|
219
|
-
const keyword = 'task';
|
|
220
|
-
const examples = await db('t_help_action_examples')
|
|
221
|
-
.where('explanation', 'like', `%${keyword}%`)
|
|
222
|
-
.select('*');
|
|
223
|
-
assert.ok(Array.isArray(examples), 'Should return search results');
|
|
224
|
-
});
|
|
225
|
-
it('should search examples by tool and keyword', async () => {
|
|
226
|
-
const db = getDb();
|
|
227
|
-
// Join with m_help_actions to filter by tool_name (task -> decision in v5.0)
|
|
228
|
-
const examples = await db('t_help_action_examples')
|
|
229
|
-
.join('m_help_actions', 't_help_action_examples.action_id', 'm_help_actions.id')
|
|
230
|
-
.where({ 'm_help_actions.tool_name': 'decision' })
|
|
231
|
-
.andWhere(function () {
|
|
232
|
-
this.where('title', 'like', '%set%')
|
|
233
|
-
.orWhere('explanation', 'like', '%set%');
|
|
234
|
-
})
|
|
235
|
-
.select('t_help_action_examples.*', 'm_help_actions.tool_name');
|
|
236
|
-
assert.ok(Array.isArray(examples), 'Should return filtered search results');
|
|
237
|
-
examples.forEach((ex) => {
|
|
238
|
-
assert.strictEqual(ex.tool_name, 'decision');
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
describe('t_help_use_cases table', () => {
|
|
243
|
-
it('should have use case table structure', async () => {
|
|
244
|
-
const db = getDb();
|
|
245
|
-
const useCases = await db('t_help_use_cases')
|
|
246
|
-
.limit(5)
|
|
247
|
-
.select('*');
|
|
248
|
-
assert.ok(Array.isArray(useCases), 'Should return use cases array');
|
|
249
|
-
if (useCases.length > 0) {
|
|
250
|
-
const useCase = useCases[0];
|
|
251
|
-
assert.ok('id' in useCase, 'Use case should have id');
|
|
252
|
-
assert.ok('title' in useCase, 'Use case should have title');
|
|
253
|
-
assert.ok('category_id' in useCase, 'Use case should have category_id');
|
|
254
|
-
assert.ok('complexity' in useCase, 'Use case should have complexity');
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
it('should get use case by ID', async () => {
|
|
258
|
-
const db = getDb();
|
|
259
|
-
const firstUseCase = await db('t_help_use_cases')
|
|
260
|
-
.orderBy('id', 'asc')
|
|
261
|
-
.first();
|
|
262
|
-
if (firstUseCase) {
|
|
263
|
-
const useCase = await db('t_help_use_cases')
|
|
264
|
-
.where({ id: firstUseCase.id })
|
|
265
|
-
.first();
|
|
266
|
-
assert.ok(useCase, 'Should retrieve use case by ID');
|
|
267
|
-
assert.strictEqual(useCase.id, firstUseCase.id);
|
|
268
|
-
assert.ok(useCase.title, 'Use case should have title');
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
it('should search use cases by keyword in title', async () => {
|
|
272
|
-
const db = getDb();
|
|
273
|
-
const keyword = 'sprint';
|
|
274
|
-
const useCases = await db('t_help_use_cases')
|
|
275
|
-
.where('title', 'like', `%${keyword}%`)
|
|
276
|
-
.select('*');
|
|
277
|
-
assert.ok(Array.isArray(useCases), 'Should return search results');
|
|
278
|
-
});
|
|
279
|
-
it('should search use cases by keyword in description', async () => {
|
|
280
|
-
const db = getDb();
|
|
281
|
-
const keyword = 'workflow';
|
|
282
|
-
const useCases = await db('t_help_use_cases')
|
|
283
|
-
.where('description', 'like', `%${keyword}%`)
|
|
284
|
-
.select('*');
|
|
285
|
-
assert.ok(Array.isArray(useCases), 'Should return search results');
|
|
286
|
-
});
|
|
287
|
-
it('should filter use cases by complexity', async () => {
|
|
288
|
-
const db = getDb();
|
|
289
|
-
const basicUseCases = await db('t_help_use_cases')
|
|
290
|
-
.where({ complexity: 'basic' })
|
|
291
|
-
.select('*');
|
|
292
|
-
const advancedUseCases = await db('t_help_use_cases')
|
|
293
|
-
.where({ complexity: 'advanced' })
|
|
294
|
-
.select('*');
|
|
295
|
-
assert.ok(Array.isArray(basicUseCases), 'Should return basic use cases');
|
|
296
|
-
assert.ok(Array.isArray(advancedUseCases), 'Should return advanced use cases');
|
|
297
|
-
basicUseCases.forEach((uc) => {
|
|
298
|
-
assert.strictEqual(uc.complexity, 'basic');
|
|
299
|
-
});
|
|
300
|
-
advancedUseCases.forEach((uc) => {
|
|
301
|
-
assert.strictEqual(uc.complexity, 'advanced');
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
describe('m_help_use_case_cats table', () => {
|
|
306
|
-
it('should have use case categories', async () => {
|
|
307
|
-
const db = getDb();
|
|
308
|
-
const categories = await db('m_help_use_case_cats')
|
|
309
|
-
.select('*');
|
|
310
|
-
assert.ok(Array.isArray(categories), 'Should return categories');
|
|
311
|
-
assert.ok(categories.length > 0, 'Should have at least one category');
|
|
312
|
-
categories.forEach((cat) => {
|
|
313
|
-
assert.ok(cat.id, 'Category should have id');
|
|
314
|
-
assert.ok(cat.category_name, 'Category should have name');
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
|
-
it('should join use cases with categories', async () => {
|
|
318
|
-
const db = getDb();
|
|
319
|
-
const useCasesWithCategory = await db('t_help_use_cases')
|
|
320
|
-
.join('m_help_use_case_cats', 't_help_use_cases.category_id', 'm_help_use_case_cats.id')
|
|
321
|
-
.select('t_help_use_cases.*', 'm_help_use_case_cats.category_name')
|
|
322
|
-
.limit(5);
|
|
323
|
-
assert.ok(Array.isArray(useCasesWithCategory), 'Should return joined results');
|
|
324
|
-
useCasesWithCategory.forEach((uc) => {
|
|
325
|
-
assert.ok(uc.category_name, 'Should have category_name from join');
|
|
326
|
-
});
|
|
327
|
-
});
|
|
328
|
-
it('should filter use cases by category name', async () => {
|
|
329
|
-
const db = getDb();
|
|
330
|
-
const categories = await db('m_help_use_case_cats')
|
|
331
|
-
.select('*');
|
|
332
|
-
if (categories.length > 0) {
|
|
333
|
-
const firstCategory = categories[0];
|
|
334
|
-
const useCases = await db('t_help_use_cases')
|
|
335
|
-
.join('m_help_use_case_cats', 't_help_use_cases.category_id', 'm_help_use_case_cats.id')
|
|
336
|
-
.where('m_help_use_case_cats.category_name', firstCategory.category_name)
|
|
337
|
-
.select('t_help_use_cases.*');
|
|
338
|
-
assert.ok(Array.isArray(useCases), 'Should return category-filtered results');
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
});
|
|
342
|
-
// NOTE: m_help_use_case_steps table does not exist in current schema
|
|
343
|
-
// Use case steps are stored in the 'workflow' TEXT column of t_help_use_cases
|
|
344
|
-
describe(`Cross-database compatibility - ${dbType}`, () => {
|
|
345
|
-
it('should handle unicode in example search', async () => {
|
|
346
|
-
const db = getDb();
|
|
347
|
-
const unicodeKeyword = '日本語';
|
|
348
|
-
const examples = await db('t_help_action_examples')
|
|
349
|
-
.where('title', 'like', `%${unicodeKeyword}%`)
|
|
350
|
-
.select('*');
|
|
351
|
-
assert.ok(Array.isArray(examples), 'Should handle unicode search');
|
|
352
|
-
});
|
|
353
|
-
it('should handle special characters in search', async () => {
|
|
354
|
-
const db = getDb();
|
|
355
|
-
const specialKeyword = "test's \"special\" chars";
|
|
356
|
-
const examples = await db('t_help_action_examples')
|
|
357
|
-
.where('title', 'like', `%${specialKeyword}%`)
|
|
358
|
-
.select('*');
|
|
359
|
-
assert.ok(Array.isArray(examples), 'Should handle special characters');
|
|
360
|
-
});
|
|
361
|
-
it('should support pagination in example listing', async () => {
|
|
362
|
-
const db = getDb();
|
|
363
|
-
const page1 = await db('t_help_action_examples')
|
|
364
|
-
.limit(5)
|
|
365
|
-
.offset(0)
|
|
366
|
-
.select('*');
|
|
367
|
-
const page2 = await db('t_help_action_examples')
|
|
368
|
-
.limit(5)
|
|
369
|
-
.offset(5)
|
|
370
|
-
.select('*');
|
|
371
|
-
assert.ok(Array.isArray(page1), 'Should return page 1');
|
|
372
|
-
assert.ok(Array.isArray(page2), 'Should return page 2');
|
|
373
|
-
if (page1.length === 5 && page2.length > 0) {
|
|
374
|
-
const page1Ids = page1.map((e) => e.id);
|
|
375
|
-
const page2Ids = page2.map((e) => e.id);
|
|
376
|
-
const overlap = page1Ids.some((id) => page2Ids.includes(id));
|
|
377
|
-
assert.strictEqual(overlap, false, 'Pages should not overlap');
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
it('should support pagination in use case listing', async () => {
|
|
381
|
-
const db = getDb();
|
|
382
|
-
const page1 = await db('t_help_use_cases')
|
|
383
|
-
.limit(3)
|
|
384
|
-
.offset(0)
|
|
385
|
-
.select('*');
|
|
386
|
-
const page2 = await db('t_help_use_cases')
|
|
387
|
-
.limit(3)
|
|
388
|
-
.offset(3)
|
|
389
|
-
.select('*');
|
|
390
|
-
assert.ok(Array.isArray(page1), 'Should return page 1');
|
|
391
|
-
assert.ok(Array.isArray(page2), 'Should return page 2');
|
|
392
|
-
});
|
|
393
|
-
it('should retrieve parameters from t_help_action_params', async () => {
|
|
394
|
-
const db = getDb();
|
|
395
|
-
const action = await db('m_help_actions')
|
|
396
|
-
.where({ tool_name: 'decision', action_name: 'set' })
|
|
397
|
-
.first();
|
|
398
|
-
if (action) {
|
|
399
|
-
const params = await db('t_help_action_params')
|
|
400
|
-
.where({ action_id: action.id })
|
|
401
|
-
.select('*');
|
|
402
|
-
assert.ok(Array.isArray(params), 'Should retrieve parameters as array');
|
|
403
|
-
}
|
|
404
|
-
});
|
|
405
|
-
it('should enforce PRIMARY KEY uniqueness on tool_name in m_help_tools', async () => {
|
|
406
|
-
const db = getDb();
|
|
407
|
-
try {
|
|
408
|
-
await db('m_help_tools').insert({
|
|
409
|
-
tool_name: 'decision', // Duplicate - conflicts with PRIMARY KEY
|
|
410
|
-
description: 'Duplicate tool',
|
|
411
|
-
});
|
|
412
|
-
assert.fail('Should have thrown uniqueness constraint error');
|
|
413
|
-
}
|
|
414
|
-
catch (error) {
|
|
415
|
-
// Expected: PRIMARY KEY or UNIQUE constraint violation
|
|
416
|
-
// Different databases use different error messages:
|
|
417
|
-
// - MySQL/MariaDB: "Duplicate entry"
|
|
418
|
-
// - PostgreSQL: "duplicate key value"
|
|
419
|
-
// - SQLite: "UNIQUE constraint"
|
|
420
|
-
const msg = error.message.toLowerCase();
|
|
421
|
-
assert.ok(msg.includes('unique') ||
|
|
422
|
-
msg.includes('duplicate') ||
|
|
423
|
-
msg.includes('primary') ||
|
|
424
|
-
msg.includes('constraint'), `Should be a uniqueness constraint error, got: ${error.message}`);
|
|
425
|
-
}
|
|
426
|
-
});
|
|
427
|
-
it('should enforce composite UNIQUE on (tool_name, action_name)', async () => {
|
|
428
|
-
const db = getDb();
|
|
429
|
-
try {
|
|
430
|
-
// m_help_actions columns: id, tool_name, action_name, description, returns
|
|
431
|
-
await db('m_help_actions').insert({
|
|
432
|
-
tool_name: 'decision',
|
|
433
|
-
action_name: 'set', // Duplicate combination
|
|
434
|
-
description: 'Duplicate action',
|
|
435
|
-
});
|
|
436
|
-
assert.fail('Should have thrown UNIQUE constraint error');
|
|
437
|
-
}
|
|
438
|
-
catch (error) {
|
|
439
|
-
// Expected: UNIQUE constraint violation
|
|
440
|
-
assert.ok(error.message.includes('unique') ||
|
|
441
|
-
error.message.includes('UNIQUE') ||
|
|
442
|
-
error.message.includes('duplicate'), 'Should be a unique constraint error');
|
|
443
|
-
}
|
|
444
|
-
});
|
|
445
|
-
});
|
|
446
|
-
describe('Integration - Complex queries', () => {
|
|
447
|
-
it('should join tools, actions, and examples', async () => {
|
|
448
|
-
const db = getDb();
|
|
449
|
-
const results = await db('m_help_tools')
|
|
450
|
-
.join('m_help_actions', 'm_help_tools.tool_name', 'm_help_actions.tool_name')
|
|
451
|
-
.leftJoin('t_help_action_examples', 'm_help_actions.id', 't_help_action_examples.action_id')
|
|
452
|
-
.select('m_help_tools.tool_name', 'm_help_actions.action_name', 't_help_action_examples.title')
|
|
453
|
-
.limit(10);
|
|
454
|
-
assert.ok(Array.isArray(results), 'Should return joined results');
|
|
455
|
-
results.forEach((row) => {
|
|
456
|
-
assert.ok(row.tool_name, 'Should have tool_name');
|
|
457
|
-
assert.ok(row.action_name, 'Should have action_name');
|
|
458
|
-
// title may be null (left join)
|
|
459
|
-
});
|
|
460
|
-
});
|
|
461
|
-
it('should count actions per tool', async () => {
|
|
462
|
-
const db = getDb();
|
|
463
|
-
const counts = await db('m_help_actions')
|
|
464
|
-
.select('tool_name')
|
|
465
|
-
.count('* as action_count')
|
|
466
|
-
.groupBy('tool_name')
|
|
467
|
-
.orderBy('action_count', 'desc');
|
|
468
|
-
assert.ok(Array.isArray(counts), 'Should return counts');
|
|
469
|
-
assert.ok(counts.length > 0, 'Should have at least one tool with actions');
|
|
470
|
-
counts.forEach((row) => {
|
|
471
|
-
assert.ok(row.tool_name, 'Should have tool_name');
|
|
472
|
-
assert.ok(row.action_count > 0, 'Should have positive count');
|
|
473
|
-
});
|
|
474
|
-
});
|
|
475
|
-
// Note: t_help_action_examples does not have 'complexity' column
|
|
476
|
-
// Complexity is stored in t_help_use_cases
|
|
477
|
-
it('should count use cases per complexity level', async () => {
|
|
478
|
-
const db = getDb();
|
|
479
|
-
const counts = await db('t_help_use_cases')
|
|
480
|
-
.select('complexity')
|
|
481
|
-
.count('* as use_case_count')
|
|
482
|
-
.groupBy('complexity')
|
|
483
|
-
.orderBy('complexity');
|
|
484
|
-
assert.ok(Array.isArray(counts), 'Should return counts');
|
|
485
|
-
counts.forEach((row) => {
|
|
486
|
-
assert.ok(row.complexity, 'Should have complexity');
|
|
487
|
-
assert.ok(row.use_case_count >= 0, 'Should have count');
|
|
488
|
-
});
|
|
489
|
-
});
|
|
490
|
-
it('should get full use case with category', async () => {
|
|
491
|
-
const db = getDb();
|
|
492
|
-
// Note: m_help_use_case_steps table does not exist
|
|
493
|
-
// Steps are stored in 'workflow' TEXT column
|
|
494
|
-
const fullUseCases = await db('t_help_use_cases')
|
|
495
|
-
.join('m_help_use_case_cats', 't_help_use_cases.category_id', 'm_help_use_case_cats.id')
|
|
496
|
-
.select('t_help_use_cases.id', 't_help_use_cases.title', 'm_help_use_case_cats.category_name', 't_help_use_cases.workflow')
|
|
497
|
-
.orderBy('t_help_use_cases.id')
|
|
498
|
-
.limit(20);
|
|
499
|
-
assert.ok(Array.isArray(fullUseCases), 'Should return full use cases');
|
|
500
|
-
fullUseCases.forEach((row) => {
|
|
501
|
-
assert.ok(row.id, 'Should have id');
|
|
502
|
-
assert.ok(row.title, 'Should have title');
|
|
503
|
-
assert.ok(row.category_name, 'Should have category_name');
|
|
504
|
-
});
|
|
505
|
-
});
|
|
506
|
-
});
|
|
507
|
-
});
|
|
508
|
-
//# sourceMappingURL=help-system.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"help-system.test.js","sourceRoot":"","sources":["../../../../src/tests/docker/native/help-system.test.ts"],"names":[],"mappings":"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"}
|