Skip to content

Commit 9a52842

Browse files
committed
more tests for caching sheet data
1 parent 7284de2 commit 9a52842

File tree

1 file changed

+114
-1
lines changed

1 file changed

+114
-1
lines changed

tests/training-sheets/cached-sheet-data.test.ts

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ describe('Cache sheet data', () => {
2626
>
2727
>;
2828
}>;
29+
let db: libsqlClient.Client;
2930
beforeEach(async () => {
30-
const db = libsqlClient.createClient({url: ':memory:'});
31+
db = libsqlClient.createClient({url: ':memory:'});
3132
await ensureCachedSheetDataTableExists(db)();
3233
getRightOrFail(
3334
await cacheSheetData(db)(cacheTimestamp, sheetId, [
@@ -59,5 +60,117 @@ describe('Cache sheet data', () => {
5960
expect(cachedData[0].sheet_id).toStrictEqual(sheetId);
6061
expect(cachedData[0].cached_at).toStrictEqual(cacheTimestamp);
6162
});
63+
64+
describe('Overwrite cache then restore', () => {
65+
const newCacheTimestamp = new Date(2024, 1, 23, 5, 23, 45);
66+
let cachedDataAfter: ReadonlyArray<{
67+
cached_at: Date;
68+
sheet_id: string;
69+
cached_data: t.Validation<
70+
ReadonlyArray<
71+
| EventOfType<'EquipmentTrainingQuizResult'>
72+
| EventOfType<'EquipmentTrainingQuizSync'>
73+
>
74+
>;
75+
}>;
76+
beforeEach(async () => {
77+
getRightOrFail(
78+
await cacheSheetData(db)(newCacheTimestamp, sheetId, [
79+
constructEvent('EquipmentTrainingQuizSync')({
80+
equipmentId,
81+
}),
82+
constructEvent('EquipmentTrainingQuizResult')({
83+
equipmentId: equipmentId,
84+
trainingSheetId: sheetId,
85+
memberNumberProvided: faker.number.int(),
86+
emailProvided: 'beans@bob.co.uk',
87+
score: 23,
88+
id: '1a3eeb99-dd7a-4f55-a018-6f5e2678fc14' as UUID,
89+
maxScore: 23,
90+
percentage: 100,
91+
timestampEpochMS: 1738623209,
92+
}),
93+
constructEvent('EquipmentTrainingQuizResult')({
94+
equipmentId: equipmentId,
95+
trainingSheetId: sheetId,
96+
memberNumberProvided: faker.number.int(),
97+
emailProvided: 'fred@bob.co.uk',
98+
score: 17,
99+
id: 'bbbbeb99-aa7a-4f55-a018-ffff2678feee' as UUID,
100+
maxScore: 23,
101+
percentage: 74,
102+
timestampEpochMS: 1738623333,
103+
}),
104+
])()
105+
);
106+
cachedDataAfter = getRightOrFail(await getCachedSheetData(db)()());
107+
});
108+
it('Each sheet is cached', () => {
109+
expect(cachedDataAfter).toHaveLength(1); // 1 sheet
110+
});
111+
it('All events cached are returned', () => {
112+
expect(getRightOrFail(cachedDataAfter[0].cached_data)).toHaveLength(3); // 3 events.
113+
});
114+
it('Event cache is correctly labeled', () => {
115+
expect(cachedDataAfter[0].sheet_id).toStrictEqual(sheetId);
116+
expect(cachedDataAfter[0].cached_at).toStrictEqual(newCacheTimestamp);
117+
});
118+
});
119+
describe('Cache multiple equipment', () => {
120+
const secondSheetCacheTimestamp = new Date(2024, 1, 23, 5, 23, 45);
121+
const secondEquipmentId = 'ed779c68-d165-45b3-bd0f-5590021d5337' as UUID;
122+
const secondSheetId = 'secondSheetId';
123+
let cachedDataAfter: ReadonlyArray<{
124+
cached_at: Date;
125+
sheet_id: string;
126+
cached_data: t.Validation<
127+
ReadonlyArray<
128+
| EventOfType<'EquipmentTrainingQuizResult'>
129+
| EventOfType<'EquipmentTrainingQuizSync'>
130+
>
131+
>;
132+
}>;
133+
let firstSheetData: (typeof cachedDataAfter)[0];
134+
let secondSheetData: (typeof cachedDataAfter)[0];
135+
beforeEach(async () => {
136+
getRightOrFail(
137+
await cacheSheetData(db)(secondSheetCacheTimestamp, secondSheetId, [
138+
constructEvent('EquipmentTrainingQuizSync')({
139+
equipmentId: secondEquipmentId,
140+
}),
141+
constructEvent('EquipmentTrainingQuizResult')({
142+
equipmentId: secondEquipmentId,
143+
trainingSheetId: secondSheetId,
144+
memberNumberProvided: faker.number.int(),
145+
emailProvided: 'beans@bob.co.uk',
146+
score: 10,
147+
id: 'e139bb51-af9b-420d-87cf-53417491fdb4' as UUID,
148+
maxScore: 10,
149+
percentage: 100,
150+
timestampEpochMS: 1738627209,
151+
}),
152+
])()
153+
);
154+
cachedDataAfter = getRightOrFail(await getCachedSheetData(db)()());
155+
firstSheetData = cachedDataAfter.find(
156+
data => data.sheet_id === sheetId
157+
)!;
158+
secondSheetData = cachedDataAfter.find(
159+
data => data.sheet_id === secondSheetId
160+
)!;
161+
});
162+
it('Event cache is correctly labeled', () => {
163+
expect(firstSheetData.sheet_id).toStrictEqual(sheetId);
164+
expect(firstSheetData.cached_at).toStrictEqual(cacheTimestamp);
165+
expect(secondSheetData.sheet_id).toStrictEqual(secondSheetId);
166+
expect(secondSheetData.cached_at).toStrictEqual(
167+
secondSheetCacheTimestamp
168+
);
169+
});
170+
it('All events cached are returned', () => {
171+
expect(getRightOrFail(firstSheetData.cached_data)).toHaveLength(2);
172+
expect(getRightOrFail(secondSheetData.cached_data)).toHaveLength(2);
173+
});
174+
});
62175
});
63176
});

0 commit comments

Comments
 (0)