diff --git a/package-lock.json b/package-lock.json index 56c760b..681cf36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "featuretoggle-react", - "version": "0.4.2", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 652e6ab..013ce49 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "featuretoggle-react", - "version": "0.4.2", + "version": "1.0.0", "description": "Library to use Feature Toggles of your choice in a React application", "main": "lib/", "scripts": { "build": "rm -rf lib && ./node_modules/.bin/babel src/ -d lib/", - "postinstall": "cd test_setup && yarn", + "prepare-test": "cd test_setup && yarn", "lint": "./node_modules/.bin/eslint src --ext .js", - "test": "yarn lint && jest" + "test": "yarn prepare-test && yarn lint && jest" }, "files": [ "lib", @@ -67,6 +67,7 @@ "moduleDirectories": [ "node_modules", "test_setup/node_modules" - ] + ], + "testEnvironment": "jsdom" } } diff --git a/src/Clients/optimizely.test.js b/src/Clients/optimizely.test.js index 02fc358..f553605 100644 --- a/src/Clients/optimizely.test.js +++ b/src/Clients/optimizely.test.js @@ -1,5 +1,30 @@ +import optimizelySDK from '@optimizely/optimizely-sdk'; import { optimizelyClient } from './optimizely'; +const config = { + sdkKey: 'abscdef', + audience: 'some_audience', +}; +const flags = [ + 'feature1', + 'feature2', +]; + +jest.spyOn(optimizelySDK, 'createInstance').mockImplementation(() => ({ + onReady: () => ({ + then: (callBack) => callBack(), + }), + getEnabledFeatures: () => flags, +})); + describe('Optimizely client', () => { - it('init passes flags to handler', () => {}); + it('init passes flags to handler', () => { + const handler = jest.fn(); + const client = optimizelyClient(config); + client.init(handler); + + expect(handler) + .toHaveBeenCalledWith({ feature1: true, feature2: true } + ); + }); }); diff --git a/src/FeatureToggle.test.js b/src/FeatureToggle.test.js new file mode 100644 index 0000000..9ac9767 --- /dev/null +++ b/src/FeatureToggle.test.js @@ -0,0 +1,77 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { + FeatureToggleWrapper, + FeatureToggle, +} from './FeatureToggle'; +import { On } from './On'; + +const flags = { + feature1: true, + feature2: false, +}; + +const handler = jest.fn(); + +const provider = { + init: () => handler(flags), +}; + +describe('FeatureToggle', () => { + it('calls provider.init on mount', () => { + mount( + + + + ); + + expect(handler) + .toHaveBeenCalledWith({ feature1: true, feature2: false }); + }); + + it('returns children when a feature is defined', () => { + const wrapper = mount( + + + + + + ); + + expect(wrapper + .find(On).length) + .toEqual(1); + }); + + it('returns empty when no feature defined', () => { + const wrapper = mount( + + + + + + ); + + expect(wrapper + .find(On).length) + .toEqual(0); + }); + + it('passes featureToggleEnabled to child', () => { + const nonMockedProvider = { + init: (nonMockedhandler) => nonMockedhandler(flags), + }; + const wrapper = mount( + + + + + + ); + + expect(wrapper + .find(On) + .props()) + .toEqual({ featureToggleEnabled: true }); + }); +}); diff --git a/test_setup/package.json b/test_setup/package.json index ea8375d..dc49f5a 100644 --- a/test_setup/package.json +++ b/test_setup/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^16.8.0", + "react-dom": "^16.8.0" } } diff --git a/test_setup/yarn.lock b/test_setup/yarn.lock index 347c5c2..b273ec9 100644 --- a/test_setup/yarn.lock +++ b/test_setup/yarn.lock @@ -7,7 +7,7 @@ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -loose-envify@^1.1.0: +loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -19,27 +19,43 @@ object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +react-dom@^16.8.0: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - scheduler "^0.20.2" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^16.8.0: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" + prop-types "^15.6.2" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1"