• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

prebid / Prebid.js / 16885668971

11 Aug 2025 04:12PM UTC coverage: 96.248% (-0.006%) from 96.254%
16885668971

push

github

46b4fe
web-flow
PubMatic Analytics Adapter Optimization. (#13711)

* Targetting key set for floor applied from PM RTD module

* Test Cases Added

* UPR related changes

* Minor changes

* Added targeting keys in constants

* UOE-12412: Added floorProvider = "PM" related check to set the targeting

* UOE-12412: Removed modelVersion related check

* UOE-12412: Changed Key Name for targeting

* UOE-12412: Enabling and disabling targetting key based on adServertargeting coming from config

* UOE-12412: RTD provider error handling for undefined configs

* Refactor: Improve bid status handling and floor value detection for No Bids scenario in PubMatic RTD provider

* Refactor: Extract bid targeting logic into separate functions

* Refactor: Improve pubmatic RTD provider targeting logic and add test coverage

* Enhance PubMatic RTD floor calculation with multi-size support and targeting precision

* UOE-12413: Changed adServerTargeting to pmTargetingKeys

* Enhance multiplier handling in pubmatic RTD provider

* PubM RTD Module: Update pubmatic RTD provider with enhanced targeting logic and test coverage

* PubM RTD Module: Multipliers fallback mechanism implemented and test cases edited

* Code changes optimisation

* Test case optimized

* Test cases: add unit tests for multiplier extraction in pubmatic RTD provider

* refactor: reorder multiplier sources in pubmaticRtdProvider to prioritize config.json over floor.json

* Fix: update NOBID multiplier from 1.6 to 1.2 in pubmaticRtdProvider module

* Refactor: enhance floor value calculation for multi-format ad units and improve logging

* Refactor: Add getBidder function and remove unused findWinningBid import in PubMatic RTD provider tests

* chore: remove unused pubmaticRtd example and noconfig files

* PubMatic RTD module markdown file update having targetingKey details

* Fix:  Removed extra whitespace and normalize line endings in RTD provider

* fix: add colon to RTD targeting log message in pubmaticRtdProvider

* Pu... (continued)

39409 of 48455 branches covered (81.33%)

603 of 626 new or added lines in 2 files covered. (96.33%)

12 existing lines in 9 files now uncovered.

195381 of 202997 relevant lines covered (96.25%)

123.94 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.88
/test/spec/modules/pubmaticAnalyticsAdapter_spec.js
1
import pubmaticAnalyticsAdapter, { getMetadata } from 'modules/pubmaticAnalyticsAdapter.js';
2
import adapterManager from 'src/adapterManager.js';
3
import { EVENTS, REJECTION_REASON } from 'src/constants.js';
4
import { config } from 'src/config.js';
5
import { setConfig } from 'modules/currency.js';
6
import { server } from '../../mocks/xhr.js';
7
import { getGlobal } from 'src/prebidGlobal.js';
8
import 'src/prebid.js';
9

10
const events = require('src/events');
1✔
11
const utils = require('src/utils');
1✔
12

13
const DEFAULT_USER_AGENT = window.navigator.userAgent;
1✔
14
const MOBILE_USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1';
1✔
15
const setUADefault = () => { window.navigator.__defineGetter__('userAgent', function () { return DEFAULT_USER_AGENT }) };
347✔
16
const setUAMobile = () => { window.navigator.__defineGetter__('userAgent', function () { return MOBILE_USER_AGENT }) };
1✔
17
const setUANull = () => { window.navigator.__defineGetter__('userAgent', function () { return null }) };
1✔
18

19
const {
20
  AUCTION_INIT,
21
  AUCTION_END,
22
  BID_REQUESTED,
23
  BID_RESPONSE,
24
  BID_REJECTED,
25
  BIDDER_DONE,
26
  BID_WON,
27
  BID_TIMEOUT,
28
  SET_TARGETING
29
} = EVENTS;
1✔
30

31
const DISPLAY_MANAGER = 'Prebid.js';
1✔
32

33
const BID = {
1✔
34
  'bidder': 'pubmatic',
35
  'width': 640,
36
  'height': 480,
37
  'mediaType': 'video',
38
  'statusMessage': 'Bid available',
39
  'bidId': '2ecff0db240757',
40
  'partnerImpId': 'partnerImpressionID-1',
41
  'adId': 'fake_ad_id',
42
  'source': 's2s',
43
  'requestId': '2ecff0db240757',
44
  'currency': 'USD',
45
  'creativeId': '3571560',
46
  'cpm': 1.22752,
47
  'originalCpm': 1.22752,
48
  'originalCurrency': 'USD',
49
  'ttl': 300,
50
  'netRevenue': false,
51
  'ad': '<html></html>',
52
  'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
53
  'responseTimestamp': 1519149629415,
54
  'requestTimestamp': 1519149628471,
55
  'adUnitCode': '/19968336/header-bid-tag-0',
56
  'timeToRespond': 944,
57
  'pbLg': '1.00',
58
  'pbMg': '1.20',
59
  'pbHg': '1.22',
60
  'pbAg': '1.20',
61
  'pbDg': '1.22',
62
  'pbCg': '',
63
  'size': '640x480',
64
  'adserverTargeting': {
65
    'hb_bidder': 'pubmatic',
66
    'hb_adid': '2ecff0db240757',
67
    'hb_pb': 1.20,
68
    'hb_size': '640x480',
69
    'hb_source': 'server'
70
  },
71
  'floorData': {
72
    'cpmAfterAdjustments': 6.3,
73
    'enforcements': { 'enforceJS': true, 'enforcePBS': false, 'floorDeals': false, 'bidAdjustment': true },
74
    'floorCurrency': 'USD',
75
    'floorRule': 'banner',
76
    'floorRuleValue': 1.1,
77
    'floorValue': 1.1
78
  },
79
  getStatusCode() {
UNCOV
80
    return 1;
×
81
  }
82
};
83

84
const BID2 = Object.assign({}, BID, {
1✔
85
  adUnitCode: '/19968336/header-bid-tag-1',
86
  bidId: '3bd4ebb1c900e2',
87
  partnerImpId: 'partnerImpressionID-2',
88
  adId: 'fake_ad_id_2',
89
  requestId: '3bd4ebb1c900e2',
90
  width: 728,
91
  height: 90,
92
  mediaType: 'banner',
93
  cpm: 1.52,
94
  originalCpm: 1.52,
95
  dealId: 'the-deal-id',
96
  dealChannel: 'PMP',
97
  mi: 'matched-impression',
98
  seatBidId: 'aaaa-bbbb-cccc-dddd',
99
  adserverTargeting: {
100
    'hb_bidder': 'pubmatic',
101
    'hb_adid': '3bd4ebb1c900e2',
102
    'hb_pb': 1.50,
103
    'hb_size': '728x90',
104
    'hb_source': 'server'
105
  },
106
  meta: {
107
    advertiserDomains: ['example.com']
108
  }
109
});
110
const BID3 = Object.assign({}, BID2, {
1✔
111
  rejectionReason: REJECTION_REASON.FLOOR_NOT_MET
112
})
113
const MOCK = {
1✔
114
  SET_TARGETING: {
115
    [BID.adUnitCode]: BID.adserverTargeting,
116
    [BID2.adUnitCode]: BID2.adserverTargeting
117
  },
118
  AUCTION_INIT: {
119
    'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
120
    'timestamp': 1519767010567,
121
    'auctionStatus': 'inProgress',
122
    'adUnits': [{
123
      'code': '/19968336/header-bid-tag-1',
124
      'sizes': [[640, 480]],
125
      'bids': [{
126
        'bidder': 'pubmatic',
127
        'params': {
128
          'publisherId': '1001'
129
        }
130
      }],
131
      'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014'
132
    }
133
    ],
134
    'adUnitCodes': ['/19968336/header-bid-tag-1'],
135
    'bidderRequests': [{
136
      'bidderCode': 'pubmatic',
137
      'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
138
      'bidderRequestId': '1be65d7958826a',
139
      'bids': [{
140
        'bidder': 'pubmatic',
141
        'params': {
142
          'publisherId': '1001',
143
          'kgpv': 'this-is-a-kgpv'
144
        },
145
        'mediaTypes': {
146
          'banner': {
147
            'sizes': [[640, 480]]
148
          }
149
        },
150
        'adUnitCode': '/19968336/header-bid-tag-1',
151
        'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
152
        'sizes': [[640, 480]],
153
        'bidId': '2ecff0db240757',
154
        'bidderRequestId': '1be65d7958826a',
155
        'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
156
        'src': 'client',
157
        'bidRequestsCount': 1
158
      }
159
      ],
160
      'timeout': 3000,
161
      'refererInfo': {
162
        'topmostLocation': 'http://www.test.com/page.html', 'reachedTop': true, 'numIframes': 0, 'stack': ['http://www.test.com/page.html']
163
      }
164
    }
165
    ],
166
    'bidsReceived': [],
167
    'winningBids': [],
168
    'timeout': 3000
169
  },
170
  BID_REQUESTED: {
171
    'bidder': 'pubmatic',
172
    'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
173
    'bidderRequestId': '1be65d7958826a',
174
    'bids': [
175
      {
176
        'bidder': 'pubmatic',
177
        'adapterCode': 'pubmatic',
178
        'bidderCode': 'pubmatic',
179
        'params': {
180
          'publisherId': '1001',
181
          'video': {
182
            'minduration': 30,
183
            'skippable': true
184
          }
185
        },
186
        'mediaType': 'video',
187
        'adUnitCode': '/19968336/header-bid-tag-0',
188
        'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
189
        'sizes': [[640, 480]],
190
        'bidId': '2ecff0db240757',
191
        'bidderRequestId': '1be65d7958826a',
192
        'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa'
193
      },
194
      {
195
        'bidder': 'pubmatic',
196
        'adapterCode': 'pubmatic',
197
        'bidderCode': 'pubmatic',
198
        'params': {
199
          'publisherId': '1001',
200
          'kgpv': 'this-is-a-kgpv'
201
        },
202
        'mediaTypes': {
203
          'banner': {
204
            'sizes': [[1000, 300], [970, 250], [728, 90]]
205
          }
206
        },
207
        'adUnitCode': '/19968336/header-bid-tag-1',
208
        'transactionId': 'c116413c-9e3f-401a-bee1-d56aec29a1d4',
209
        'sizes': [[1000, 300], [970, 250], [728, 90]],
210
        'bidId': '3bd4ebb1c900e2',
211
        'seatBidId': 'aaaa-bbbb-cccc-dddd',
212
        'bidderRequestId': '1be65d7958826a',
213
        'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
214
        'floorData': {
215
          'fetchStatus': 'success',
216
          'floorMin': undefined,
217
          'floorProvider': 'pubmatic',
218
          'location': 'fetch',
219
          'modelTimestamp': undefined,
220
          'modelVersion': 'floorModelTest',
221
          'modelWeight': undefined,
222
          'skipRate': 0,
223
          'skipped': false
224
        }
225
      }
226
    ],
227
    'auctionStart': 1519149536560,
228
    'timeout': 5000,
229
    'start': 1519149562216,
230
    'refererInfo': {
231
      'topmostLocation': 'http://www.test.com/page.html', 'reachedTop': true, 'numIframes': 0, 'stack': ['http://www.test.com/page.html']
232
    },
233
    'gdprConsent': {
234
      'consentString': 'here-goes-gdpr-consent-string',
235
      'gdprApplies': true
236
    }
237
  },
238
  BID_RESPONSE: [
239
    BID,
240
    BID2
241
  ],
242
  REJECTED_BID: [
243
    BID3
244
  ],
245
  AUCTION_END: {
246
    'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa'
247
  },
248
  BID_WON: [
249
    Object.assign({}, BID, {
250
      'status': 'rendered'
251
    }),
252
    Object.assign({}, BID2, {
253
      'status': 'rendered'
254
    })
255
  ],
256
  BIDDER_DONE: {
257
    'bidderCode': 'pubmatic',
258
    'bids': [
259
      BID,
260
      Object.assign({}, BID2, {
261
        'serverResponseTimeMs': 42,
262
      })
263
    ]
264
  },
265
  BID_TIMEOUT: [
266
    {
267
      'bidId': '3bd4ebb1c900e2',
268
      'bidder': 'pubmatic',
269
      'adUnitCode': '/19968336/header-bid-tag-1',
270
      'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa'
271
    }
272
  ]
273
};
274

275
function getLoggerJsonFromRequest(requestBody) {
276
  return JSON.parse(decodeURIComponent(requestBody));
19✔
277
}
278

279
describe('pubmatic analytics adapter', function () {
1✔
280
  let sandbox;
281
  let requests;
282
  let oldScreen;
283
  let clock;
284

285
  beforeEach(function () {
1✔
286
    setUADefault();
19✔
287
    sandbox = sinon.createSandbox();
19✔
288

289
    requests = server.requests;
19✔
290

291
    sandbox.stub(events, 'getEvents').returns([]);
19✔
292

293
    clock = sandbox.useFakeTimers(1519767013781);
19✔
294

295
    config.setConfig({
19✔
296
      s2sConfig: {
297
        timeout: 1000,
298
        accountId: 10000,
299
        bidders: ['pubmatic']
300
      }
301
    })
302
  });
303

304
  afterEach(function () {
1✔
305
    sandbox.restore();
19✔
306
    config.resetConfig();
19✔
307
    clock.runAll();
19✔
308
    clock.restore();
19✔
309
  });
310

311
  it('should require publisherId', function () {
1✔
312
    sandbox.stub(utils, 'logError');
1✔
313
    pubmaticAnalyticsAdapter.enableAnalytics({
1✔
314
      options: {}
315
    });
316
    expect(utils.logError.called).to.equal(true);
1✔
317
  });
318

319
  describe('OW S2S', function () {
1✔
320
    this.beforeEach(function () {
1✔
321
      pubmaticAnalyticsAdapter.enableAnalytics({
2✔
322
        options: {
323
          publisherId: 9999,
324
          profileId: 1111,
325
          profileVersionId: 20
326
        }
327
      });
328
      config.setConfig({
2✔
329
        s2sConfig: {
330
          accountId: '1234',
331
          bidders: ['pubmatic'],
332
          defaultVendor: 'openwrap',
333
          timeout: 500
334
        }
335
      });
336
    });
337

338
    this.afterEach(function () {
1✔
339
      pubmaticAnalyticsAdapter.disableAnalytics();
2✔
340
    });
341

342
    it('Pubmatic Won: No tracker fired', function () {
1✔
343
      this.timeout(5000)
1✔
344

345
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake(() => {
1✔
346
        return [MOCK.BID_RESPONSE[0], MOCK.BID_RESPONSE[1]]
1✔
347
      });
348

349
      config.setConfig({
1✔
350
        testGroupId: 15
351
      });
352

353
      if (getGlobal().getUserIds !== 'function') {
1✔
354
        getGlobal().getUserIds = function () { return {}; };
48✔
355
      }
356

357
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
358
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
359
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
360
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
361
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
362
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
363
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
364

365
      clock.tick(2000 + 1000);
1✔
366
      expect(requests.length).to.equal(1); // only logger is fired
1✔
367
      const request = requests[0];
1✔
368
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
369
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
370
      // check mandatory fields
371
      expect(data).to.have.property('sd');
1✔
372
      expect(data).to.have.property('fd');
1✔
373
      expect(data).to.have.property('rd');
1✔
374

375
      expect(data.rd.pubid).to.equal('9999');
1✔
376
      expect(data.rd.pid).to.equal('1111');
1✔
377
      expect(data.rd.pdvid).to.equal('20');
1✔
378
    });
379

380
    it('Non-pubmatic won: logger, tracker fired', function () {
1✔
381
      const APPNEXUS_BID = Object.assign({}, BID, {
1✔
382
        'bidder': 'appnexus',
383
        'adserverTargeting': {
384
          'hb_bidder': 'appnexus',
385
          'hb_adid': '2ecff0db240757',
386
          'hb_pb': 1.20,
387
          'hb_size': '640x480',
388
          'hb_source': 'server'
389
        }
390
      });
391

392
      const MOCK_AUCTION_INIT_APPNEXUS = {
1✔
393
        'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
394
        'timestamp': 1519767010567,
395
        'auctionStatus': 'inProgress',
396
        'adUnits': [{
397
          'code': '/19968336/header-bid-tag-1',
398
          'sizes': [[640, 480]],
399
          'bids': [{
400
            'bidder': 'appnexus',
401
            'params': {
402
              'publisherId': '1001'
403
            }
404
          }],
405
          'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014'
406
        }
407
        ],
408
        'adUnitCodes': ['/19968336/header-bid-tag-1'],
409
        'bidderRequests': [{
410
          'bidderCode': 'appnexus',
411
          'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
412
          'bidderRequestId': '1be65d7958826a',
413
          'bids': [{
414
            'bidder': 'appnexus',
415
            'params': {
416
              'publisherId': '1001',
417
              'kgpv': 'this-is-a-kgpv'
418
            },
419
            'mediaTypes': {
420
              'banner': {
421
                'sizes': [[640, 480]]
422
              }
423
            },
424
            'adUnitCode': '/19968336/header-bid-tag-1',
425
            'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
426
            'sizes': [[640, 480]],
427
            'bidId': '2ecff0db240757',
428
            'bidderRequestId': '1be65d7958826a',
429
            'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
430
            'src': 'client',
431
            'bidRequestsCount': 1
432
          }
433
          ],
434
          'timeout': 3000,
435
          'refererInfo': {
436
            'topmostLocation': 'http://www.test.com/page.html', 'reachedTop': true, 'numIframes': 0, 'stack': ['http://www.test.com/page.html']
437
          }
438
        }
439
        ],
440
        'bidsReceived': [],
441
        'winningBids': [],
442
        'timeout': 3000
443
      };
444

445
      const MOCK_BID_REQUESTED_APPNEXUS = {
1✔
446
        'bidder': 'appnexus',
447
        'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa',
448
        'bidderRequestId': '1be65d7958826a',
449
        'bids': [
450
          {
451
            'bidder': 'appnexus',
452
            'adapterCode': 'appnexus',
453
            'bidderCode': 'appnexus',
454
            'params': {
455
              'publisherId': '1001',
456
              'video': {
457
                'minduration': 30,
458
                'skippable': true
459
              }
460
            },
461
            'mediaType': 'video',
462
            'adUnitCode': '/19968336/header-bid-tag-0',
463
            'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
464
            'sizes': [[640, 480]],
465
            'bidId': '2ecff0db240757',
466
            'bidderRequestId': '1be65d7958826a',
467
            'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa'
468
          }
469
        ],
470
        'auctionStart': 1519149536560,
471
        'timeout': 5000,
472
        'start': 1519149562216,
473
        'refererInfo': {
474
          'topmostLocation': 'http://www.test.com/page.html', 'reachedTop': true, 'numIframes': 0, 'stack': ['http://www.test.com/page.html']
475
        },
476
        'gdprConsent': {
477
          'consentString': 'here-goes-gdpr-consent-string',
478
          'gdprApplies': true
479
        }
480
      };
481

482
      this.timeout(5000)
1✔
483

484
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake((key) => {
1✔
485
        return [APPNEXUS_BID]
1✔
486
      });
487

488
      events.emit(AUCTION_INIT, MOCK_AUCTION_INIT_APPNEXUS);
1✔
489
      events.emit(BID_REQUESTED, MOCK_BID_REQUESTED_APPNEXUS);
1✔
490
      events.emit(BID_RESPONSE, APPNEXUS_BID);
1✔
491
      events.emit(BIDDER_DONE, {
1✔
492
        'bidderCode': 'appnexus',
493
        'bids': [
494
          APPNEXUS_BID,
495
          Object.assign({}, APPNEXUS_BID, {
496
            'serverResponseTimeMs': 42,
497
          })
498
        ]
499
      });
500
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
501
      events.emit(SET_TARGETING, {
1✔
502
        [APPNEXUS_BID.adUnitCode]: APPNEXUS_BID.adserverTargeting,
503
      });
504
      events.emit(BID_WON, Object.assign({}, APPNEXUS_BID, {
1✔
505
        'status': 'rendered'
506
      }));
507

508
      clock.tick(2000 + 1000);
1✔
509
      expect(requests.length).to.equal(2); // logger as well as tracker is fired
1✔
510
      const request = requests[1]; // logger is executed late, trackers execute first
1✔
511
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
512
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
513

514
      // check mandatory fields
515
      expect(data).to.have.property('sd');
1✔
516
      expect(data).to.have.property('fd');
1✔
517
      expect(data).to.have.property('rd');
1✔
518

519
      expect(data.rd.pubid).to.equal('9999');
1✔
520
      expect(data.rd.pid).to.equal('1111');
1✔
521
      expect(data.rd.pdvid).to.equal('20');
1✔
522

523
      expect(data.sd).to.be.an('object');
1✔
524
      expect(Object.keys(data.sd).length).to.equal(1);
1✔
525
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].adapterCode).to.equal('appnexus');
1✔
526
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidderCode).to.equal('appnexus');
1✔
527

528
      const firstTracker = requests[0].url;
1✔
529
      expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
1✔
530
      firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
2✔
531
      expect(data.rd.pubid).to.equal('9999');
1✔
532
      expect(decodeURIComponent(data.rd.purl)).to.equal('http://www.test.com/page.html');
1✔
533
    })
534
  });
