@skillsmith/core 2.0.2 → 2.1.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/README.md +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/db/schema.d.ts +1 -1
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +41 -1
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/SyncConfigRepository.d.ts +91 -0
- package/dist/src/repositories/SyncConfigRepository.d.ts.map +1 -0
- package/dist/src/repositories/SyncConfigRepository.js +202 -0
- package/dist/src/repositories/SyncConfigRepository.js.map +1 -0
- package/dist/src/repositories/SyncHistoryRepository.d.ts +104 -0
- package/dist/src/repositories/SyncHistoryRepository.d.ts.map +1 -0
- package/dist/src/repositories/SyncHistoryRepository.js +235 -0
- package/dist/src/repositories/SyncHistoryRepository.js.map +1 -0
- package/dist/src/scripts/github-import/github-client.d.ts +24 -0
- package/dist/src/scripts/github-import/github-client.d.ts.map +1 -1
- package/dist/src/scripts/github-import/github-client.js +103 -0
- package/dist/src/scripts/github-import/github-client.js.map +1 -1
- package/dist/src/scripts/github-import/index.js +3 -10
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/merge-skills.d.ts +56 -0
- package/dist/src/scripts/merge-skills.d.ts.map +1 -0
- package/dist/src/scripts/merge-skills.js +411 -0
- package/dist/src/scripts/merge-skills.js.map +1 -0
- package/dist/src/scripts/skill-scanner/index.d.ts +9 -2
- package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/index.js +98 -7
- package/dist/src/scripts/skill-scanner/index.js.map +1 -1
- package/dist/src/scripts/skill-scanner/logger.d.ts +51 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/logger.js +255 -1
- package/dist/src/scripts/skill-scanner/logger.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js +67 -15
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts +5 -2
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js +156 -39
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/types.d.ts +44 -0
- package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -1
- package/dist/src/sync/BackgroundSyncService.d.ts +90 -0
- package/dist/src/sync/BackgroundSyncService.d.ts.map +1 -0
- package/dist/src/sync/BackgroundSyncService.js +214 -0
- package/dist/src/sync/BackgroundSyncService.js.map +1 -0
- package/dist/src/sync/SyncEngine.d.ts +76 -0
- package/dist/src/sync/SyncEngine.d.ts.map +1 -0
- package/dist/src/sync/SyncEngine.js +272 -0
- package/dist/src/sync/SyncEngine.js.map +1 -0
- package/dist/src/sync/index.d.ts +11 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +14 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/tests/sync/SyncConfigRepository.test.d.ts +7 -0
- package/dist/tests/sync/SyncConfigRepository.test.d.ts.map +1 -0
- package/dist/tests/sync/SyncConfigRepository.test.js +154 -0
- package/dist/tests/sync/SyncConfigRepository.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.test.d.ts +7 -0
- package/dist/tests/sync/SyncEngine.test.d.ts.map +1 -0
- package/dist/tests/sync/SyncEngine.test.js +298 -0
- package/dist/tests/sync/SyncEngine.test.js.map +1 -0
- package/dist/tests/sync/SyncHistoryRepository.test.d.ts +7 -0
- package/dist/tests/sync/SyncHistoryRepository.test.d.ts.map +1 -0
- package/dist/tests/sync/SyncHistoryRepository.test.js +220 -0
- package/dist/tests/sync/SyncHistoryRepository.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SyncConfigRepository Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for sync configuration management.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { createDatabase, closeDatabase } from '../../src/db/schema.js';
|
|
8
|
+
import { SyncConfigRepository, FREQUENCY_INTERVALS, } from '../../src/repositories/SyncConfigRepository.js';
|
|
9
|
+
describe('SyncConfigRepository', () => {
|
|
10
|
+
let db;
|
|
11
|
+
let repo;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
db = createDatabase(':memory:');
|
|
14
|
+
repo = new SyncConfigRepository(db);
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
closeDatabase(db);
|
|
18
|
+
});
|
|
19
|
+
describe('getConfig', () => {
|
|
20
|
+
it('should return default config on fresh database', () => {
|
|
21
|
+
const config = repo.getConfig();
|
|
22
|
+
expect(config.id).toBe('default');
|
|
23
|
+
expect(config.enabled).toBe(true);
|
|
24
|
+
expect(config.frequency).toBe('daily');
|
|
25
|
+
expect(config.intervalMs).toBe(FREQUENCY_INTERVALS.daily);
|
|
26
|
+
expect(config.lastSyncAt).toBeNull();
|
|
27
|
+
expect(config.nextSyncAt).toBeNull();
|
|
28
|
+
expect(config.lastSyncCount).toBe(0);
|
|
29
|
+
expect(config.lastSyncError).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
it('should return updated config after changes', () => {
|
|
32
|
+
repo.disable();
|
|
33
|
+
const config = repo.getConfig();
|
|
34
|
+
expect(config.enabled).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('updateConfig', () => {
|
|
38
|
+
it('should update enabled status', () => {
|
|
39
|
+
repo.updateConfig({ enabled: false });
|
|
40
|
+
expect(repo.getConfig().enabled).toBe(false);
|
|
41
|
+
repo.updateConfig({ enabled: true });
|
|
42
|
+
expect(repo.getConfig().enabled).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it('should update frequency and recalculate interval', () => {
|
|
45
|
+
repo.updateConfig({ frequency: 'weekly' });
|
|
46
|
+
const config = repo.getConfig();
|
|
47
|
+
expect(config.frequency).toBe('weekly');
|
|
48
|
+
expect(config.intervalMs).toBe(FREQUENCY_INTERVALS.weekly);
|
|
49
|
+
});
|
|
50
|
+
it('should recalculate nextSyncAt when frequency changes and lastSyncAt exists', () => {
|
|
51
|
+
const lastSync = new Date().toISOString();
|
|
52
|
+
repo.setLastSync(lastSync, 10);
|
|
53
|
+
repo.updateConfig({ frequency: 'weekly' });
|
|
54
|
+
const config = repo.getConfig();
|
|
55
|
+
expect(config.nextSyncAt).not.toBeNull();
|
|
56
|
+
const expectedNext = new Date(new Date(lastSync).getTime() + FREQUENCY_INTERVALS.weekly);
|
|
57
|
+
expect(new Date(config.nextSyncAt).getTime()).toBe(expectedNext.getTime());
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('enable/disable', () => {
|
|
61
|
+
it('should enable auto-sync', () => {
|
|
62
|
+
repo.disable();
|
|
63
|
+
expect(repo.getConfig().enabled).toBe(false);
|
|
64
|
+
repo.enable();
|
|
65
|
+
expect(repo.getConfig().enabled).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it('should disable auto-sync', () => {
|
|
68
|
+
expect(repo.getConfig().enabled).toBe(true);
|
|
69
|
+
repo.disable();
|
|
70
|
+
expect(repo.getConfig().enabled).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('setFrequency', () => {
|
|
74
|
+
it('should set frequency to daily', () => {
|
|
75
|
+
repo.setFrequency('weekly');
|
|
76
|
+
repo.setFrequency('daily');
|
|
77
|
+
const config = repo.getConfig();
|
|
78
|
+
expect(config.frequency).toBe('daily');
|
|
79
|
+
expect(config.intervalMs).toBe(FREQUENCY_INTERVALS.daily);
|
|
80
|
+
});
|
|
81
|
+
it('should set frequency to weekly', () => {
|
|
82
|
+
repo.setFrequency('weekly');
|
|
83
|
+
const config = repo.getConfig();
|
|
84
|
+
expect(config.frequency).toBe('weekly');
|
|
85
|
+
expect(config.intervalMs).toBe(FREQUENCY_INTERVALS.weekly);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('setLastSync', () => {
|
|
89
|
+
it('should update lastSyncAt and lastSyncCount', () => {
|
|
90
|
+
const timestamp = new Date().toISOString();
|
|
91
|
+
repo.setLastSync(timestamp, 42);
|
|
92
|
+
const config = repo.getConfig();
|
|
93
|
+
expect(config.lastSyncAt).toBe(timestamp);
|
|
94
|
+
expect(config.lastSyncCount).toBe(42);
|
|
95
|
+
expect(config.lastSyncError).toBeNull();
|
|
96
|
+
});
|
|
97
|
+
it('should calculate nextSyncAt based on interval', () => {
|
|
98
|
+
const timestamp = new Date().toISOString();
|
|
99
|
+
repo.setLastSync(timestamp, 10);
|
|
100
|
+
const config = repo.getConfig();
|
|
101
|
+
expect(config.nextSyncAt).not.toBeNull();
|
|
102
|
+
const expectedNext = new Date(new Date(timestamp).getTime() + FREQUENCY_INTERVALS.daily);
|
|
103
|
+
expect(new Date(config.nextSyncAt).getTime()).toBe(expectedNext.getTime());
|
|
104
|
+
});
|
|
105
|
+
it('should clear lastSyncError on successful sync', () => {
|
|
106
|
+
repo.setLastSyncError('Previous error');
|
|
107
|
+
expect(repo.getConfig().lastSyncError).toBe('Previous error');
|
|
108
|
+
repo.setLastSync(new Date().toISOString(), 5);
|
|
109
|
+
expect(repo.getConfig().lastSyncError).toBeNull();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('setLastSyncError', () => {
|
|
113
|
+
it('should store error message', () => {
|
|
114
|
+
repo.setLastSyncError('Connection failed');
|
|
115
|
+
expect(repo.getConfig().lastSyncError).toBe('Connection failed');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('clearError', () => {
|
|
119
|
+
it('should clear stored error', () => {
|
|
120
|
+
repo.setLastSyncError('Some error');
|
|
121
|
+
expect(repo.getConfig().lastSyncError).toBe('Some error');
|
|
122
|
+
repo.clearError();
|
|
123
|
+
expect(repo.getConfig().lastSyncError).toBeNull();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('isSyncDue', () => {
|
|
127
|
+
it('should return true if never synced', () => {
|
|
128
|
+
expect(repo.isSyncDue()).toBe(true);
|
|
129
|
+
});
|
|
130
|
+
it('should return true if nextSyncAt has passed', () => {
|
|
131
|
+
// Set last sync to 2 days ago
|
|
132
|
+
const twoDaysAgo = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString();
|
|
133
|
+
repo.setLastSync(twoDaysAgo, 10);
|
|
134
|
+
// With daily frequency, sync should be due
|
|
135
|
+
expect(repo.isSyncDue()).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
it('should return false if nextSyncAt is in the future', () => {
|
|
138
|
+
// Set last sync to now
|
|
139
|
+
const now = new Date().toISOString();
|
|
140
|
+
repo.setLastSync(now, 10);
|
|
141
|
+
// With daily frequency, next sync is 24 hours away
|
|
142
|
+
expect(repo.isSyncDue()).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('calculateNextSync', () => {
|
|
146
|
+
it('should add interval to last sync time', () => {
|
|
147
|
+
const lastSync = '2026-01-15T12:00:00.000Z';
|
|
148
|
+
const nextSync = repo.calculateNextSync(lastSync, FREQUENCY_INTERVALS.daily);
|
|
149
|
+
const expected = new Date(new Date(lastSync).getTime() + FREQUENCY_INTERVALS.daily);
|
|
150
|
+
expect(nextSync).toBe(expected.toISOString());
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=SyncConfigRepository.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncConfigRepository.test.js","sourceRoot":"","sources":["../../../tests/sync/SyncConfigRepository.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncEngine.test.d.ts","sourceRoot":"","sources":["../../../tests/sync/SyncEngine.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SyncEngine Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the core sync engine with mocked dependencies.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
7
|
+
import { createDatabase, closeDatabase } from '../../src/db/schema.js';
|
|
8
|
+
import { SyncConfigRepository } from '../../src/repositories/SyncConfigRepository.js';
|
|
9
|
+
import { SyncHistoryRepository } from '../../src/repositories/SyncHistoryRepository.js';
|
|
10
|
+
import { SkillRepository } from '../../src/repositories/SkillRepository.js';
|
|
11
|
+
import { SyncEngine } from '../../src/sync/SyncEngine.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create a mock skill for testing
|
|
14
|
+
* Note: quality_score must be between 0 and 1 (database constraint)
|
|
15
|
+
*/
|
|
16
|
+
function createMockSkill(id, updatedAt = new Date().toISOString()) {
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
name: `Skill ${id}`,
|
|
20
|
+
description: `Description for ${id}`,
|
|
21
|
+
author: 'test-author',
|
|
22
|
+
repo_url: `https://github.com/test/${id}`,
|
|
23
|
+
quality_score: 0.85, // Must be 0-1 range (database constraint)
|
|
24
|
+
trust_tier: 'community',
|
|
25
|
+
tags: ['test'],
|
|
26
|
+
stars: 50,
|
|
27
|
+
installable: true,
|
|
28
|
+
created_at: updatedAt,
|
|
29
|
+
updated_at: updatedAt,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a mock API client with customizable behavior
|
|
34
|
+
*/
|
|
35
|
+
function createMockApiClient(config = {}) {
|
|
36
|
+
const { offline = false, healthStatus = 'healthy', skills = [], throwOnSearch } = config;
|
|
37
|
+
const searchMock = vi.fn().mockImplementation(async ({ limit = 100, offset = 0 }) => {
|
|
38
|
+
if (throwOnSearch) {
|
|
39
|
+
throw throwOnSearch;
|
|
40
|
+
}
|
|
41
|
+
const pageSkills = skills.slice(offset, offset + limit);
|
|
42
|
+
return {
|
|
43
|
+
data: pageSkills,
|
|
44
|
+
total: skills.length,
|
|
45
|
+
limit,
|
|
46
|
+
offset,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
isOffline: vi.fn().mockReturnValue(offline),
|
|
51
|
+
checkHealth: vi.fn().mockResolvedValue({ status: healthStatus }),
|
|
52
|
+
search: searchMock,
|
|
53
|
+
getSkill: vi.fn(),
|
|
54
|
+
getHealthStatus: vi.fn(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
describe('SyncEngine', () => {
|
|
58
|
+
let db;
|
|
59
|
+
let syncConfigRepo;
|
|
60
|
+
let syncHistoryRepo;
|
|
61
|
+
let skillRepo;
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
db = createDatabase(':memory:');
|
|
64
|
+
syncConfigRepo = new SyncConfigRepository(db);
|
|
65
|
+
syncHistoryRepo = new SyncHistoryRepository(db);
|
|
66
|
+
skillRepo = new SkillRepository(db);
|
|
67
|
+
});
|
|
68
|
+
afterEach(() => {
|
|
69
|
+
closeDatabase(db);
|
|
70
|
+
});
|
|
71
|
+
describe('constructor', () => {
|
|
72
|
+
it('should create sync engine with all dependencies', () => {
|
|
73
|
+
const apiClient = createMockApiClient();
|
|
74
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
75
|
+
expect(engine).toBeDefined();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('sync - offline and health checks', () => {
|
|
79
|
+
it('should fail when API client is offline', async () => {
|
|
80
|
+
const apiClient = createMockApiClient({ offline: true });
|
|
81
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
82
|
+
const result = await engine.sync();
|
|
83
|
+
expect(result.success).toBe(false);
|
|
84
|
+
expect(result.errors).toContain('API client is in offline mode. Cannot sync.');
|
|
85
|
+
});
|
|
86
|
+
it('should fail when API health check fails', async () => {
|
|
87
|
+
const apiClient = createMockApiClient({ healthStatus: 'unhealthy' });
|
|
88
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
89
|
+
const result = await engine.sync();
|
|
90
|
+
expect(result.success).toBe(false);
|
|
91
|
+
expect(result.errors).toContain('API is unhealthy. Try again later.');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('sync - basic functionality', () => {
|
|
95
|
+
it('should successfully sync skills from API', async () => {
|
|
96
|
+
const skills = [
|
|
97
|
+
createMockSkill('test/skill-1'),
|
|
98
|
+
createMockSkill('test/skill-2'),
|
|
99
|
+
createMockSkill('test/skill-3'),
|
|
100
|
+
];
|
|
101
|
+
const apiClient = createMockApiClient({ skills });
|
|
102
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
103
|
+
const result = await engine.sync();
|
|
104
|
+
expect(result.success).toBe(true);
|
|
105
|
+
expect(result.skillsAdded).toBe(3);
|
|
106
|
+
expect(result.skillsUpdated).toBe(0);
|
|
107
|
+
expect(result.skillsUnchanged).toBe(0);
|
|
108
|
+
expect(result.totalProcessed).toBe(3);
|
|
109
|
+
expect(result.errors).toHaveLength(0);
|
|
110
|
+
});
|
|
111
|
+
it('should detect updates to existing skills', async () => {
|
|
112
|
+
// Pre-populate database with a skill
|
|
113
|
+
skillRepo.create({
|
|
114
|
+
id: 'test/skill-1',
|
|
115
|
+
name: 'Old Name',
|
|
116
|
+
trustTier: 'community',
|
|
117
|
+
tags: ['old'],
|
|
118
|
+
});
|
|
119
|
+
// API returns updated version with new updated_at
|
|
120
|
+
const skills = [createMockSkill('test/skill-1', new Date(Date.now() + 1000).toISOString())];
|
|
121
|
+
const apiClient = createMockApiClient({ skills });
|
|
122
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
123
|
+
const result = await engine.sync();
|
|
124
|
+
expect(result.success).toBe(true);
|
|
125
|
+
expect(result.skillsAdded).toBe(0);
|
|
126
|
+
expect(result.skillsUpdated).toBe(1);
|
|
127
|
+
});
|
|
128
|
+
it('should skip unchanged skills when timestamps match', async () => {
|
|
129
|
+
const timestamp = new Date().toISOString();
|
|
130
|
+
// Pre-populate database with a skill
|
|
131
|
+
skillRepo.create({
|
|
132
|
+
id: 'test/skill-1',
|
|
133
|
+
name: 'Skill test/skill-1',
|
|
134
|
+
trustTier: 'community',
|
|
135
|
+
tags: ['test'],
|
|
136
|
+
});
|
|
137
|
+
// Manually set the same timestamp as what API will return
|
|
138
|
+
db.prepare('UPDATE skills SET updated_at = ? WHERE id = ?').run(timestamp, 'test/skill-1');
|
|
139
|
+
// API returns skill with same timestamp
|
|
140
|
+
const skills = [createMockSkill('test/skill-1', timestamp)];
|
|
141
|
+
const apiClient = createMockApiClient({ skills });
|
|
142
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
143
|
+
const result = await engine.sync();
|
|
144
|
+
expect(result.success).toBe(true);
|
|
145
|
+
expect(result.skillsUnchanged).toBe(1);
|
|
146
|
+
expect(result.skillsUpdated).toBe(0);
|
|
147
|
+
expect(result.skillsAdded).toBe(0);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe('sync - differential sync', () => {
|
|
151
|
+
it('should perform differential sync when lastSyncAt exists', async () => {
|
|
152
|
+
// Set last sync to 1 hour ago
|
|
153
|
+
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);
|
|
154
|
+
syncConfigRepo.setLastSync(oneHourAgo.toISOString(), 0);
|
|
155
|
+
// Create skills: one old (before lastSync), one new (after lastSync)
|
|
156
|
+
const oldSkill = createMockSkill('test/old-skill', new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
|
|
157
|
+
const newSkill = createMockSkill('test/new-skill', new Date().toISOString());
|
|
158
|
+
const apiClient = createMockApiClient({ skills: [oldSkill, newSkill] });
|
|
159
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
160
|
+
const result = await engine.sync();
|
|
161
|
+
expect(result.success).toBe(true);
|
|
162
|
+
// Only the new skill should be added (old one filtered out by differential)
|
|
163
|
+
expect(result.skillsAdded).toBe(1);
|
|
164
|
+
expect(result.totalProcessed).toBe(2); // Both fetched
|
|
165
|
+
});
|
|
166
|
+
it('should perform full sync with force option', async () => {
|
|
167
|
+
// Set last sync recently
|
|
168
|
+
const now = new Date().toISOString();
|
|
169
|
+
syncConfigRepo.setLastSync(now, 0);
|
|
170
|
+
// Create skills with old timestamps that would normally be filtered
|
|
171
|
+
const skills = [
|
|
172
|
+
createMockSkill('test/skill-1', new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString()),
|
|
173
|
+
createMockSkill('test/skill-2', new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString()),
|
|
174
|
+
];
|
|
175
|
+
const apiClient = createMockApiClient({ skills });
|
|
176
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
177
|
+
const result = await engine.sync({ force: true });
|
|
178
|
+
expect(result.success).toBe(true);
|
|
179
|
+
expect(result.skillsAdded).toBe(2); // All skills processed because force=true
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('sync - dry run', () => {
|
|
183
|
+
it('should not modify database in dry run mode', async () => {
|
|
184
|
+
const skills = [createMockSkill('test/skill-1')];
|
|
185
|
+
const apiClient = createMockApiClient({ skills });
|
|
186
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
187
|
+
const result = await engine.sync({ dryRun: true });
|
|
188
|
+
expect(result.success).toBe(true);
|
|
189
|
+
expect(result.dryRun).toBe(true);
|
|
190
|
+
expect(result.skillsAdded).toBe(1);
|
|
191
|
+
// Verify skill was NOT actually added
|
|
192
|
+
const skill = skillRepo.findById('test/skill-1');
|
|
193
|
+
expect(skill).toBeNull();
|
|
194
|
+
// Verify no history entry was created
|
|
195
|
+
const history = syncHistoryRepo.getHistory();
|
|
196
|
+
expect(history).toHaveLength(0);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe('sync - progress callback', () => {
|
|
200
|
+
it('should call onProgress callback with phases', async () => {
|
|
201
|
+
const skills = [createMockSkill('test/skill-1')];
|
|
202
|
+
const apiClient = createMockApiClient({ skills });
|
|
203
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
204
|
+
const progressCalls = [];
|
|
205
|
+
const onProgress = vi.fn((progress) => {
|
|
206
|
+
progressCalls.push(progress.phase);
|
|
207
|
+
});
|
|
208
|
+
await engine.sync({ onProgress });
|
|
209
|
+
expect(onProgress).toHaveBeenCalled();
|
|
210
|
+
expect(progressCalls).toContain('connecting');
|
|
211
|
+
expect(progressCalls).toContain('fetching');
|
|
212
|
+
expect(progressCalls).toContain('comparing');
|
|
213
|
+
// upserting and complete should be called for successful sync with skills
|
|
214
|
+
expect(progressCalls.some((p) => p === 'upserting' || p === 'complete')).toBe(true);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe('sync - pagination', () => {
|
|
218
|
+
it('should handle pagination correctly', async () => {
|
|
219
|
+
// Create 150 skills (more than one page of 100)
|
|
220
|
+
const skills = Array.from({ length: 150 }, (_, i) => createMockSkill(`test/skill-${i}`));
|
|
221
|
+
const apiClient = createMockApiClient({ skills });
|
|
222
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
223
|
+
const result = await engine.sync({ pageSize: 100 });
|
|
224
|
+
expect(result.success).toBe(true);
|
|
225
|
+
expect(result.skillsAdded).toBe(150);
|
|
226
|
+
expect(result.totalProcessed).toBe(150);
|
|
227
|
+
// Should have made 2 API calls (100 + 50)
|
|
228
|
+
expect(apiClient.search).toHaveBeenCalledTimes(2);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
describe('sync - history tracking', () => {
|
|
232
|
+
it('should record sync history on success', async () => {
|
|
233
|
+
const skills = [createMockSkill('test/skill-1')];
|
|
234
|
+
const apiClient = createMockApiClient({ skills });
|
|
235
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
236
|
+
await engine.sync();
|
|
237
|
+
const history = syncHistoryRepo.getHistory();
|
|
238
|
+
expect(history).toHaveLength(1);
|
|
239
|
+
expect(history[0].status).toBe('success');
|
|
240
|
+
expect(history[0].skillsAdded).toBe(1);
|
|
241
|
+
});
|
|
242
|
+
it('should record sync history on failure', async () => {
|
|
243
|
+
const apiClient = createMockApiClient({
|
|
244
|
+
throwOnSearch: new Error('Network failure'),
|
|
245
|
+
});
|
|
246
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
247
|
+
await engine.sync();
|
|
248
|
+
const history = syncHistoryRepo.getHistory();
|
|
249
|
+
expect(history).toHaveLength(1);
|
|
250
|
+
expect(history[0].status).toBe('failed');
|
|
251
|
+
expect(history[0].errorMessage).toContain('Network failure');
|
|
252
|
+
});
|
|
253
|
+
it('should update sync config on success', async () => {
|
|
254
|
+
const skills = [createMockSkill('test/skill-1')];
|
|
255
|
+
const apiClient = createMockApiClient({ skills });
|
|
256
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
257
|
+
await engine.sync();
|
|
258
|
+
const config = syncConfigRepo.getConfig();
|
|
259
|
+
expect(config.lastSyncAt).not.toBeNull();
|
|
260
|
+
expect(config.lastSyncCount).toBe(1);
|
|
261
|
+
expect(config.lastSyncError).toBeNull();
|
|
262
|
+
});
|
|
263
|
+
it('should set error in config on failure', async () => {
|
|
264
|
+
const apiClient = createMockApiClient({ offline: true });
|
|
265
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
266
|
+
await engine.sync();
|
|
267
|
+
const config = syncConfigRepo.getConfig();
|
|
268
|
+
expect(config.lastSyncError).toBe('API client is in offline mode. Cannot sync.');
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
describe('getStatus', () => {
|
|
272
|
+
it('should return sync status summary', () => {
|
|
273
|
+
const apiClient = createMockApiClient();
|
|
274
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
275
|
+
const status = engine.getStatus();
|
|
276
|
+
expect(status).toHaveProperty('config');
|
|
277
|
+
expect(status).toHaveProperty('lastRun');
|
|
278
|
+
expect(status).toHaveProperty('isRunning');
|
|
279
|
+
expect(status).toHaveProperty('isDue');
|
|
280
|
+
});
|
|
281
|
+
it('should show sync is due when never synced', () => {
|
|
282
|
+
const apiClient = createMockApiClient();
|
|
283
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
284
|
+
const status = engine.getStatus();
|
|
285
|
+
expect(status.isDue).toBe(true);
|
|
286
|
+
expect(status.lastRun).toBeNull();
|
|
287
|
+
});
|
|
288
|
+
it('should reflect running state', async () => {
|
|
289
|
+
const apiClient = createMockApiClient();
|
|
290
|
+
const engine = new SyncEngine(apiClient, skillRepo, syncConfigRepo, syncHistoryRepo);
|
|
291
|
+
// Start a run manually
|
|
292
|
+
syncHistoryRepo.startRun();
|
|
293
|
+
const status = engine.getStatus();
|
|
294
|
+
expect(status.isRunning).toBe(true);
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
//# sourceMappingURL=SyncEngine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncEngine.test.js","sourceRoot":"","sources":["../../../tests/sync/SyncEngine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncHistoryRepository.test.d.ts","sourceRoot":"","sources":["../../../tests/sync/SyncHistoryRepository.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|