import { expect } from "chai"; import { MockedFeatureConfig } from "@ogury/feature-config-sdk"; import { FeatureConfigService } from "../../../src/services/FeatureConfig.service"; import { FakeRequestBuilder } from "../fakeRequestBuilder"; import { Campaign } from "../../../src/models"; import { FakeCampaign } from "../fake/Campaign"; import { DEFAULT_CAMPAIGN } from "../fake/CampaignModelFake"; import { Step } from "../../../src/steps/step"; import { StepBuilder } from "../../../src/steps/stepBuilder"; import FallbackStep from "../../../src/steps/fallback/fallback.step"; describe("FallbackStep", () => { let featureConfigService: FeatureConfigService; let mockedFeatureConf: MockedFeatureConfig; let fallbackStep: Step; beforeEach(() => { featureConfigService = FeatureConfigService.getInstance(); mockedFeatureConf = new MockedFeatureConfig(); featureConfigService.setFeatureConfig(mockedFeatureConf); fallbackStep = new StepBuilder(new FallbackStep()).build(); }); it("should pass regular campaigns if there are any", async function () { const campaigns: Campaign[] = [new FakeCampaign("1"), new FakeCampaign("2")]; const request = new FakeRequestBuilder().withCampaigns(...campaigns).build(); request.groupedCampaignIds.fallback.add("1"); request.groupedCampaignIds.managed.add("2"); await fallbackStep.execute(request); expect(request.campaigns.length).to.equal(1); expect(request.campaigns[0].id).to.equal("2"); }); it("should pass if there are no fallback campaigns", async function () { const request = new FakeRequestBuilder().build(); request.campaigns = []; await fallbackStep.execute(request); expect(request.campaigns.length).to.equal(0); }); it("should pass on the fallback campaigns", async function () { const campaigns: Campaign[] = [new FakeCampaign("1")]; const request = new FakeRequestBuilder().withCampaigns(...campaigns).build(); request.groupedCampaignIds.fallback = new Set(["1"]); request.app = { eecpm: 4, ad_unit_type: "interstitial", }; request.campaignData = { 1: { ...DEFAULT_CAMPAIGN, id: "1", budget: 1000, clicks_sold: 75000, ad_unit_types: { interstitial: { payback_cpm: 5, margin: 70, }, }, }, }; await fallbackStep.execute(request); expect(request.campaigns.length).to.equal(1); expect(request.campaigns[0].id).to.equal("1"); }); it("should pass on the fallback campaigns if eecpm is lower than cpa, & paybackcpm", async function () { const campaigns: Campaign[] = [new FakeCampaign("1")]; const request = new FakeRequestBuilder().withCampaigns(...campaigns).build(); request.groupedCampaignIds.fallback = new Set(["1"]); request.app = { eecpm: 4, ad_unit_type: "interstitial", }; request.campaignData = { 1: { ...DEFAULT_CAMPAIGN, id: "1", budget: 1000, clicks_sold: 75000, ad_unit_types: { interstitial: { payback_cpm: 5, margin: 70, }, }, }, }; await fallbackStep.execute(request); expect(request.campaigns.length).to.equal(1); expect(request.campaigns[0].id).to.equal("1"); }); it("should not pass on the fallback campaigns if eecpm is bigger than cpa, & paybackcpm", async function () { const campaigns: Campaign[] = [new FakeCampaign("1")]; const request = new FakeRequestBuilder().withCampaigns(...campaigns).build(); request.groupedCampaignIds.fallback = new Set(["1"]); request.app = { eecpm: 10, ad_unit_type: "interstitial", }; request.campaignData = { 1: { ...DEFAULT_CAMPAIGN, id: "1", budget: 1000, clicks_sold: 75000, ad_unit_types: { interstitial: { payback_cpm: 5, margin: 70, }, }, }, }; await fallbackStep.execute(request); expect(request.campaigns.length).to.equal(0); }); it("should filter out fallback campaigns without enough payback cpm in interstitial", async function () { const campaigns: Campaign[] = [new FakeCampaign("1"), new FakeCampaign("2")]; const request = new FakeRequestBuilder().withCampaigns(...campaigns).build(); request.groupedCampaignIds.fallback = new Set(["1", "2"]); request.app = { eecpm: 4, ad_unit_type: "interstitial", }; request.campaignData = { 1: { ...DEFAULT_CAMPAIGN, id: "1", budget: 1000, clicks_sold: 75000, }, 2: { ...DEFAULT_CAMPAIGN, id: "2", budget: 1000, clicks_sold: 65000, ad_unit_types: { interstitial: { payback_cpm: 5, margin: 70, }, }, }, }; await fallbackStep.execute(request); expect(request.campaigns.length).to.equal(1); expect(request.campaigns[0].id).to.equal("2"); }); it("should filter out all fallback campaigns without eecpm", async function () { const campaigns: Campaign[] = [new FakeCampaign("1"), new FakeCampaign("2")]; const request = new FakeRequestBuilder().withCampaigns(...campaigns).build(); request.groupedCampaignIds.fallback = new Set(["1", "2"]); request.app = { eecpm: 4, ad_unit_type: "overlay_thumbnail", }; request.campaignData = { 1: { ...DEFAULT_CAMPAIGN, id: "1", budget: 1000, clicks_sold: 75000, ad_unit_types: { interstitial: { payback_cpm: 5, margin: 70, }, }, }, 2: { ...DEFAULT_CAMPAIGN, id: "2", budget: 1000, clicks_sold: 65000, ad_unit_types: { interstitial: { payback_cpm: 5, margin: 70, }, }, }, }; await fallbackStep.execute(request); expect(request.campaigns.length).to.equal(0); }); it("should filter out all fallback campaigns without the right adunit config", async function () { const campaigns: Campaign[] = [new FakeCampaign("1"), new FakeCampaign("2")]; const request = new FakeRequestBuilder().withCampaigns(...campaigns).build(); request.groupedCampaignIds.fallback = new Set(["1", "2"]); request.app = {}; request.campaignData = { 1: { ...DEFAULT_CAMPAIGN, id: "1", budget: 1000, clicks_sold: 75000, ad_unit_types: { interstitial: { payback_cpm: 5, margin: 70, }, }, }, 2: { ...DEFAULT_CAMPAIGN, id: "2", budget: 1000, clicks_sold: 65000, ad_unit_types: { interstitial: { payback_cpm: 5, margin: 70, }, }, }, }; await fallbackStep.execute(request); expect(request.campaigns.length).to.equal(0); }); });