535

536
  describe('when handling events', function () {
1✔
537
    beforeEach(function () {
1✔
538
      pubmaticAnalyticsAdapter.enableAnalytics({
16✔
539
        options: {
540
          publisherId: 9999,
541
          profileId: 1111,
542
          profileVersionId: 20
543
        }
544
      });
545
    });
546

547
    afterEach(function () {
1✔
548
      pubmaticAnalyticsAdapter.disableAnalytics();
16✔
549
    });
550

551
    it('Logger: best case + win tracker', function () {
1✔
552
      this.timeout(5000)
1✔
553

554
      const mockUserIds = {
1✔
555
        'pubmaticId': 'test-pubmaticId'
556
      };
557

558
      const mockUserSync = {
1✔
559
        userIds: [
560
          {
561
            name: 'pubmaticId',
562
            storage: { name: 'pubmaticId', type: 'cookie&html5' }
563
          }
564
        ]
565
      };
566

567
      sandbox.stub(getGlobal(), 'getUserIds').callsFake(() => {
1✔
568
        return mockUserIds;
3✔
569
      });
570

571
      sandbox.stub(getGlobal(), 'getConfig').callsFake((key) => {
1✔
572
        if (key === 'userSync') return mockUserSync;
6✔
573
        return null;
3✔
574
      });
575

576
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake((key) => {
1✔
577
        return [MOCK.BID_RESPONSE[0], MOCK.BID_RESPONSE[1]]
1✔
578
      });
579

580
      config.setConfig({
1✔
581
        testGroupId: 15
582
      });
583

584
      var mockAuctionEnd = {
1✔
585
        "auctionId": MOCK.BID_REQUESTED.auctionId,
586
        "bidderRequests": [
587
          {
588
            "bidderCode": "pubmatic",
589
            "auctionId": MOCK.BID_REQUESTED.auctionId,
590
            "bidderRequestId": MOCK.BID_REQUESTED.bidderRequestId,
591
            "bids": [
592
              {
593
                "bidder": "pubmatic",
594
                "auctionId": MOCK.BID_REQUESTED.auctionId,
595
                "adUnitCode": "div2",
596
                "transactionId": "bac39250-1006-42c2-b48a-876203505f95",
597
                "adUnitId": "a36be277-84ce-42aa-b840-e95dbd104a3f",
598
                "sizes": [
599
                  [
600
                    728,
601
                    90
602
                  ]
603
                ],
604
                "bidId": "9cfd58f75514bc8",
605
                "bidderRequestId": "857a9c3758c5cc8",
606
                "timeout": 3000
607
              }
608
            ],
609
            "auctionStart": 1753342540904,
610
            "timeout": 3000,
611
            "ortb2": {
612
              "source": {},
613
              "user": {
614
                "ext": {
615
                  "ctr": "US"
616
                }
617
              }
618
            },
619
            "start": 1753342540938
620
          }
621
        ]
622
      }
623

624
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
625
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
626
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
627
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1✔
628
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
629
      events.emit(AUCTION_END, mockAuctionEnd);
1✔
630
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
631
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
632
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
633

634
      clock.tick(2000 + 1000);
1✔
635
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
636
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
637
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
638
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
639

640
      // check mandatory fields
641
      expect(data).to.have.property('sd');
1✔
642
      expect(data).to.have.property('fd');
1✔
643
      expect(data).to.have.property('rd');
1✔
644

645
      expect(data.rd.pubid).to.equal('9999');
1✔
646
      expect(data.rd.pid).to.equal('1111');
1✔
647
      expect(data.rd.pdvid).to.equal('20');
1✔
648
      expect(data.rd.iid).to.equal('25c6d7f5-699a-4bfc-87c9-996f915341fa');
1✔
649
      expect(data.rd.to).to.equal(3000);
1✔
650
      expect(data.rd.purl).to.equal('http://www.test.com/page.html');
1✔
651
      expect(data.rd.tst).to.equal(1519767016);
1✔
652
      expect(data.rd.tgid).to.equal(15);
1✔
653
      expect(data.fd.bdv.lip).to.deep.equal(['pubmaticId']);
1✔
654
      expect(data.rd.s2sls).to.deep.equal(['pubmatic']);
1✔
655
      expect(data.rd.ctr).to.equal('US');
1✔
656

657
      // floor data in featureList
658
      expect(data.fd.flr.modelVersion).to.equal('floorModelTest');
1✔
659
      expect(data.fd.flr).to.have.property('enforcements');
1✔
660
      expect(data.fd.flr.enforcements).to.deep.equal({
1✔
661
        enforceJS: true,
662
        enforcePBS: false,
663
        floorDeals: false,
664
        bidAdjustment: true
665
      });
666
      expect(data.fd.flr.fetchStatus).to.equal('success');
1✔
667
      expect(data.fd.flr.floorProvider).to.equal('pubmatic');
1✔
668
      expect(data.fd.flr.location).to.equal('fetch');
1✔
669
      expect(data.fd.flr.skipRate).to.equal(0);
1✔
670
      expect(data.fd.flr.skipped).to.equal(false);
1✔
671

672
      expect(data.sd).to.be.an('object');
1✔
673
      expect(Object.keys(data.sd).length).to.equal(2);
1✔
674

675
      // tracker slot1
676
      const firstTracker = requests[0];
1✔
677
      expect(firstTracker.url).to.equal('https://t.pubmatic.com/wt?v=1&psrc=web');
1✔
678
      const trackerData = getLoggerJsonFromRequest(firstTracker.requestBody);
1✔
679
      expect(trackerData).to.have.property('sd');
1✔
680
      expect(trackerData).to.have.property('fd');
1✔
681
      expect(trackerData).to.have.property('rd');
1✔
682
      expect(trackerData.rd.pubid).to.equal('9999');
1✔
683
      expect(trackerData.rd.pid).to.equal('1111');
1✔
684
      expect(trackerData.rd.pdvid).to.equal('20');
1✔
685
      expect(trackerData.rd.purl).to.equal('http://www.test.com/page.html');
1✔
686
      expect(trackerData.rd.ctr).to.equal('US');
1✔
687
    });
688

689
    it('Logger: log floor fields when prebids floor shows setConfig in location property', function () {
1✔
690
      const BID_REQUESTED_COPY = utils.deepClone(MOCK.BID_REQUESTED);
1✔
691
      BID_REQUESTED_COPY['bids'][1]['floorData']['location'] = 'fetch';
1✔
692

693
      this.timeout(5000)
1✔
694

695
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake((key) => {
1✔
696
        return [MOCK.BID_RESPONSE[0], MOCK.BID_RESPONSE[1]]
1✔
697
      });
698

699
      config.setConfig({
1✔
700
        testGroupId: 15
701
      });
702

703
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
704
      events.emit(BID_REQUESTED, BID_REQUESTED_COPY);
1✔
705
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
706
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1✔
707
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
708
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
709
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
710
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
711
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
712

713
      clock.tick(2000 + 1000);
1✔
714
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
715
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
716
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
717

718
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
719
      // check mandatory fields
720
      expect(data).to.have.property('sd');
1✔
721
      expect(data).to.have.property('fd');
1✔
722
      expect(data).to.have.property('rd');
1✔
723

724
      expect(data.rd.pubid).to.equal('9999');
1✔
725
      // floor data in featureList
726
      expect(data.fd.flr.modelVersion).to.equal('floorModelTest');
1✔
727
      expect(data.fd.flr).to.have.property('enforcements');
1✔
728
      expect(data.fd.flr.enforcements).to.deep.equal({
1✔
729
        enforceJS: true,
730
        enforcePBS: false,
731
        floorDeals: false,
732
        bidAdjustment: true
733
      });
734
      expect(data.fd.flr.fetchStatus).to.equal('success');
1✔
735
      expect(data.fd.flr.floorProvider).to.equal('pubmatic');
1✔
736
      expect(data.fd.flr.location).to.equal('fetch');
1✔
737
      expect(data.fd.flr.skipRate).to.equal(0);
1✔
738
      expect(data.fd.flr.skipped).to.equal(false);
1✔
739
    });
740

741
    // done
742
    it('bidCpmAdjustment: USD: Logger: best case + win tracker', function () {
1✔
743
      const bidCopy = utils.deepClone(BID);
1✔
744
      bidCopy.cpm = bidCopy.originalCpm * 2; //  bidCpmAdjustment => bidCpm * 2
1✔
745
      this.timeout(5000)
1✔
746

747
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake((key) => {
1✔
748
        return [bidCopy, MOCK.BID_RESPONSE[1]]
1✔
749
      });
750

751
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
752
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
753
      events.emit(BID_RESPONSE, bidCopy);
1✔
754
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1✔
755
      events.emit(BID_RESPONSE, bidCopy);
1✔
756
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
757
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
758
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
759
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
760
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
761

762
      clock.tick(3000 + 2000);
1✔
763
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
764
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
765
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
766
      let data = getLoggerJsonFromRequest(request.requestBody);
1✔
767

768
      // check mandatory fields
769
      expect(data).to.have.property('sd');
1✔
770
      expect(data).to.have.property('fd');
1✔
771
      expect(data).to.have.property('rd');
1✔
772

773
      expect(data.rd.pubid).to.equal('9999');
1✔
774
      expect(data.rd.pid).to.equal('1111');
1✔
775
      expect(data.rd.tgid).to.equal(0);
1✔
776
      // floor data in featureList
777
      expect(data.fd.flr.modelVersion).to.equal('floorModelTest');
1✔
778
      expect(data.fd.flr).to.have.property('enforcements');
1✔
779
      expect(data.fd.flr.enforcements).to.deep.equal({
1✔
780
        enforceJS: true,
781
        enforcePBS: false,
782
        floorDeals: false,
783
        bidAdjustment: true
784
      });
785
      expect(data.fd.flr.fetchStatus).to.equal('success');
1✔
786
      expect(data.fd.flr.floorProvider).to.equal('pubmatic');
1✔
787
      expect(data.fd.flr.location).to.equal('fetch');
1✔
788
      expect(data.fd.flr.skipRate).to.equal(0);
1✔
789
      expect(data.fd.flr.skipped).to.equal(false);
1✔
790

791
      expect(data.sd).to.be.an('object');
1✔
792
      expect(Object.keys(data.sd).length).to.equal(2);
1✔
793

794
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.bidGrossCpmUSD).to.equal(1.23);
1✔
795
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.bidPriceUSD).to.equal(2.46);
1✔
796
      // tracker slot1
797
      const firstTracker = requests[0].url;
1✔
798
      expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
1✔
799
      data = {};
1✔
800
      firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
2✔
801
      expect(data.v).to.equal('1');
1✔
802
      expect(data.psrc).to.equal('web');
1✔
803
    });
