@skillsmith/core 0.4.9 → 0.4.10

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.
Files changed (90) hide show
  1. package/README.md +1 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/adapters/java-parsers.d.ts.map +1 -1
  4. package/dist/src/analysis/adapters/java-parsers.js +9 -2
  5. package/dist/src/analysis/adapters/java-parsers.js.map +1 -1
  6. package/dist/src/api/client.d.ts +1 -0
  7. package/dist/src/api/client.d.ts.map +1 -1
  8. package/dist/src/api/client.js.map +1 -1
  9. package/dist/src/api/schemas.d.ts +11 -4
  10. package/dist/src/api/schemas.d.ts.map +1 -1
  11. package/dist/src/api/schemas.js +8 -1
  12. package/dist/src/api/schemas.js.map +1 -1
  13. package/dist/src/db/drivers/betterSqlite3Driver.d.ts.map +1 -1
  14. package/dist/src/db/drivers/betterSqlite3Driver.js +5 -3
  15. package/dist/src/db/drivers/betterSqlite3Driver.js.map +1 -1
  16. package/dist/src/exports/services.d.ts +1 -0
  17. package/dist/src/exports/services.d.ts.map +1 -1
  18. package/dist/src/exports/services.js +4 -0
  19. package/dist/src/exports/services.js.map +1 -1
  20. package/dist/src/index.d.ts +3 -0
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +6 -0
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/indexer/SkillParser.d.ts +20 -0
  25. package/dist/src/indexer/SkillParser.d.ts.map +1 -1
  26. package/dist/src/indexer/SkillParser.js +58 -0
  27. package/dist/src/indexer/SkillParser.js.map +1 -1
  28. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
  29. package/dist/src/repositories/quarantine/QuarantineRepository.js +4 -1
  30. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
  31. package/dist/src/scripts/validation/types.d.ts +2 -2
  32. package/dist/src/security/audit-types.d.ts +2 -2
  33. package/dist/src/security/audit-types.d.ts.map +1 -1
  34. package/dist/src/security/audit-types.js.map +1 -1
  35. package/dist/src/security/sanitization.d.ts.map +1 -1
  36. package/dist/src/security/sanitization.js +25 -17
  37. package/dist/src/security/sanitization.js.map +1 -1
  38. package/dist/src/services/index.d.ts +9 -0
  39. package/dist/src/services/index.d.ts.map +1 -0
  40. package/dist/src/services/index.js +10 -0
  41. package/dist/src/services/index.js.map +1 -0
  42. package/dist/src/services/quarantine/QuarantineService.d.ts +149 -0
  43. package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -0
  44. package/dist/src/services/quarantine/QuarantineService.js +406 -0
  45. package/dist/src/services/quarantine/QuarantineService.js.map +1 -0
  46. package/dist/src/services/quarantine/index.d.ts +10 -0
  47. package/dist/src/services/quarantine/index.d.ts.map +1 -0
  48. package/dist/src/services/quarantine/index.js +14 -0
  49. package/dist/src/services/quarantine/index.js.map +1 -0
  50. package/dist/src/services/quarantine/types.d.ts +127 -0
  51. package/dist/src/services/quarantine/types.d.ts.map +1 -0
  52. package/dist/src/services/quarantine/types.js +59 -0
  53. package/dist/src/services/quarantine/types.js.map +1 -0
  54. package/dist/src/types/skill.d.ts +6 -1
  55. package/dist/src/types/skill.d.ts.map +1 -1
  56. package/dist/src/types/skill.js.map +1 -1
  57. package/dist/src/types.d.ts +1 -1
  58. package/dist/src/types.d.ts.map +1 -1
  59. package/dist/src/utils/index.d.ts +1 -0
  60. package/dist/src/utils/index.d.ts.map +1 -1
  61. package/dist/src/utils/index.js +2 -0
  62. package/dist/src/utils/index.js.map +1 -1
  63. package/dist/src/utils/safe-fs.d.ts +63 -0
  64. package/dist/src/utils/safe-fs.d.ts.map +1 -0
  65. package/dist/src/utils/safe-fs.js +119 -0
  66. package/dist/src/utils/safe-fs.js.map +1 -0
  67. package/dist/src/validation/input-validators.d.ts.map +1 -1
  68. package/dist/src/validation/input-validators.js +11 -4
  69. package/dist/src/validation/input-validators.js.map +1 -1
  70. package/dist/tests/QuarantineRepository.test.js +39 -2
  71. package/dist/tests/QuarantineRepository.test.js.map +1 -1
  72. package/dist/tests/edge-cases/EdgeCases.test.js +5 -2
  73. package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -1
  74. package/dist/tests/integration/QuarantineService.test.d.ts +11 -0
  75. package/dist/tests/integration/QuarantineService.test.d.ts.map +1 -0
  76. package/dist/tests/integration/QuarantineService.test.js +378 -0
  77. package/dist/tests/integration/QuarantineService.test.js.map +1 -0
  78. package/dist/tests/unit/check-references.test.d.ts +2 -0
  79. package/dist/tests/unit/check-references.test.d.ts.map +1 -0
  80. package/dist/tests/unit/check-references.test.js +118 -0
  81. package/dist/tests/unit/check-references.test.js.map +1 -0
  82. package/dist/tests/utils/safe-fs.test.d.ts +12 -0
  83. package/dist/tests/utils/safe-fs.test.d.ts.map +1 -0
  84. package/dist/tests/utils/safe-fs.test.js +116 -0
  85. package/dist/tests/utils/safe-fs.test.js.map +1 -0
  86. package/package.json +14 -10
  87. package/dist/tests/db/driver-parity.integration.test.d.ts +0 -16
  88. package/dist/tests/db/driver-parity.integration.test.d.ts.map +0 -1
  89. package/dist/tests/db/driver-parity.integration.test.js +0 -555
  90. package/dist/tests/db/driver-parity.integration.test.js.map +0 -1
