Skip to content

Commit 15d65d7

Browse files
committed
test: [sdk-1577] add unit tests for file data initializer
1 parent 678e42f commit 15d65d7

File tree

3 files changed

+551
-2
lines changed

3 files changed

+551
-2
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import FDv2ChangeSetBuilder from '../../../src/internal/fdv2/FDv2ChangeSetBuilder';
2+
import { DeleteObject, Event, PutObject } from '../../../src/internal/fdv2/proto';
3+
4+
it('throws an error when finishing without starting', () => {
5+
const builder = new FDv2ChangeSetBuilder();
6+
expect(() => builder.finish()).toThrow('changeset: cannot complete without a server-intent');
7+
});
8+
9+
it('starts a new changeset with the given intent', () => {
10+
const builder = new FDv2ChangeSetBuilder();
11+
builder.start('xfer-full');
12+
const result = builder.finish();
13+
14+
expect(result).toBeDefined();
15+
expect(result.length).toBeGreaterThan(0);
16+
expect(result[0].event).toBe('server-intent');
17+
});
18+
19+
it('resets events when starting a new changeset', () => {
20+
const builder = new FDv2ChangeSetBuilder();
21+
builder.start('xfer-full');
22+
builder.putObject({ kind: 'flag', key: 'test-flag', version: 1, object: {} });
23+
builder.start('xfer-full');
24+
const result = builder.finish();
25+
26+
// Should only have server-intent and payload-transferred, no put-object events
27+
const putObjectEvents = result.filter((e) => e.event === 'put-object');
28+
expect(putObjectEvents.length).toBe(0);
29+
});
30+
31+
it('includes server-intent as the first event with correct structure', () => {
32+
const builder = new FDv2ChangeSetBuilder();
33+
builder.start('xfer-full');
34+
const result = builder.finish();
35+
36+
const serverIntentEvent = result[0] as Event;
37+
expect(serverIntentEvent.event).toBe('server-intent');
38+
expect(serverIntentEvent.data).toBeDefined();
39+
40+
const intentData = serverIntentEvent.data as any;
41+
expect(intentData.payloads).toBeDefined();
42+
expect(intentData.payloads.length).toBe(1);
43+
expect(intentData.payloads[0].intentCode).toBe('xfer-full');
44+
expect(intentData.payloads[0].id).toBe('dummy-id');
45+
expect(intentData.payloads[0].target).toBe(1);
46+
expect(intentData.payloads[0].reason).toBe('payload-missing');
47+
});
48+
49+
it('includes payload-transferred as the last event with empty state', () => {
50+
const builder = new FDv2ChangeSetBuilder();
51+
builder.start('xfer-full');
52+
const result = builder.finish();
53+
54+
const payloadTransferredEvent = result[result.length - 1] as Event;
55+
expect(payloadTransferredEvent.event).toBe('payload-transferred');
56+
expect(payloadTransferredEvent.data).toBeDefined();
57+
58+
const transferredData = payloadTransferredEvent.data as any;
59+
expect(transferredData.state).toBe('');
60+
expect(transferredData.version).toBe(1);
61+
expect(transferredData.id).toBe('dummy-id');
62+
});
63+
64+
it('includes all put and delete events between server-intent and payload-transferred', () => {
65+
const builder = new FDv2ChangeSetBuilder();
66+
const putObj1: PutObject = {
67+
kind: 'flag',
68+
key: 'flag-1',
69+
version: 1,
70+
object: { key: 'flag-1', on: true },
71+
};
72+
const deleteObj: DeleteObject = {
73+
kind: 'segment',
74+
key: 'segment-1',
75+
version: 2,
76+
};
77+
const putObj2: PutObject = {
78+
kind: 'flag',
79+
key: 'flag-2',
80+
version: 3,
81+
object: { key: 'flag-2', on: false },
82+
};
83+
84+
builder.start('xfer-full');
85+
builder.putObject(putObj1);
86+
builder.deleteObject(deleteObj);
87+
builder.putObject(putObj2);
88+
const result = builder.finish();
89+
90+
expect(result.length).toBe(5); // server-intent + 3 events + payload-transferred
91+
expect(result[0].event).toBe('server-intent');
92+
expect(result[1].event).toBe('put-object');
93+
expect((result[1].data as PutObject).key).toBe('flag-1');
94+
expect(result[2].event).toBe('delete-object');
95+
expect((result[2].data as DeleteObject).key).toBe('segment-1');
96+
expect(result[3].event).toBe('put-object');
97+
expect((result[3].data as PutObject).key).toBe('flag-2');
98+
expect(result[4].event).toBe('payload-transferred');
99+
});

0 commit comments

Comments
 (0)