804

805
    it('bidCpmAdjustment: JPY: Logger: best case + win tracker', function () {
1✔
806
      config.setConfig({
1✔
807
        testGroupId: 25
808
      });
809

810
      setConfig({
1✔
811
        adServerCurrency: 'JPY',
812
        rates: {
813
          USD: {
814
            JPY: 100
815
          }
816
        }
817
      });
818
      const bidCopy = utils.deepClone(BID);
1✔
819
      bidCopy.originalCpm = 100;
1✔
820
      bidCopy.originalCurrency = 'JPY';
1✔
821
      bidCopy.currency = 'JPY';
1✔
822
      bidCopy.cpm = bidCopy.originalCpm * 2; //  bidCpmAdjustment => bidCpm * 2
1✔
823

824
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
825
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
826
      events.emit(BID_RESPONSE, bidCopy);
1✔
827
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1✔
828
      events.emit(BID_RESPONSE, bidCopy);
1✔
829
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
830
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
831
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
832
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
833
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
834

835
      clock.tick(2000 + 1000);
1✔
836
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
837
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
838
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
839
      let data = getLoggerJsonFromRequest(request.requestBody);
1✔
840
      // check mandatory fields
841
      expect(data).to.have.property('sd');
1✔
842
      expect(data).to.have.property('fd');
1✔
843
      expect(data).to.have.property('rd');
1✔
844

845
      expect(data.rd.pubid).to.equal('9999');
1✔
846
      expect(data.rd.pid).to.equal('1111');
1✔
847
      expect(data.rd.tgid).to.equal(0);// test group id should be between 0-15 else set to 0
1✔
848
      // floor data in featureList
849
      expect(data.fd.flr.modelVersion).to.equal('floorModelTest');
1✔
850
      expect(data.fd.flr).to.have.property('enforcements');
1✔
851
      expect(data.fd.flr.enforcements).to.deep.equal({
1✔
852
        enforceJS: true,
853
        enforcePBS: false,
854
        floorDeals: false,
855
        bidAdjustment: true
856
      });
857
      expect(data.fd.flr.fetchStatus).to.equal('success');
1✔
858
      expect(data.fd.flr.floorProvider).to.equal('pubmatic');
1✔
859
      expect(data.fd.flr.location).to.equal('fetch');
1✔
860
      expect(data.fd.flr.skipRate).to.equal(0);
1✔
861
      expect(data.fd.flr.skipped).to.equal(false);
1✔
862
      expect(data.sd).to.be.an('object');
1✔
863
      expect(Object.keys(data.sd).length).to.equal(2);
1✔
864
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.bidGrossCpmUSD).to.equal(1);
1✔
865
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.bidPriceUSD).to.equal(200); // bidPriceUSD is not getting set as currency module is not added
1✔
866

