Skip to content

Commit 3775f07

Browse files
committed
fix e2e test, minor refactor
Signed-off-by: Michael Beemer <[email protected]>
1 parent 36ec82a commit 3775f07

File tree

20 files changed

+152
-187
lines changed

20 files changed

+152
-187
lines changed

libs/providers/flagd-web/project.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@
5959
]
6060
},
6161
"e2e": {
62-
"executor": "nx:run-commands",
62+
"executor": "@nx/jest:jest",
63+
"outputs": [
64+
"{workspaceRoot}/coverage/libs/providers/flagd-web"
65+
],
6366
"options": {
64-
"commands": [
65-
"npx jest"
66-
],
67-
"cwd": "libs/providers/flagd-web/src/e2e",
67+
"jestConfig": "libs/providers/flagd-web/src/e2e/jest.config.ts",
6868
"parallel": false
6969
},
7070
"dependsOn": [
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { getGherkinTestPath } from '@openfeature/flagd-core';
22

3-
export const FLAGD_NAME = 'flagd-web';
3+
export const FLAGD_NAME = 'flagd';
44

55
export const GHERKIN_EVALUATION_FEATURE = getGherkinTestPath('flagd.feature');
Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
export default {
1+
import type { Config } from 'jest';
2+
3+
const config: Config = {
24
displayName: 'providers-flagd-web-e2e',
3-
transform: {
4-
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: './tsconfig.lib.json' }],
5-
},
5+
clearMocks: true,
6+
preset: 'ts-jest',
67
moduleNameMapper: {
78
'@openfeature/flagd-core': ['<rootDir>/../../../../shared/flagd-core/src'],
8-
'^(.*)\\.js$': ['$1.js', '$1.ts', '$1'],
9+
'(.+)\\.js$': '$1',
910
},
10-
testEnvironment: 'node',
11-
preset: 'ts-jest',
12-
clearMocks: true,
13-
setupFiles: [],
11+
detectOpenHandles: true,
1412
verbose: true,
15-
silent: false,
1613
};
14+
15+
export default config;

libs/providers/flagd-web/src/e2e/step-definitions/flag.ts

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
3535

3636
when(
3737
/^a boolean flag with key "(.*)" is evaluated with default value "(.*)"$/,
38-
async (key: string, defaultValue: string) => {
38+
(key: string, defaultValue: string) => {
3939
flagKey = key;
4040
fallback = defaultValue;
41-
value = await client.getBooleanValue(key, defaultValue === 'true');
41+
value = client.getBooleanValue(key, defaultValue === 'true');
4242
},
4343
);
4444

@@ -48,10 +48,10 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
4848

4949
when(
5050
/^a string flag with key "(.*)" is evaluated with default value "(.*)"$/,
51-
async (key: string, defaultValue: string) => {
51+
(key: string, defaultValue: string) => {
5252
flagKey = key;
5353
fallback = defaultValue;
54-
value = await client.getStringValue(key, defaultValue);
54+
value = client.getStringValue(key, defaultValue);
5555
},
5656
);
5757

@@ -64,7 +64,7 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
6464
async (key: string, defaultValue: string) => {
6565
flagKey = key;
6666
fallback = Number(defaultValue);
67-
value = await client.getNumberValue(key, Number.parseInt(defaultValue));
67+
value = client.getNumberValue(key, Number.parseInt(defaultValue));
6868
},
6969
);
7070

@@ -77,7 +77,7 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
7777
async (key: string, defaultValue: string) => {
7878
flagKey = key;
7979
fallback = Number(defaultValue);
80-
value = await client.getNumberValue(key, Number.parseFloat(defaultValue));
80+
value = client.getNumberValue(key, Number.parseFloat(defaultValue));
8181
},
8282
);
8383

@@ -89,7 +89,7 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
8989
const defaultValue = {};
9090
flagKey = key;
9191
fallback = '';
92-
value = await client.getObjectValue(key, defaultValue);
92+
value = client.getObjectValue(key, defaultValue);
9393
});
9494

9595
then(
@@ -107,7 +107,7 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
107107
async (key: string, defaultValue: string) => {
108108
flagKey = key;
109109
fallback = defaultValue;
110-
details = await client.getBooleanDetails(key, defaultValue === 'true');
110+
details = client.getBooleanDetails(key, defaultValue === 'true');
111111
},
112112
);
113113

@@ -123,10 +123,10 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
123123

