import { describe, it, beforeEach } from "mocha"; import { expect } from "chai"; import ChoiceTopicService, { Report } from "../../../src/services/choicesTopic.service"; import { reset, verify, mock, instance, capture, anything } from "ts-mockito"; import { KafkaService } from "../../../src/services/kafka.service"; import { ChoiceRequest, RequestInventorySource } from "../../../src/models/request.model"; import DVCategoryProvider from "../../../src/categories/DVCategoryProvider"; import { CategoryProviderType } from "../../../src/categories/categoryProvider"; import { FakeRequestBuilder } from "../fakeRequestBuilder"; import { FakeCampaign } from "../fake/Campaign"; describe("ChoiceTopicService", function () { let choiceTopicService: ChoiceTopicService; let kafkaConnector: KafkaService; before(() => { kafkaConnector = mock(KafkaService); choiceTopicService = new ChoiceTopicService(); const untypedService: any = choiceTopicService; untypedService.kafkaConnector = instance(kafkaConnector); }); afterEach(() => { reset(kafkaConnector); }); it("send report", async function () { choiceTopicService.sendReport(createRequest()); verify(kafkaConnector.send(anything(), anything())).once(); const [report, advertId] = capture(kafkaConnector.send).first(); expect(advertId).to.be.equal("1000"); expect(report).not.to.be.undefined; expect(report.advert_id).to.be.equal("1000"); expect(report.request_id).to.be.equal("request_id"); expect(report.ssp).to.be.equal("myssp"); expect(report.device_name).to.be.equal("samsung"); expect(report.os_version).to.be.equal("android 5"); expect(report.connectivity).to.be.equal("wifi"); expect(report.inventory_source).to.be.equal(RequestInventorySource.INTERNAL); expect(report.bidfloor).to.be.equal(12.5); expect(report.geoip_isp).to.be.equal("orange"); expect(report.ip_type).to.be.equal("none"); }); it("send report with ip", async function () { const request = createRequest(); request.device!.ip = "2.3.4.5"; choiceTopicService.sendReport(request); verify(kafkaConnector.send(anything(), anything())).once(); const [report, advertId] = capture(kafkaConnector.send).first(); expect(advertId).to.be.equal("1000"); expect(report).not.to.be.undefined; expect(report.advert_id).to.be.equal("1000"); expect(report.request_id).to.be.equal("request_id"); expect(report.ssp).to.be.equal("myssp"); expect(report.device_name).to.be.equal("samsung"); expect(report.os_version).to.be.equal("android 5"); expect(report.connectivity).to.be.equal("wifi"); expect(report.inventory_source).to.be.equal(RequestInventorySource.INTERNAL); expect(report.bidfloor).to.be.equal(12.5); expect(report.geoip_isp).to.be.equal("orange"); expect(report.ip_type).to.be.equal("ipv4"); }); it("send report with ipv6", async function () { const request = createRequest(); request.device!.ipv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"; choiceTopicService.sendReport(request); verify(kafkaConnector.send(anything(), anything())).once(); const [report, advertId] = capture(kafkaConnector.send).first(); expect(advertId).to.be.equal("1000"); expect(report).not.to.be.undefined; expect(report.advert_id).to.be.equal("1000"); expect(report.request_id).to.be.equal("request_id"); expect(report.ssp).to.be.equal("myssp"); expect(report.device_name).to.be.equal("samsung"); expect(report.os_version).to.be.equal("android 5"); expect(report.connectivity).to.be.equal("wifi"); expect(report.inventory_source).to.be.equal(RequestInventorySource.INTERNAL); expect(report.bidfloor).to.be.equal(12.5); expect(report.geoip_isp).to.be.equal("orange"); expect(report.ip_type).to.be.equal("ipv6"); }); it("send report with truncated ip", async function () { const request = createRequest(); request.device!.ip = "2.3.4.0"; choiceTopicService.sendReport(request); verify(kafkaConnector.send(anything(), anything())).once(); const [report, advertId] = capture(kafkaConnector.send).first(); expect(advertId).to.be.equal("1000"); expect(report).not.to.be.undefined; expect(report.advert_id).to.be.equal("1000"); expect(report.request_id).to.be.equal("request_id"); expect(report.ssp).to.be.equal("myssp"); expect(report.device_name).to.be.equal("samsung"); expect(report.os_version).to.be.equal("android 5"); expect(report.connectivity).to.be.equal("wifi"); expect(report.inventory_source).to.be.equal(RequestInventorySource.INTERNAL); expect(report.bidfloor).to.be.equal(12.5); expect(report.geoip_isp).to.be.equal("orange"); expect(report.ip_type).to.be.equal("truncated"); }); it("send report with metadata", async function () { const request: ChoiceRequest = createRequest(); request.campaigns = [ new FakeCampaign("1", { speed_threshold: 10, vast_hash: "plop" }, undefined, undefined, { pass_dv_fraud: "true", pass_brand_safety: "true", }), new FakeCampaign("2"), ]; request.excluded = [ new FakeCampaign("3", { speed_threshold: 10, vast_hash: "3" }, undefined, undefined, { pass_dv_fraud: "false", pass_brand_safety: "bypassed", }), new FakeCampaign("4", { speed_threshold: 13, vast_hash: "4" }), ]; choiceTopicService.sendReport(request); verify(kafkaConnector.send(anything(), anything())).once(); const [report, advertId] = capture(kafkaConnector.send).first(); expect(advertId).to.be.equal("1000"); expect(report).not.to.be.undefined; expect(report.advert_id).to.be.equal("1000"); expect(report.request_id).to.be.equal("request_id"); expect(report.ssp).to.be.equal("myssp"); expect(report.device_name).to.be.equal("samsung"); expect(report.os_version).to.be.equal("android 5"); expect(report.connectivity).to.be.equal("wifi"); expect(report.inventory_source).to.be.equal(RequestInventorySource.INTERNAL); expect(report.bidfloor).to.be.equal(12.5); expect(report.geoip_isp).to.be.equal("orange"); expect(report.campaigns.length).to.be.equal(4); expect(report.campaigns).to.deep.contains({ campaign_id: "1", speed_threshold: 10, vast_hash: "plop", pass_dv_fraud: "true", pass_brand_safety: "true", }); expect(report.campaigns).to.deep.contains({ campaign_id: "2" }); expect(report.campaigns).to.deep.contains({ campaign_id: "3", speed_threshold: 10, vast_hash: "3", pass_dv_fraud: "false", pass_brand_safety: "bypassed", }); expect(report.campaigns).to.deep.contains({ campaign_id: "4", speed_threshold: 13, vast_hash: "4", }); }); it("send report with categories", async function () { const dvCategoryProvider: any = new DVCategoryProvider(); const categoryValue = dvCategoryProvider.decode( dvCategoryProvider.encodePayload( "99000001,80312001,80023001,80222001,81012005,99012001,81012004,81012007,81012006,81012001,81012003,81012002,81012009,81012008,80013001,99012012,80122001", 2000 ) ); const request: ChoiceRequest = createRequest(); request.categories = new Map(); request.categories.set(CategoryProviderType.DV, categoryValue); choiceTopicService.sendReport(request); verify(kafkaConnector.send(anything(), anything())).once(); const [report, advertId] = capture(kafkaConnector.send).first(); expect(advertId).to.be.equal("1000"); expect(report).not.to.be.undefined; expect(report.advert_id).to.be.equal("1000"); expect(report.ssp).to.be.equal("myssp"); expect(report.device_name).to.be.equal("samsung"); expect(report.os_version).to.be.equal("android 5"); expect(report.connectivity).to.be.equal("wifi"); expect(report.inventory_source).to.be.equal(RequestInventorySource.INTERNAL); expect(report.bidfloor).to.be.equal(12.5); expect(report.geoip_isp).to.be.equal("orange"); expect(report.categories).not.to.be.undefined; expect(report.categories![0].provider).to.be.equal("dv"); expect(report.categories![0].segments).to.deep.equal([ "80312001", "80023001", "80222001", "80013001", "80122001", ]); }); }); function createRequest(): ChoiceRequest { const req = new FakeRequestBuilder().build(); Object.assign(req, { id: "1000", request_id: "request_id", device: { name: "samsung", os_version: "android 5", connectivity: "wifi", isp: "orange", }, bidfloor: 12.5, context: { ssp: "myssp", }, user: {}, inventory_source: RequestInventorySource.INTERNAL, campaigns: [], excluded: [], site: { domain: "www.google.com", }, }); return req; }