867
      // tracker slot1
868
      let firstTracker = requests[0].url;
1✔
869
      expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
1✔
870
      data = {};
1✔
871
      firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
2✔
872
      expect(data.v).to.equal('1');
1✔
873
      expect(data.psrc).to.equal('web');
1✔
874
    });
875

876
    it('Logger: when bid is not submitted, default bid status 1 check: pubmatic set as s2s', function () {
1✔
877
      config.setConfig({
1✔
878
        testGroupId: '25'
879
      });
880

881
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
882
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
883
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
884
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
885
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
886
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
887
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
888

889
      clock.tick(2000 + 1000);
1✔
890
      expect(requests.length).to.equal(2); // 1 logger and 1 win-tracker
1✔
891
      const request = requests[1]; // logger is executed late, trackers execute first
1✔
892
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
893

894
      // check mandatory fields
895
      expect(data).to.have.property('sd');
1✔
896
      expect(data).to.have.property('fd');
1✔
897
      expect(data).to.have.property('rd');
1✔
898

899
      expect(data.rd.tgid).to.equal(0);// test group id should be an INT between 0-15 else set to 0
1✔
900

901
      expect(data.sd).to.be.an('object');
1✔
902
      expect(Object.keys(data.sd).length).to.equal(2);
1✔
903

904
      expect(data.sd).to.have.property('/19968336/header-bid-tag-0');
1✔
905
      expect(data.sd['/19968336/header-bid-tag-0'].dimensions).to.deep.equal([[640, 480]])
1✔
906
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].adapterCode).to.equal('pubmatic');
1✔
907
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidderCode).to.equal('pubmatic');
1✔
908
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCpm).to.equal(1.23);
1✔
909
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
910
    });
