Skip to content

Commit 07e27ce

Browse files
committed
fixup: reduce code duplications
Signed-off-by: Simon Schrottner <[email protected]>
1 parent 5e5eac9 commit 07e27ce

17 files changed

+52
-55
lines changed

Diff for: libs/providers/flagd-web/src/e2e/constants.ts

+3-11
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
1-
export const FLAGD_NAME = 'flagd-web';
2-
export const E2E_CLIENT_NAME = 'e2e';
3-
4-
export const IMAGE_VERSION = 'v0.5.13';
1+
import { getGherkinTestPath } from '@openfeature/flagd-core';
52

6-
export function getGherkinTestPath(file: string, modulePath = 'test-harness/gherkin/'): string {
7-
// TODO: find a way to resolve this in a generic manner - currently this works, because of the file structure
8-
return `<rootdir>/../../../../../shared/flagd-core/${modulePath}${file}`;
9-
}
3+
export const FLAGD_NAME = 'flagd-web';
104

11-
export const GHERKIN_EVALUATION_FEATURE = getGherkinTestPath(
12-
'flagd.feature'
13-
);
5+
export const GHERKIN_EVALUATION_FEATURE = getGherkinTestPath('flagd.feature');

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
ProviderEvents,
99
StandardResolutionReasons,
1010
} from '@openfeature/web-sdk';
11-
import { E2E_CLIENT_NAME } from '../constants';
11+
import { E2E_CLIENT_NAME } from '@openfeature/flagd-core';
1212

1313
export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then }) => {
1414
let flagKey: string;
@@ -286,8 +286,8 @@ export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then })
286286
await new Promise((resolve) => setTimeout(resolve, 3000));
287287
});
288288

