Skip to content

Commit 2080024

Browse files
committed
fixup: upgarding test-harnes
Signed-off-by: Simon Schrottner <[email protected]>
1 parent 5f51211 commit 2080024

File tree

15 files changed

+83
-63
lines changed

15 files changed

+83
-63
lines changed

libs/providers/flagd/src/e2e/step-definitions/configSteps.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,9 @@ export const configSteps: Steps = (state: State) => {
3838
expect(configElement).toBe(expected);
3939
},
4040
);
41+
42+
then('we should have an error', () => {
43+
44+
});
4145
};
4246
};

libs/providers/flagd/src/e2e/step-definitions/eventSteps.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,25 @@ export const eventSteps: Steps =
3434
then(/^the (.*) event handler should have been executed$/, async (type: string) => {
3535
await waitFor(() => expect(state.events.find((value) => value.type == type)).toBeDefined(), { timeout: 20000 });
3636
expect(state.events.find((value) => value.type == type)).toBeDefined();
37-
state.events = state.events.filter((a) => a.type !== type);
37+
state.events = [];
3838
});
3939

4040
then(/^the (.*) event handler should have been executed within (\d+)ms$/, async (type: string, ms: number) => {
4141
await waitFor(() => expect(state.events.find((value) => value.type == type)).toBeDefined(), { timeout: ms });
4242
const actual = state.events.find((value) => value.type == type);
4343
expect(actual).toBeDefined();
44-
state.events = state.events.filter((a) => a.type !== type);
44+
state.events = [];
4545
console.error('here bin cih');
4646
});
4747

48-
when(/^a (.*) event was fired$/, () => {});
48+
when(/^a (.*) event was fired$/, async (type: string) => {
49+
await waitFor(() => expect(state.events.find((value) => value.type == type)), { timeout: 2000 });
50+
expect(state.events.find((value) => value.type == type)).toBeDefined();
51+
state.events = [];
52+
});
53+
54+
then('the flag should be part of the event payload', async () => {
55+
await waitFor(() => expect(state.events.find((value) => value.type == 'change')), { timeout: 2000 });
56+
state.events = [];
57+
});
4958
};

libs/providers/flagd/src/e2e/step-definitions/flagSteps.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,4 @@ export const flagSteps: Steps =
6464
then(/^the variant should be "(.*)"$/, (arg0) => {
6565
expect(state.details?.variant).toBe(arg0);
6666
});
67-
when('the flag was modified', async () => {
68-
await waitFor(
69-
() =>
70-
expect(
71-
state.events.find(
72-
(value) => value.type == 'change' && (value.details?.flagsChanged as string[]).includes(state.flag!.name),
73-
),
74-
).toBeDefined(),
75-
{ timeout: 5000 },
76-
);
77-
});
7867
};

libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,64 +2,59 @@ import { OpenFeature } from '@openfeature/server-sdk';
22
import { FlagdContainer } from '../tests/flagdContainer';
33
import { State, Steps } from './state';
44
import { FlagdProvider } from '../../lib/flagd-provider';
5-
6-
type Containers = Record<string, FlagdContainer> & { default: FlagdContainer };
5+
import { waitFor } from "./utils";
76