911

912
    it('Logger: post-timeout check without bid response', function () {
1✔
913
      // db = 1 and t = 1 means bidder did NOT respond with a bid but we got a timeout notification
914
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
915
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
916
      events.emit(BID_TIMEOUT, MOCK.BID_TIMEOUT);
1✔
917
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
918
      clock.tick(2000 + 1000);
1✔
919

920
      expect(requests.length).to.equal(1); // 1 logger and 0 win-tracker
1✔
921
      const request = requests[0];
1✔
922
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
923
      // check mandatory fields
924
      expect(data).to.have.property('sd');
1✔
925
      expect(data).to.have.property('fd');
1✔
926
      expect(data).to.have.property('rd');
1✔
927

928
      expect(data.sd).to.be.an('object');
1✔
929
      expect(Object.keys(data.sd).length).to.equal(2);
1✔
930
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
931
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
932
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
933
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
934
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].params.kgpv).to.equal('this-is-a-kgpv');
1✔
935
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.not.have.property('bidResponse')
1✔
936
    });
937

938
    it('Logger: post-timeout check with bid response', function () {
1✔
939
      // db = 1 and t = 1 means bidder did NOT respond with a bid but we got a timeout notification
940

941
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake((key) => {
1✔
942
        return [MOCK.BID_RESPONSE[1]]
1✔
943
      });
944

945
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
946
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
947
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1✔
948
      events.emit(BID_TIMEOUT, MOCK.BID_TIMEOUT);
1✔
949
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
950
      clock.tick(2000 + 1000);
1✔
951

952
      expect(requests.length).to.equal(1); // 1 logger and 0 win-tracker
1✔
953
      const request = requests[0];
1✔
954
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
955
      // check mandatory fields
956
      expect(data).to.have.property('sd');
1✔
957
      expect(data).to.have.property('fd');
1✔
958
      expect(data).to.have.property('rd');
1✔
959

960
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
961
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
962
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
963
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
964

965
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].params.kgpv).to.equal('this-is-a-kgpv');
1✔
966
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
967
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCpm).to.equal(1.52);
1✔
968
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
969

970
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealId).to.equal('the-deal-id');
1✔
971
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].partnerTimeToRespond).to.equal(944);
1✔
972
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].clientLatencyTimeMs).to.equal(3214);
1✔
973
      expect(data.rd.s2sls).to.deep.equal(['pubmatic']);
1✔
974

975
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].status).to.equal('error');
1✔
976
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mediaType).to.equal('banner');
1✔
977
    });
978

979
    it('Logger: currency conversion check', function () {
1✔
980
      setUANull();
1✔
981
      setConfig({
1✔
982
        adServerCurrency: 'JPY',
983
        rates: {
984
          USD: {
985
            JPY: 100
986
          }
987
        }
988
      });
989
      const bidCopy = utils.deepClone(BID2);
1✔
990
      bidCopy.currency = 'JPY';
1✔
991
      bidCopy.cpm = 100;
1✔
992
      bidCopy.originalCpm = 100;
1✔
993
      bidCopy.originalCurrency = 'JPY';
1✔
994

995
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
996
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
997
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
998
      events.emit(BID_RESPONSE, bidCopy);
1✔
999
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1000
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1001
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
1002
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
1003
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
1004

1005
      clock.tick(2000 + 1000);
1✔
1006
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
1007
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
1008
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
1009
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
1010
      // check mandatory fields
1011
      expect(data).to.have.property('sd');
1✔
1012
      expect(data).to.have.property('fd');
1✔
1013
      expect(data).to.have.property('rd');
1✔
1014

1015
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
1016
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
1017
      expect(data.sd['/19968336/header-bid-tag-1'].bids).to.have.property('3bd4ebb1c900e2');
1✔
1018
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
1019
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
1020

1021
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
1022

1023
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCpm).to.equal(100);
1✔
1024
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCurrency).to.equal('JPY');
1✔
1025
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mediaType).to.equal('banner');
1✔
1026
    });
1027

