Skip to content

Commit 2f66f71

Browse files
committed
Get all events tests
1 parent 65be3c5 commit 2f66f71

File tree

1 file changed

+163
-0
lines changed

1 file changed

+163
-0
lines changed
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
import createLogger from 'pino';
2+
import {faker} from '@faker-js/faker';
3+
import * as libsqlClient from '@libsql/client';
4+
import * as T from 'fp-ts/Task';
5+
import {randomUUID} from 'crypto';
6+
import {
7+
DomainEvent,
8+
EmailAddress,
9+
constructEvent,
10+
} from '../../../src/types';
11+
import {commitEvent} from '../../../src/init-dependencies/event-store/commit-event';
12+
import {ensureEventTableExists} from '../../../src/init-dependencies/event-store/ensure-events-table-exists';
13+
import {
14+
getAllEvents,
15+
getAllEventsByType,
16+
getAllEventsByTypes,
17+
} from '../../../src/init-dependencies/event-store/get-all-events';
18+
import {arbitraryActor, getRightOrFail} from '../../helpers';
19+
import { UUID } from 'io-ts-types';
20+
import { EventName } from '../../../src/types/domain-event';
21+
22+
const arbitraryMemberNumberLinkedToEmailEvent = () =>
23+
constructEvent('MemberNumberLinkedToEmail')({
24+
memberNumber: faker.number.int(),
25+
email: faker.internet.email() as EmailAddress,
26+
name: undefined,
27+
formOfAddress: undefined,
28+
actor: arbitraryActor(),
29+
});
30+
31+
const arbitraryEquipmentTrainingSheetRegisteredEvent = () =>
32+
constructEvent('EquipmentTrainingSheetRegistered')({
33+
equipmentId: faker.string.uuid() as UUID,
34+
trainingSheetId: faker.string.alphanumeric(12),
35+
actor: arbitraryActor(),
36+
});
37+
38+
const arbitraryEquipmentTrainingQuizResultEvent = () =>
39+
constructEvent('EquipmentTrainingQuizResult')({
40+
actor: arbitraryActor(),
41+
});
42+
43+
const arbitraryResource = () => ({
44+
id: randomUUID(),
45+
type: 'test-resource',
46+
});
47+
48+
describe('get all events', () => {
49+
const testLogger = createLogger({level: 'silent'});
50+
const dummyRefreshReadModel = () => T.of(undefined);
51+
52+
let dbClient: libsqlClient.Client;
53+
let persistEvent: (event: DomainEvent) => Promise<void>;
54+
let initalisedGetAllEvents: () => Promise<ReadonlyArray<DomainEvent>>;
55+
let initalisedGetAllEventsByType: (type: EventName) => Promise<ReadonlyArray<DomainEvent>>;
56+
let initalisedGetAllEventsByTypes: (type1: EventName, type2: EventName) => Promise<ReadonlyArray<DomainEvent>>;
57+
58+
beforeEach(async () => {
59+
dbClient = libsqlClient.createClient({url: ':memory:'});
60+
getRightOrFail(await ensureEventTableExists(dbClient)());
61+
persistEvent = async (event: DomainEvent) => {
62+
getRightOrFail(
63+
await commitEvent(
64+
dbClient,
65+
testLogger,
66+
dummyRefreshReadModel
67+
)(arbitraryResource(), 'no-such-resource')(event)()
68+
)
69+
};
70+
initalisedGetAllEvents = async () => getRightOrFail(await getAllEvents(dbClient)()());
71+
initalisedGetAllEventsByType = async (type: EventName) => getRightOrFail(await getAllEventsByType(dbClient)(type)());
72+
initalisedGetAllEventsByTypes = async (type1: EventName, type2: EventName) => getRightOrFail(await getAllEventsByTypes(dbClient)(type1, type2)());
73+
});
74+
75+
afterEach(() => {
76+
dbClient.close();
77+
});
78+
79+
describe('getAllEvents', () => {
80+
it('returns all persisted events except EquipmentTrainingQuizResult', async () => {
81+
const memberNumberLinkedToEmail =
82+
arbitraryMemberNumberLinkedToEmailEvent();
83+
const equipmentTrainingQuizResult =
84+
arbitraryEquipmentTrainingQuizResultEvent();
85+
const equipmentTrainingSheetRegistered =
86+
arbitraryEquipmentTrainingSheetRegisteredEvent();
87+
await persistEvent(memberNumberLinkedToEmail);
88+
await persistEvent(equipmentTrainingQuizResult);
89+
await persistEvent(equipmentTrainingSheetRegistered);
90+
expect(await initalisedGetAllEvents()).toStrictEqual([
91+
memberNumberLinkedToEmail,
92+
equipmentTrainingSheetRegistered,
93+
]);
94+
});
95+
});
96+
97+
describe('getAllEventsByType', () => {
98+
it('returns only events of the requested type', async () => {
99+
const firstMatchingEvent = arbitraryMemberNumberLinkedToEmailEvent();
100+
const nonMatchingEvent = arbitraryEquipmentTrainingSheetRegisteredEvent();
101+
const secondMatchingEvent = arbitraryMemberNumberLinkedToEmailEvent();
102+
await persistEvent(firstMatchingEvent);
103+
await persistEvent(nonMatchingEvent);
104+
await persistEvent(secondMatchingEvent);
105+
expect(await initalisedGetAllEventsByType('MemberNumberLinkedToEmail')).toStrictEqual([
106+
firstMatchingEvent,
107+
secondMatchingEvent,
108+
]);
109+
});
110+
111+
it('returns EquipmentTrainingQuizResult events when explicitly requested', async () => {
112+
const equipmentTrainingQuizResult =
113+
arbitraryEquipmentTrainingQuizResultEvent();
114+
const nonMatchingEvent = arbitraryMemberNumberLinkedToEmailEvent();
115+
await persistEvent(equipmentTrainingQuizResult);
116+
await persistEvent(nonMatchingEvent);
117+
expect(await initalisedGetAllEventsByType('EquipmentTrainingQuizResult')).toStrictEqual([equipmentTrainingQuizResult]);
118+
});
119+
});
120+
121+
describe('getAllEventsByTypes', () => {
122+
it('returns events matching either requested type', async () => {
123+
const firstMatchingEvent = arbitraryMemberNumberLinkedToEmailEvent();
124+
const nonMatchingEvent = arbitraryEquipmentTrainingQuizResultEvent();
125+
const secondMatchingEvent = arbitraryEquipmentTrainingSheetRegisteredEvent();
126+
127+
await persistEvent(firstMatchingEvent);
128+
await persistEvent(nonMatchingEvent);
129+
await persistEvent(secondMatchingEvent);
130+
131+
expect(
132+
await initalisedGetAllEventsByTypes(
133+
'MemberNumberLinkedToEmail',
134+
'EquipmentTrainingSheetRegistered'
135+
)
136+
).toStrictEqual([
137+
firstMatchingEvent,
138+
secondMatchingEvent,
139+
]);
140+
});
141+
142+
it('returns EquipmentTrainingQuizResult events when one of the requested types matches', async () => {
143+
const equipmentTrainingQuizResult =
144+
arbitraryEquipmentTrainingQuizResultEvent();
145+
const matchingEvent = arbitraryEquipmentTrainingSheetRegisteredEvent();
146+
const nonMatchingEvent = arbitraryMemberNumberLinkedToEmailEvent();
147+
148+
await persistEvent(equipmentTrainingQuizResult);
149+
await persistEvent(matchingEvent);
150+
await persistEvent(nonMatchingEvent);
151+
152+
expect(
153+
await initalisedGetAllEventsByTypes(
154+
'EquipmentTrainingQuizResult',
155+
'EquipmentTrainingSheetRegistered'
156+
)
157+
).toStrictEqual([
158+
equipmentTrainingQuizResult,
159+
matchingEvent,
160+
]);
161+
});
162+
});
163+
});

0 commit comments

Comments
 (0)