From 530f3a6fca57614b4487018fd86f4d21d33280ff Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Fri, 29 Dec 2023 23:23:39 +0530 Subject: [PATCH 01/11] adds in-memory provider for server e2e suite Signed-off-by: Mohamed V J --- jest.config.ts | 1 - .../server/e2e/step-definitions/evaluation.spec.ts | 4 ++-- packages/server/e2e/step-definitions/setup.ts | 14 -------------- 3 files changed, 2 insertions(+), 17 deletions(-) delete mode 100644 packages/server/e2e/step-definitions/setup.ts diff --git a/jest.config.ts b/jest.config.ts index eeacc3aa8..9154ef75f 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -138,7 +138,6 @@ export default { preset: 'ts-jest', testMatch: ['/packages/server/e2e/**/*.spec.ts'], modulePathIgnorePatterns: ['.*/node-modules/'], - setupFiles: ['/packages/server/e2e/step-definitions/setup.ts'], moduleNameMapper: { '@openfeature/core': '/packages/shared/src', }, diff --git a/packages/server/e2e/step-definitions/evaluation.spec.ts b/packages/server/e2e/step-definitions/evaluation.spec.ts index 1794ffdb0..d75fd1220 100644 --- a/packages/server/e2e/step-definitions/evaluation.spec.ts +++ b/packages/server/e2e/step-definitions/evaluation.spec.ts @@ -8,7 +8,7 @@ import { StandardResolutionReasons, ProviderEvents, } from '@openfeature/core'; -import { OpenFeature } from '../..'; +import { OpenFeature, InMemoryProvider } from '../..'; // load the feature file. const feature = loadFeature('packages/server/e2e/features/evaluation.feature'); @@ -18,7 +18,7 @@ const client = OpenFeature.getClient(); const givenAnOpenfeatureClientIsRegisteredWithCacheDisabled = ( given: (stepMatcher: string, stepDefinitionCallback: () => void) => void ) => { - // TODO: when the FlagdProvider is updated to support caching, we may need to disable it here for this test to work as expected. + OpenFeature.setProvider(new InMemoryProvider()); given('a provider is registered with cache disabled', () => undefined); }; diff --git a/packages/server/e2e/step-definitions/setup.ts b/packages/server/e2e/step-definitions/setup.ts deleted file mode 100644 index 850b598e9..000000000 --- a/packages/server/e2e/step-definitions/setup.ts +++ /dev/null @@ -1,14 +0,0 @@ -import assert from 'assert'; -import { OpenFeature } from '../..'; -import { FlagdProvider } from '@openfeature/flagd-provider'; - -const FLAGD_NAME = 'flagd Provider'; - -// register the flagd provider before the tests. -console.log('Setting flagd provider...'); -OpenFeature.setProvider(new FlagdProvider({ cache: 'disabled' })); -assert( - OpenFeature.providerMetadata.name === FLAGD_NAME, - new Error(`Expected ${FLAGD_NAME} provider to be configured, instead got: ${OpenFeature.providerMetadata.name}`) -); -console.log('flagd provider configured!'); From 9b8edf304a79bd3e81d5982611af0d376ad64b95 Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Fri, 29 Dec 2023 23:28:46 +0530 Subject: [PATCH 02/11] adds in-memory provider for client e2e suite Signed-off-by: Mohamed V J --- jest.config.ts | 1 - .../e2e/step-definitions/evaluation.spec.ts | 3 ++- packages/client/e2e/step-definitions/setup.ts | 19 ------------------- 3 files changed, 2 insertions(+), 21 deletions(-) delete mode 100644 packages/client/e2e/step-definitions/setup.ts diff --git a/jest.config.ts b/jest.config.ts index 9154ef75f..0d1d2e2a6 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -148,7 +148,6 @@ export default { preset: 'ts-jest', testMatch: ['/packages/client/e2e/**/*.spec.ts'], modulePathIgnorePatterns: ['.*/node-modules/'], - setupFiles: ['/packages/client/e2e/step-definitions/setup.ts'], moduleNameMapper: { '^uuid$': require.resolve('uuid'), '^(.*)\\.js$': ['$1', '$1.js'], diff --git a/packages/client/e2e/step-definitions/evaluation.spec.ts b/packages/client/e2e/step-definitions/evaluation.spec.ts index 017661b71..99575db40 100644 --- a/packages/client/e2e/step-definitions/evaluation.spec.ts +++ b/packages/client/e2e/step-definitions/evaluation.spec.ts @@ -7,7 +7,7 @@ import { ResolutionDetails, StandardResolutionReasons, } from '@openfeature/core'; -import { OpenFeature, ProviderEvents } from '../..'; +import { OpenFeature, ProviderEvents, InMemoryProvider } from '../../src'; // load the feature file. const feature = loadFeature('packages/client/e2e/features/evaluation.feature'); @@ -17,6 +17,7 @@ const client = OpenFeature.getClient(); const givenAnOpenfeatureClientIsRegisteredWithCacheDisabled = ( given: (stepMatcher: string, stepDefinitionCallback: () => void) => void ) => { + OpenFeature.setProvider(new InMemoryProvider()); given('a provider is registered with cache disabled', () => undefined); }; diff --git a/packages/client/e2e/step-definitions/setup.ts b/packages/client/e2e/step-definitions/setup.ts deleted file mode 100644 index 5f2256731..000000000 --- a/packages/client/e2e/step-definitions/setup.ts +++ /dev/null @@ -1,19 +0,0 @@ -import assert from 'assert'; -import { OpenFeature } from '../..'; -import { FlagdWebProvider } from '@openfeature/flagd-web-provider'; - -const FLAGD_WEB_NAME = 'flagd-web'; - -// register the flagd provider before the tests. -console.log('Setting flagd web provider...'); -OpenFeature.setProvider(new FlagdWebProvider({ - host: 'localhost', - port: 8013, - tls: false, - maxRetries: -1, -})); -assert( - OpenFeature.providerMetadata.name === FLAGD_WEB_NAME, - new Error(`Expected ${FLAGD_WEB_NAME} provider to be configured, instead got: ${OpenFeature.providerMetadata.name}`) -); -console.log('flagd web provider configured!'); From a9baf3c617fec0867b14fa799921d1056f3d79f4 Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Fri, 29 Dec 2023 23:29:08 +0530 Subject: [PATCH 03/11] removed unwanted jest config Signed-off-by: Mohamed V J --- .../server/e2e/step-definitions/jest.config.ts | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 packages/server/e2e/step-definitions/jest.config.ts diff --git a/packages/server/e2e/step-definitions/jest.config.ts b/packages/server/e2e/step-definitions/jest.config.ts deleted file mode 100644 index c56a4ed00..000000000 --- a/packages/server/e2e/step-definitions/jest.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -export default { - clearMocks: true, - collectCoverage: true, - coverageDirectory: 'coverage', - coverageProvider: 'v8', - globals: { - 'ts-jest': { - tsConfig: 'e2e/step-definitions/tsconfig.json', - }, - }, - moduleNameMapper: { - '^(.*)\\.js$': ['$1', '$1.js'], - }, - setupFiles: ['./setup.ts'], - preset: 'ts-jest', -}; From 9be49e4a201ccd9e42583fab7358bfb4d2819c26 Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Fri, 29 Dec 2023 23:31:42 +0530 Subject: [PATCH 04/11] corrected path Signed-off-by: Mohamed V J --- packages/client/e2e/step-definitions/evaluation.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/e2e/step-definitions/evaluation.spec.ts b/packages/client/e2e/step-definitions/evaluation.spec.ts index 99575db40..afd41c57f 100644 --- a/packages/client/e2e/step-definitions/evaluation.spec.ts +++ b/packages/client/e2e/step-definitions/evaluation.spec.ts @@ -7,7 +7,7 @@ import { ResolutionDetails, StandardResolutionReasons, } from '@openfeature/core'; -import { OpenFeature, ProviderEvents, InMemoryProvider } from '../../src'; +import { OpenFeature, ProviderEvents, InMemoryProvider } from '../..'; // load the feature file. const feature = loadFeature('packages/client/e2e/features/evaluation.feature'); From 101fba107975ee942142526fef728e0af5c4b422 Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Wed, 3 Jan 2024 21:05:30 +0530 Subject: [PATCH 05/11] Fixed e2e test by configuring correct flags to the provider Signed-off-by: Mohamed V J --- .../e2e/step-definitions/evaluation.spec.ts | 8 +- .../e2e/step-definitions/flags-config.ts | 80 +++++++++++++++++++ .../e2e/step-definitions/evaluation.spec.ts | 5 +- .../e2e/step-definitions/flags-config.ts | 80 +++++++++++++++++++ 4 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 packages/client/e2e/step-definitions/flags-config.ts create mode 100644 packages/server/e2e/step-definitions/flags-config.ts diff --git a/packages/client/e2e/step-definitions/evaluation.spec.ts b/packages/client/e2e/step-definitions/evaluation.spec.ts index afd41c57f..3841f2483 100644 --- a/packages/client/e2e/step-definitions/evaluation.spec.ts +++ b/packages/client/e2e/step-definitions/evaluation.spec.ts @@ -8,6 +8,7 @@ import { StandardResolutionReasons, } from '@openfeature/core'; import { OpenFeature, ProviderEvents, InMemoryProvider } from '../..'; +import flagConfiguration from './flags-config'; // load the feature file. const feature = loadFeature('packages/client/e2e/features/evaluation.feature'); @@ -17,7 +18,7 @@ const client = OpenFeature.getClient(); const givenAnOpenfeatureClientIsRegisteredWithCacheDisabled = ( given: (stepMatcher: string, stepDefinitionCallback: () => void) => void ) => { - OpenFeature.setProvider(new InMemoryProvider()); + OpenFeature.setProvider(new InMemoryProvider(flagConfiguration)); given('a provider is registered with cache disabled', () => undefined); }; @@ -71,10 +72,11 @@ defineFeature(feature, (test) => { givenAnOpenfeatureClientIsRegisteredWithCacheDisabled(given); + when( /^an integer flag with key "(.*)" is evaluated with default value (\d+)$/, - (key: string, defaultValue: number) => { - value = client.getNumberValue(key, defaultValue); + (key: string, defaultValue: string) => { + value = client.getNumberValue(key, Number.parseInt(defaultValue)); } ); diff --git a/packages/client/e2e/step-definitions/flags-config.ts b/packages/client/e2e/step-definitions/flags-config.ts new file mode 100644 index 000000000..ad3b7c207 --- /dev/null +++ b/packages/client/e2e/step-definitions/flags-config.ts @@ -0,0 +1,80 @@ +export default { + 'boolean-flag': { + disabled: false, + variants: { + on: true, + off: false, + }, + defaultVariant: 'on', + }, + 'string-flag': { + disabled: false, + variants: { + greeting: 'hi', + parting: 'bye', + }, + defaultVariant: 'greeting', + }, + 'integer-flag': { + disabled: false, + variants: { + one: 1, + ten: 10, + }, + defaultVariant: 'ten', + }, + 'float-flag': { + disabled: false, + variants: { + tenth: 0.1, + half: 0.5, + }, + defaultVariant: 'half', + }, + 'object-flag': { + disabled: false, + variants: { + empty: {}, + template: { + showImages: true, + title: 'Check out these pics!', + imagesPerPage: 100, + }, + }, + defaultVariant: 'template', + }, + 'context-aware': { + disabled: false, + variants: { + internal: 'INTERNAL', + external: 'EXTERNAL', + }, + defaultVariant: 'external', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + contextEvaluator(ctx: any) { + const { fn, ln, age, customer } = ctx; + if (fn === 'Sulisław' && ln === 'Świętopełk' && age === 29 && customer === false) { + return 'internal'; + } else { + return 'external'; + } + }, + }, + 'timestamp-flag': { + disabled: false, + variants: { + past: -1, + future: 1, + none: 0, + }, + defaultVariant: 'none', + }, + 'wrong-flag': { + disabled: false, + variants: { + one: 'uno', + two: 'dos', + }, + defaultVariant: 'one', + }, +}; diff --git a/packages/server/e2e/step-definitions/evaluation.spec.ts b/packages/server/e2e/step-definitions/evaluation.spec.ts index d75fd1220..a158b1e2a 100644 --- a/packages/server/e2e/step-definitions/evaluation.spec.ts +++ b/packages/server/e2e/step-definitions/evaluation.spec.ts @@ -9,6 +9,7 @@ import { ProviderEvents, } from '@openfeature/core'; import { OpenFeature, InMemoryProvider } from '../..'; +import flagConfiguration from './flags-config'; // load the feature file. const feature = loadFeature('packages/server/e2e/features/evaluation.feature'); @@ -18,7 +19,9 @@ const client = OpenFeature.getClient(); const givenAnOpenfeatureClientIsRegisteredWithCacheDisabled = ( given: (stepMatcher: string, stepDefinitionCallback: () => void) => void ) => { - OpenFeature.setProvider(new InMemoryProvider()); + OpenFeature.setProvider( + new InMemoryProvider(flagConfiguration), + ); given('a provider is registered with cache disabled', () => undefined); }; diff --git a/packages/server/e2e/step-definitions/flags-config.ts b/packages/server/e2e/step-definitions/flags-config.ts new file mode 100644 index 000000000..ad3b7c207 --- /dev/null +++ b/packages/server/e2e/step-definitions/flags-config.ts @@ -0,0 +1,80 @@ +export default { + 'boolean-flag': { + disabled: false, + variants: { + on: true, + off: false, + }, + defaultVariant: 'on', + }, + 'string-flag': { + disabled: false, + variants: { + greeting: 'hi', + parting: 'bye', + }, + defaultVariant: 'greeting', + }, + 'integer-flag': { + disabled: false, + variants: { + one: 1, + ten: 10, + }, + defaultVariant: 'ten', + }, + 'float-flag': { + disabled: false, + variants: { + tenth: 0.1, + half: 0.5, + }, + defaultVariant: 'half', + }, + 'object-flag': { + disabled: false, + variants: { + empty: {}, + template: { + showImages: true, + title: 'Check out these pics!', + imagesPerPage: 100, + }, + }, + defaultVariant: 'template', + }, + 'context-aware': { + disabled: false, + variants: { + internal: 'INTERNAL', + external: 'EXTERNAL', + }, + defaultVariant: 'external', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + contextEvaluator(ctx: any) { + const { fn, ln, age, customer } = ctx; + if (fn === 'Sulisław' && ln === 'Świętopełk' && age === 29 && customer === false) { + return 'internal'; + } else { + return 'external'; + } + }, + }, + 'timestamp-flag': { + disabled: false, + variants: { + past: -1, + future: 1, + none: 0, + }, + defaultVariant: 'none', + }, + 'wrong-flag': { + disabled: false, + variants: { + one: 'uno', + two: 'dos', + }, + defaultVariant: 'one', + }, +}; From daa48ff194d0ace8f8b33f5077696df857cf26dc Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Wed, 3 Jan 2024 21:06:02 +0530 Subject: [PATCH 06/11] removed unwanted service in e2e workflow Signed-off-by: Mohamed V J --- .github/workflows/pr-checks.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/pr-checks.yaml b/.github/workflows/pr-checks.yaml index 69d53fa9a..f5290655a 100644 --- a/.github/workflows/pr-checks.yaml +++ b/.github/workflows/pr-checks.yaml @@ -65,12 +65,6 @@ jobs: e2e: runs-on: ubuntu-latest - services: - flagd: - image: ghcr.io/open-feature/flagd-testbed:latest - ports: - - 8013:8013 - steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 From 228f9fb77ffecd9e755d99ef7ee320cf46dc8333 Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Wed, 3 Jan 2024 21:13:07 +0530 Subject: [PATCH 07/11] updated readme Signed-off-by: Mohamed V J --- CONTRIBUTING.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1d7335586..16f5a9996 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,11 +30,7 @@ Run tests with `npm test`. ### End-to-End Tests -The continuous integration runs a set of [gherkin e2e tests](https://github.com/open-feature/test-harness/blob/main/features/evaluation.feature) using [`flagd`](https://github.com/open-feature/flagd). These tests run with the "e2e" npm script. If you'd like to run them locally, you can start the flagd testbed with -``` -docker run -p 8013:8013 ghcr.io/open-feature/flagd-testbed:latest -``` -and then run +The continuous integration runs a set of [gherkin e2e tests](https://github.com/open-feature/test-harness/blob/main/features/evaluation.feature) using in-memory provider. These tests run with the "e2e" npm script. If you'd like to run ``` npm run e2e-server ``` From 82e6d0c7971819451e295154dc4e6deb3deaafe9 Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Thu, 4 Jan 2024 01:38:08 +0530 Subject: [PATCH 08/11] Removed unwanted flag config Signed-off-by: Mohamed V J --- packages/client/e2e/step-definitions/flags-config.ts | 9 --------- packages/server/e2e/step-definitions/flags-config.ts | 9 --------- 2 files changed, 18 deletions(-) diff --git a/packages/client/e2e/step-definitions/flags-config.ts b/packages/client/e2e/step-definitions/flags-config.ts index ad3b7c207..17956b13f 100644 --- a/packages/client/e2e/step-definitions/flags-config.ts +++ b/packages/client/e2e/step-definitions/flags-config.ts @@ -60,15 +60,6 @@ export default { } }, }, - 'timestamp-flag': { - disabled: false, - variants: { - past: -1, - future: 1, - none: 0, - }, - defaultVariant: 'none', - }, 'wrong-flag': { disabled: false, variants: { diff --git a/packages/server/e2e/step-definitions/flags-config.ts b/packages/server/e2e/step-definitions/flags-config.ts index ad3b7c207..17956b13f 100644 --- a/packages/server/e2e/step-definitions/flags-config.ts +++ b/packages/server/e2e/step-definitions/flags-config.ts @@ -60,15 +60,6 @@ export default { } }, }, - 'timestamp-flag': { - disabled: false, - variants: { - past: -1, - future: 1, - none: 0, - }, - defaultVariant: 'none', - }, 'wrong-flag': { disabled: false, variants: { From e367d0d60b7d0db6cd12f238ff5025771b565451 Mon Sep 17 00:00:00 2001 From: Mohamed V J Date: Thu, 4 Jan 2024 01:43:16 +0530 Subject: [PATCH 09/11] Update CONTRIBUTING.md file Signed-off-by: Mohamed V J --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 16f5a9996..0fb4e5159 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,7 +30,7 @@ Run tests with `npm test`. ### End-to-End Tests -The continuous integration runs a set of [gherkin e2e tests](https://github.com/open-feature/test-harness/blob/main/features/evaluation.feature) using in-memory provider. These tests run with the "e2e" npm script. If you'd like to run +The continuous integration runs a set of [gherkin e2e tests](https://github.com/open-feature/test-harness/blob/main/features/evaluation.feature) using in-memory provider. These tests run with the "e2e" npm script. If you'd like to run them locally, follow the steps below: ``` npm run e2e-server ``` From 84e19b173e670a8ccdcca1adb432e69c0e1a6f7a Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Fri, 5 Jan 2024 12:25:18 -0500 Subject: [PATCH 10/11] Update packages/server/e2e/step-definitions/evaluation.spec.ts Signed-off-by: Todd Baert --- packages/server/e2e/step-definitions/evaluation.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/e2e/step-definitions/evaluation.spec.ts b/packages/server/e2e/step-definitions/evaluation.spec.ts index a158b1e2a..957bd8fa9 100644 --- a/packages/server/e2e/step-definitions/evaluation.spec.ts +++ b/packages/server/e2e/step-definitions/evaluation.spec.ts @@ -8,7 +8,7 @@ import { StandardResolutionReasons, ProviderEvents, } from '@openfeature/core'; -import { OpenFeature, InMemoryProvider } from '../..'; +import { OpenFeature, InMemoryProvider } from '../../src'; import flagConfiguration from './flags-config'; // load the feature file. const feature = loadFeature('packages/server/e2e/features/evaluation.feature'); From 519c4465d798fb240096940fd175482a6d721722 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Fri, 5 Jan 2024 12:25:40 -0500 Subject: [PATCH 11/11] Update packages/client/e2e/step-definitions/evaluation.spec.ts Signed-off-by: Todd Baert --- packages/client/e2e/step-definitions/evaluation.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/e2e/step-definitions/evaluation.spec.ts b/packages/client/e2e/step-definitions/evaluation.spec.ts index 3841f2483..f03e76801 100644 --- a/packages/client/e2e/step-definitions/evaluation.spec.ts +++ b/packages/client/e2e/step-definitions/evaluation.spec.ts @@ -7,7 +7,7 @@ import { ResolutionDetails, StandardResolutionReasons, } from '@openfeature/core'; -import { OpenFeature, ProviderEvents, InMemoryProvider } from '../..'; +import { OpenFeature, ProviderEvents, InMemoryProvider } from '../../src'; import flagConfiguration from './flags-config'; // load the feature file. const feature = loadFeature('packages/client/e2e/features/evaluation.feature');