1028
    it('Logger: regexPattern in bid.params', function () {
1✔
1029
      setUAMobile();
1✔
1030
      const BID_REQUESTED_COPY = utils.deepClone(MOCK.BID_REQUESTED);
1✔
1031
      BID_REQUESTED_COPY.bids[1].params.regexPattern = '*';
1✔
1032
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1033
      events.emit(BID_REQUESTED, BID_REQUESTED_COPY);
1✔
1034
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
1035
      events.emit(BID_RESPONSE, BID2);
1✔
1036
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1037
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1038
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
1039
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
1040
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
1041

1042
      clock.tick(2000 + 1000);
1✔
1043
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
1044
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
1045
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
1046
      let data = getLoggerJsonFromRequest(request.requestBody);
1✔
1047

1048
      // check mandatory fields
1049
      expect(data).to.have.property('sd');
1✔
1050
      expect(data).to.have.property('fd');
1✔
1051
      expect(data).to.have.property('rd');
1✔
1052

1053
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
1054
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
1055
      expect(data.sd['/19968336/header-bid-tag-1'].bids).to.have.property('3bd4ebb1c900e2');
1✔
1056
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
1057
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
1058
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
1059
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidId).to.equal('3bd4ebb1c900e2');
1✔
1060
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1061

1062
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidGrossCpmUSD).to.equal(1.52);
1✔
1063
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidPriceUSD).to.equal(1.52);
1✔
1064
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].params.regexPattern).to.equal("*");
1✔
1065
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealId).to.equal('the-deal-id');
1✔
1066
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].partnerTimeToRespond).to.equal(944);
1✔
1067
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1068

1069
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCpm).to.equal(1.52);
1✔
1070
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1071

1072
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mi).to.equal('matched-impression');
1✔
1073
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.meta.advertiserDomains).to.deep.equal(['example.com']);
1✔
1074
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mediaType).to.equal('banner');
1✔
1075
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.floorData.floorRuleValue).to.equal(1.1);
1✔
1076

1077
      expect(data.sd['/19968336/header-bid-tag-1'].bidWonAdId).to.equal('fake_ad_id_2');
1✔
1078
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.adserverTargeting.hb_pb).to.equal(1.5);
1✔
1079

1080
      const firstTracker = requests[1].url;
1✔
1081
      expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
1✔
1082
      data = {};
1✔
1083
      firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
2✔
1084
      expect(data.v).to.equal('1');
1✔
1085
      expect(data.psrc).to.equal('web');
1✔
1086
    });
1087

1088
    it('Logger: regexPattern in bid.bidResponse and url in adomain', function () {
1✔
1089
      const BID2_COPY = utils.deepClone(BID2);
1✔
1090
      BID2_COPY.regexPattern = '*';
1✔
1091
      BID2_COPY.meta.advertiserDomains = ['https://www.example.com/abc/223']
1✔
1092
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1093
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1094
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
1095
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
1096
      events.emit(BID_RESPONSE, BID2_COPY);
1✔
1097
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1098
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1099
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
1100
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
1101
      events.emit(BID_WON, Object.assign({}, BID2_COPY, {
1✔
1102
        'status': 'rendered'
1103
      }));
1104

1105
      clock.tick(2000 + 1000);
1✔
1106
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
1107
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
1108
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
1109
      let data = getLoggerJsonFromRequest(request.requestBody);
1✔
1110
      // check mandatory fields
1111
      expect(data).to.have.property('sd');
1✔
1112
      expect(data).to.have.property('fd');
1✔
1113
      expect(data).to.have.property('rd');
1✔
1114

1115
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
1116
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
1117
      expect(data.sd['/19968336/header-bid-tag-1'].bids).to.have.property('3bd4ebb1c900e2');
1✔
1118
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
1119
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
1120
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
1121
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.floorData.floorValue).to.equal(1.1);
1✔
1122

1123
      // respective tracker slot
1124
      const firstTracker = requests[1].url;
1✔
1125
      expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
1✔
1126
      data = {};
1✔
1127
      firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
2✔
1128
      expect(data.v).to.equal('1');
1✔
1129
      expect(data.psrc).to.equal('web');
1✔
1130
    });
1131

1132
    it('Logger: regexPattern in bid.params', function () {
1✔
1133
      const BID_REQUESTED_COPY = utils.deepClone(MOCK.BID_REQUESTED);
1✔
1134
      BID_REQUESTED_COPY.bids[1].params.regexPattern = '*';
1✔
1135
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1136
      events.emit(BID_REQUESTED, BID_REQUESTED_COPY);
1✔
1137
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
1138
      events.emit(BID_RESPONSE, BID2);
1✔
1139
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1140
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1141
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
1142
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
1143
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
1144

1145
      clock.tick(2000 + 1000);
1✔
1146
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
1147
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
1148
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
1149
      let data = getLoggerJsonFromRequest(request.requestBody);
1✔
1150
      // check mandatory fields
1151
      expect(data).to.have.property('sd');
1✔
1152
      expect(data).to.have.property('fd');
1✔
1153
      expect(data).to.have.property('rd');
1✔
1154

1155
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
1156
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
1157
      expect(data.sd['/19968336/header-bid-tag-1'].bids).to.have.property('3bd4ebb1c900e2');
1✔
1158
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
1159
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
1160
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
1161
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidId).to.equal('3bd4ebb1c900e2');
1✔
1162
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1163

1164
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidGrossCpmUSD).to.equal(1.52);
1✔
1165
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidPriceUSD).to.equal(1.52);
1✔
1166
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].params.regexPattern).to.equal("*");
1✔
1167
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealId).to.equal('the-deal-id');
1✔
1168
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].partnerTimeToRespond).to.equal(944);
1✔
1169
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1170

1171
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCpm).to.equal(1.52);
1✔
1172
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1173

1174
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mi).to.equal('matched-impression');
1✔
1175
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.meta.advertiserDomains).to.deep.equal(['example.com']);
1✔
1176
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mediaType).to.equal('banner');
1✔
1177
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.floorData.floorRuleValue).to.equal(1.1);
1✔
1178

1179
      expect(data.sd['/19968336/header-bid-tag-1'].bidWonAdId).to.equal('fake_ad_id_2');
1✔
1180
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.adserverTargeting.hb_pb).to.equal(1.5);
1✔
1181

1182
      let firstTracker = requests[1].url;
1✔
1183
      expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
1✔
1184
      data = {};
1✔
1185
      firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
2✔
1186
      expect(data.v).to.equal('1');
1✔
1187
      expect(data.psrc).to.equal('web');
1✔
1188
    });
1189

1190
    it('Logger: regexPattern in bid.bidResponse', function () {
1✔
1191
      const BID2_COPY = utils.deepClone(BID2);
1✔
1192
      BID2_COPY.regexPattern = '*';
1✔
1193
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1194
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1195
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
1196
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
1197
      events.emit(BID_RESPONSE, BID2_COPY);
1✔
1198
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1199
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1200
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
1201
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
1202
      events.emit(BID_WON, Object.assign({}, BID2_COPY, {
1✔
1203
        'status': 'rendered'
1204
      }));
1205

1206
      clock.tick(2000 + 1000);
1✔
1207
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
1208
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
1209
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
1210
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
1211
      // check mandatory fields
1212
      expect(data).to.have.property('sd');
1✔
1213
      expect(data).to.have.property('fd');
1✔
1214
      expect(data).to.have.property('rd');
1✔
1215

1216
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
1217
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
1218
      expect(data.sd['/19968336/header-bid-tag-1'].bids).to.have.property('3bd4ebb1c900e2');
1✔
1219
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
1220
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
1221
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
1222
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidId).to.equal('3bd4ebb1c900e2');
1✔
1223
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1224

1225
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidGrossCpmUSD).to.equal(1.52);
1✔
1226
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidPriceUSD).to.equal(1.52);
1✔
1227
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealId).to.equal('the-deal-id');
1✔
1228
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].partnerTimeToRespond).to.equal(944);
1✔
1229
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1230

1231
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCpm).to.equal(1.52);
1✔
1232
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1233

1234
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.regexPattern).to.equal('*');
1✔
1235

