Revised both function and test for getExperimentBranch.

This commit is contained in:
Maxx Crawford 2020-05-14 14:20:16 -05:00
Родитель 302d3f7be9
Коммит b5e4d34715
2 изменённых файлов: 83 добавлений и 8 удалений

Просмотреть файл

@ -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,18 +47,20 @@ 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.
if (language) {
const lang = req.headers["accept-language"].split(",");
if (language && !lang[0].includes(language)) {
log.debug("Preferred language is not English variant: ", lang[0]);
log.debug(`Preferred language is not ${language} variant: ${lang[0]}`);
return false;
}
}
// If URL param has experimentBranch entry, use that branch;
if (req.query.experimentBranch) {

Просмотреть файл

@ -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();
});