import { expect } from "chai"; import nock from "nock"; import { MockedFeatureConfig } from "@ogury/feature-config-sdk"; import { FeatureConfigService } from "../../../src/services/FeatureConfig.service"; import { FakeRequestBuilder } from "../fakeRequestBuilder"; import { FakeCampaign } from "../fake/Campaign"; import { CampaignModelFake, DEFAULT_CAMPAIGN } from "../fake/CampaignModelFake"; import { Step } from "../../../src/steps/step"; import { StepBuilder } from "../../../src/steps/stepBuilder"; import MarketplaceResponseStep from "../../../src/steps/programmatic/marketplaceResponse.step"; import { MsAuctionService } from "../../../src/services/auction/MsAuction.service"; describe("MarketplaceResponseStep", () => { let featureConfigService: FeatureConfigService; let mockedFeatureConf: MockedFeatureConfig; let marketplaceStep: Step; beforeEach(() => { featureConfigService = FeatureConfigService.getInstance(); mockedFeatureConf = new MockedFeatureConfig(); featureConfigService.setFeatureConfig(mockedFeatureConf); mockedFeatureConf.setParam("ms-choices.auction-mkp-pct", "101"); mockedFeatureConf.setParam("ms-choices.auction-mkp-dryrun", "false"); const msAuctionService = new MsAuctionService( new CampaignModelFake(), "http://ms-auction.test", {} as any ); marketplaceStep = new StepBuilder(new MarketplaceResponseStep(msAuctionService)).build(); }); afterEach(() => { nock.cleanAll(); }); it("should not run if request has non-marketplace campaigns", async function () { const campaigns = [new FakeCampaign("1"), new FakeCampaign("2")]; const campaignData = [ { ...DEFAULT_CAMPAIGN, id: "1", prog_deal_id: "deal_1" }, { ...DEFAULT_CAMPAIGN, id: "2", prog_deal_id: "deal_2" }, ]; const request = new FakeRequestBuilder() .withCampaigns(...campaigns) .withCampaignData(campaignData) .build(); request.groupedCampaignIds.marketplace.add("1"); request.groupedCampaignIds.managed.add("2"); await marketplaceStep.execute(request); expect(request.campaigns.length).to.equal(1); expect(request.campaigns[0].id).to.equal("2"); }); it("should call marketplace and put winning private auction campaign in result", async function () { const campaigns = [new FakeCampaign("1"), new FakeCampaign("2"), new FakeCampaign("3")]; const campaignData = [ { ...DEFAULT_CAMPAIGN, id: "1", prog_deal_id: "" }, { ...DEFAULT_CAMPAIGN, id: "2", prog_deal_id: "deal_2" }, { ...DEFAULT_CAMPAIGN, id: "3", prog_deal_id: "deal_3" }, ]; const request = new FakeRequestBuilder() .withCampaigns(...campaigns) .withCampaignData(campaignData) .build(); request.groupedCampaignIds.marketplace.add("1"); request.groupedCampaignIds.marketplace.add("2"); request.groupedCampaignIds.marketplace.add("3"); nock("http://ms-auction.test") .post("/auction") .reply((_, requestBody: any) => { const winningCampaign = requestBody.campaigns.find((c: any) => c.id === 1 || c.id === 3); return [ 200, { advert_id: requestBody.advert_id, campaign: winningCampaign.id, price: 1.01, advertiser_domain: "advertiser_domain", deal_id: winningCampaign.deal_id, seat: "wseat1", }, ]; }); await marketplaceStep.execute(request); expect(request.campaigns.length).to.equal(1); expect(request.campaigns[0].id).to.equal("3"); }); it("should call marketplace and put winning open auction campaign in result", async function () { const campaigns = [new FakeCampaign("1"), new FakeCampaign("2"), new FakeCampaign("3")]; const campaignData = [ { ...DEFAULT_CAMPAIGN, id: "1", prog_deal_id: "" }, { ...DEFAULT_CAMPAIGN, id: "2", prog_deal_id: "deal_2" }, { ...DEFAULT_CAMPAIGN, id: "3", prog_deal_id: "deal_3" }, ]; const request = new FakeRequestBuilder() .withCampaigns(...campaigns) .withCampaignData(campaignData) .build(); request.groupedCampaignIds.marketplace.add("1"); request.groupedCampaignIds.marketplace.add("2"); request.groupedCampaignIds.marketplace.add("3"); nock("http://ms-auction.test") .post("/auction") .reply((_, requestBody: any) => { const winningCampaign = requestBody.campaigns.find((c: any) => c.id === 1); if (!winningCampaign) { return [200, null]; } return [ 200, { advert_id: requestBody.advert_id, campaign: winningCampaign.id, price: 1.01, advertiser_domain: "advertiser_domain", deal_id: winningCampaign.deal_id, seat: "wseat1", }, ]; }) .persist(); await marketplaceStep.execute(request); expect(request.campaigns.length).to.equal(1); expect(request.campaigns[0].id).to.equal("1"); }); it("should autopass fallback campaigns", async function () { const campaigns = [new FakeCampaign("1")]; const campaignData = [{ ...DEFAULT_CAMPAIGN, id: "1", prog_deal_id: "deal_1" }]; const request = new FakeRequestBuilder() .withCampaigns(...campaigns) .withCampaignData(campaignData) .build(); request.groupedCampaignIds.fallback.add("1"); await marketplaceStep.execute(request); expect(request.campaigns.length).to.equal(1); expect(request.campaigns[0].id).to.equal("1"); }); });