1236
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mi).to.equal('matched-impression');
1✔
1237
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.meta.advertiserDomains).to.deep.equal(['example.com']);
1✔
1238
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mediaType).to.equal('banner');
1✔
1239
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.floorData.floorRuleValue).to.equal(1.1);
1✔
1240

1241
      expect(data.sd['/19968336/header-bid-tag-1'].bidWonAdId).to.equal('fake_ad_id_2');
1✔
1242
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.adserverTargeting.hb_pb).to.equal(1.5);
1✔
1243
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealChannel).to.equal('PMP');
1✔
1244
    });
1245

1246
    it('Logger: to handle floor rejected bids', function () {
1✔
1247
      this.timeout(5000)
1✔
1248

1249
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake((key) => {
1✔
1250
        return [MOCK.BID_RESPONSE[0], MOCK.BID_RESPONSE[1]]
1✔
1251
      });
1252

1253
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1254
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
1255
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
1256
      events.emit(BID_REJECTED, MOCK.REJECTED_BID[0]);
1✔
1257
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1258
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1259
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
1260
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
1261

1262
      clock.tick(2000 + 1000);
1✔
1263
      expect(requests.length).to.equal(2); // 1 logger and 1 win-tracker
1✔
1264
      const request = requests[1]; // logger is executed late, trackers execute first
1✔
1265
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
1266
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
1267
      // check mandatory fields
1268
      expect(data).to.have.property('sd');
1✔
1269
      expect(data).to.have.property('fd');
1✔
1270
      expect(data).to.have.property('rd');
1✔
1271

1272
      expect(data.fd.flr.fetchStatus).to.equal('success');
1✔
1273
      expect(data.fd.flr).to.have.property('enforcements');
1✔
1274
      expect(data.fd.flr.floorProvider).to.equal('pubmatic');
1✔
1275

1276
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
1277
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
1278
      expect(data.sd['/19968336/header-bid-tag-1'].bids).to.have.property('3bd4ebb1c900e2');
1✔
1279
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
1280
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
1281
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
1282
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidId).to.equal('3bd4ebb1c900e2');
1✔
1283
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1284

1285
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidGrossCpmUSD).to.equal(1.52);
1✔
1286
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidPriceUSD).to.equal(0);
1✔
1287
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealId).to.equal('the-deal-id');
1✔
1288
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].partnerTimeToRespond).to.equal(944);
1✔
1289
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1290

1291
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].partnerTimeToRespond).to.equal(944);
1✔
1292
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1293
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCpm).to.equal(1.52);
1✔
1294
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1295

1296
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mi).to.equal('matched-impression');
1✔
1297
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.meta.advertiserDomains).to.deep.equal(['example.com']);
1✔
1298
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mediaType).to.equal('banner');
1✔
1299
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.floorData.floorRuleValue).to.equal(1.1);
1✔
1300

1301
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.adserverTargeting.hb_pb).to.equal(1.5);
1✔
1302
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealChannel).to.equal('PMP');
1✔
1303
    });
1304

1305
    it('Logger: best case + win tracker in case of Bidder Aliases', function () {
1✔
1306
      MOCK.BID_REQUESTED['bids'][0]['bidder'] = 'pubmatic_alias';
1✔
1307
      MOCK.BID_REQUESTED['bids'][0]['bidderCode'] = 'pubmatic_alias';
1✔
1308
      adapterManager.aliasRegistry['pubmatic_alias'] = 'pubmatic';
1✔
1309

1310
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake((key) => {
1✔
1311
        return [MOCK.BID_RESPONSE[0], MOCK.BID_RESPONSE[1]]
1✔
1312
      });
1313

1314
      config.setConfig({
1✔
1315
        testGroupId: 15
1316
      });
1317

1318
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1319
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
1320
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
1321
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1✔
1322
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1323
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1324
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
1325
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
1326
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
1327

1328
      clock.tick(2000 + 1000);
1✔
1329
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
1330
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
1331
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
1332
      let data = getLoggerJsonFromRequest(request.requestBody);
1✔
1333
      // check mandatory fields
1334
      expect(data).to.have.property('sd');
1✔
1335
      expect(data).to.have.property('fd');
1✔
1336
      expect(data).to.have.property('rd');
1✔
1337

1338
      expect(data.rd.pubid).to.equal('9999');
1✔
1339
      expect(data.rd.pid).to.equal('1111');
1✔
1340
      expect(data.rd.pdvid).to.equal('20');
1✔
1341
      expect(data.rd.iid).to.equal('25c6d7f5-699a-4bfc-87c9-996f915341fa');
1✔
1342
      expect(data.rd.to).to.equal(3000);
1✔
1343
      expect(data.rd.purl).to.equal('http://www.test.com/page.html');
1✔
1344
      expect(data.rd.tst).to.equal(1519767016);
1✔
1345
      expect(data.rd.tgid).to.equal(15);
1✔
1346

1347
      // floor data in featureList
1348
      expect(data.fd.flr.modelVersion).to.equal('floorModelTest');
1✔
1349
      expect(data.fd.flr).to.have.property('enforcements');
1✔
1350
      expect(data.fd.flr.enforcements).to.deep.equal({
1✔
1351
        enforceJS: true,
1352
        enforcePBS: false,
1353
        floorDeals: false,
1354
        bidAdjustment: true
1355
      });
1356
      expect(data.fd.flr.fetchStatus).to.equal('success');
1✔
1357
      expect(data.fd.flr.floorProvider).to.equal('pubmatic');
1✔
1358
      expect(data.fd.flr.location).to.equal('fetch');
1✔
1359
      expect(data.fd.flr.skipRate).to.equal(0);
1✔
1360
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1361

1362
      expect(data.sd).to.be.an('object');
1✔
1363
      expect(Object.keys(data.sd).length).to.equal(2);
1✔
1364

1365
      // slot 1
1366

1367
      expect(data.sd).to.have.property('/19968336/header-bid-tag-0');
1✔
1368

1369
      expect(data.sd['/19968336/header-bid-tag-0'].bids).to.have.property('2ecff0db240757');
1✔
1370
      expect(data.sd['/19968336/header-bid-tag-0'].dimensions).to.deep.equal([[640, 480]])
1✔
1371
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].adapterCode).to.equal('pubmatic');
1✔
1372
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidderCode).to.equal('pubmatic_alias');
1✔
1373
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCpm).to.equal(1.23);
1✔
1374
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1375

1376
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0]).to.have.property('bidResponse');
1✔
1377
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidId).to.equal('2ecff0db240757');
1✔
1378
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1379

1380
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.bidGrossCpmUSD).to.equal(1.23);
1✔
1381
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.bidPriceUSD).to.equal(1.23);
1✔
1382
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].partnerTimeToRespond).to.equal(944);
1✔
1383
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1384

1385
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCpm).to.equal(1.23);
1✔
1386
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1387

1388
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.mediaType).to.equal('video');
1✔
1389
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.floorData.floorRuleValue).to.equal(1.1);
1✔
1390

1391
      expect(data.sd['/19968336/header-bid-tag-0'].bidWonAdId).to.equal('fake_ad_id');
1✔
1392
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.adserverTargeting.hb_pb).to.equal(1.2);
1✔
1393

1394
      // slot 2
1395
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
1396
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
1397
      expect(data.sd['/19968336/header-bid-tag-1'].bids).to.have.property('3bd4ebb1c900e2');
1✔
1398
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
1399
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
1400
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
1401
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidId).to.equal('3bd4ebb1c900e2');
1✔
1402
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1403

1404
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidGrossCpmUSD).to.equal(1.52);
1✔
1405
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidPriceUSD).to.equal(1.52);
1✔
1406
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].params.kgpv).to.equal("this-is-a-kgpv");
1✔
1407
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealId).to.equal('the-deal-id');
1✔
1408
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].partnerTimeToRespond).to.equal(944);
1✔
1409
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1410

1411
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCpm).to.equal(1.52);
1✔
1412
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1413

1414
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mi).to.equal('matched-impression');
1✔
1415
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.meta.advertiserDomains).to.deep.equal(['example.com']);
1✔
1416
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mediaType).to.equal('banner');
1✔
1417
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.floorData.floorRuleValue).to.equal(1.1);
1✔
1418

