diff --git a/controllers/utils.js b/controllers/utils.js index 3be98654e..7d4db3c52 100644 --- a/controllers/utils.js +++ b/controllers/utils.js @@ -33,10 +33,11 @@ function hasUserSignedUpForRelay(user) { return false; } -function getExperimentBranch(req, language, sorterNum) { +function getExperimentBranch(req, sorterNum = false, language = false) { - if (!sorterNum) { + if (sorterNum === false) { sorterNum = Math.floor(Math.random() * 100); + log.debug("No coinflip number provided. Coinflip number is ", sorterNum); } if (req.session.excludeFromExperiment && !req.query.experimentBranch) { @@ -46,17 +47,19 @@ function getExperimentBranch(req, language, sorterNum) { // If we cannot parse req.headers["accept-language"], we should not // enroll users in the experiment. - if (!language || !req.headers || !req.headers["accept-language"]){ + if (language && !req.headers || language && !req.headers["accept-language"]){ log.debug("No headers or accept-language information present."); return false; } - // If the user doesn't have an English variant langauge selected as their primary language, + // If the user doesn't have the requested variant langauge selected as their primary language, // we do not enroll them in the experiment. - const lang = req.headers["accept-language"].split(","); - if (language && !lang[0].includes(language)) { - log.debug("Preferred language is not English variant: ", lang[0]); - return false; + if (language) { + const lang = req.headers["accept-language"].split(","); + if (language && !lang[0].includes(language)) { + log.debug(`Preferred language is not ${language} variant: ${lang[0]}`); + return false; + } } // If URL param has experimentBranch entry, use that branch; diff --git a/tests/controllers/home.test.js b/tests/controllers/home.test.js index f8bfd5549..7d884ebec 100644 --- a/tests/controllers/home.test.js +++ b/tests/controllers/home.test.js @@ -2,10 +2,24 @@ const AppConstants = require("../../app-constants"); const home = require("../../controllers/home"); +const { getExperimentBranch } = require("../../controllers/utils"); const { scanResult } = require("../../scan-results"); let mockRequest = { fluentFormat: jest.fn(), csrfToken: jest.fn() }; +function mockRequestSessionReset(mockRequest) { + mockRequest.session = { + excludeFromExperiment: false, + experimentBranch: false, + }; + + mockRequest.headers = { + "accept-language": "en", + }; + + return mockRequest; +} + function addBreachesToMockRequest(mockRequest) { const mockBreaches = [ {Name: "Test"}, @@ -60,3 +74,61 @@ test("notFound set status 404 and renders 404", () => { expect(mockStatusCallArgs[0]).toBe(404); expect(mockRenderCallArgs[0]).toBe("subpage"); }); + +test("Experiment 3 Cohort Assignment Unit Test", () => { + + // Resets session and language after each test + mockRequestSessionReset(mockRequest); + + // Set accept-language headers to German for first test. + mockRequest.headers = { + "accept-language": "de", + }; + +// The session is excluded from the experiment because the set language is German. + let experimentBranch = getExperimentBranch(mockRequest, false, "en"); + expect(experimentBranch).toBeFalsy(); + + mockRequestSessionReset(mockRequest); + + // The session is assigned to the control group when the coin flip is 0; + let experimentNumber = 0; + + experimentBranch = getExperimentBranch(mockRequest, experimentNumber); + expect(experimentBranch).toBe("va"); + + mockRequestSessionReset(mockRequest); + + // The session is assigned to the control group when the coin flip is 29; + experimentNumber = 29; + experimentBranch = getExperimentBranch(mockRequest, experimentNumber); + expect(experimentBranch).toBe("va"); + + mockRequestSessionReset(mockRequest); + + // The session is assigned to the treatment group when the coin flip is 30; + experimentNumber = 30; + experimentBranch = getExperimentBranch(mockRequest, experimentNumber); + expect(experimentBranch).toBe("vb"); + + mockRequestSessionReset(mockRequest); + + // The session is assigned to the treatment group when the coin flip is 59; + experimentNumber = 59; + experimentBranch = getExperimentBranch(mockRequest, experimentNumber); + expect(experimentBranch).toBe("vb"); + + mockRequestSessionReset(mockRequest); + + // The session is assigned to the treatment group when the coin flip is 60 + experimentNumber = 60; + experimentBranch = getExperimentBranch(mockRequest, experimentNumber); + expect(experimentBranch).toBeFalsy(); + + mockRequestSessionReset(mockRequest); + + // The session is excluded from the experiment when the coin flip is 99 + experimentNumber = 99; + experimentBranch = getExperimentBranch(mockRequest, experimentNumber); + expect(experimentBranch).toBeFalsy(); +});