Skip to content

Commit 635ed79

Browse files
tanderson-ldTodd Anderson
andauthored
chore: adds initMetadata handling to FDv2 datasources (#866)
**Requirements** - [x] I have added test coverage for new or changed functionality - [x] I have followed the repository's [pull request submission guidelines](../blob/main/CONTRIBUTING.md#submitting-pull-requests) - [x] I have validated my changes against all supported platform versions **Related issues** @abarker-launchdarkly added initMetadata support while I was working on FDv2 data sources. This catches the FDv2 datasources up to FDv1 implementations on main. **Describe the solution you've provided** Similar to existing FDv1 approach. --------- Co-authored-by: Todd Anderson <tanderson@Todds-MacBook-Pro.local>
1 parent 78e9a5e commit 635ed79

File tree

6 files changed

+164
-103
lines changed

6 files changed

+164
-103
lines changed

packages/shared/sdk-server/__tests__/data_sources/PollingProcessorFDv2.test.ts

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ describe('given a polling processor', () => {
88
requestAllData: jest.fn(),
99
};
1010
const longInterval = 100000;
11+
const headers = {
12+
'x-ld-envid': 'envKey',
13+
};
1114
const allFDv2Events = {
1215
events: [
1316
{
@@ -66,7 +69,7 @@ describe('given a polling processor', () => {
6669
});
6770

6871
it('calls callback on success', async () => {
69-
requestor.requestAllData = jest.fn((cb) => cb(undefined, fdv2JsonData));
72+
requestor.requestAllData = jest.fn((cb) => cb(undefined, fdv2JsonData, headers));
7073
let dataCallback;
7174
await new Promise<void>((resolve) => {
7275
dataCallback = jest.fn(() => {
@@ -77,18 +80,23 @@ describe('given a polling processor', () => {
7780
});
7881

7982
expect(dataCallback).toHaveBeenNthCalledWith(1, true, {
80-
basis: true,
81-
id: `mockId`,
82-
state: `mockState`,
83-
updates: [
84-
{
85-
kind: `flag`,
86-
key: `flagA`,
87-
version: 123,
88-
object: { objectFieldA: 'objectValueA' },
89-
},
90-
],
91-
version: 1,
83+
initMetadata: {
84+
environmentId: 'envKey',
85+
},
86+
payload: {
87+
basis: true,
88+
id: `mockId`,
89+
state: `mockState`,
90+
updates: [
91+
{
92+
kind: `flag`,
93+
key: `flagA`,
94+
version: 123,
95+
object: { objectFieldA: 'objectValueA' },
96+
},
97+
],
98+
version: 1,
99+
},
92100
});
93101
});
94102

@@ -99,7 +107,7 @@ describe('given a polling processor', () => {
99107
new TestLogger(),
100108
true,
101109
);
102-
requestor.requestAllData = jest.fn((cb) => cb(undefined, fdv1JsonData));
110+
requestor.requestAllData = jest.fn((cb) => cb(undefined, fdv1JsonData, headers));
103111
let dataCallback;
104112
await new Promise<void>((resolve) => {
105113
dataCallback = jest.fn(() => {
@@ -110,24 +118,29 @@ describe('given a polling processor', () => {
110118
});
111119

112120
expect(dataCallback).toHaveBeenNthCalledWith(1, true, {
113-
basis: true,
114-
id: `FDv1Fallback`,
115-
state: `FDv1Fallback`,
116-
updates: [
117-
{
118-
kind: `flag`,
119-
key: `flagA`,
120-
version: 456,
121-
object: { version: 456 },
122-
},
123-
{
124-
kind: `segment`,
125-
key: `segmentA`,
126-
version: 789,
127-
object: { version: 789 },
128-
},
129-
],
130-
version: 1,
121+
initMetadata: {
122+
environmentId: 'envKey',
123+
},
124+
payload: {
125+
basis: true,
126+
id: `FDv1Fallback`,
127+
state: `FDv1Fallback`,
128+
updates: [
129+
{
130+
kind: `flag`,
131+
key: `flagA`,
132+
version: 456,
133+
object: { version: 456 },
134+
},
135+
{
136+
kind: `segment`,
137+
key: `segmentA`,
138+
version: 789,
139+
object: { version: 789 },
140+
},
141+
],
142+
version: 1,
143+
},
131144
});
132145
});
133146

@@ -138,7 +151,7 @@ describe('given a polling processor', () => {
138151
new TestLogger(),
139152
true,
140153
);
141-
requestor.requestAllData = jest.fn((cb) => cb(undefined, fdv2JsonData));
154+
requestor.requestAllData = jest.fn((cb) => cb(undefined, fdv2JsonData, headers));
142155
let dataCallback;
143156
await new Promise<void>((resolve) => {
144157
dataCallback = jest.fn(() => {
@@ -159,6 +172,9 @@ describe('given a polling processor with a short poll duration', () => {
159172
requestAllData: jest.fn(),
160173
};
161174
const shortInterval = 0.1;
175+
const headers = {
176+
'x-ld-envid': 'envKey',
177+
};
162178
const allEvents = {
163179
events: [
164180
{
@@ -206,7 +222,7 @@ describe('given a polling processor with a short poll duration', () => {
206222
const expectedCalls = new Promise<void>((resolve) => {
207223
let callCount = 0;
208224
requestor.requestAllData = jest.fn((cb) => {
209-
cb(undefined, jsonData);
225+
cb(undefined, jsonData, headers);
210226
callCount += 1;
211227
if (callCount >= 5) {
212228
resolve();
@@ -256,7 +272,7 @@ describe('given a polling processor with a short poll duration', () => {
256272
const expectedCalls = new Promise<void>((resolve) => {
257273
let callCount = 0;
258274
requestor.requestAllData = jest.fn((cb) => {
259-
cb(undefined, '{sad');
275+
cb(undefined, '{sad', headers);
260276
callCount += 1;
261277
if (callCount >= 5) {
262278
resolve();

packages/shared/sdk-server/__tests__/data_sources/StreamingProcessorFDv2.test.ts

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ function getBasicConfiguration(inLogger: LDLogger) {
3232

3333
const dateNowString = '2023-08-10';
3434
const sdkKey = 'my-sdk-key';
35+
const openHeaders = {
36+
'x-ld-envid': 'envKey',
37+
};
3538
const events = {
3639
'server-intent': {
3740
data: '{"payloads": [{"intentCode": "xfer-full", "id": "mockId"}]}',
@@ -59,6 +62,7 @@ beforeEach(() => {
5962
const createMockEventSource = (streamUri: string = '', options: any = {}) => ({
6063
streamUri,
6164
options,
65+
onopen: jest.fn(),
6266
onclose: jest.fn(),
6367
addEventListener: jest.fn(),
6468
close: jest.fn(),
@@ -71,6 +75,7 @@ describe('given a stream processor with mock event source', () => {
7175
let mockEventSource: any;
7276
let mockDataCallback: jest.Mock;
7377
let mockStatusCallback: jest.Mock;
78+
let simulateOpen: () => void;
7479
let simulateEvents: (e?: any) => void;
7580
let simulateError: (e: { status: number; message: string }) => boolean;
7681

@@ -92,6 +97,11 @@ describe('given a stream processor with mock event source', () => {
9297
return mockEventSource;
9398
}),
9499
} as any;
100+
simulateOpen = () => {
101+
mockEventSource.onopen({
102+
headers: openHeaders,
103+
});
104+
};
95105
simulateEvents = (e: any = events) => {
96106
// positions in these call arrays match order of handler attachment in payloadStreamReader
97107
mockEventSource.addEventListener.mock.calls[0][1](e['server-intent']); // server intent listener
@@ -230,20 +240,26 @@ describe('given a stream processor with mock event source', () => {
230240
});
231241

232242
it('executes payload listener', () => {
243+
simulateOpen();
233244
simulateEvents();
234245
expect(mockDataCallback).toHaveBeenNthCalledWith(1, true, {
235-
basis: true,
236-
id: `mockId`,
237-
state: `mockState`,
238-
updates: [
239-
{
240-
kind: `flag`,
241-
key: `flagA`,
242-
version: 123,
243-
object: { objectFieldA: 'objectValueA' },
244-
},
245-
],
246-
version: 1,
246+
initMetadata: {
247+
environmentId: 'envKey',
248+
},
249+
payload: {
250+
basis: true,
251+
id: `mockId`,
252+
state: `mockState`,
253+
updates: [
254+
{
255+
kind: `flag`,
256+
key: `flagA`,
257+
version: 123,
258+
object: { objectFieldA: 'objectValueA' },
259+
},
260+
],
261+
version: 1,
262+
},
247263
});
248264
});
249265

packages/shared/sdk-server/__tests__/data_sources/createPayloadListenersFDv2.test.ts

Lines changed: 65 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -17,74 +17,89 @@ beforeEach(() => {
1717
});
1818

1919
const fullTransferPayload = {
20-
id: 'payloadID',
21-
version: 99,
22-
state: 'initial',
23-
basis: true,
24-
updates: [
25-
{
26-
kind: 'flag',
27-
key: 'flagkey',
28-
version: 1,
29-
object: {
20+
initMetadata: {
21+
environmentId: 'envId',
22+
},
23+
payload: {
24+
id: 'payloadID',
25+
version: 99,
26+
state: 'initial',
27+
basis: true,
28+
updates: [
29+
{
30+
kind: 'flag',
3031
key: 'flagkey',
3132
version: 1,
33+
object: {
34+
key: 'flagkey',
35+
version: 1,
36+
},
3237
},
33-
},
34-
{
35-
kind: 'segment',
36-
key: 'segkey',
37-
version: 1,
38-
object: {
38+
{
39+
kind: 'segment',
3940
key: 'segkey',
40-
version: 2,
41+
version: 1,
42+
object: {
43+
key: 'segkey',
44+
version: 2,
45+
},
4146
},
42-
},
43-
],
47+
],
48+
},
4449
};
4550

4651
const changesTransferPayload = {
47-
id: 'payloadID',
48-
version: 99,
49-
state: 'changes',
50-
basis: false,
51-
updates: [
52-
{
53-
kind: 'flag',
54-
key: 'flagkey',
55-
version: 1,
56-
object: {
52+
initMetadata: {
53+
environmentId: 'envId',
54+
},
55+
payload: {
56+
id: 'payloadID',
57+
version: 99,
58+
state: 'changes',
59+
basis: false,
60+
updates: [
61+
{
62+
kind: 'flag',
5763
key: 'flagkey',
5864
version: 1,
65+
object: {
66+
key: 'flagkey',
67+
version: 1,
68+
},
5969
},
60-
},
61-
{
62-
kind: 'segment',
63-
key: 'segkey',
64-
version: 2,
65-
object: {
70+
{
71+
kind: 'segment',
6672
key: 'segkey',
6773
version: 2,
74+
object: {
75+
key: 'segkey',
76+
version: 2,
77+
},
6878
},
69-
},
70-
{
71-
kind: 'flag',
72-
key: 'deletedFlag',
73-
version: 3,
74-
object: {
79+
{
80+
kind: 'flag',
7581
key: 'deletedFlag',
7682
version: 3,
83+
object: {
84+
key: 'deletedFlag',
85+
version: 3,
86+
},
87+
deleted: true,
7788
},
78-
deleted: true,
79-
},
80-
],
89+
],
90+
},
8191
};
8292

8393
const changesTransferNone = {
84-
id: 'payloadID',
85-
version: 99,
86-
basis: false,
87-
updates: [],
94+
initMetadata: {
95+
environmentId: 'envId',
96+
},
97+
payload: {
98+
id: 'payloadID',
99+
version: 99,
100+
basis: false,
101+
updates: [],
102+
},
88103
};
89104

90105
describe('createPayloadListenerFDv2', () => {
@@ -120,7 +135,7 @@ describe('createPayloadListenerFDv2', () => {
120135
},
121136
},
122137
basisReceived,
123-
undefined,
138+
{ environmentId: 'envId' },
124139
'initial',
125140
);
126141
});
@@ -154,7 +169,7 @@ describe('createPayloadListenerFDv2', () => {
154169
},
155170
},
156171
basisReceived,
157-
undefined,
172+
{ environmentId: 'envId' },
158173
'changes',
159174
);
160175
});

0 commit comments

Comments
 (0)