import { expect } from "chai"; import FeatureConfigFake from "../fake/FeatureConfigFake"; import { FeatureConfigService } from "../../../src/services/FeatureConfig.service"; import { FakeRequestBuilder } from "../fakeRequestBuilder"; import { StepBuilder } from "../../../src/steps/stepBuilder"; import { Step } from "../../../src/steps/step"; import SpeedThresholdStep from "../../../src/steps/speedThreshold/speedThreshold.step"; import constants from "../../../src/utils/constants"; import { Campaign } from "../../../src/models"; import { FakeCampaign } from "../fake/Campaign"; import SpeedService from "../../../src/services/speed.service"; describe("SpeedThresholdStep", function () { let speedThresholdStep: Step; let mockedFeatureConf: FeatureConfigFake; let featureConfigService: FeatureConfigService; before(() => { featureConfigService = FeatureConfigService.getInstance(); mockedFeatureConf = new FeatureConfigFake(); featureConfigService.setFeatureConfig(mockedFeatureConf); speedThresholdStep = new StepBuilder(new SpeedThresholdStep(new SpeedService())).build(); }); beforeEach(() => { mockedFeatureConf.clearParams(); }); it("should correctly filter campaigns according to composite_score", async function () { const request = new FakeRequestBuilder() .withCampaigns( new FakeCampaign("1", { composite_score: 0.5, speed_threshold: 0.5 }), new FakeCampaign("2", { composite_score: 0.5, speed_threshold: 0.51 }), new FakeCampaign("3", { composite_score: 0.5, speed_threshold: 0.49 }), new FakeCampaign("4", { composite_score: 0.5, speed_threshold: null }), new FakeCampaign("5", { composite_score: 0.5 }), new FakeCampaign("6", { speed_threshold: 0.5 }), new FakeCampaign("7") ) .build(); const result = await speedThresholdStep.execute(request); expect(result.passedCampaigns).to.deep.equal([ { id: "1", category_iab: [], metadata: { composite_score: 0.5, speed_threshold: 0.5, }, metadataTmp: {}, stepsPassedStatus: { pass_speed_threshold: "true", }, }, { id: "3", category_iab: [], metadata: { composite_score: 0.5, speed_threshold: 0.49, }, metadataTmp: {}, stepsPassedStatus: { pass_speed_threshold: "true", }, }, { id: "4", category_iab: [], metadata: { composite_score: 0.5, speed_threshold: null, }, metadataTmp: {}, stepsPassedStatus: { pass_speed_threshold: "true", }, }, { id: "5", category_iab: [], metadata: { composite_score: 0.5, }, metadataTmp: {}, stepsPassedStatus: { pass_speed_threshold: "true", }, }, { id: "6", category_iab: [], metadata: { speed_threshold: 0.5, }, metadataTmp: {}, stepsPassedStatus: { pass_speed_threshold: "true", }, }, { id: "7", category_iab: [], metadata: {}, metadataTmp: {}, stepsPassedStatus: { pass_speed_threshold: "true", }, }, ]); }); it("should correctly handle added noise for normalisation of scores", async () => { const campaigns: Campaign[] = []; for (let i = 1; i < 101; i++) { campaigns.push( new FakeCampaign(i.toString(), { composite_score: 0.51, speed_threshold: 0.5, }) ); } const request = new FakeRequestBuilder().withCampaigns(...campaigns).build(); const requestClone = Object.assign(Object.create(Object.getPrototypeOf(request)), request); const result = await speedThresholdStep.execute(request); expect(result.passedCampaigns).to.be.length(100); mockedFeatureConf.setParam(constants.RANDOM_NOISE_COMPOSITE_SCORE_SPEED_PARAM, "0.1"); const noisedResult = await speedThresholdStep.execute(requestClone); expect(noisedResult.passedCampaigns.length).to.be.lessThan(95); }); });