289-
then('the PROVIDER_CONFIGURATION_CHANGED handler must run', () => {
290-
expect(ran).toBeTruthy();
289+
then('the PROVIDER_CONFIGURATION_CHANGED handler must run', async () => {
290+
expect(await ran).toBeTruthy();
291291
});
292292

293293
and(/^the event details must indicate "(.*)" was altered$/, (flagName) => {

Diff for: libs/providers/flagd-web/src/e2e/tests/provider.spec.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import { OpenFeature } from '@openfeature/web-sdk';
33
import { GenericContainer, StartedTestContainer } from 'testcontainers';
44
import { FlagdWebProvider } from '../../lib/flagd-web-provider';
55
import { autoBindSteps, loadFeature } from 'jest-cucumber';
6-
import { E2E_CLIENT_NAME, FLAGD_NAME, GHERKIN_EVALUATION_FEATURE, IMAGE_VERSION } from '../constants';
6+
import { FLAGD_NAME, GHERKIN_EVALUATION_FEATURE } from '../constants';
77
import { flagStepDefinitions } from '../step-definitions';
8+
import { E2E_CLIENT_NAME, IMAGE_VERSION } from '@openfeature/flagd-core';
89

910
// register the flagd provider before the tests.
1011
async function setup() {
@@ -22,10 +23,7 @@ async function setup() {
2223
tls: false,
2324
maxRetries: -1,
2425
});
25-
await OpenFeature.setProviderAndWait(
26-
E2E_CLIENT_NAME,
27-
flagdWebProvider,
28-
);
26+
await OpenFeature.setProviderAndWait(E2E_CLIENT_NAME, flagdWebProvider);
2927
assert(
3028
OpenFeature.getProviderMetadata(E2E_CLIENT_NAME).name === FLAGD_NAME,
3129
new Error(

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
{
22
"extends": "../../tsconfig.json",
33
"compilerOptions": {
4-
"lib": ["ES2015", "DOM"],
4+
"lib": ["ES2022", "DOM"],
55
"outDir": "../../../dist/out-tsc",
66
"declaration": true,
77
"types": ["jest"],
88
"allowSyntheticDefaultImports": true,
9+
"allowJs" :true,
10+
"resolveJsonModule": true
911
}
1012
}

Diff for: libs/providers/flagd/src/e2e/constants.ts

+2-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
1+
import { getGherkinTestPath } from '@openfeature/flagd-core';
2+
13
export const FLAGD_NAME = 'flagd Provider';
2-
export const E2E_CLIENT_NAME = 'e2e';
34
export const UNSTABLE_CLIENT_NAME = 'unstable';
45
export const UNAVAILABLE_CLIENT_NAME = 'unavailable';
56

6-
export const IMAGE_VERSION = 'v0.5.6';
7-
8-
export function getGherkinTestPath(file: string, modulePath = 'test-harness/gherkin/'): string {
9-
// TODO: find a way to resolve this in a generic manner - currently this works, because of the file structure
10-
return `<rootdir>/../../../../../shared/flagd-core/${modulePath}${file}`;
11-
}
12-
137
export const GHERKIN_FLAGD_FEATURE = getGherkinTestPath('flagd.feature');
148
export const GHERKIN_FLAGD_JSON_EVALUATOR_FEATURE = getGherkinTestPath('flagd-json-evaluator.feature');
159
export const GHERKIN_FLAGD_RECONNECT_FEATURE = getGherkinTestPath('flagd-reconnect.feature');

Diff for: libs/providers/flagd/src/e2e/step-definitions/flag.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
ProviderEvents,
99
StandardResolutionReasons,
1010
} from '@openfeature/server-sdk';
11-
import { E2E_CLIENT_NAME } from '../constants';
11+
import { E2E_CLIENT_NAME } from '@openfeature/flagd-core';
1212

1313
export const flagStepDefinitions: StepDefinitions = ({ given, and, when, then }) => {
1414
let flagKey: string;

Diff for: libs/providers/flagd/src/e2e/step-definitions/flagd-json-evaluator.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { EvaluationContext, EvaluationDetails, OpenFeature, ProviderEvents } from '@openfeature/server-sdk';
22
import { defineFeature, loadFeature } from 'jest-cucumber';
33
import { StepsDefinitionCallbackFunction } from 'jest-cucumber/dist/src/feature-definition-creation';
4-
import { E2E_CLIENT_NAME } from '../constants';
4+
import { E2E_CLIENT_NAME } from '@openfeature/flagd-core';
55

66
export function flagdJsonEvaluator() {
77
// load the feature file.

Diff for: libs/providers/flagd/src/e2e/step-definitions/reconnect.ts

+11-5
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,17 @@ export const reconnectStepDefinitions: StepDefinitions = ({ given, and, when, th
1212
let readyRunCount = 0;
1313
let errorHandlerRun = 0;
1414

15+
/**
16+
* This describe block and retry settings are calibrated to gRPC's retry time
17+
* and our testing container's restart cadence.
18+
*/
19+
const retryTimes = 240;
20+
jest.retryTimes(retryTimes);
21+
const retryDelayMs = 5000;
22+
1523
beforeAll((done) => {
1624
client.addHandler(ProviderEvents.Ready, () => {
25+
readyRunCount++;
1726
done();
1827
});
1928
});
@@ -23,20 +32,17 @@ export const reconnectStepDefinitions: StepDefinitions = ({ given, and, when, th
2332
errorRunCount++;
2433
});
2534

26-
client.addHandler(ProviderEvents.Ready, () => {
27-
readyRunCount++;
28-
});
2935
});
3036
then('the PROVIDER_READY handler must run when the provider connects', async () => {
3137
// should already be at 1 from `beforeAll`
3238
expect(readyRunCount).toEqual(1);
3339
});
3440
and("the PROVIDER_ERROR handler must run when the provider's connection is lost", async () => {
35-
await new Promise((resolve) => setTimeout(resolve, 10000));
41+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
3642
expect(errorRunCount).toBeGreaterThan(0);
3743
});
3844
and('when the connection is reestablished the PROVIDER_READY handler must run again', async () => {
39-
await new Promise((resolve) => setTimeout(resolve, 10000));
45+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
4046
expect(readyRunCount).toBeGreaterThan(1);
4147
});
4248
when('a flagd provider is set and initialization is awaited', () => {

Diff for: libs/providers/flagd/src/e2e/tests/in-process-reconnect.spec.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { FlagdProvider } from '../../lib/flagd-provider';
44
import { GenericContainer, StartedTestContainer } from 'testcontainers';
55
import { autoBindSteps, loadFeature } from 'jest-cucumber';
66
import {
7-
UNSTABLE_CLIENT_NAME,
8-
UNAVAILABLE_CLIENT_NAME,
97
FLAGD_NAME,
108
GHERKIN_FLAGD_RECONNECT_FEATURE,
11-
IMAGE_VERSION,
9+
UNAVAILABLE_CLIENT_NAME,
10+
UNSTABLE_CLIENT_NAME,
1211
} from '../constants';
12+
import { IMAGE_VERSION } from '@openfeature/flagd-core';
1313
import { reconnectStepDefinitions } from '../step-definitions';
1414

1515
// register the flagd provider before the tests.
@@ -21,7 +21,7 @@ async function setup() {
2121
.withExposedPorts(9090)
2222
.start();
2323
containers.push(unstable);
24-
OpenFeature.setProvider(
24+
await OpenFeature.setProviderAndWait(
2525
UNSTABLE_CLIENT_NAME,
2626
new FlagdProvider({ resolverType: 'in-process', host: 'localhost', port: unstable.getFirstMappedPort() }),
2727
);
@@ -52,6 +52,7 @@ async function setup() {
5252
}
5353

5454
jest.setTimeout(30000);
55+
5556
describe('in process', () => {
5657
let containers: StartedTestContainer[] = [];
5758
beforeAll(async () => {

Diff for: libs/providers/flagd/src/e2e/tests/in-process.spec.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import { FlagdProvider } from '../../lib/flagd-provider';
44
import { GenericContainer, StartedTestContainer } from 'testcontainers';
55
import { autoBindSteps, loadFeature } from 'jest-cucumber';
66
import {
7-
E2E_CLIENT_NAME,
87
FLAGD_NAME,
98
GHERKIN_EVALUATION_FEATURE,
109
GHERKIN_FLAGD_FEATURE,
1110
GHERKIN_FLAGD_JSON_EVALUATOR_FEATURE,
12-
IMAGE_VERSION,
1311
} from '../constants';
1412
import { flagStepDefinitions } from '../step-definitions';
13+
import { E2E_CLIENT_NAME, IMAGE_VERSION } from '@openfeature/flagd-core';
1514

1615
// register the flagd provider before the tests.
1716
async function setup() {
@@ -23,7 +22,7 @@ async function setup() {
2322
.withExposedPorts(9090)
2423
.start();
2524
containers.push(stable);
26-
await OpenFeature.setProviderAndWait(
25+
OpenFeature.setProvider(
2726
E2E_CLIENT_NAME,
2827
new FlagdProvider({ resolverType: 'in-process', host: 'localhost', port: stable.getFirstMappedPort() }),
2928
);

Diff for: libs/providers/flagd/src/e2e/tests/rpc-reconnect.spec.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import { FlagdProvider } from '../../lib/flagd-provider';
44
import { GenericContainer, StartedTestContainer } from 'testcontainers';
55
import { autoBindSteps, loadFeature } from 'jest-cucumber';
66
import {
7-
UNSTABLE_CLIENT_NAME,
8-
UNAVAILABLE_CLIENT_NAME,
97
FLAGD_NAME,
108
GHERKIN_FLAGD_RECONNECT_FEATURE,
11-
IMAGE_VERSION,
9+
UNAVAILABLE_CLIENT_NAME,
10+
UNSTABLE_CLIENT_NAME,
1211
} from '../constants';
1312
import { reconnectStepDefinitions } from '../step-definitions';
13+
import { IMAGE_VERSION } from '@openfeature/flagd-core';
1414

1515
// register the flagd provider before the tests.
1616
async function setup() {

Diff for: libs/providers/flagd/src/e2e/tests/rpc.spec.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ import { FlagdProvider } from '../../lib/flagd-provider';
44
import { GenericContainer, StartedTestContainer } from 'testcontainers';
55
import { autoBindSteps, loadFeature } from 'jest-cucumber';
66
import {
7-
E2E_CLIENT_NAME,
87
FLAGD_NAME,
98
GHERKIN_EVALUATION_FEATURE,
109
GHERKIN_FLAGD_FEATURE,
1110
GHERKIN_FLAGD_JSON_EVALUATOR_FEATURE,
12-
IMAGE_VERSION,
1311
} from '../constants';
12+
import { E2E_CLIENT_NAME, IMAGE_VERSION } from '@openfeature/flagd-core';
1413
import { flagStepDefinitions } from '../step-definitions';
1514

1615
// register the flagd provider before the tests.
@@ -22,10 +21,7 @@ async function setup() {
2221
.withExposedPorts(8013)
2322
.start();
2423
containers.push(stable);
25-
await OpenFeature.setProviderAndWait(
26-
E2E_CLIENT_NAME,
27-
new FlagdProvider({ cache: 'disabled', port: stable.getFirstMappedPort() }),
28-
);
24+
OpenFeature.setProvider(E2E_CLIENT_NAME, new FlagdProvider({ cache: 'disabled', port: stable.getFirstMappedPort() }));
2925

3026
assert(
3127
OpenFeature.getProviderMetadata(E2E_CLIENT_NAME).name === FLAGD_NAME,

Diff for: libs/shared/flagd-core/package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: libs/shared/flagd-core/src/e2e/index.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export const E2E_CLIENT_NAME = 'e2e';
2+
3+
export const IMAGE_VERSION = 'v0.5.13';
4+
5+
export function getGherkinTestPath(file: string, modulePath = 'test-harness/gherkin/'): string {
6+
// TODO: find a way to resolve this in a generic manner - currently this works, because of the file structure
7+
return `<rootdir>/../../../../../shared/flagd-core/${modulePath}${file}`;
8+
}

Diff for: libs/shared/flagd-core/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './lib/flagd-core';
22
export * from './lib/feature-flag';
33
export * from './lib/storage';
4+
export * from './e2e';

Diff for: libs/shared/flagd-core/tsconfig.lib.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
"types": []
77
},
88
"include": ["src/**/*.ts"],
9-
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
9+
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "src/e2e"]
1010
}

Diff for: libs/shared/flagd-core/tsconfig.spec.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
"module": "commonjs",
66
"types": ["jest", "node"]
77
},
8-
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
8+
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts", "src/e2e"]
99
}

0 commit comments

Comments
 (0)