@@ -1,555 +0,0 @@
1
- /**
2
- * SMI-2180: Database Driver Parity Integration Tests
3
- *
4
- * Ensures end-to-end parity between better-sqlite3 and sql.js drivers
5
- * by running identical operations on SkillRepository with both drivers.
6
- *
7
- * Tests cover:
8
- * - CRUD operations
9
- * - Transactions and rollback behavior
10
- * - Prepared statement reuse
11
- * - Search operations
12
- * - Batch insertions
13
- * - Edge cases and error handling
14
- */
15
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
16
- import { createBetterSqlite3Database } from '../../src/db/drivers/betterSqlite3Driver.js';
17
- import { createSqlJsDatabase } from '../../src/db/drivers/sqljsDriver.js';
18
- import { initializeSchema } from '../../src/db/schema.js';
19
- import { SkillRepository } from '../../src/repositories/SkillRepository.js';
20
- /**
21
- * Helper to create a test database with initialized schema
22
- */
23
- async function createTestDatabase(driver) {
24
- const db = driver === 'better-sqlite3'
25
- ? createBetterSqlite3Database(':memory:')
26
- : await createSqlJsDatabase(':memory:');
27
- // Initialize schema
28
- initializeSchema(db);
29
- // Enable foreign keys
30
- db.pragma('foreign_keys = ON');
31
- return db;
32
- }
33
- /**
34
- * Test suite running identical operations on both drivers
35
- */
36
- describe('Database Driver Parity Integration Tests', () => {
37
- // Test both drivers
38
- const drivers = ['better-sqlite3', 'sqljs'];
39
- for (const driverType of drivers) {
40
- describe(`${driverType} driver`, () => {
41
- let db;
42
- let repo;
43
- beforeEach(async () => {
44
- db = await createTestDatabase(driverType);
45
- repo = new SkillRepository(db);
46
- });
47
- afterEach(() => {
48
- if (db?.open) {
49
- db.close();
50
- }
51
- });
52
- describe('CRUD Operations', () => {
53
- it('should insert and retrieve a skill', () => {
54
- const input = {
55
- name: 'test-skill',
56
- description: 'A test skill',
57
- author: 'test-author',
58
- repoUrl: 'https://github.com/test/skill',
59
- qualityScore: 0.85,
60
- trustTier: 'community',
61
- tags: ['testing', 'example'],
62
- };
63
- const created = repo.create(input);
64
- expect(created).toBeDefined();
65
- expect(created.id).toBeDefined();
66
- expect(created.name).toBe(input.name);
67
- expect(created.description).toBe(input.description);
68
- expect(created.author).toBe(input.author);
69
- expect(created.repoUrl).toBe(input.repoUrl);
70
- expect(created.qualityScore).toBe(input.qualityScore);
71
- expect(created.trustTier).toBe(input.trustTier);
72
- expect(created.tags).toEqual(input.tags);
73
- expect(created.createdAt).toBeDefined();
74
- expect(created.updatedAt).toBeDefined();
75
- // Retrieve by ID
76
- const retrieved = repo.findById(created.id);
77
- expect(retrieved).toEqual(created);
78
- // Retrieve by repo URL
79
- const retrievedByUrl = repo.findByRepoUrl(input.repoUrl);
80
- expect(retrievedByUrl).toEqual(created);
81
- });
82
- it('should update a skill', () => {
83
- const input = {
84
- name: 'original-name',
85
- description: 'Original description',
86
- trustTier: 'experimental',
87
- };
88
- const created = repo.create(input);
89
- // Update the skill
90
- const updated = repo.update(created.id, {
91
- name: 'updated-name',
92
- description: 'Updated description',
93
- qualityScore: 0.9,
94
- trustTier: 'community',
95
- });
96
- expect(updated).toBeDefined();
97
- expect(updated.name).toBe('updated-name');
98
- expect(updated.description).toBe('Updated description');
99
- expect(updated.qualityScore).toBe(0.9);
100
- expect(updated.trustTier).toBe('community');
101
- // Verify update persisted
102
- const retrieved = repo.findById(created.id);
103
- expect(retrieved).toEqual(updated);
104
- });
105
- it('should delete a skill', () => {
106
- const input = {
107
- name: 'to-delete',
108
- description: 'Will be deleted',
109
- };
110
- const created = repo.create(input);
111
- expect(repo.exists(created.id)).toBe(true);
112
- const deleted = repo.delete(created.id);
113
- expect(deleted).toBe(true);
114
- expect(repo.exists(created.id)).toBe(false);
115
- // Verify it's gone
116
- const retrieved = repo.findById(created.id);
117
- expect(retrieved).toBeNull();
118
- });
119
- it('should return null when updating non-existent skill', () => {
120
- const result = repo.update('non-existent-id', {
121
- name: 'updated-name',
122
- });
123
- expect(result).toBeNull();
124
- });
125
- it('should return false when deleting non-existent skill', () => {
126
- const result = repo.delete('non-existent-id');
127
- expect(result).toBe(false);
128
- });
129
- });
130
- describe('Batch Operations', () => {
131
- it('should insert multiple skills efficiently', () => {
132
- const inputs = Array.from({ length: 50 }, (_, i) => ({
133
- name: `skill-${i}`,
134
- description: `Test skill number ${i}`,
135
- author: `author-${i % 5}`, // 5 different authors
136
- repoUrl: `https://github.com/test/skill-${i}`,
137
- qualityScore: Math.random(),
138
- trustTier: ['verified', 'community', 'experimental'][i % 3],
139
- tags: [`tag-${i % 10}`, 'testing'],
140
- }));
141
- const created = repo.createBatch(inputs);
142
- expect(created).toHaveLength(50);
143
- expect(repo.count()).toBe(50);
144
- // Verify all skills can be retrieved
145
- for (const skill of created) {
146
- const retrieved = repo.findById(skill.id);
147
- expect(retrieved).toBeDefined();
148
- expect(retrieved.name).toBe(skill.name);
149
- }
150
- });
151
- it('should handle duplicate repo URLs gracefully in batch', () => {
152
- const inputs = [
153
- {
154
- name: 'skill-1',
155
- repoUrl: 'https://github.com/test/duplicate',
156
- },
157
- {
158
- name: 'skill-2',
159
- repoUrl: 'https://github.com/test/unique',
160
- },
161
- {
162
- name: 'skill-3',
163
- repoUrl: 'https://github.com/test/duplicate', // Duplicate
164
- },
165
- ];
166
- const created = repo.createBatch(inputs);
167
- // Should only create 2 skills (duplicate is skipped)
168
- expect(created).toHaveLength(2);
169
- expect(repo.count()).toBe(2);
170
- });
171
- });
172
- describe('Pagination', () => {
173
- beforeEach(() => {
174
- // Insert 25 skills for pagination testing
175
- const inputs = Array.from({ length: 25 }, (_, i) => ({
176
- name: `skill-${String(i).padStart(2, '0')}`, // Pad for consistent ordering
177
- description: `Skill ${i}`,
178
- }));
179
- repo.createBatch(inputs);
180
- });
181
- it('should paginate results correctly', () => {
182
- const page1 = repo.findAll({ limit: 10, offset: 0 });
183
- expect(page1.items).toHaveLength(10);
184
- expect(page1.total).toBe(25);
185
- expect(page1.hasMore).toBe(true);
186
- const page2 = repo.findAll({ limit: 10, offset: 10 });
187
- expect(page2.items).toHaveLength(10);
188
- expect(page2.total).toBe(25);
189
- expect(page2.hasMore).toBe(true);
190
- const page3 = repo.findAll({ limit: 10, offset: 20 });
191
- expect(page3.items).toHaveLength(5);
192
- expect(page3.total).toBe(25);
193
- expect(page3.hasMore).toBe(false);
194
- });
195
- it('should support legacy positional parameters', () => {
196
- const page1 = repo.findAll(10, 0);
197
- expect(page1.items).toHaveLength(10);
198
- expect(page1.total).toBe(25);
199
- });
200
- });
201
- describe('Transaction Support', () => {
202
- it('should commit successful transactions', () => {
203
- // Use db.transaction directly since repo.transaction has issues with 0-arg functions
204
- const result = db.transaction(() => {
205
- repo.create({
206
- name: 'skill-1',
207
- repoUrl: 'https://github.com/test/skill-1',
208
- });
209
- repo.create({
210
- name: 'skill-2',
211
- repoUrl: 'https://github.com/test/skill-2',
212
- });
213
- return 'success';
214
- });
215
- expect(result).toBe('success');
216
- expect(repo.count()).toBe(2);
217
- });
218
- it('should rollback failed transactions', () => {
219
- expect(() => {
220
- db.transaction(() => {
221
- repo.create({
222
- name: 'skill-1',
223
- repoUrl: 'https://github.com/test/skill-1',
224
- });
225
- repo.create({
226
- name: 'skill-2',
227
- repoUrl: 'https://github.com/test/skill-1', // Duplicate repo URL
228
- });
229
- return 'should not reach';
230
- });
231
- }).toThrow();
232
- // No skills should be created due to rollback
233
- expect(repo.count()).toBe(0);
234
- });
235
- it('should handle nested transactions', () => {
236
- const result = db.transaction(() => {
237
- repo.create({
238
- name: 'outer-1',
239
- repoUrl: 'https://github.com/test/outer-1',
240
- });
241
- // Nested transaction
242
- db.transaction(() => {
243
- repo.create({
244
- name: 'inner-1',
245
- repoUrl: 'https://github.com/test/inner-1',
246
- });
247
- });
248
- repo.create({
249
- name: 'outer-2',
250
- repoUrl: 'https://github.com/test/outer-2',
251
- });
252
- return 'nested-success';
253
- });
254
- expect(result).toBe('nested-success');
255
- expect(repo.count()).toBe(3);
256
- });
257
- it('should rollback nested transactions on error', () => {
258
- expect(() => {
259
- db.transaction(() => {
260
- repo.create({
261
- name: 'outer-1',
262
- repoUrl: 'https://github.com/test/outer-1',
263
- });
264
- // This nested transaction will fail
265
- db.transaction(() => {
266
- repo.create({
267
- name: 'inner-1',
268
- repoUrl: 'https://github.com/test/inner-1',
269
- });
270
- throw new Error('Simulated error in nested transaction');
271
- });
272
- // Should not reach this
273
- repo.create({
274
- name: 'outer-2',
275
- repoUrl: 'https://github.com/test/outer-2',
276
- });
277
- });
278
- }).toThrow('Simulated error');
279
- // Everything should be rolled back
280
- expect(repo.count()).toBe(0);
281
- });
282
- });
283
- describe('Prepared Statement Reuse', () => {
284
- it('should efficiently reuse prepared statements', () => {
285
- // Create multiple skills using the same prepared statement
286
- for (let i = 0; i < 100; i++) {
287
- repo.create({
288
- name: `skill-${i}`,
289
- repoUrl: `https://github.com/test/skill-${i}`,
290
- });
291
- }
292
- expect(repo.count()).toBe(100);
293
- // Retrieve using the same prepared statement
294
- for (let i = 0; i < 100; i++) {
295
- const skill = repo.findByRepoUrl(`https://github.com/test/skill-${i}`);
296
- expect(skill).toBeDefined();
297
- expect(skill.name).toBe(`skill-${i}`);
298
- }
299
- });
300
- it('should handle statement binding correctly', () => {
301
- const stmt = db.prepare('SELECT COUNT(*) as count FROM skills');
302
- // Execute multiple times
303
- for (let i = 0; i < 10; i++) {
304
- repo.create({
305
- name: `skill-${i}`,
306
- repoUrl: `https://github.com/test/skill-${i}`,
307
- });
308
- const result = stmt.get();
309
- expect(result?.count).toBe(i + 1);
310
- }
311
- });
312
- });
313
- describe('Upsert Operations', () => {
314
- it('should insert when skill does not exist', () => {
315
- const input = {
316
- name: 'new-skill',
317
- repoUrl: 'https://github.com/test/new-skill',
318
- };
319
- const result = repo.upsert(input);
320
- expect(result).toBeDefined();
321
- expect(result.name).toBe('new-skill');
322
- expect(repo.count()).toBe(1);
323
- });
324
- it('should update when skill exists by repo URL', () => {
325
- const input = {
326
- name: 'original-name',
327
- repoUrl: 'https://github.com/test/skill',
328
- };
329
- const created = repo.create(input);
330
- const updated = repo.upsert({
331
- name: 'updated-name',
332
- repoUrl: 'https://github.com/test/skill',
333
- description: 'New description',
334
- });
335
- expect(updated.id).toBe(created.id);
336
- expect(updated.name).toBe('updated-name');
337
- expect(updated.description).toBe('New description');
338
- expect(repo.count()).toBe(1); // Still just one skill
339
- });
340
- });
341
- describe('Edge Cases', () => {
342
- it('should handle null/undefined fields correctly', () => {
343
- const input = {
344
- name: 'minimal-skill',
345
- description: null,
346
- author: undefined,
347
- repoUrl: null,
348
- };
349
- const created = repo.create(input);
350
- expect(created.name).toBe('minimal-skill');
351
- expect(created.description).toBeNull();
352
- expect(created.author).toBeNull();
353
- expect(created.repoUrl).toBeNull();
354
- });
355
- it('should handle empty strings', () => {
356
- const input = {
357
- name: 'empty-strings',
358
- description: '',
359
- author: '',
360
- };
361
- const created = repo.create(input);
362
- expect(created.description).toBe('');
363
- expect(created.author).toBe('');
364
- });
365
- it('should enforce unique constraint on repo_url', () => {
366
- repo.create({
367
- name: 'skill-1',
368
- repoUrl: 'https://github.com/test/unique',
369
- });
370
- expect(() => {
371
- repo.create({
372
- name: 'skill-2',
373
- repoUrl: 'https://github.com/test/unique',
374
- });
375
- }).toThrow();
376
- });
377
- it('should handle large text fields', () => {
378
- const largeDescription = 'A'.repeat(10000);
379
- const created = repo.create({
380
- name: 'large-text',
381
- description: largeDescription,
382
- });
383
- expect(created.description).toHaveLength(10000);
384
- const retrieved = repo.findById(created.id);
385
- expect(retrieved.description).toHaveLength(10000);
386
- });
387
- it('should handle special characters in JSON tags', () => {
388
- const input = {
389
- name: 'special-chars',
390
- tags: ['tag-with-"quotes"', "tag-with-'apostrophe'", 'tag-with-\\backslash'],
391
- };
392
- const created = repo.create(input);
393
- expect(created.tags).toEqual(input.tags);
394
- const retrieved = repo.findById(created.id);
395
- expect(retrieved.tags).toEqual(input.tags);
396
- });
397
- });
398
- describe('Security Scan Fields (SMI-825)', () => {
399
- it('should store and retrieve security scan data', () => {
400
- const input = {
401
- name: 'scanned-skill',
402
- riskScore: 35,
403
- securityFindingsCount: 3,
404
- securityScannedAt: '2024-01-15T10:00:00Z',
405
- securityPassed: true,
406
- };
407
- const created = repo.create(input);
408
- expect(created.riskScore).toBe(35);
409
- expect(created.securityFindingsCount).toBe(3);
410
- expect(created.securityScannedAt).toBe('2024-01-15T10:00:00Z');
411
- expect(created.securityPassed).toBe(true);
412
- const retrieved = repo.findById(created.id);
413
- expect(retrieved.riskScore).toBe(35);
414
- expect(retrieved.securityPassed).toBe(true);
415
- });
416
- it('should handle null security fields', () => {
417
- const input = {
418
- name: 'unscanned-skill',
419
- riskScore: null,
420
- // Don't pass securityPassed to test undefined -> null conversion
421
- };
422
- const created = repo.create(input);
423
- expect(created.riskScore).toBeNull();
424
- // When securityPassed is not provided (undefined), it defaults to false (0 in DB)
425
- // This is expected behavior per the SkillRepository implementation
426
- expect([null, false]).toContain(created.securityPassed);
427
- });
428
- it('should update security scan results', () => {
429
- const created = repo.create({
430
- name: 'skill',
431
- riskScore: null,
432
- securityPassed: null,
433
- });
434
- const updated = repo.update(created.id, {
435
- riskScore: 25,
436
- securityFindingsCount: 1,
437
- securityScannedAt: '2024-01-20T15:30:00Z',
438
- securityPassed: true,
439
- });
440
- expect(updated.riskScore).toBe(25);
441
- expect(updated.securityFindingsCount).toBe(1);
442
- expect(updated.securityPassed).toBe(true);
443
- });
444
- });
445
- describe('Count Operations', () => {
446
- it('should count skills correctly', () => {
447
- expect(repo.count()).toBe(0);
448
- repo.create({ name: 'skill-1' });
449
- expect(repo.count()).toBe(1);
450
- repo.create({ name: 'skill-2', repoUrl: 'https://github.com/test/2' });
451
- expect(repo.count()).toBe(2);
452
- repo.deleteAll();
453
- expect(repo.count()).toBe(0);
454
- });
455
- });
456
- describe('Delete All Operation', () => {
457
- it('should delete all skills', () => {
458
- // Create multiple skills
459
- for (let i = 0; i < 10; i++) {
460
- repo.create({
461
- name: `skill-${i}`,
462
- repoUrl: `https://github.com/test/skill-${i}`,
463
- });
464
- }
465
- expect(repo.count()).toBe(10);
466
- const deletedCount = repo.deleteAll();
467
- expect(deletedCount).toBe(10);
468
- expect(repo.count()).toBe(0);
469
- });
470
- });
471
- });
472
- }
473
- describe('Cross-Driver Consistency', () => {
474
- it('should produce identical results for same operations', async () => {
475
- const db1 = await createTestDatabase('better-sqlite3');
476
- const db2 = await createTestDatabase('sqljs');
477
- const repo1 = new SkillRepository(db1);
478
- const repo2 = new SkillRepository(db2);
479
- // Perform identical operations on both
480
- const inputs = [
481
- {
482
- name: 'skill-1',
483
- description: 'First skill',
484
- author: 'author-1',
485
- repoUrl: 'https://github.com/test/skill-1',
486
- qualityScore: 0.8,
487
- trustTier: 'community',
488
- tags: ['testing', 'example'],
489
- },
490
- {
491
- name: 'skill-2',
492
- description: 'Second skill',
493
- author: 'author-2',
494
- repoUrl: 'https://github.com/test/skill-2',
495
- qualityScore: 0.9,
496
- trustTier: 'verified',
497
- tags: ['production', 'verified'],
498
- },
499
- ];
500
- const created1 = repo1.createBatch(inputs);
501
- const created2 = repo2.createBatch(inputs);
502
- // Results should be structurally identical (excluding IDs which are UUIDs)
503
- expect(created1).toHaveLength(created2.length);
504
- for (let i = 0; i < created1.length; i++) {
505
- expect(created1[i].name).toBe(created2[i].name);
506
- expect(created1[i].description).toBe(created2[i].description);
507
- expect(created1[i].author).toBe(created2[i].author);
508
- expect(created1[i].repoUrl).toBe(created2[i].repoUrl);
509
- expect(created1[i].qualityScore).toBe(created2[i].qualityScore);
510
- expect(created1[i].trustTier).toBe(created2[i].trustTier);
511
- expect(created1[i].tags).toEqual(created2[i].tags);
512
- }
513
- // Pagination should work identically
514
- const page1 = repo1.findAll({ limit: 10, offset: 0 });
515
- const page2 = repo2.findAll({ limit: 10, offset: 0 });
516
- expect(page1.total).toBe(page2.total);
517
- expect(page1.items.length).toBe(page2.items.length);
518
- expect(page1.hasMore).toBe(page2.hasMore);
519
- // Cleanup
520
- db1.close();
521
- db2.close();
522
- });
523
- it('should handle transactions identically', async () => {
524
- const db1 = await createTestDatabase('better-sqlite3');
525
- const db2 = await createTestDatabase('sqljs');
526
- const repo1 = new SkillRepository(db1);
527
- const repo2 = new SkillRepository(db2);
528
- // Test successful transaction - use db.transaction directly
529
- const result1 = db1.transaction(() => {
530
- repo1.create({ name: 'tx-skill-1', repoUrl: 'https://github.com/test/tx1' });
531
- return 'success';
532
- });
533
- const result2 = db2.transaction(() => {
534
- repo2.create({ name: 'tx-skill-1', repoUrl: 'https://github.com/test/tx1' });
535
- return 'success';
536
- });
537
- expect(result1).toBe(result2);
538
- expect(repo1.count()).toBe(repo2.count());
539
- // Test rollback
540
- const expectError1 = () => db1.transaction(() => {
541
- repo1.create({ name: 'tx-skill-2', repoUrl: 'https://github.com/test/tx1' });
542
- });
543
- const expectError2 = () => db2.transaction(() => {
544
- repo2.create({ name: 'tx-skill-2', repoUrl: 'https://github.com/test/tx1' });
545
- });
546
- expect(expectError1).toThrow();
547
- expect(expectError2).toThrow();
548
- // Counts should still match after rollback
549
- expect(repo1.count()).toBe(repo2.count());
550
- db1.close();
551
- db2.close();
552
- });
553
- });
554
- });
555
- //# sourceMappingURL=driver-parity.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver-parity.integration.test.js","sourceRoot":"","sources":["../../../tests/db/driver-parity.integration.test.ts"],"names":[],"mappings":"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"}