124124
when(
125125
/^a string flag with key "(.*)" is evaluated with details and default value "(.*)"$/,
126-
async (key: string, defaultValue: string) => {
126+
(key: string, defaultValue: string) => {
127127
flagKey = key;
128128
fallback = defaultValue;
129-
details = await client.getStringDetails(key, defaultValue);
129+
details = client.getStringDetails(key, defaultValue);
130130
},
131131
);
132132

@@ -142,10 +142,10 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
142142

143143
when(
144144
/^an integer flag with key "(.*)" is evaluated with details and default value (\d+)$/,
145-
async (key: string, defaultValue: string) => {
145+
(key: string, defaultValue: string) => {
146146
flagKey = key;
147147
fallback = defaultValue;
148-
details = await client.getNumberDetails(key, Number.parseInt(defaultValue));
148+
details = client.getNumberDetails(key, Number.parseInt(defaultValue));
149149
},
150150
);
151151

@@ -161,10 +161,10 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
161161

162162
when(
163163
/^a float flag with key "(.*)" is evaluated with details and default value (\d+\.?\d*)$/,
164-
async (key: string, defaultValue: string) => {
164+
(key: string, defaultValue: string) => {
165165
flagKey = key;
166166
fallback = defaultValue;
167-
details = await client.getNumberDetails(key, Number.parseFloat(defaultValue));
167+
details = client.getNumberDetails(key, Number.parseFloat(defaultValue));
168168
},
169169
);
170170

@@ -178,10 +178,10 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
178178
},
179179
);
180180

181-
when(/^an object flag with key "(.*)" is evaluated with details and a null default value$/, async (key: string) => {
181+
when(/^an object flag with key "(.*)" is evaluated with details and a null default value$/, (key: string) => {
182182
flagKey = key;
183183
fallback = {};
184-
details = await client.getObjectDetails(key, {});
184+
details = client.getObjectDetails(key, {});
185185
});
186186

187187
then(
@@ -211,10 +211,10 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
211211

212212
when(
213213
/^a non-existent string flag with key "(.*)" is evaluated with details and a default value "(.*)"$/,
214-
async (key: string, defaultValue: string) => {
214+
(key: string, defaultValue: string) => {
215215
flagKey = key;
216216
fallback = defaultValue;
217-
details = await client.getStringDetails(flagKey, defaultValue);
217+
details = client.getStringDetails(flagKey, defaultValue);
218218
},
219219
);
220220

@@ -234,10 +234,10 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
234234

235235
when(
236236
/^a string flag with key "(.*)" is evaluated as an integer, with details and a default value (\d+)$/,
237-
async (key: string, defaultValue: string) => {
237+
(key: string, defaultValue: string) => {
238238
flagKey = key;
239239
fallback = Number.parseInt(defaultValue);
240-
details = await client.getNumberDetails(flagKey, Number.parseInt(defaultValue));
240+
details = client.getNumberDetails(flagKey, Number.parseInt(defaultValue));
241241
},
242242
);
243243

@@ -303,9 +303,9 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
303303
},
304304
);
305305

306-
then(/^the resolved boolean zero-value should be "(.*)"$/, async (expectedVal: string) => {
306+
then(/^the resolved boolean zero-value should be "(.*)"$/, (expectedVal: string) => {
307307
const expectedValue = expectedVal === 'true';
308-
const value = await client.getBooleanValue(flagKey, fallback as boolean);
308+
const value = client.getBooleanValue(flagKey, fallback as boolean);
309309
expect(value).toEqual(expectedValue);
310310
});
311311

@@ -314,8 +314,8 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
314314
fallback = defaultVal;
315315
});
316316

317-
then('the resolved string zero-value should be ""', async () => {
318-
const value = await client.getStringValue(flagKey, fallback as string);
317+
then('the resolved string zero-value should be ""', () => {
318+
const value = client.getStringValue(flagKey, fallback as string);
319319
expect(value).toEqual('');
320320
});
321321

@@ -324,9 +324,9 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
324324
fallback = defaultVal;
325325
});
326326

327-
then(/^the resolved integer zero-value should be (\d+)$/, async (expectedValueString) => {
327+
then(/^the resolved integer zero-value should be (\d+)$/, (expectedValueString) => {
328328
const expectedValue = Number.parseInt(expectedValueString);
329-
const value = await client.getNumberValue(flagKey, fallback as number);
329+
const value = client.getNumberValue(flagKey, fallback as number);
330330
expect(value).toEqual(expectedValue);
331331
});
332332

@@ -338,9 +338,9 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
338338
},
339339
);
340340

341-
then(/^the resolved float zero-value should be (\d+\.\d+)$/, async (expectedValueString) => {
341+
then(/^the resolved float zero-value should be (\d+\.\d+)$/, (expectedValueString) => {
342342
const expectedValue = Number.parseFloat(expectedValueString);
343-
const value = await client.getNumberValue(flagKey, fallback as number);
343+
const value = client.getNumberValue(flagKey, fallback as number);
344344
expect(value).toEqual(expectedValue);
345345
});
346346

libs/providers/flagd-web/src/e2e/tsconfig.lib.json

Lines changed: 0 additions & 12 deletions
This file was deleted.

libs/providers/flagd-web/src/lib/flagd-web-provider.spec.ts

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
JsonValue,
77
OpenFeature,
88
ProviderEvents,
9-
ProviderStatus,
109
StandardResolutionReasons,
1110
} from '@openfeature/web-sdk';
1211
import fetchMock from 'jest-fetch-mock';
@@ -193,21 +192,12 @@ describe(FlagdWebProvider.name, () => {
193192

194193
describe(ProviderEvents.Ready, () => {
195194
it('should fire as soon as client subscribes, if ready', (done) => {
196-
try {
197-
// should start NOT_READY
198-
expect(provider.status).toEqual(ProviderStatus.NOT_READY);
199-
done();
200-
} catch (err) {
201-
done(err);
202-
}
203-
204195
mockCallbackClient.mockMessage({
205196
type: EVENT_PROVIDER_READY,
206197
});
207198

208199
client.addHandler(ProviderEvents.Ready, () => {
209200
try {
210-
expect(provider.status).toEqual(ProviderStatus.READY);
211201
done();
212202
} catch (err) {
213203
done(err);
@@ -216,22 +206,14 @@ describe(FlagdWebProvider.name, () => {
216206
});
217207

218208
it('should fire and be ready if message received', (done) => {
219-
try {
220-
// should start NOT_READY
221-
expect(provider.status).toEqual(ProviderStatus.NOT_READY);
222-
done();
223-
} catch (err) {
224-
done(err);
225-
}
226-
227209
client.addHandler(ProviderEvents.Ready, () => {
228210
try {
229-
expect(provider.status).toEqual(ProviderStatus.READY);
230211
done();
231212
} catch (err) {
232213
done(err);
233214
}
234215
});
216+
235217
mockCallbackClient.mockMessage({
236218
type: EVENT_PROVIDER_READY,
237219
});
@@ -269,9 +251,9 @@ describe(FlagdWebProvider.name, () => {
269251

270252
describe(ProviderEvents.Error, () => {
271253
it('should fire if message received', (done) => {
272-
client.addHandler(ProviderEvents.Error, () => {
254+
client.addHandler(ProviderEvents.Error, (event) => {
273255
try {
274-
expect(provider.status).toEqual(ProviderStatus.ERROR);
256+
expect(event?.providerName).toBe('flagd');
275257
done();
276258
} catch (err) {
277259
done(err);

libs/providers/flagd-web/src/lib/flagd-web-provider.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
OpenFeatureEventEmitter,
1212
Provider,
1313
ProviderEvents,
14-
ProviderStatus,
1514
ResolutionDetails,
1615
StandardResolutionReasons,
1716
TypeMismatchError,
@@ -31,10 +30,12 @@ type AnyFlagResolutionType = typeof AnyFlag.prototype.value.case;
3130

3231
export class FlagdWebProvider implements Provider {
3332
metadata = {
34-
name: 'flagd-web',
33+
name: 'flagd',
3534
};
3635

37-
private _status = ProviderStatus.NOT_READY;
36+
readonly runsOn = 'client';
37+
readonly events = new OpenFeatureEventEmitter();
38+
3839
private _connected = false;
3940
private _promiseClient: PromiseClient<typeof Service>;
4041
private _callbackClient: CallbackClient<typeof Service>;
@@ -64,12 +65,6 @@ export class FlagdWebProvider implements Provider {
6465
this._logger = logger;
6566
}
6667

67-
get status() {
68-
return this._status;
69-
}
70-
71-
events = new OpenFeatureEventEmitter();
72-
7368
async onContextChange(oldContext: EvaluationContext, newContext: EvaluationContext): Promise<void> {
7469
await this.fetchAll(newContext);
7570
}
@@ -112,6 +107,7 @@ export class FlagdWebProvider implements Provider {
112107
reason: this._connected ? resolved.reason : StandardResolutionReasons.CACHED,
113108
variant: resolved.variant,
114109
value: resolved.value as T,
110+
flagMetadata: resolved.flagMetadata,
115111
};
116112
}
117113

@@ -129,7 +125,6 @@ export class FlagdWebProvider implements Provider {
129125
case EVENT_PROVIDER_READY:
130126
this.fetchAll(currentContext).then(() => {
131127
this.resetConnectionState();
132-
this._status = ProviderStatus.READY;
133128
resolve();
134129
});
135130
return;
@@ -142,8 +137,7 @@ export class FlagdWebProvider implements Provider {
142137
}
143138
},
144139
(err) => {
145-
this._status = ProviderStatus.ERROR;
146-
this._logger?.error(`${FlagdWebProvider.name}: could not establish connection to flagd, ${err?.message}`);
140+
this._logger?.error(`${FlagdWebProvider.name}: could not establish connection, ${err?.message}`);
147141
this._logger?.debug(err?.stack);
148142
if (this._retry < this._maxRetries) {
149143
this._retry++;
@@ -160,12 +154,12 @@ export class FlagdWebProvider implements Provider {
160154
private async fetchAll(context: EvaluationContext) {
161155
const transformedContext = this.transformContext(context);
162156
const allResolved = await this._promiseClient.resolveAll({ context: transformedContext });
163-
this._flags = Object.keys(allResolved.flags).reduce((accumuated, currentKey) => {
157+
this._flags = Object.keys(allResolved.flags).reduce((accumulated, currentKey) => {
164158
const resolved = allResolved.flags[currentKey];
165159
// reducer to store the resolved bulk response in a map of ResolutionDetails,
166160
// with an addition annotation for the type (typeof AnyFlag.prototype.value.case)
167161
return {
168-
...accumuated,
162+
...accumulated,
169163
[currentKey]: {
170164
type: resolved.value.case,
171165
reason: resolved.reason,

0 commit comments

Comments
 (0)