-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathproject-sync-status.test.ts
More file actions
139 lines (125 loc) · 4.26 KB
/
Copy pathproject-sync-status.test.ts
File metadata and controls
139 lines (125 loc) · 4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import { describe, expect, it } from 'bun:test';
import {
buildProjectSyncErrorFeedback,
buildProjectSyncFeedback,
buildRemoteStatusItems,
formatRemoteRunCount,
getProjectSyncView,
} from './project-sync-status';
describe('getProjectSyncView', () => {
it('keeps unconfigured remote results out of the sync action', () => {
expect(getProjectSyncView({ configured: false, available: false })).toMatchObject({
state: 'unconfigured',
canSync: false,
});
});
it('surfaces dirty metadata as syncable without reset language', () => {
const view = getProjectSyncView({
configured: true,
available: true,
sync_status: 'dirty',
dirty_paths: ['.agentv/results/metadata/runs/demo/tags.json'],
auto_push: false,
});
expect(view).toMatchObject({
state: 'dirty',
label: 'Dirty',
canSync: true,
});
expect(view.nextAction).toContain('no reset');
});
it('treats diverged history as a conflict-safe blocked state', () => {
expect(
getProjectSyncView({
configured: true,
available: true,
sync_status: 'diverged',
block_reason: 'Results repo local and remote histories have diverged',
}),
).toMatchObject({
state: 'conflicted',
tone: 'danger',
canSync: false,
});
});
});
describe('buildProjectSyncFeedback', () => {
it('summarizes successful sync actions', () => {
const feedback = buildProjectSyncFeedback({
configured: true,
available: true,
sync_status: 'clean',
commit_created: true,
pull_performed: true,
push_performed: true,
run_count: 2,
last_synced_at: '2026-06-06T13:00:00.000Z',
});
expect(feedback.kind).toBe('success');
expect(feedback.message).toContain(
'Sync completed: committed pending metadata, pulled remote results, pushed local results.',
);
});
it('confirms WTG-like manual sync with repo, run count, and sync time', () => {
const feedback = buildProjectSyncFeedback({
configured: true,
available: true,
sync_status: 'clean',
repo: 'WiseTechGlobal/WTG.AI.Prompts.EvalResults',
run_count: 1,
last_synced_at: '2026-06-06T13:00:00.000Z',
pull_performed: true,
});
expect(feedback.kind).toBe('success');
expect(feedback.message).toContain('Synced 1 remote run');
expect(feedback.message).toContain('WiseTechGlobal/WTG.AI.Prompts.EvalResults');
expect(feedback.message).toContain(' at ');
expect(feedback.message).toContain('pulled remote results');
});
it('keeps blocked sync feedback explicit', () => {
expect(
buildProjectSyncFeedback({
configured: true,
available: true,
sync_status: 'conflicted',
blocked: true,
block_reason: 'Results repo has unresolved git conflicts',
}),
).toEqual({
kind: 'warning',
message:
'Sync stopped: Results repo has unresolved git conflicts. The remote results cache remains available. Resolve the results repo issue, then sync remote results again.',
});
});
it('builds actionable sync failure feedback without hiding cached remote runs', () => {
expect(
buildProjectSyncErrorFeedback(new Error('GitHub authentication failed'), {
configured: true,
available: true,
run_count: 1,
}).message,
).toBe(
'Sync failed: GitHub authentication failed. Cached 1 remote run remains available. Resolve the results repo issue, then sync remote results again.',
);
});
});
describe('formatRemoteRunCount', () => {
it('pluralizes known remote run counts', () => {
expect(formatRemoteRunCount(1)).toBe('1 remote run');
expect(formatRemoteRunCount(2)).toBe('2 remote runs');
});
});
describe('buildRemoteStatusItems', () => {
it('includes WTG-like repo, remote run count, and last sync time', () => {
const items = buildRemoteStatusItems({
configured: true,
available: true,
repo: 'WiseTechGlobal/WTG.AI.Prompts.EvalResults',
run_count: 1,
last_synced_at: '2026-06-06T13:00:00.000Z',
});
expect(items).toContain('1 remote run');
expect(items).toContain('Repo: WiseTechGlobal/WTG.AI.Prompts.EvalResults');
expect(items.some((item) => item.startsWith('Last synced '))).toBe(true);
});
});