import { StepBuilder } from "../../../src/steps/stepBuilder"; import { FakeRequestBuilder } from "../fakeRequestBuilder"; import CategoryService from "../../../src/services/category.service"; import { CategoryProviderType } from "../../../src/categories/categoryProvider"; import { reset, verify, mock, when, instance, objectContaining } from "ts-mockito"; import FeatureConfigFake from "../fake/FeatureConfigFake"; import { FeatureConfigService } from "../../../src/services/FeatureConfig.service"; import { expect } from "chai"; import { FakeCampaign } from "../fake/Campaign"; import { CampaignModelFake } from "../fake/CampaignModelFake"; import { CampaignModel } from "../../../src/models/CampaignModel"; import BrandSuitabilityStep from "../../../src/steps/prebid/brandSuitability.step"; import { IASCategoryValue } from "../../../src/categories/IASCategoryProvider"; import { ChoiceRequest } from "../../../src/models/request.model"; const featureConfigService = FeatureConfigService.getInstance(); const mockedFeatureConf: FeatureConfigFake = new FeatureConfigFake(); const campaignModel: CampaignModel = new CampaignModelFake(); const innerBrandSuitabilityStep = new BrandSuitabilityStep( campaignModel, CategoryProviderType.IAS, true ); const brandSuitabilityStep = new StepBuilder(innerBrandSuitabilityStep).build(); let categoryService: CategoryService; describe("BrandSuitabilityStep", function () { before(async () => { categoryService = mock(CategoryService); innerBrandSuitabilityStep.categoryService = instance(categoryService); (innerBrandSuitabilityStep as any).featureConfigService = featureConfigService; featureConfigService.setFeatureConfig(mockedFeatureConf); }); after(async () => {}); beforeEach(async () => { mockedFeatureConf.clearParams(); reset(categoryService); when( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("com.app.android", true, false)), CategoryProviderType.IAS ) ).thenResolve( new IASCategoryValue( "wa|623c8365.999998|501|503|537|1000002|1000001|1999999|2000000|3000000|3999999" ) ); when( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("1234", true, true)), CategoryProviderType.IAS ) ).thenResolve( new IASCategoryValue( "wa|623c8365.999998|501|503|537|1000002|1000001|1999999|2000000|3000000|3999999" ) ); when( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("http://my.page.com/toto/bidule", false, false)), CategoryProviderType.IAS ) ).thenResolve( new IASCategoryValue( "wa|623c8365.999998|501|503|537|1000002|1000001|1999999|2000000|3000000|3999999" ) ); when( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("http://my.page.com/unknown", false, false)), CategoryProviderType.IAS ) ).thenResolve(new IASCategoryValue("wa|623c8365.999998|1000075")); }); it("test android app", async function () { const request = new FakeRequestBuilder() .withValidIpAndUserAgent() .withAppBundleOrDomain("com.app.android") .withEnvironmentType("in-app") .withCampaigns( new FakeCampaign("10001"), new FakeCampaign("10002"), new FakeCampaign("10003"), new FakeCampaign("10004"), new FakeCampaign("10005"), new FakeCampaign("10006"), new FakeCampaign("10007"), new FakeCampaign("10008"), new FakeCampaign("10009"), new FakeCampaign("10010"), new FakeCampaign("10011") ) .withCampaignPrebid("10002", { type: "brand-suitability", provider: "ias", segment: "1000002", }) .withCampaignPrebid("10003", { type: "brand-suitability", provider: "ias", segment: "1000003", }) .withCampaignPrebid("10004", { type: "brand-suitability", provider: "ias", segment: "3000000", }) .withCampaignPrebid("10005", { type: "brand-suitability", provider: "ias", segment: "3000001", }) .withCampaignPrebid("10006", { type: "brand-suitability", provider: "ias", segment: "4000001", }) .withCampaignPrebid("10007", { type: "brand-suitability", provider: "ias" }) .withCampaignPrebid("10008", { type: "brand-suitability", provider: "ias", segment: "3000001,1000002", }) .withCampaignPrebid("10009", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withCampaignPrebid("10010", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withDeviceOS("android") .build(); const stepRes = await brandSuitabilityStep.execute(request); checkCampaign(request, "10001", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10002", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10003", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10004", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10005", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10006", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10007", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10008", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10009", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10010", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10011", "pass_brand_suitability_ias", "false"); verify( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("com.app.android", true, false)), CategoryProviderType.IAS ) ).once(); }); it("test ios app", async function () { const request = new FakeRequestBuilder() .withValidIpAndUserAgent() .withAppBundleOrDomain("1234", true) .withEnvironmentType("in-app") .withCampaigns( new FakeCampaign("10001"), new FakeCampaign("10002"), new FakeCampaign("10003"), new FakeCampaign("10004"), new FakeCampaign("10005"), new FakeCampaign("10006"), new FakeCampaign("10007"), new FakeCampaign("10008"), new FakeCampaign("10009"), new FakeCampaign("10010"), new FakeCampaign("10011") ) .withCampaignPrebid("10002", { type: "brand-suitability", provider: "ias", segment: "1000002", }) .withCampaignPrebid("10003", { type: "brand-suitability", provider: "ias", segment: "1000003", }) .withCampaignPrebid("10004", { type: "brand-suitability", provider: "ias", segment: "3000000", }) .withCampaignPrebid("10005", { type: "brand-suitability", provider: "ias", segment: "3000001", }) .withCampaignPrebid("10006", { type: "brand-suitability", provider: "ias", segment: "4000001", }) .withCampaignPrebid("10007", { type: "brand-suitability", provider: "ias" }) .withCampaignPrebid("10008", { type: "brand-suitability", provider: "ias", segment: "3000001,1000002", }) .withCampaignPrebid("10009", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withCampaignPrebid("10010", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withDeviceOS("android") .build(); const stepRes = await brandSuitabilityStep.execute(request); checkCampaign(request, "10001", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10002", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10003", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10004", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10005", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10006", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10007", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10008", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10009", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10010", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10011", "pass_brand_suitability_ias", "false"); verify( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("1234", true, true)), CategoryProviderType.IAS ) ).once(); }); it("test web", async function () { const request = new FakeRequestBuilder() .withValidIpAndUserAgent() .withAppBundleOrDomain("my.page.com") .withPage("http://my.page.com/toto/bidule") .withEnvironmentType("web") .withCampaigns( new FakeCampaign("10001"), new FakeCampaign("10002"), new FakeCampaign("10003"), new FakeCampaign("10004"), new FakeCampaign("10005"), new FakeCampaign("10006"), new FakeCampaign("10007"), new FakeCampaign("10008"), new FakeCampaign("10009"), new FakeCampaign("10010"), new FakeCampaign("10011") ) .withCampaignPrebid("10002", { type: "brand-suitability", provider: "ias", segment: "1000002", }) .withCampaignPrebid("10003", { type: "brand-suitability", provider: "ias", segment: "1000003", }) .withCampaignPrebid("10004", { type: "brand-suitability", provider: "ias", segment: "3000000", }) .withCampaignPrebid("10005", { type: "brand-suitability", provider: "ias", segment: "3000001", }) .withCampaignPrebid("10006", { type: "brand-suitability", provider: "ias", segment: "4000001", }) .withCampaignPrebid("10007", { type: "brand-suitability", provider: "ias" }) .withCampaignPrebid("10008", { type: "brand-suitability", provider: "ias", segment: "3000001,1000002", }) .withCampaignPrebid("10009", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withCampaignPrebid("10010", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withDeviceOS("android") .build(); const stepRes = await brandSuitabilityStep.execute(request); checkCampaign(request, "10001", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10002", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10003", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10004", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10005", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10006", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10007", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10008", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10009", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10010", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10011", "pass_brand_suitability_ias", "false"); verify( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("http://my.page.com/toto/bidule", false, false)), CategoryProviderType.IAS ) ).once(); }); it("test web unknown without bloc", async function () { mockedFeatureConf.setParam("ms-choices.brand-suitability.allow-unknown.ias", "true"); const request = new FakeRequestBuilder() .withValidIpAndUserAgent() .withAppBundleOrDomain("my.page.com") .withPage("http://my.page.com/unknown") .withEnvironmentType("web") .withCampaigns( new FakeCampaign("10001"), new FakeCampaign("10002"), new FakeCampaign("10003"), new FakeCampaign("10004"), new FakeCampaign("10005"), new FakeCampaign("10006"), new FakeCampaign("10007"), new FakeCampaign("10008"), new FakeCampaign("10009"), new FakeCampaign("10010"), new FakeCampaign("10011") ) .withCampaignPrebid("10002", { type: "brand-suitability", provider: "ias", segment: "1000002", }) .withCampaignPrebid("10003", { type: "brand-suitability", provider: "ias", segment: "1000003", }) .withCampaignPrebid("10004", { type: "brand-suitability", provider: "ias", segment: "3000000", }) .withCampaignPrebid("10005", { type: "brand-suitability", provider: "ias", segment: "3000001", }) .withCampaignPrebid("10006", { type: "brand-suitability", provider: "ias", segment: "4000001", }) .withCampaignPrebid("10007", { type: "brand-suitability", provider: "ias" }) .withCampaignPrebid("10008", { type: "brand-suitability", provider: "ias", segment: "3000001,1000002", }) .withCampaignPrebid("10009", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withCampaignPrebid("10010", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withDeviceOS("android") .build(); const stepRes = await brandSuitabilityStep.execute(request); checkCampaign(request, "10001", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10002", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10003", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10004", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10005", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10006", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10007", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10008", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10009", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10010", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10011", "pass_brand_suitability_ias", "false"); verify( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("http://my.page.com/unknown", false, false)), CategoryProviderType.IAS ) ).once(); }); it("test web unknown with bloc", async function () { const request = new FakeRequestBuilder() .withValidIpAndUserAgent() .withAppBundleOrDomain("my.page.com") .withPage("http://my.page.com/unknown") .withEnvironmentType("web") .withCampaigns( new FakeCampaign("10001"), new FakeCampaign("10002"), new FakeCampaign("10003"), new FakeCampaign("10004"), new FakeCampaign("10005"), new FakeCampaign("10006"), new FakeCampaign("10007"), new FakeCampaign("10008"), new FakeCampaign("10009"), new FakeCampaign("10010"), new FakeCampaign("10011") ) .withCampaignPrebid("10002", { type: "brand-suitability", provider: "ias", segment: "1000002", }) .withCampaignPrebid("10003", { type: "brand-suitability", provider: "ias", segment: "1000003", }) .withCampaignPrebid("10004", { type: "brand-suitability", provider: "ias", segment: "3000000", }) .withCampaignPrebid("10005", { type: "brand-suitability", provider: "ias", segment: "3000001", }) .withCampaignPrebid("10006", { type: "brand-suitability", provider: "ias", segment: "4000001", }) .withCampaignPrebid("10007", { type: "brand-suitability", provider: "ias" }) .withCampaignPrebid("10008", { type: "brand-suitability", provider: "ias", segment: "3000001,1000002", }) .withCampaignPrebid("10009", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withCampaignPrebid("10010", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000003,3000000", }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "ias", segment: "1000002,3000001", }) .withDeviceOS("android") .build(); const stepRes = await brandSuitabilityStep.execute(request); checkCampaign(request, "10001", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10002", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10003", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10004", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10005", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10006", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10007", "pass_brand_suitability_ias", "true"); checkCampaign(request, "10008", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10009", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10010", "pass_brand_suitability_ias", "false"); checkCampaign(request, "10011", "pass_brand_suitability_ias", "false"); verify( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("http://my.page.com/unknown", false, false)), CategoryProviderType.IAS ) ).once(); }); it("test android app with no prebid", async function () { const request = new FakeRequestBuilder() .withValidIpAndUserAgent() .withAppBundleOrDomain("com.app.android") .withEnvironmentType("in-app") .withCampaigns( new FakeCampaign("10001"), new FakeCampaign("10002"), new FakeCampaign("10003"), new FakeCampaign("10004"), new FakeCampaign("10005"), new FakeCampaign("10006"), new FakeCampaign("10007"), new FakeCampaign("10008"), new FakeCampaign("10009"), new FakeCampaign("10010"), new FakeCampaign("10011") ) .withCampaignPrebid("10002", { type: "brand-suitability", provider: "dv", segment: "1000002", }) .withCampaignPrebid("10007", { type: "brand-safety", provider: "ias" }) .withCampaignPrebid("10011", { type: "brand-suitability", provider: "dv", segment: "1000002,3000001", }) .withDeviceOS("android") .build(); const stepRes = await brandSuitabilityStep.execute(request); checkCampaign(request, "10001", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10002", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10003", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10004", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10005", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10006", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10007", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10008", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10009", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10010", "pass_brand_suitability_ias", "bypassed"); checkCampaign(request, "10011", "pass_brand_suitability_ias", "bypassed"); verify( categoryService.getPublisherCategoryValue( objectContaining(expectedRequest("com.app.android", true, false)), CategoryProviderType.IAS ) ).never(); }); }); function checkCampaign(request: ChoiceRequest, id: string, step: string, passed: string) { if (passed === "bypassed" || passed === "true") { const passedCampaign = request.campaigns.find((campaign) => campaign.id === id); expect(passedCampaign).to.not.be.undefined; expect(passedCampaign?.stepsPassedStatus[step]).to.be.equal(passed); if (request.excluded) { const excludedCampaign = request.excluded.find((campaign) => campaign.id === id); expect(excludedCampaign).to.be.undefined; } } else { const passedCampaign = request.campaigns.find((campaign) => campaign.id === id); expect(passedCampaign).to.be.undefined; expect(request.excluded).not.to.be.undefined; const excludedCampaign = request.excluded?.find((campaign) => campaign.id === id); expect(excludedCampaign).to.not.be.undefined; expect(excludedCampaign?.stepsPassedStatus[step]).to.be.equal(passed); } } function expectedRequest(urlOrBundle: string, inApp: boolean, ios: boolean): Object { if (!inApp) { return { site: { page: urlOrBundle, }, }; } if (ios) { return { app: { app_id: urlOrBundle, }, }; } return { app: { bundle_id: urlOrBundle, }, }; }