import _ from "lodash"; import { CampaignData, Prebid } from "../../src/models/CampaignModel"; import { Campaign, ChoiceRequest, HeaderBiddingType, RequestInventorySource, } from "../../src/models"; import { DEFAULT_CAMPAIGN } from "./fake/CampaignModelFake"; import uuid = require("uuid"); import { FakeCampaign } from "./fake/Campaign"; import { DeviceOS, EnvironmentType, isWeb } from "../../src/utils/RequestUtils"; export class FakeRequestBuilder { private request: ChoiceRequest; constructor() { this.request = { id: "d19ad1b3-5135-411f-a6c3-954db35381f6", user: { odid: "aa922640-b067-5418-9a90-3ce74453ca87", }, context: { country: "FR" }, device: { name: "test-device", os_version: "1.0.0", os: "ANDROID", ip: "0.0.0.0", ua: "something", ifa: "aa922640-b067-5418-9a90-3ce74453ca86", }, app: { name: "AppName", app_api_key: "82349", bundle_id: "a.valid.bundle", ad_unit_id: "82349_default", }, campaigns: [new FakeCampaign("10001")], excluded: [], campaignData: { "10001": Object.assign({}, DEFAULT_CAMPAIGN) }, dvHashes: {}, decodedRequest: {}, inventory_source: RequestInventorySource.INTERNAL, environment_type: "in-app", metadata: {}, metadataTmp: {}, site: {}, stepsStatuses: [], isWeb: false, allMetricsLabels: {}, globalRequestLabels: {}, groupedCampaignIds: { managed: new Set(), programmatic: new Set(), marketplace: new Set(), fallback: new Set(), }, }; } withRandomId(): FakeRequestBuilder { this.request.id = uuid.v4(); return this; } withInventorySource(inventorySource: RequestInventorySource): FakeRequestBuilder { this.request ? (this.request.inventory_source = inventorySource) : ""; return this; } withBidfloor(bidfloor: number): FakeRequestBuilder { this.request.bidfloor = bidfloor; return this; } withCampaigns(...campaigns: Campaign[]): FakeRequestBuilder { this.request.campaigns = campaigns; return this; } withCampaignData(campaigns: Partial[]): FakeRequestBuilder { const fullCampaigns = campaigns.map((c) => Object.assign({}, DEFAULT_CAMPAIGN, c)); this.request.campaignData = _.keyBy(fullCampaigns, (c) => c.id); return this; } withCampaignPrebid(campaignId: string, prebid: Prebid): FakeRequestBuilder { if (this.request.campaignData === undefined) { this.request.campaignData = {}; } if (this.request.campaignData[campaignId] === undefined) { this.request.campaignData[campaignId] = Object.assign({}, DEFAULT_CAMPAIGN); } if (this.request.campaignData[campaignId].prebid === undefined) { this.request.campaignData[campaignId].prebid = []; } this.request.campaignData[campaignId].prebid?.push(prebid); return this; } withPrebid(prebid: Prebid): FakeRequestBuilder { for (const campaign of this.request.campaigns) { this.withCampaignPrebid(campaign.id, prebid); } return this; } withValidIpAndUserAgent(): FakeRequestBuilder { this.request.device ??= {}; if (this.request) { this.request.device.ip = "10.10.10.10"; this.request.device.ua = "aValidUserAgent"; } return this; } withValidIp(): FakeRequestBuilder { this.request.device ??= {}; if (this.request) { this.request.device.ip = "10.10.10.10"; } return this; } withIP(ip: string | undefined): FakeRequestBuilder { this.request.device ??= {}; this.request.device.ip = ip; return this; } withIPv6(ipv6: string | undefined): FakeRequestBuilder { this.request.device ??= {}; this.request.device.ipv6 = ipv6; return this; } withUserAgent(ua: string | undefined): FakeRequestBuilder { this.request.device ??= {}; this.request.device.ua = ua; return this; } withValidAppBundleOrDomain(): FakeRequestBuilder { this.request.app ??= {}; this.request.app.bundle_id = "a.valid.bundle"; return this; } withSSP(ssp: string): FakeRequestBuilder { this.request.context ??= {}; this.request.context.ssp = ssp; return this; } withAdUnitId(AdUnitId: string): FakeRequestBuilder { this.request.app ??= {}; this.request.app.ad_unit_id = AdUnitId; return this; } withApiKey(apiKey: string | number): FakeRequestBuilder { this.request.app ??= {}; this.request.app.app_api_key = apiKey; return this; } withAppBundleOrDomain(appBundleOrDomain: string, isIOS: boolean = false): FakeRequestBuilder { if (isIOS) { this.request.app ??= {}; this.request.app.app_id = appBundleOrDomain; } else { this.request.app ??= {}; this.request.app.bundle_id = appBundleOrDomain; } this.request.site ??= {}; this.request.site.domain = appBundleOrDomain; return this; } withPage(url: string): FakeRequestBuilder { this.request.site ??= {}; this.request.site.page = url; this.request.site.domain = new URL(url).hostname; return this; } withEnvironmentType(environmentType: EnvironmentType): FakeRequestBuilder { this.request.environment_type = environmentType; this.request.isWeb = isWeb(this.request); return this; } withDeviceOS(deviceOs: DeviceOS): FakeRequestBuilder { switch (deviceOs) { case "ios": this.request.device ??= {}; this.request.device.os = "IOS"; break; case "android": this.request.device ??= {}; this.request.device.os = "ANDROID"; } return this; } flagAsExternal(): FakeRequestBuilder { this.request.inventory_source = RequestInventorySource.EXTERNAL; return this; } withDecodedRequest(decodedRequest: any): FakeRequestBuilder { this.request.decodedRequest = decodedRequest; return this; } withContext(ctx: any): FakeRequestBuilder { this.request.context = ctx; return this; } withSize(size: number): FakeRequestBuilder { this.request.size = size; return this; } withEECPM(eecpm: number): FakeRequestBuilder { this.request.app ??= {}; this.request.app.eecpm = eecpm; return this; } withODID(odid: string): FakeRequestBuilder { if (this.request.user) this.request.user.odid = odid; return this; } withHeaderBiddingType(headerBiddingType: HeaderBiddingType) { this.request.headerBiddingType = headerBiddingType; return this; } build(): ChoiceRequest { return this.request; } }