87
export const providerSteps: Steps =
98
(state: State) =>
109
({ given, when, then }) => {
11-
const containers: Containers = {
12-
default: FlagdContainer.build(),
13-
};
10+
const container: FlagdContainer = FlagdContainer.build();
1411
beforeAll(async () => {
1512
console.log('Setting flagd provider...');
1613

17-
const promises = [];
18-
19-
for (const container of Object.values(containers)) {
20-
promises.push(container.start());
21-
}
22-
23-
return Promise.all(promises);
14+
return container.start();
2415
}, 50000);
2516

2617
afterAll(async () => {
2718
await OpenFeature.close();
28-
for (const container of Object.values(containers)) {
29-
await container.stop();
30-
}
19+
await container.stop();
3120
});
3221

3322
beforeEach(async () => {
34-
const promises = [];
35-
36-
for (const container of Object.values(containers)) {
37-
promises.push(container.start());
23+
if (container.isStarted()) {
24+
return container.start();
3825
}
39-
40-
return Promise.all(promises);
26+
return Promise.resolve();
4127
}, 50000);
42-
43-
function getContainer(providerType: string): FlagdContainer {
44-
if (Object.hasOwn(containers, providerType)) {
45-
return containers[providerType];
28+
afterEach(async () => {
29+
if (state.client) {
30+
await fetch('http://' + container.getLaunchpadUrl() + '/stop');
31+
await new Promise((r) => setTimeout(r, 100));
4632
}
47-
return containers.default;
48-
}
33+
return Promise.resolve();
34+
}, 50000);
4935

5036
given(/a (.*) flagd provider/, async (providerType: string) => {
51-
const container = getContainer(providerType);
5237
const flagdOptions: Record<string, unknown> = {
5338
resolverType: state.resolverType,
39+
deadlineMs: 2000,
5440
};
41+
let type = 'default';
5542
switch (providerType) {
5643
default:
5744
flagdOptions['port'] = container.getPort(state.resolverType);
5845
break;
5946
case 'unavailable':
6047
flagdOptions['port'] = 9999;
6148
break;
49+
case 'ssl':
50+
// todo: configure properly
51+
flagdOptions['port'] = container.getPort(state.resolverType);
52+
type = 'ssl';
53+
break;
6254
}
55+
56+
await fetch('http://' + container.getLaunchpadUrl() + '/start?config=' + type);
57+
await new Promise((r) => setTimeout(r, 50));
6358
if (providerType == 'unavailable') {
6459
OpenFeature.setProvider(providerType, new FlagdProvider(flagdOptions));
6560
} else {
@@ -71,8 +66,13 @@ export const providerSteps: Steps =
7166
});
7267

7368
when(/^the connection is lost for (\d+)s$/, async (time) => {
74-
const container = getContainer(state.providerType!);
75-
await container.stop();
76-
setTimeout(() => container.start(), time * 1000);
69+
console.log('stopping flagd');
70+
await fetch('http://' + container.getLaunchpadUrl() + '/restart?seconds=' + time);
71+
await new Promise((r) => setTimeout(r, 50));
72+
});
73+
74+
when('the flag was modified', async () => {
75+
await fetch('http://' + container.getLaunchpadUrl() + '/change');
76+
await new Promise((r) => setTimeout(r, 50));
7777
});
7878
};

libs/providers/flagd/src/e2e/tests/flagdContainer.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ export class FlagdContainer extends GenericContainer {
88
private started: StartedTestContainer | undefined;
99
private stopped: StoppedTestContainer | undefined;
1010

11-
public static build(feature: string | undefined = undefined) {
12-
return new FlagdContainer(this.generateImageName(feature)).withExposedPorts(8013, 8014, 8015, 8016);
11+
public static build() {
12+
return new FlagdContainer(this.generateImageName());
1313
}
1414

1515
private constructor(image: string) {
1616
super(image);
17+
this.withExposedPorts(8080, 8013, 8014, 8015, 8016);
1718
}
1819

1920
isStarted(): boolean {
@@ -42,15 +43,15 @@ export class FlagdContainer extends GenericContainer {
4243
return containerPromise;
4344
}
4445

45-
private static generateImageName(feature: string | undefined): string {
46+
getLaunchpadUrl() {
47+
return this.started?.getHost() + ':' + this.started?.getMappedPort(8080);
48+
}
49+
50+
private static generateImageName(): string {
4651
const image = this.imageBase;
4752
const file = path.join(__dirname, './../../../../../shared/flagd-core/test-harness/', 'version.txt');
4853
const version = fs.readFileSync(file, 'utf8').trim();
49-
let featurePart = '';
50-
if (feature) {
51-
featurePart = `-${feature}`;
52-
}
53-
return `${image}${featurePart}:v${version}`;
54+
return `${image}:v${version}`;
5455
}
5556

5657
getPort(resolverType: ResolverType) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { contextSteps } from '../step-definitions/contextSteps';
1010
const steps = [providerSteps, configSteps, eventSteps, flagSteps, contextSteps];
1111

1212
jest.setTimeout(50000);
13-
describe('rpc', () => {
13+
describe('in-process', () => {
1414
const state: State = {
1515
resolverType: 'in-process',
1616
options: {},

libs/providers/flagd/src/e2e/tests/rpc.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ describe('rpc', () => {
2020
};
2121
autoBindSteps(
2222
loadFeatures(GHERKIN_FLAGD, {
23-
tagFilter: '@rpc and not @targetURI and not @customCert and not @events and not @sync and not @offline and not @grace',
23+
tagFilter:
24+
'@rpc and not @targetURI and not @customCert and not @events and not @stream and not @grace',
2425
scenarioNameTemplate: (vars) => {
2526
return `${vars.scenarioTitle} (${vars.scenarioTags.join(',')} ${vars.featureTags.join(',')})`;
2627
},

0 commit comments

Comments
 (0)