1419
      expect(data.sd['/19968336/header-bid-tag-1'].bidWonAdId).to.equal('fake_ad_id_2');
1✔
1420
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.adserverTargeting.hb_pb).to.equal(1.5);
1✔
1421

1422
      // tracker slot1
1423
      let firstTracker = requests[0].url;
1✔
1424
      expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
1✔
1425
      data = {};
1✔
1426
      firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
2✔
1427
      expect(data.v).to.equal('1');
1✔
1428
      expect(data.psrc).to.equal('web');
1✔
1429
    });
1430

1431
    it('Logger: best case + win tracker in case of GroupM as alternate bidder', function () {
1✔
1432
      MOCK.BID_REQUESTED['bids'][0]['bidderCode'] = 'groupm';
1✔
1433
      sandbox.stub(getGlobal(), 'getHighestCpmBids').callsFake((key) => {
1✔
1434
        return [MOCK.BID_RESPONSE[0], MOCK.BID_RESPONSE[1]]
1✔
1435
      });
1436

1437
      config.setConfig({
1✔
1438
        testGroupId: 15
1439
      });
1440

1441
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1442
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
1443
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
1444
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[1]);
1✔
1445
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1446
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1447
      events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1✔
1448
      events.emit(BID_WON, MOCK.BID_WON[0]);
1✔
1449
      events.emit(BID_WON, MOCK.BID_WON[1]);
1✔
1450

1451
      clock.tick(2000 + 1000);
1✔
1452
      expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
1✔
1453
      const request = requests[2]; // logger is executed late, trackers execute first
1✔
1454
      expect(request.url).to.equal('https://t.pubmatic.com/wl?v=1&psrc=web');
1✔
1455
      let data = getLoggerJsonFromRequest(request.requestBody);
1✔
1456
      // check mandatory fields
1457
      expect(data).to.have.property('sd');
1✔
1458
      expect(data).to.have.property('fd');
1✔
1459
      expect(data).to.have.property('rd');
1✔
1460

1461
      expect(data.rd.pubid).to.equal('9999');
1✔
1462
      expect(data.rd.pid).to.equal('1111');
1✔
1463
      expect(data.rd.pdvid).to.equal('20');
1✔
1464
      expect(data.rd.iid).to.equal('25c6d7f5-699a-4bfc-87c9-996f915341fa');
1✔
1465
      expect(data.rd.to).to.equal(3000);
1✔
1466
      expect(data.rd.purl).to.equal('http://www.test.com/page.html');
1✔
1467
      expect(data.rd.tst).to.equal(1519767016);
1✔
1468
      expect(data.rd.tgid).to.equal(15);
1✔
1469

1470
      // floor data in feature list data
1471
      expect(data.fd.flr.modelVersion).to.equal('floorModelTest');
1✔
1472
      expect(data.fd.flr).to.have.property('enforcements');
1✔
1473
      expect(data.fd.flr.enforcements).to.deep.equal({
1✔
1474
        enforceJS: true,
1475
        enforcePBS: false,
1476
        floorDeals: false,
1477
        bidAdjustment: true
1478
      });
1479
      expect(data.fd.flr.fetchStatus).to.equal('success');
1✔
1480
      expect(data.fd.flr.floorProvider).to.equal('pubmatic');
1✔
1481
      expect(data.fd.flr.location).to.equal('fetch');
1✔
1482
      expect(data.fd.flr.skipRate).to.equal(0);
1✔
1483
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1484

1485
      expect(data.sd).to.be.an('object');
1✔
1486
      expect(Object.keys(data.sd).length).to.equal(2);
1✔
1487

1488
      expect(data.sd).to.have.property('/19968336/header-bid-tag-0');
1✔
1489

1490
      expect(data.sd['/19968336/header-bid-tag-0'].bids).to.have.property('2ecff0db240757');
1✔
1491
      expect(data.sd['/19968336/header-bid-tag-0'].dimensions).to.deep.equal([[640, 480]])
1✔
1492
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].adapterCode).to.equal('pubmatic');
1✔
1493
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidderCode).to.equal('groupm');
1✔
1494
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCpm).to.equal(1.23);
1✔
1495
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1496

1497
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0]).to.have.property('bidResponse');
1✔
1498
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidId).to.equal('2ecff0db240757');
1✔
1499
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1500

1501
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.bidGrossCpmUSD).to.equal(1.23);
1✔
1502
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.bidPriceUSD).to.equal(1.23);
1✔
1503
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].partnerTimeToRespond).to.equal(944);
1✔
1504
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1505

1506
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCpm).to.equal(1.23);
1✔
1507
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1508

1509
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.mediaType).to.equal('video');
1✔
1510
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.floorData.floorRuleValue).to.equal(1.1);
1✔
1511

1512
      expect(data.sd['/19968336/header-bid-tag-0'].bidWonAdId).to.equal('fake_ad_id');
1✔
1513
      expect(data.sd['/19968336/header-bid-tag-0'].bids['2ecff0db240757'][0].bidResponse.adserverTargeting.hb_pb).to.equal(1.2);
1✔
1514

1515
      // slot 2
1516
      expect(data.sd).to.have.property('/19968336/header-bid-tag-1');
1✔
1517
      expect(data.sd['/19968336/header-bid-tag-1'].dimensions).to.deep.equal([[1000, 300], [970, 250], [728, 90]]);
1✔
1518
      expect(data.sd['/19968336/header-bid-tag-1'].bids).to.have.property('3bd4ebb1c900e2');
1✔
1519
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].adapterCode).to.equal('pubmatic');
1✔
1520
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidderCode).to.equal('pubmatic');
1✔
1521
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0]).to.have.property('bidResponse');
1✔
1522
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidId).to.equal('3bd4ebb1c900e2');
1✔
1523
      expect(data.fd.flr.skipped).to.equal(false);
1✔
1524

1525
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidGrossCpmUSD).to.equal(1.52);
1✔
1526
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.bidPriceUSD).to.equal(1.52);
1✔
1527
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].params.kgpv).to.equal("this-is-a-kgpv");
1✔
1528
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.dealId).to.equal('the-deal-id');
1✔
1529
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].partnerTimeToRespond).to.equal(944);
1✔
1530
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].clientLatencyTimeMs).to.equal(3214);
1✔
1531

1532
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCpm).to.equal(1.52);
1✔
1533
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.originalCurrency).to.equal('USD');
1✔
1534

1535
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mi).to.equal('matched-impression');
1✔
1536
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.meta.advertiserDomains).to.deep.equal(['example.com']);
1✔
1537
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.mediaType).to.equal('banner');
1✔
1538
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.floorData.floorRuleValue).to.equal(1.1);
1✔
1539

1540
      expect(data.sd['/19968336/header-bid-tag-1'].bidWonAdId).to.equal('fake_ad_id_2');
1✔
1541
      expect(data.sd['/19968336/header-bid-tag-1'].bids['3bd4ebb1c900e2'][0].bidResponse.adserverTargeting.hb_pb).to.equal(1.5);
1✔
1542

1543
      // tracker slot1
1544
      let firstTracker = requests[0].url;
1✔
1545
      expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
1✔
1546
      data = {};
1✔
1547
      firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
2✔
1548
      expect(data.v).to.equal('1');
1✔
1549
      expect(data.psrc).to.equal('web');
1✔
1550
    });
1551

1552
    it('Logger: should verify display manager and version in analytics data', function () {
1✔
1553
      events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
1✔
1554
      events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
1✔
1555
      events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
1✔
1556
      events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1✔
1557
      events.emit(AUCTION_END, MOCK.AUCTION_END);
1✔
1558

1559
      clock.tick(2000 + 1000);
1✔
1560
      expect(requests.length).to.equal(1);
1✔
1561
      const request = requests[0];
1✔
1562
      const data = getLoggerJsonFromRequest(request.requestBody);
1✔
1563
      // Verify display manager
1564
      expect(data.rd.dm).to.equal(DISPLAY_MANAGER);
1✔
1565
      // Verify display manager version using global Prebid version
1566
      expect(data.rd.dmv).to.equal('$prebid.version$' || '-1');
1!
1567
    });
1568
  });
1569
});
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc