From 5408ea51524be741406c2b3f92a16e1deb86c357 Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Tue, 20 Dec 2016 19:40:18 +0000 Subject: [PATCH 01/10] de-ordinal test stubs, deduplicate testee jsx --- test/components/FeatureFlagRenderer.test.js | 32 ++++++++++----------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/test/components/FeatureFlagRenderer.test.js b/test/components/FeatureFlagRenderer.test.js index 1f45b26..b7a73b2 100644 --- a/test/components/FeatureFlagRenderer.test.js +++ b/test/components/FeatureFlagRenderer.test.js @@ -148,10 +148,18 @@ describe("components/FeatureFlagRenderer", () => { }); describe("the _checkFeatureFlag function", () => { + + const variation = stub(); + const getWrapper = () => { + return mount( + + ); + }; before(() => { - const variation = stub(); - variation.onCall(0).returns(true); - variation.onCall(1).returns(false); const ldClientStub = stub().returns({ on: (ready, callback) => { @@ -164,26 +172,16 @@ describe("components/FeatureFlagRenderer", () => { context("when the feature flag comes back true", () => { it("sets the state", () => { - const wrapper = mount( - - ); + variation.returns(true); + const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); }); }); context("when the feature flag comes back false", () => { it("sets the state", () => { - const wrapper = mount( - - ); + variation.returns(false); + const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: false }); }); }); From cc252e2f1b862e7350a5921b6f434da9a71d42bf Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Wed, 21 Dec 2016 04:36:42 +0000 Subject: [PATCH 02/10] implement url checking, functional testing works but mocha fails --- src/components/FeatureFlagRenderer.js | 22 ++++++++++++++++++++- test/components/FeatureFlagRenderer.test.js | 17 ++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/components/FeatureFlagRenderer.js b/src/components/FeatureFlagRenderer.js index 91e9050..e086285 100644 --- a/src/components/FeatureFlagRenderer.js +++ b/src/components/FeatureFlagRenderer.js @@ -4,6 +4,8 @@ import React, { Component } from "react"; import { ldBrowserInit } from "../lib/launchDarkly"; import { FeatureFlagType } from "../types/FeatureFlag"; +const url = require('url'); + type LaunchDarklyConfig = { clientId: String, user: String @@ -62,7 +64,25 @@ export default class FeatureFlagRenderer extends Component { const showFeature = ldClient.variation(flagKey, false); const defaultState = { checkFeatureFlagComplete: true }; - if (showFeature) { + let override; + /** + * Follow this overriding convention: + * @link https://git.corp.tc/capsela/tc_feature_flagging#overriding-feature-flags + **/ + const query = url.parse(window.location.toString(), true).query; + const queryFlag = query["features." + flagKey]; + + if (typeof queryFlag !== "undefined"){ + if (queryFlag === ""){ + override = true; + } else if (queryFlag === "false"){ + override = false; + } + } + + if (typeof override !== "undefined"){ + this.setState({ showFeature: override, ...defaultState}); + } else if (showFeature) { this.setState({ showFeature: true, ...defaultState }); } else { this.setState({ showFeature: false, ...defaultState }); diff --git a/test/components/FeatureFlagRenderer.test.js b/test/components/FeatureFlagRenderer.test.js index b7a73b2..d6512c2 100644 --- a/test/components/FeatureFlagRenderer.test.js +++ b/test/components/FeatureFlagRenderer.test.js @@ -2,6 +2,7 @@ import React from "react"; import { shallow, mount } from "enzyme"; import { expect } from "chai"; import { spy, stub } from "sinon"; +import { Location } from "jsdom"; import FeatureFlagRenderer from "../../src/components/FeatureFlagRenderer"; import * as launchDarkly from "../../src/lib/launchDarkly"; @@ -161,6 +162,7 @@ describe("components/FeatureFlagRenderer", () => { }; before(() => { + window.location = Location; const ldClientStub = stub().returns({ on: (ready, callback) => { callback(); @@ -185,6 +187,21 @@ describe("components/FeatureFlagRenderer", () => { expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: false }); }); }); + + describe("query param flag overrides", () => { + it("param \"features.flag=false\" overrides LD data \"on\"", () => { + variation.returns(true); + window.location.assign("http://ab.cdef.com?features.my-test=false"); + const wrapper = getWrapper(); + expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: false }); + }); + it("param \"features.flag\" overrides LD data \"off\"", () => { + variation.returns(false); + window.location.assign("http://ab.cdef.com?features.my-test"); + const wrapper = getWrapper(); + expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); + }); + }); }); }); From 2acf5368443ea97e5ca2e07190cdd35aeb1174d7 Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Wed, 21 Dec 2016 04:51:54 +0000 Subject: [PATCH 03/10] move override logic into ld lib wrapper, and add a mock to the component tests --- src/components/FeatureFlagRenderer.js | 21 ++------------------- src/lib/launchDarkly.js | 20 ++++++++++++++++++++ test/components/FeatureFlagRenderer.test.js | 10 +++++++--- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/components/FeatureFlagRenderer.js b/src/components/FeatureFlagRenderer.js index e086285..05c6d1f 100644 --- a/src/components/FeatureFlagRenderer.js +++ b/src/components/FeatureFlagRenderer.js @@ -1,11 +1,9 @@ /* @flow */ import React, { Component } from "react"; -import { ldBrowserInit } from "../lib/launchDarkly"; +import { ldBrowserInit, ldOverrideFlag } from "../lib/launchDarkly"; import { FeatureFlagType } from "../types/FeatureFlag"; -const url = require('url'); - type LaunchDarklyConfig = { clientId: String, user: String @@ -63,22 +61,7 @@ export default class FeatureFlagRenderer extends Component { ldClient.on("ready", () => { const showFeature = ldClient.variation(flagKey, false); const defaultState = { checkFeatureFlagComplete: true }; - - let override; - /** - * Follow this overriding convention: - * @link https://git.corp.tc/capsela/tc_feature_flagging#overriding-feature-flags - **/ - const query = url.parse(window.location.toString(), true).query; - const queryFlag = query["features." + flagKey]; - - if (typeof queryFlag !== "undefined"){ - if (queryFlag === ""){ - override = true; - } else if (queryFlag === "false"){ - override = false; - } - } + const override = ldOverrideFlag(flagKey); if (typeof override !== "undefined"){ this.setState({ showFeature: override, ...defaultState}); diff --git a/src/lib/launchDarkly.js b/src/lib/launchDarkly.js index cbf1c9d..7b3502b 100644 --- a/src/lib/launchDarkly.js +++ b/src/lib/launchDarkly.js @@ -1,9 +1,29 @@ import launchDarklyBrowser from "ldclient-js"; +const url = require('url'); export function ldBrowserInit (key, user) { return launchDarklyBrowser.initialize(key, user); } +export function ldOverrideFlag(flagKey) { + let override; + /** + * Follow this overriding convention: + * @link https://git.corp.tc/capsela/tc_feature_flagging#overriding-feature-flags + **/ + const query = url.parse(window.location.toString(), true).query; + const queryFlag = query["features." + flagKey]; + + if (typeof queryFlag !== "undefined"){ + if (queryFlag === ""){ + override = true; + } else if (queryFlag === "false"){ + override = false; + } + } + return override; +} + export function getAllFeatureFlags (key, user) { const ldClient = ldBrowserInit(key, user); return new Promise((resolve, reject) => { diff --git a/test/components/FeatureFlagRenderer.test.js b/test/components/FeatureFlagRenderer.test.js index d6512c2..8f08bbc 100644 --- a/test/components/FeatureFlagRenderer.test.js +++ b/test/components/FeatureFlagRenderer.test.js @@ -151,6 +151,7 @@ describe("components/FeatureFlagRenderer", () => { describe("the _checkFeatureFlag function", () => { const variation = stub(); + const override = stub().returns(void 0); const getWrapper = () => { return mount( { variation: variation }); stub(launchDarkly, "ldBrowserInit", ldClientStub); + stub(launchDarkly, "ldOverrideFlag", override); }); context("when the feature flag comes back true", () => { @@ -188,16 +190,18 @@ describe("components/FeatureFlagRenderer", () => { }); }); - describe("query param flag overrides", () => { + describe("query param flag overrides if not undefined", () => { it("param \"features.flag=false\" overrides LD data \"on\"", () => { variation.returns(true); - window.location.assign("http://ab.cdef.com?features.my-test=false"); + override.returns(false); + //window.location.assign("http://ab.cdef.com?features.my-test=false"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: false }); }); it("param \"features.flag\" overrides LD data \"off\"", () => { variation.returns(false); - window.location.assign("http://ab.cdef.com?features.my-test"); + override.returns(true); + //window.location.assign("http://ab.cdef.com?features.my-test"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); }); From baa62f9ddec0055778915aa61106339a13306ff7 Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Wed, 21 Dec 2016 17:56:21 +0000 Subject: [PATCH 04/10] add stubs for lib/launchDarkly tests, experiment with location mocking --- test/components/FeatureFlagRenderer.test.js | 6 ++-- test/lib/launchDarkly.test.js | 32 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 test/lib/launchDarkly.test.js diff --git a/test/components/FeatureFlagRenderer.test.js b/test/components/FeatureFlagRenderer.test.js index 8f08bbc..991d8b1 100644 --- a/test/components/FeatureFlagRenderer.test.js +++ b/test/components/FeatureFlagRenderer.test.js @@ -163,7 +163,7 @@ describe("components/FeatureFlagRenderer", () => { }; before(() => { - window.location = Location; + //window.location = Location; const ldClientStub = stub().returns({ on: (ready, callback) => { callback(); @@ -191,10 +191,11 @@ describe("components/FeatureFlagRenderer", () => { }); describe("query param flag overrides if not undefined", () => { + //stub(window, "location", Location); it("param \"features.flag=false\" overrides LD data \"on\"", () => { variation.returns(true); override.returns(false); - //window.location.assign("http://ab.cdef.com?features.my-test=false"); + //Location.assign("http://ab.cdef.com?features.my-test=false"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: false }); }); @@ -202,6 +203,7 @@ describe("components/FeatureFlagRenderer", () => { variation.returns(false); override.returns(true); //window.location.assign("http://ab.cdef.com?features.my-test"); + //Location.assign("http://ab.cdef.com?features.my-test"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); }); diff --git a/test/lib/launchDarkly.test.js b/test/lib/launchDarkly.test.js new file mode 100644 index 0000000..88b521f --- /dev/null +++ b/test/lib/launchDarkly.test.js @@ -0,0 +1,32 @@ +import { expect } from "chai"; +import { spy } from "sinon"; +import * as ldClient from "./../../src/lib/launchDarkly.js"; +import launchDarklyBrowser from "ldclient-js"; + +describe("lib/launchDarkly", () => { + it("exports three functions", () => { + expect(ldClient).to.have.property('ldBrowserInit'); + expect(ldClient).to.have.property('ldOverrideFlag'); + expect(ldClient).to.have.property('getAllFeatureFlags'); + }); + + describe("ldBroswerInit", () => { + it("proxies to ldclient-js", () => { + const key = "my key"; + const user = "my user"; + spy(launchDarklyBrowser, "initialize").withArgs(key, user); + ldClient.ldBrowserInit(key, user); + + // this is misuse of sinon; the expectation fails + //expect(launchDarklyBrowser.initialize.withArgs(key, user).calledOnce).to.be.ok() + + }) + }); + describe("getAllFeatureFlags", () => { + + }); + describe("ldOverrideFlag", () => { + + }); + +}); \ No newline at end of file From f2bd8c09fb08e0a523da0f27a7c78acdf10b28cf Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Tue, 27 Dec 2016 19:31:23 +0000 Subject: [PATCH 05/10] wrap window.location to permit test override --- src/lib/launchDarkly.js | 22 ++++++++++++++++----- test/components/FeatureFlagRenderer.test.js | 21 ++++++++++---------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/lib/launchDarkly.js b/src/lib/launchDarkly.js index 7b3502b..48c4b4b 100644 --- a/src/lib/launchDarkly.js +++ b/src/lib/launchDarkly.js @@ -1,17 +1,29 @@ import launchDarklyBrowser from "ldclient-js"; const url = require('url'); +export function getLocation() { + if (window.location) { + return window.location.toString(); + } else { + return ''; + } +} + export function ldBrowserInit (key, user) { return launchDarklyBrowser.initialize(key, user); } export function ldOverrideFlag(flagKey) { let override; - /** - * Follow this overriding convention: - * @link https://git.corp.tc/capsela/tc_feature_flagging#overriding-feature-flags - **/ - const query = url.parse(window.location.toString(), true).query; + /* + POST /users?features=send-onboarding-email + # Overrides the `send-onboarding-email` boolean feature flag, setting it to `true` + GET /users/101?features=show-user-email,user-nicknames,hide-inactive-users + # Enables the `show-user-email`, `user-nicknames`, and `hide-inactive-users` feature flags + POST /users?features.verify-email=false&features.email-frequency=weekly + # Disables the `verify-email` feature flag and sets the `email-frequency` variation to "weekly" + */ + const query = url.parse(exports.getLocation(), true).query; const queryFlag = query["features." + flagKey]; if (typeof queryFlag !== "undefined"){ diff --git a/test/components/FeatureFlagRenderer.test.js b/test/components/FeatureFlagRenderer.test.js index 991d8b1..6e2e747 100644 --- a/test/components/FeatureFlagRenderer.test.js +++ b/test/components/FeatureFlagRenderer.test.js @@ -1,7 +1,7 @@ import React from "react"; import { shallow, mount } from "enzyme"; import { expect } from "chai"; -import { spy, stub } from "sinon"; +import { spy, stub, sandbox } from "sinon"; import { Location } from "jsdom"; import FeatureFlagRenderer from "../../src/components/FeatureFlagRenderer"; @@ -151,7 +151,6 @@ describe("components/FeatureFlagRenderer", () => { describe("the _checkFeatureFlag function", () => { const variation = stub(); - const override = stub().returns(void 0); const getWrapper = () => { return mount( { ); }; before(() => { - - //window.location = Location; const ldClientStub = stub().returns({ on: (ready, callback) => { callback(); @@ -171,7 +168,6 @@ describe("components/FeatureFlagRenderer", () => { variation: variation }); stub(launchDarkly, "ldBrowserInit", ldClientStub); - stub(launchDarkly, "ldOverrideFlag", override); }); context("when the feature flag comes back true", () => { @@ -191,19 +187,22 @@ describe("components/FeatureFlagRenderer", () => { }); describe("query param flag overrides if not undefined", () => { - //stub(window, "location", Location); + let _sandbox; + before(() => { + _sandbox = sandbox.create(); + }); + afterEach(() => { + _sandbox.restore(); + }) it("param \"features.flag=false\" overrides LD data \"on\"", () => { variation.returns(true); - override.returns(false); - //Location.assign("http://ab.cdef.com?features.my-test=false"); + sandbox.stub(launchDarkly, "getLocation").returns("http://ab.cdef.com?features.my-test=false"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: false }); }); it("param \"features.flag\" overrides LD data \"off\"", () => { variation.returns(false); - override.returns(true); - //window.location.assign("http://ab.cdef.com?features.my-test"); - //Location.assign("http://ab.cdef.com?features.my-test"); + sandbox.stub(launchDarkly, "getLocation").returns("http://ab.cdef.com?features.my-test"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); }); From 889ec8d14f793c45b10ecc187a7de98e2e1844ba Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Tue, 27 Dec 2016 19:32:38 +0000 Subject: [PATCH 06/10] add simple test case and comma-list test case --- test/components/FeatureFlagRenderer.test.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/components/FeatureFlagRenderer.test.js b/test/components/FeatureFlagRenderer.test.js index 6e2e747..6ade7dd 100644 --- a/test/components/FeatureFlagRenderer.test.js +++ b/test/components/FeatureFlagRenderer.test.js @@ -206,6 +206,20 @@ describe("components/FeatureFlagRenderer", () => { const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); }); + it("param \"features=flag\" overrides LD data \"off\"", () => { + variation.returns(false); + sandbox.stub(launchDarkly, "getLocation").returns("httpd://ab.cdef.com?features=my-test"); + const wrapper = getWrapper(); + expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); + }); + it("param comma-list of features to enable", () => { + variation.withArgs('one').returns(false); + variation.withArgs('my-test').returns(false); + variation.withArgs('two').returns(false); + sandbox.stub(launchDarkly, "getLocation").returns("http://ab.cdef.com?features=one,my-test"); + const wrapper = getWrapper(); + expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); + }); }); }); }); From db47d4ad5b2a29853542ce9fc84d35244fae38e0 Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Tue, 27 Dec 2016 20:40:12 +0000 Subject: [PATCH 07/10] parse query parameter "features" in simple and list forms --- src/lib/launchDarkly.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/launchDarkly.js b/src/lib/launchDarkly.js index 48c4b4b..b00dec6 100644 --- a/src/lib/launchDarkly.js +++ b/src/lib/launchDarkly.js @@ -25,6 +25,7 @@ export function ldOverrideFlag(flagKey) { */ const query = url.parse(exports.getLocation(), true).query; const queryFlag = query["features." + flagKey]; + const queryFeatures = query['features']; if (typeof queryFlag !== "undefined"){ if (queryFlag === ""){ @@ -32,7 +33,14 @@ export function ldOverrideFlag(flagKey) { } else if (queryFlag === "false"){ override = false; } + } else if (queryFeatures) { + queryFeatures.split(',').forEach((f) => { + if (f === flagKey){ + override = true; + } + }) } + return override; } From 5739db0eea9547ffbf08da5e55bb0281d547233c Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Wed, 28 Dec 2016 18:39:48 +0000 Subject: [PATCH 08/10] remove escaped quotes --- test/components/FeatureFlagRenderer.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/components/FeatureFlagRenderer.test.js b/test/components/FeatureFlagRenderer.test.js index 6ade7dd..95ed38e 100644 --- a/test/components/FeatureFlagRenderer.test.js +++ b/test/components/FeatureFlagRenderer.test.js @@ -194,19 +194,19 @@ describe("components/FeatureFlagRenderer", () => { afterEach(() => { _sandbox.restore(); }) - it("param \"features.flag=false\" overrides LD data \"on\"", () => { + it("param 'features.flag=false' overrides LD data 'on'", () => { variation.returns(true); sandbox.stub(launchDarkly, "getLocation").returns("http://ab.cdef.com?features.my-test=false"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: false }); }); - it("param \"features.flag\" overrides LD data \"off\"", () => { + it("param 'features.flag' overrides LD data 'off'", () => { variation.returns(false); sandbox.stub(launchDarkly, "getLocation").returns("http://ab.cdef.com?features.my-test"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); }); - it("param \"features=flag\" overrides LD data \"off\"", () => { + it("param 'features=flag' overrides LD data 'off'", () => { variation.returns(false); sandbox.stub(launchDarkly, "getLocation").returns("httpd://ab.cdef.com?features=my-test"); const wrapper = getWrapper(); From f96b6028b164fafdb9b8e6002106b37bd962d4d1 Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Wed, 28 Dec 2016 23:17:07 +0000 Subject: [PATCH 09/10] add test-specific eslintrc --- test/.eslintrc | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 test/.eslintrc diff --git a/test/.eslintrc b/test/.eslintrc new file mode 100644 index 0000000..d35b395 --- /dev/null +++ b/test/.eslintrc @@ -0,0 +1,6 @@ +{ + "env": { + "mocha": true + } +} + From c3535ba4c22b1f4779bc0ecdf218fc17ac21b3b9 Mon Sep 17 00:00:00 2001 From: Seth Battin Date: Wed, 28 Dec 2016 23:17:23 +0000 Subject: [PATCH 10/10] fix linting errors --- src/lib/launchDarkly.js | 11 +++++------ test/components/FeatureFlagRenderer.test.js | 9 ++++----- test/lib/launchDarkly.test.js | 10 +++++----- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/lib/launchDarkly.js b/src/lib/launchDarkly.js index d2accfe..410e255 100644 --- a/src/lib/launchDarkly.js +++ b/src/lib/launchDarkly.js @@ -1,12 +1,11 @@ import launchDarklyBrowser from "ldclient-js"; -const url = require('url'); +const url = require("url"); export function getLocation() { if (window.location) { return window.location.toString(); - } else { - return ''; } + return ""; } export function ldBrowserInit (key, user) { @@ -25,7 +24,7 @@ export function ldOverrideFlag(flagKey) { */ const query = url.parse(exports.getLocation(), true).query; const queryFlag = query["features." + flagKey]; - const queryFeatures = query['features']; + const queryFeatures = query["features"]; if (typeof queryFlag !== "undefined"){ if (queryFlag === ""){ @@ -34,11 +33,11 @@ export function ldOverrideFlag(flagKey) { override = false; } } else if (queryFeatures) { - queryFeatures.split(',').forEach((f) => { + queryFeatures.split(",").forEach((f) => { if (f === flagKey){ override = true; } - }) + }); } return override; diff --git a/test/components/FeatureFlagRenderer.test.js b/test/components/FeatureFlagRenderer.test.js index 95ed38e..d6acb7e 100644 --- a/test/components/FeatureFlagRenderer.test.js +++ b/test/components/FeatureFlagRenderer.test.js @@ -2,7 +2,6 @@ import React from "react"; import { shallow, mount } from "enzyme"; import { expect } from "chai"; import { spy, stub, sandbox } from "sinon"; -import { Location } from "jsdom"; import FeatureFlagRenderer from "../../src/components/FeatureFlagRenderer"; import * as launchDarkly from "../../src/lib/launchDarkly"; @@ -193,7 +192,7 @@ describe("components/FeatureFlagRenderer", () => { }); afterEach(() => { _sandbox.restore(); - }) + }); it("param 'features.flag=false' overrides LD data 'on'", () => { variation.returns(true); sandbox.stub(launchDarkly, "getLocation").returns("http://ab.cdef.com?features.my-test=false"); @@ -213,9 +212,9 @@ describe("components/FeatureFlagRenderer", () => { expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); }); it("param comma-list of features to enable", () => { - variation.withArgs('one').returns(false); - variation.withArgs('my-test').returns(false); - variation.withArgs('two').returns(false); + variation.withArgs("one").returns(false); + variation.withArgs("my-test").returns(false); + variation.withArgs("two").returns(false); sandbox.stub(launchDarkly, "getLocation").returns("http://ab.cdef.com?features=one,my-test"); const wrapper = getWrapper(); expect(wrapper.state()).to.deep.equal({ checkFeatureFlagComplete: true, showFeature: true }); diff --git a/test/lib/launchDarkly.test.js b/test/lib/launchDarkly.test.js index 88b521f..3211de8 100644 --- a/test/lib/launchDarkly.test.js +++ b/test/lib/launchDarkly.test.js @@ -5,9 +5,9 @@ import launchDarklyBrowser from "ldclient-js"; describe("lib/launchDarkly", () => { it("exports three functions", () => { - expect(ldClient).to.have.property('ldBrowserInit'); - expect(ldClient).to.have.property('ldOverrideFlag'); - expect(ldClient).to.have.property('getAllFeatureFlags'); + expect(ldClient).to.have.property("ldBrowserInit"); + expect(ldClient).to.have.property("ldOverrideFlag"); + expect(ldClient).to.have.property("getAllFeatureFlags"); }); describe("ldBroswerInit", () => { @@ -20,7 +20,7 @@ describe("lib/launchDarkly", () => { // this is misuse of sinon; the expectation fails //expect(launchDarklyBrowser.initialize.withArgs(key, user).calledOnce).to.be.ok() - }) + }); }); describe("getAllFeatureFlags", () => { @@ -29,4 +29,4 @@ describe("lib/launchDarkly", () => { }); -}); \ No newline at end of file +});