Skip to content

Commit

Permalink
Add cucumber integration tests
Browse files Browse the repository at this point in the history
Signed-off-by: Todd Baert <[email protected]>
  • Loading branch information
toddbaert committed Jul 14, 2022
1 parent 8fc41b6 commit 4a3046f
Show file tree
Hide file tree
Showing 10 changed files with 4,214 additions and 342 deletions.
9 changes: 5 additions & 4 deletions .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,11 @@
"check-file/filename-naming-convention":[
"error",
{
"*.spec.{js,ts}":"*",
"**/jest.config.ts":"*",
"*.{js,ts}":"KEBAB_CASE"
}
"**/*.{js,ts}":"KEBAB_CASE"
},
{
"ignoreMiddleExtensions": true
}
]
}
}
13 changes: 11 additions & 2 deletions .github/workflows/pr-checks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,27 @@ jobs:
build-test-lint:
runs-on: ubuntu-latest

services:
flagd:
image: ghcr.io/open-feature/flagd-testbed:latest
ports:
- 8080:8080

steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3

- name: Install
run: npm ci

- name: Build
run: npm run build

- name: Lint
run: npm run lint

- name: Build
run: npm run build
- name: Integration
run: npm run integration

- name: Test
run: npm run test
Expand Down
16 changes: 16 additions & 0 deletions integration/features/evaluation.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Feature: Flag evaluation

Scenario: Resolves boolean value
Given A boolean flag called boolean-flag with value true exists
When Flag is evaluated with default value false
Then The resolved value should match the flag value

Scenario: Resolves string value
Given A string flag called string-flag with value #CC0000 exists
When Flag is evaluated with default value #0000CC
Then The resolved value should match the flag value

Scenario: Resolves number value
Given A number flag called number-flag with value 1 exists
When Flag is evaluated with default value 2
Then The resolved value should match the flag value
68 changes: 68 additions & 0 deletions integration/step-definitions/evaluation.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { defineFeature, loadFeature } from 'jest-cucumber';
import { OpenFeature } from '../../src/open-feature.js';

// load the feature file.
const feature = loadFeature('integration/features/evaluation.feature');

// get a client (flagd provider registered in setup)
const client = OpenFeature.getClient();

defineFeature(feature, (test) => {
test('Resolves boolean value', ({ given, when, then }) => {
let expectedValue: boolean;
let value: boolean;
let flagKey: string;

given(/^A boolean flag called (.*) with value (.*) exists$/, (key, value) => {
flagKey = key;
// convert to bool
expectedValue = value === 'true';
});

when(/^Flag is evaluated with default value (.*)$/, async (defaultValue) => {
value = await client.getBooleanValue(flagKey, defaultValue === 'true' ? true : false);
});

then(/^The resolved value should match the flag value$/, () => {
expect(value).toEqual(expectedValue);
});
});

test('Resolves string value', ({ given, when, then }) => {
let expectedValue: string;
let value: string;
let flagKey: string;

given(/^A string flag called (.*) with value (.*) exists$/, (key, value) => {
flagKey = key;
expectedValue = value;
});

when(/^Flag is evaluated with default value (.*)$/, async (defaultValue) => {
value = await client.getStringValue(flagKey, defaultValue);
});

then(/^The resolved value should match the flag value$/, () => {
expect(value).toEqual(expectedValue);
});
});

test('Resolves number value', ({ given, when, then }) => {
let expectedValue: number;
let value: number;
let flagKey: string;

given(/^A number flag called (.*) with value (.*) exists$/, (key, value) => {
flagKey = key;
expectedValue = Number.parseInt(value);
});

when(/^Flag is evaluated with default value (.*)$/, async (defaultValue) => {
value = await client.getNumberValue(flagKey, Number.parseInt(defaultValue));
});

then(/^The resolved value should match the flag value$/, () => {
expect(value).toEqual(expectedValue);
});
});
});
16 changes: 16 additions & 0 deletions integration/step-definitions/jest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
export default {
clearMocks: true,
collectCoverage: true,
coverageDirectory: 'coverage',
coverageProvider: 'v8',
globals: {
'ts-jest': {
tsConfig: 'integration/step-definitions/tsconfig.json',
},
},
moduleNameMapper: {
'^(.*)\\.js$': ['$1', '$1.js'],
},
setupFiles: ['./setup.ts'],
preset: 'ts-jest',
};
9 changes: 9 additions & 0 deletions integration/step-definitions/setup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { OpenFeature } from '../../src/open-feature.js';
import { FlagdRESTProvider } from '@openfeature/flagd-rest-provider';
import assert from 'assert';

// register the flagd provider before the tests.
console.log('Setting flagd provider...');
OpenFeature.setProvider(new FlagdRESTProvider());
assert(OpenFeature.providerMetadata.name === 'Flagd REST', new Error('Expected flagd provider to be configured!'));
console.log('flagd provider configured!');
8 changes: 8 additions & 0 deletions integration/step-definitions/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"moduleResolution": "node"
},
"include": ["./**/*.ts"],
"exclude": ["node_modules", "**/*.test.js"]
}
6 changes: 2 additions & 4 deletions jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export default {

// we need this so jest doesn't break with our .js naming rule.
moduleNameMapper: {
'(.*).js': '$1',
'^(.*)\\.js$': ['$1', '$1.js'],
},

// An array of regexp pattern strings used to skip coverage collection
Expand Down Expand Up @@ -129,9 +129,7 @@ export default {
// rootDir: undefined,

// A list of paths to directories that Jest should use to search for files in
// roots: [
// "<rootDir>"
// ],
roots: ['<rootDir>/test'],

// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",
Expand Down
Loading

0 comments on commit 4a3046f

Please sign in to comment.