prebid.js 6.1.0 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/.circleci/config.yml +1 -1
  2. package/README.md +1 -1
  3. package/browsers.json +13 -29
  4. package/gulpfile.js +87 -82
  5. package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
  6. package/karma.conf.maker.js +2 -2
  7. package/modules/33acrossBidAdapter.js +189 -102
  8. package/modules/adagioBidAdapter.js +1 -1
  9. package/modules/addefendBidAdapter.js +1 -0
  10. package/modules/adkernelBidAdapter.js +146 -61
  11. package/modules/adlooxAdServerVideo.js +2 -2
  12. package/modules/adlooxAnalyticsAdapter.js +4 -4
  13. package/modules/admanBidAdapter.js +1 -0
  14. package/modules/admixerBidAdapter.js +3 -2
  15. package/modules/adnuntiusBidAdapter.js +5 -2
  16. package/modules/adomikAnalyticsAdapter.js +6 -0
  17. package/modules/adplusBidAdapter.js +203 -0
  18. package/modules/adplusBidAdapter.md +39 -0
  19. package/modules/adxcgBidAdapter.js +311 -359
  20. package/modules/adxcgBidAdapter.md +22 -21
  21. package/modules/adyoulikeBidAdapter.js +20 -11
  22. package/modules/aniviewBidAdapter.js +1 -1
  23. package/modules/appnexusBidAdapter.js +19 -3
  24. package/modules/beachfrontBidAdapter.js +14 -17
  25. package/modules/beopBidAdapter.js +6 -4
  26. package/modules/bidViewability.js +3 -3
  27. package/modules/bidViewabilityIO.js +3 -3
  28. package/modules/bliinkBidAdapter.js +1 -1
  29. package/modules/colossussspBidAdapter.js +7 -0
  30. package/modules/compassBidAdapter.js +201 -0
  31. package/modules/compassBidAdapter.md +79 -0
  32. package/modules/consentManagement.js +7 -1
  33. package/modules/craftBidAdapter.js +5 -3
  34. package/modules/criteoBidAdapter.js +1 -1
  35. package/modules/currency.js +2 -2
  36. package/modules/cwireBidAdapter.js +3 -0
  37. package/modules/dailyhuntBidAdapter.js +435 -0
  38. package/modules/dailyhuntBidAdapter.md +4 -0
  39. package/modules/dchain.js +149 -0
  40. package/modules/dchain.md +45 -0
  41. package/modules/docereeBidAdapter.js +10 -1
  42. package/modules/docereeBidAdapter.md +2 -0
  43. package/modules/dspxBidAdapter.js +1 -1
  44. package/modules/emx_digitalBidAdapter.js +9 -1
  45. package/modules/engageyaBidAdapter.js +1 -1
  46. package/modules/feedadBidAdapter.js +2 -2
  47. package/modules/feedadBidAdapter.md +4 -2
  48. package/modules/freewheel-sspBidAdapter.js +6 -0
  49. package/modules/futureads.md +48 -0
  50. package/modules/glimpseBidAdapter.js +16 -3
  51. package/modules/goldbachBidAdapter.js +1176 -0
  52. package/modules/goldbachBidAdapter.md +151 -0
  53. package/modules/gptPreAuction.js +55 -7
  54. package/modules/gridBidAdapter.js +4 -3
  55. package/modules/gumgumBidAdapter.js +7 -3
  56. package/modules/improvedigitalBidAdapter.js +19 -3
  57. package/modules/instreamTracking.js +4 -4
  58. package/modules/intersectionRtdProvider.js +114 -0
  59. package/modules/invibesBidAdapter.js +64 -14
  60. package/modules/invibesBidAdapter.md +2 -1
  61. package/modules/ipromBidAdapter.js +79 -0
  62. package/modules/ixBidAdapter.js +53 -18
  63. package/modules/kinessoIdSystem.js +1 -1
  64. package/modules/limelightDigitalBidAdapter.js +3 -1
  65. package/modules/livewrappedAnalyticsAdapter.js +3 -1
  66. package/modules/livewrappedBidAdapter.js +8 -2
  67. package/modules/loglyliftBidAdapter.js +79 -0
  68. package/modules/loglyliftBidAdapter.md +55 -0
  69. package/modules/lotamePanoramaIdSystem.js +80 -8
  70. package/modules/luponmediaBidAdapter.js +570 -0
  71. package/modules/mediasquareBidAdapter.js +1 -9
  72. package/modules/missenaBidAdapter.js +89 -0
  73. package/modules/nextMillenniumBidAdapter.js +37 -7
  74. package/modules/optimeraRtdProvider.js +8 -1
  75. package/modules/ozoneBidAdapter.js +21 -64
  76. package/modules/prebidServerBidAdapter/index.js +16 -12
  77. package/modules/pubgeniusBidAdapter.js +1 -1
  78. package/modules/pubmaticBidAdapter.js +3 -3
  79. package/modules/pubxaiAnalyticsAdapter.js +17 -0
  80. package/modules/relaidoBidAdapter.js +86 -65
  81. package/modules/richaudienceBidAdapter.js +2 -3
  82. package/modules/rtdModule/index.js +48 -18
  83. package/modules/rubiconBidAdapter.js +31 -19
  84. package/modules/sharedIdSystem.js +27 -1
  85. package/modules/smaatoBidAdapter.js +4 -1
  86. package/modules/smartxBidAdapter.js +17 -1
  87. package/modules/tappxBidAdapter.js +3 -1
  88. package/modules/targetVideoBidAdapter.js +187 -0
  89. package/modules/targetVideoBidAdapter.md +34 -0
  90. package/modules/telariaBidAdapter.js +2 -2
  91. package/modules/trustxBidAdapter.js +8 -16
  92. package/modules/undertoneBidAdapter.js +8 -1
  93. package/modules/userId/index.js +27 -2
  94. package/modules/ventes.md +71 -0
  95. package/modules/ventesBidAdapter.js +104 -64
  96. package/modules/ventesBidAdapter.md +0 -1
  97. package/modules/vidoomyBidAdapter.js +16 -10
  98. package/modules/visxBidAdapter.js +19 -2
  99. package/modules/visxBidAdapter.md +4 -6
  100. package/modules/weboramaRtdProvider.js +288 -73
  101. package/modules/weboramaRtdProvider.md +27 -10
  102. package/modules/yahoosspBidAdapter.js +5 -1
  103. package/modules/yahoosspBidAdapter.md +1 -1
  104. package/modules/yieldmoBidAdapter.js +23 -5
  105. package/modules/yieldoneBidAdapter.js +115 -11
  106. package/modules/zetaSspBidAdapter.md +33 -1
  107. package/modules/zeta_global_sspAnalyticsAdapter.js +97 -0
  108. package/modules/zeta_global_sspAnalyticsAdapter.md +24 -0
  109. package/modules/zeta_global_sspBidAdapter.js +22 -1
  110. package/package.json +1 -1
  111. package/plugins/pbjsGlobals.js +28 -1
  112. package/src/auction.js +5 -4
  113. package/src/config.js +27 -3
  114. package/src/prebid.js +3 -2
  115. package/src/targeting.js +24 -3
  116. package/src/utils.js +53 -8
  117. package/test/helpers/prebidGlobal.js +1 -0
  118. package/test/spec/config_spec.js +279 -0
  119. package/test/spec/integration/faker/googletag.js +6 -0
  120. package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
  121. package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
  122. package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
  123. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +6 -0
  124. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  125. package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
  126. package/test/spec/modules/adyoulikeBidAdapter_spec.js +75 -0
  127. package/test/spec/modules/appnexusBidAdapter_spec.js +49 -1
  128. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  129. package/test/spec/modules/beopBidAdapter_spec.js +1 -1
  130. package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
  131. package/test/spec/modules/bidViewability_spec.js +4 -4
  132. package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
  133. package/test/spec/modules/compassBidAdapter_spec.js +397 -0
  134. package/test/spec/modules/consentManagement_spec.js +20 -0
  135. package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
  136. package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
  137. package/test/spec/modules/dchain_spec.js +329 -0
  138. package/test/spec/modules/docereeBidAdapter_spec.js +9 -1
  139. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  140. package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
  141. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  142. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  143. package/test/spec/modules/gptPreAuction_spec.js +177 -2
  144. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  145. package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -1
  146. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  147. package/test/spec/modules/invibesBidAdapter_spec.js +148 -4
  148. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  149. package/test/spec/modules/ixBidAdapter_spec.js +112 -62
  150. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +84 -23
  151. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +22 -0
  152. package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
  153. package/test/spec/modules/loglyliftBidAdapter_spec.js +172 -0
  154. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
  155. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  156. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
  157. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  158. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +26 -1
  159. package/test/spec/modules/optimeraRtdProvider_spec.js +14 -1
  160. package/test/spec/modules/ozoneBidAdapter_spec.js +43 -31
  161. package/test/spec/modules/prebidServerBidAdapter_spec.js +43 -0
  162. package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
  163. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  164. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
  165. package/test/spec/modules/realTimeDataModule_spec.js +135 -49
  166. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  167. package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
  168. package/test/spec/modules/rubiconBidAdapter_spec.js +65 -9
  169. package/test/spec/modules/sharedIdSystem_spec.js +52 -6
  170. package/test/spec/modules/smaatoBidAdapter_spec.js +31 -0
  171. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  172. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  173. package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
  174. package/test/spec/modules/userId_spec.js +51 -0
  175. package/test/spec/modules/visxBidAdapter_spec.js +120 -4
  176. package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
  177. package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
  178. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  179. package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +427 -0
  180. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
  181. package/test/spec/unit/core/targeting_spec.js +116 -0
  182. package/test/spec/utils_spec.js +38 -0
  183. package/test/test_deps.js +3 -0
  184. package/test/test_index.js +1 -3
@@ -0,0 +1,195 @@
1
+ import {expect} from 'chai';
2
+ import {spec} from 'modules/ipromBidAdapter.js';
3
+
4
+ describe('iPROM Adapter', function () {
5
+ let bidRequests;
6
+ let bidderRequest;
7
+
8
+ beforeEach(function () {
9
+ bidRequests = [
10
+ {
11
+ bidder: 'iprom',
12
+ params: {
13
+ id: '1234',
14
+ dimension: '300x250',
15
+ },
16
+ adUnitCode: '/19966331/header-bid-tag-1',
17
+ mediaTypes: {
18
+ banner: {
19
+ sizes: [[300, 250], [300, 600]],
20
+ }
21
+ },
22
+ bidId: '29a72b151f7bd3',
23
+ auctionId: 'e36abb27-g3b1-1ad6-8a4c-701c8919d3hh',
24
+ bidderRequestId: '2z76da40m1b3cb8',
25
+ transactionId: 'j51lhf58-1ad6-g3b1-3j6s-912c9493g0gu'
26
+ }
27
+ ];
28
+
29
+ bidderRequest = {
30
+ timeout: 3000,
31
+ refererInfo: {
32
+ referer: 'https://adserver.si/index.html',
33
+ reachedTop: true,
34
+ numIframes: 1,
35
+ stack: [
36
+ 'https://adserver.si/index.html',
37
+ 'https://adserver.si/iframe1.html',
38
+ ]
39
+ }
40
+ }
41
+ });
42
+
43
+ describe('validating bids', function () {
44
+ it('should accept valid bid', function () {
45
+ let validBid = {
46
+ bidder: 'iprom',
47
+ params: {
48
+ id: '1234',
49
+ dimension: '300x250',
50
+ },
51
+ };
52
+
53
+ const isValid = spec.isBidRequestValid(validBid);
54
+
55
+ expect(isValid).to.equal(true);
56
+ });
57
+
58
+ it('should reject bid if missing dimension and id', function () {
59
+ let invalidBid = {
60
+ bidder: 'iprom',
61
+ params: {}
62
+ };
63
+
64
+ const isValid = spec.isBidRequestValid(invalidBid);
65
+
66
+ expect(isValid).to.equal(false);
67
+ });
68
+
69
+ it('should reject bid if missing dimension', function () {
70
+ let invalidBid = {
71
+ bidder: 'iprom',
72
+ params: {
73
+ id: '1234',
74
+ }
75
+ };
76
+
77
+ const isValid = spec.isBidRequestValid(invalidBid);
78
+
79
+ expect(isValid).to.equal(false);
80
+ });
81
+
82
+ it('should reject bid if dimension is not a string', function () {
83
+ let invalidBid = {
84
+ bidder: 'iprom',
85
+ params: {
86
+ id: '1234',
87
+ dimension: 404,
88
+ }
89
+ };
90
+
91
+ const isValid = spec.isBidRequestValid(invalidBid);
92
+
93
+ expect(isValid).to.equal(false);
94
+ });
95
+
96
+ it('should reject bid if missing id', function () {
97
+ let invalidBid = {
98
+ bidder: 'iprom',
99
+ params: {
100
+ dimension: '300x250',
101
+ }
102
+ };
103
+
104
+ const isValid = spec.isBidRequestValid(invalidBid);
105
+
106
+ expect(isValid).to.equal(false);
107
+ });
108
+
109
+ it('should reject bid if id is not a string', function () {
110
+ let invalidBid = {
111
+ bidder: 'iprom',
112
+ params: {
113
+ id: 1234,
114
+ dimension: '300x250',
115
+ }
116
+ };
117
+
118
+ const isValid = spec.isBidRequestValid(invalidBid);
119
+
120
+ expect(isValid).to.equal(false);
121
+ });
122
+ });
123
+
124
+ describe('building requests', function () {
125
+ it('should go to correct endpoint', function () {
126
+ const request = spec.buildRequests(bidRequests, bidderRequest);
127
+
128
+ expect(request.method).to.exist;
129
+ expect(request.method).to.equal('POST');
130
+ expect(request.url).to.exist;
131
+ expect(request.url).to.equal('https://core.iprom.net/programmatic');
132
+ });
133
+
134
+ it('should add referer info', function () {
135
+ const request = spec.buildRequests(bidRequests, bidderRequest);
136
+ const requestparse = JSON.parse(request.data);
137
+
138
+ expect(requestparse.referer).to.exist;
139
+ expect(requestparse.referer.referer).to.equal('https://adserver.si/index.html');
140
+ });
141
+
142
+ it('should add adapter version', function () {
143
+ const request = spec.buildRequests(bidRequests, bidderRequest);
144
+ const requestparse = JSON.parse(request.data);
145
+
146
+ expect(requestparse.version).to.exist;
147
+ });
148
+
149
+ it('should contain id and dimension', function () {
150
+ const request = spec.buildRequests(bidRequests, bidderRequest);
151
+ const requestparse = JSON.parse(request.data);
152
+
153
+ expect(requestparse.bids[0].params.id).to.equal('1234');
154
+ expect(requestparse.bids[0].params.dimension).to.equal('300x250');
155
+ });
156
+ });
157
+
158
+ describe('handling responses', function () {
159
+ it('should return complete bid response', function () {
160
+ const serverResponse = {
161
+ body: [{
162
+ requestId: '29a72b151f7bd3',
163
+ cpm: 0.5,
164
+ width: '300',
165
+ height: '250',
166
+ creativeId: 1234,
167
+ ad: '<html><head><title>Iprom Header bidding example</title></head><body><img src="https://iprom.si/files/2015/08/iprom-logo.svg"></body></html>',
168
+ aDomains: ['https://example.com'],
169
+ }
170
+ ]};
171
+
172
+ const request = spec.buildRequests(bidRequests, bidderRequest);
173
+ const bids = spec.interpretResponse(serverResponse, request);
174
+
175
+ expect(bids).to.be.lengthOf(1);
176
+ expect(bids[0].requestId).to.equal('29a72b151f7bd3');
177
+ expect(bids[0].cpm).to.equal(0.5);
178
+ expect(bids[0].width).to.equal('300');
179
+ expect(bids[0].height).to.equal('250');
180
+ expect(bids[0].ad).to.have.length.above(1);
181
+ expect(bids[0].meta.advertiserDomains).to.deep.equal(['https://example.com']);
182
+ });
183
+
184
+ it('should return empty bid response', function () {
185
+ const emptyServerResponse = {
186
+ body: []
187
+ };
188
+
189
+ const request = spec.buildRequests(bidRequests, bidderRequest);
190
+ const bids = spec.interpretResponse(emptyServerResponse, request);
191
+
192
+ expect(bids).to.be.lengthOf(0);
193
+ });
194
+ });
195
+ });
@@ -4,6 +4,7 @@ import { expect } from 'chai';
4
4
  import { newBidder } from 'src/adapters/bidderFactory.js';
5
5
  import { spec, storage, ERROR_CODES } from '../../../modules/ixBidAdapter.js';
6
6
  import { createEidsArray } from 'modules/userId/eids.js';
7
+ import { deepAccess } from '../../../src/utils.js';
7
8
 
8
9
  describe('IndexexchangeAdapter', function () {
9
10
  const IX_SECURE_ENDPOINT = 'https://htlb.casalemedia.com/cygnus';
@@ -440,7 +441,10 @@ describe('IndexexchangeAdapter', function () {
440
441
  netId: 'testnetid123', // NetId
441
442
  IDP: 'userIDP000', // IDP
442
443
  fabrickId: 'fabrickId9000', // FabrickId
443
- uid2: { id: 'testuid2' } // UID 2.0
444
+ // so structured because when calling createEidsArray, UID2's getValue func takes .id to set in uids
445
+ uid2: { id: 'testuid2' }, // UID 2.0
446
+ // similar to uid2, but id5's getValue takes .uid
447
+ id5id: { uid: 'testid5id' } // ID5
444
448
  };
445
449
 
446
450
  const DEFAULT_USERIDASEIDS_DATA = createEidsArray(DEFAULT_USERID_DATA);
@@ -481,12 +485,16 @@ describe('IndexexchangeAdapter', function () {
481
485
  }, {
482
486
  source: 'uidapi.com',
483
487
  uids: [{
484
- // when calling createEidsArray, UID2's getValue func returns .id, which is then set in uids
485
488
  id: DEFAULT_USERID_DATA.uid2.id,
486
489
  ext: {
487
490
  rtiPartner: 'UID2'
488
491
  }
489
492
  }]
493
+ }, {
494
+ source: 'id5-sync.com',
495
+ uids: [{
496
+ id: DEFAULT_USERID_DATA.id5id.uid
497
+ }]
490
498
  }
491
499
  ];
492
500
 
@@ -753,7 +761,7 @@ describe('IndexexchangeAdapter', function () {
753
761
  const payload = JSON.parse(request[0].data.r);
754
762
  expect(request).to.be.an('array');
755
763
  expect(request).to.have.lengthOf.above(0); // should be 1 or more
756
- expect(payload.user.eids).to.have.lengthOf(5);
764
+ expect(payload.user.eids).to.have.lengthOf(6);
757
765
  expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
758
766
  });
759
767
  });
@@ -952,12 +960,8 @@ describe('IndexexchangeAdapter', function () {
952
960
  const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
953
961
  const payload = JSON.parse(request.data.r);
954
962
 
955
- expect(payload.user.eids).to.have.lengthOf(5);
956
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
957
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[1]);
958
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[2]);
959
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[3]);
960
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[4]);
963
+ expect(payload.user.eids).to.have.lengthOf(6);
964
+ expect(payload.user.eids).to.have.deep.members(DEFAULT_USERID_PAYLOAD);
961
965
  });
962
966
 
963
967
  it('IX adapter reads floc id from prebid userId and adds it to eids when there is not other eids', function () {
@@ -977,12 +981,8 @@ describe('IndexexchangeAdapter', function () {
977
981
  const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
978
982
  const payload = JSON.parse(request.data.r);
979
983
 
980
- expect(payload.user.eids).to.have.lengthOf(6);
981
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
982
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[1]);
983
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[2]);
984
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[3]);
985
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[4]);
984
+ expect(payload.user.eids).to.have.lengthOf(7);
985
+ expect(payload.user.eids).to.deep.include.members(DEFAULT_USERID_PAYLOAD);
986
986
  expect(payload.user.eids).to.deep.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
987
987
  });
988
988
 
@@ -993,12 +993,8 @@ describe('IndexexchangeAdapter', function () {
993
993
  const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
994
994
  const payload = JSON.parse(request.data.r);
995
995
 
996
- expect(payload.user.eids).to.have.lengthOf(5);
997
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
998
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[1]);
999
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[2]);
1000
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[3]);
1001
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[4]);
996
+ expect(payload.user.eids).to.have.lengthOf(6);
997
+ expect(payload.user.eids).to.deep.include.members(DEFAULT_USERID_PAYLOAD);
1002
998
  expect(payload.user.eids).should.not.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
1003
999
  });
1004
1000
 
@@ -1009,12 +1005,8 @@ describe('IndexexchangeAdapter', function () {
1009
1005
  const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
1010
1006
  const payload = JSON.parse(request.data.r);
1011
1007
 
1012
- expect(payload.user.eids).to.have.lengthOf(5);
1013
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
1014
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[1]);
1015
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[2]);
1016
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[3]);
1017
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[4]);
1008
+ expect(payload.user.eids).to.have.lengthOf(6);
1009
+ expect(payload.user.eids).to.deep.include.members(DEFAULT_USERID_PAYLOAD);
1018
1010
  expect(payload.user.eids).should.not.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
1019
1011
  });
1020
1012
 
@@ -1025,12 +1017,8 @@ describe('IndexexchangeAdapter', function () {
1025
1017
  const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
1026
1018
  const payload = JSON.parse(request.data.r);
1027
1019
 
1028
- expect(payload.user.eids).to.have.lengthOf(5);
1029
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
1030
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[1]);
1031
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[2]);
1032
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[3]);
1033
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[4]);
1020
+ expect(payload.user.eids).to.have.lengthOf(6);
1021
+ expect(payload.user.eids).to.deep.include.members(DEFAULT_USERID_PAYLOAD);
1034
1022
  expect(payload.user.eids).should.not.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
1035
1023
  });
1036
1024
 
@@ -1041,12 +1029,8 @@ describe('IndexexchangeAdapter', function () {
1041
1029
  const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
1042
1030
  const payload = JSON.parse(request.data.r);
1043
1031
 
1044
- expect(payload.user.eids).to.have.lengthOf(5);
1045
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
1046
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[1]);
1047
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[2]);
1048
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[3]);
1049
- expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[4]);
1032
+ expect(payload.user.eids).to.have.lengthOf(6);
1033
+ expect(payload.user.eids).to.deep.include.members(DEFAULT_USERID_PAYLOAD);
1050
1034
  expect(payload.user.eids).should.not.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
1051
1035
  });
1052
1036
 
@@ -1179,15 +1163,9 @@ describe('IndexexchangeAdapter', function () {
1179
1163
  })
1180
1164
 
1181
1165
  expect(payload.user).to.exist;
1182
- expect(payload.user.eids).to.have.lengthOf(7);
1166
+ expect(payload.user.eids).to.have.lengthOf(8);
1183
1167
 
1184
- expect(payload.user.eids).to.deep.include(validUserIdPayload[0]);
1185
- expect(payload.user.eids).to.deep.include(validUserIdPayload[1]);
1186
- expect(payload.user.eids).to.deep.include(validUserIdPayload[2]);
1187
- expect(payload.user.eids).to.deep.include(validUserIdPayload[3]);
1188
- expect(payload.user.eids).to.deep.include(validUserIdPayload[4]);
1189
- expect(payload.user.eids).to.deep.include(validUserIdPayload[5]);
1190
- expect(payload.user.eids).to.deep.include(validUserIdPayload[6]);
1168
+ expect(payload.user.eids).to.have.deep.members(validUserIdPayload);
1191
1169
  });
1192
1170
 
1193
1171
  it('IXL and Prebid are mutually exclusive', function () {
@@ -1227,13 +1205,8 @@ describe('IndexexchangeAdapter', function () {
1227
1205
  });
1228
1206
 
1229
1207
  const payload = JSON.parse(request.data.r);
1230
- expect(payload.user.eids).to.have.lengthOf(6);
1231
- expect(payload.user.eids).to.deep.include(validUserIdPayload[0]);
1232
- expect(payload.user.eids).to.deep.include(validUserIdPayload[1]);
1233
- expect(payload.user.eids).to.deep.include(validUserIdPayload[2]);
1234
- expect(payload.user.eids).to.deep.include(validUserIdPayload[3]);
1235
- expect(payload.user.eids).to.deep.include(validUserIdPayload[4]);
1236
- expect(payload.user.eids).to.deep.include(validUserIdPayload[5]);
1208
+ expect(payload.user.eids).to.have.lengthOf(7);
1209
+ expect(payload.user.eids).to.have.deep.members(validUserIdPayload);
1237
1210
  });
1238
1211
  });
1239
1212
 
@@ -1440,12 +1413,69 @@ describe('IndexexchangeAdapter', function () {
1440
1413
  expect(dfp_ad_unit_code).to.equal(AD_UNIT_CODE);
1441
1414
  });
1442
1415
 
1416
+ it('should send gpid in request if ortb2Imp.ext.gpid exists', function () {
1417
+ const GPID = '/19968336/some-adunit-path';
1418
+ const validBids = utils.deepClone(DEFAULT_BANNER_VALID_BID);
1419
+ validBids[0].ortb2Imp = {
1420
+ ext: {
1421
+ gpid: GPID
1422
+ }
1423
+ };
1424
+ const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1425
+ const { ext: { gpid } } = JSON.parse(requests[0].data.r).imp[0];
1426
+ expect(gpid).to.equal(GPID);
1427
+ });
1428
+
1443
1429
  it('should not send dfp_adunit_code in request if ortb2Imp.ext.data.adserver.adslot does not exists', function () {
1430
+ const GPID = '/19968336/some-adunit-path';
1431
+ const validBids = utils.deepClone(DEFAULT_BANNER_VALID_BID);
1432
+ validBids[0].ortb2Imp = {
1433
+ ext: {
1434
+ gpid: GPID
1435
+ }
1436
+ };
1437
+ const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1438
+ const imp = JSON.parse(requests[0].data.r).imp[0];
1439
+ expect(deepAccess(imp, 'ext.dfp_ad_unit_code')).to.not.exist;
1440
+ });
1441
+
1442
+ it('should not send gpid in request if ortb2Imp.ext.gpid does not exists', function () {
1443
+ const AD_UNIT_CODE = '/19968336/some-adunit-path';
1444
1444
  const validBids = utils.deepClone(DEFAULT_BANNER_VALID_BID);
1445
+ validBids[0].ortb2Imp = {
1446
+ ext: {
1447
+ data: {
1448
+ adserver: {
1449
+ name: 'gam',
1450
+ adslot: AD_UNIT_CODE
1451
+ }
1452
+ }
1453
+ }
1454
+ };
1445
1455
  const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1446
- const { ext } = JSON.parse(requests[0].data.r).imp[0];
1456
+ const imp = JSON.parse(requests[0].data.r).imp[0];
1457
+ expect(deepAccess(imp, 'ext.gpid')).to.not.exist;
1458
+ });
1447
1459
 
1448
- expect(ext).to.not.exist;
1460
+ it('should send gpid & dfp_adunit_code if they exist in ortb2Imp.ext', function () {
1461
+ const AD_UNIT_CODE = '/1111/home';
1462
+ const GPID = '/1111/home-left';
1463
+ const validBids = utils.deepClone(DEFAULT_BANNER_VALID_BID);
1464
+ validBids[0].ortb2Imp = {
1465
+ ext: {
1466
+ gpid: GPID,
1467
+ data: {
1468
+ adserver: {
1469
+ name: 'gam',
1470
+ adslot: AD_UNIT_CODE
1471
+ }
1472
+ }
1473
+ }
1474
+ };
1475
+ const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1476
+ const imp = JSON.parse(requests[0].data.r).imp[0];
1477
+ expect(deepAccess(imp, 'ext.gpid')).to.equal(GPID);
1478
+ expect(deepAccess(imp, 'ext.dfp_ad_unit_code')).to.equal(AD_UNIT_CODE);
1449
1479
  });
1450
1480
 
1451
1481
  it('payload should have correct format and value', function () {
@@ -1502,11 +1532,23 @@ describe('IndexexchangeAdapter', function () {
1502
1532
 
1503
1533
  expect(w).to.equal(size[0]);
1504
1534
  expect(h).to.equal(size[1]);
1505
- expect(ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
1535
+ expect(ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId);
1506
1536
  expect(ext.sid).to.equal(sidValue);
1507
1537
  });
1508
1538
  });
1509
1539
 
1540
+ it('payload should have imp[].banner.format[].ext.siteID as string ', function () {
1541
+ const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
1542
+ bid.params.siteId = 1234;
1543
+
1544
+ request = spec.buildRequests([bid], DEFAULT_OPTION)[0];
1545
+
1546
+ const payload = JSON.parse(request.data.r);
1547
+ payload.imp[0].banner.format.forEach((imp) => {
1548
+ expect(imp.ext.siteID).to.be.a('string');
1549
+ });
1550
+ });
1551
+
1510
1552
  describe('build requests with price floors', () => {
1511
1553
  const highFloor = 4.5;
1512
1554
  const lowFloor = 3.5;
@@ -1638,7 +1680,7 @@ describe('IndexexchangeAdapter', function () {
1638
1680
  expect(impression.banner.format[0].w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
1639
1681
  expect(impression.banner.format[0].h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
1640
1682
  expect(impression.banner.topframe).to.be.oneOf([0, 1]);
1641
- expect(impression.banner.format[0].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
1683
+ expect(impression.banner.format[0].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId);
1642
1684
  expect(impression.banner.format[0].ext.sid).to.equal('50');
1643
1685
  });
1644
1686
 
@@ -1652,7 +1694,7 @@ describe('IndexexchangeAdapter', function () {
1652
1694
  expect(impression.banner.format[0].w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
1653
1695
  expect(impression.banner.format[0].h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
1654
1696
  expect(impression.banner.topframe).to.be.oneOf([0, 1]);
1655
- expect(impression.banner.format[0].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
1697
+ expect(impression.banner.format[0].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId);
1656
1698
  expect(impression.banner.format[0].ext.sid).to.equal('abc');
1657
1699
  });
1658
1700
 
@@ -1750,7 +1792,7 @@ describe('IndexexchangeAdapter', function () {
1750
1792
 
1751
1793
  expect(w).to.equal(size[0]);
1752
1794
  expect(h).to.equal(size[1]);
1753
- expect(ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
1795
+ expect(ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId);
1754
1796
  expect(ext.sid).to.equal(sidValue);
1755
1797
  });
1756
1798
  });
@@ -1915,7 +1957,7 @@ describe('IndexexchangeAdapter', function () {
1915
1957
 
1916
1958
  expect(w).to.equal(size[0]);
1917
1959
  expect(h).to.equal(size[1]);
1918
- expect(ext.siteID).to.equal(bids[impressionIndex].params.siteId.toString());
1960
+ expect(ext.siteID).to.equal(bids[impressionIndex].params.siteId);
1919
1961
  expect(ext.sid).to.equal(sidValue);
1920
1962
  });
1921
1963
  });
@@ -2119,7 +2161,7 @@ describe('IndexexchangeAdapter', function () {
2119
2161
 
2120
2162
  expect(w).to.equal(size[0]);
2121
2163
  expect(h).to.equal(size[1]);
2122
- expect(ext.siteID).to.equal(bid.params.siteId.toString());
2164
+ expect(ext.siteID).to.equal(bid.params.siteId);
2123
2165
  expect(ext.sid).to.equal(sidValue);
2124
2166
  });
2125
2167
  });
@@ -2806,5 +2848,13 @@ describe('IndexexchangeAdapter', function () {
2806
2848
  expect(JSON.parse(localStorageValues[key])[EXPIRED_DATE]).to.be.undefined;
2807
2849
  expect(JSON.parse(localStorageValues[key])).to.deep.equal({ [TODAY]: { '1': 1, '3': 8, '4': 1 } })
2808
2850
  });
2851
+
2852
+ it('should not save error data into localstorage if consent is not given', () => {
2853
+ config.setConfig({ deviceAccess: false });
2854
+ const bid = utils.deepClone(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]);
2855
+ bid.params.size = ['400', 100];
2856
+ expect(spec.isBidRequestValid(bid)).to.be.false;
2857
+ expect(localStorageValues[key]).to.be.undefined;
2858
+ });
2809
2859
  });
2810
2860
  });
@@ -9,7 +9,8 @@ describe('limelightDigitalAdapter', function () {
9
9
  params: {
10
10
  host: 'exchange.ortb.net',
11
11
  adUnitId: 123,
12
- adUnitType: 'banner'
12
+ adUnitType: 'banner',
13
+ publisherId: 'perfectPublisher'
13
14
  },
14
15
  placementCode: 'placement_0',
15
16
  auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
@@ -18,7 +19,17 @@ describe('limelightDigitalAdapter', function () {
18
19
  sizes: [[300, 250]]
19
20
  }
20
21
  },
21
- transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e62'
22
+ transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e62',
23
+ userIdAsEids: [
24
+ {
25
+ source: 'test1.org',
26
+ uids: [
27
+ {
28
+ id: '123',
29
+ }
30
+ ]
31
+ }
32
+ ]
22
33
  }
23
34
  const bid2 = {
24
35
  bidId: '58ee9870c3164a',
@@ -32,7 +43,17 @@ describe('limelightDigitalAdapter', function () {
32
43
  placementCode: 'placement_1',
33
44
  auctionId: '482f88de-29ab-45c8-981a-d25e39454a34',
34
45
  sizes: [[350, 200]],
35
- transactionId: '068867d1-46ec-40bb-9fa0-e24611786fb4'
46
+ transactionId: '068867d1-46ec-40bb-9fa0-e24611786fb4',
47
+ userIdAsEids: [
48
+ {
49
+ source: 'test2.org',
50
+ uids: [
51
+ {
52
+ id: '234',
53
+ }
54
+ ]
55
+ }
56
+ ]
36
57
  }
37
58
  const bid3 = {
38
59
  bidId: '019645c7d69460',
@@ -41,12 +62,26 @@ describe('limelightDigitalAdapter', function () {
41
62
  params: {
42
63
  host: 'exchange.ortb.net',
43
64
  adUnitId: 789,
44
- adUnitType: 'video'
65
+ adUnitType: 'video',
66
+ publisherId: 'secondPerfectPublisher'
45
67
  },
46
68
  placementCode: 'placement_2',
47
69
  auctionId: 'e4771143-6aa7-41ec-8824-ced4342c96c8',
48
70
  sizes: [[800, 600]],
49
- transactionId: '738d5915-6651-43b9-9b6b-d50517350917'
71
+ transactionId: '738d5915-6651-43b9-9b6b-d50517350917',
72
+ userIdAsEids: [
73
+ {
74
+ source: 'test3.org',
75
+ uids: [
76
+ {
77
+ id: '345',
78
+ },
79
+ {
80
+ id: '456',
81
+ }
82
+ ]
83
+ }
84
+ ]
50
85
  }
51
86
  const bid4 = {
52
87
  bidId: '019645c7d69460',
@@ -62,7 +97,17 @@ describe('limelightDigitalAdapter', function () {
62
97
  video: {
63
98
  playerSize: [800, 600]
64
99
  },
65
- transactionId: '738d5915-6651-43b9-9b6b-d50517350917'
100
+ transactionId: '738d5915-6651-43b9-9b6b-d50517350917',
101
+ userIdAsEids: [
102
+ {
103
+ source: 'test.org',
104
+ uids: [
105
+ {
106
+ id: '111',
107
+ }
108
+ ]
109
+ }
110
+ ]
66
111
  }
67
112
 
68
113
  describe('buildRequests', function () {
@@ -82,19 +127,33 @@ describe('limelightDigitalAdapter', function () {
82
127
  expect(serverRequest.method).to.equal('POST')
83
128
  })
84
129
  it('Returns valid data if array of bids is valid', function () {
85
- let data = serverRequest.data
86
- expect(data).to.be.an('object')
87
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'secure', 'adUnits')
88
- expect(data.deviceWidth).to.be.a('number')
89
- expect(data.deviceHeight).to.be.a('number')
90
- expect(data.secure).to.be.a('boolean')
130
+ let data = serverRequest.data;
131
+ expect(data).to.be.an('object');
132
+ expect(data).to.have.all.keys(
133
+ 'deviceWidth',
134
+ 'deviceHeight',
135
+ 'secure',
136
+ 'adUnits'
137
+ );
138
+ expect(data.deviceWidth).to.be.a('number');
139
+ expect(data.deviceHeight).to.be.a('number');
140
+ expect(data.secure).to.be.a('boolean');
91
141
  data.adUnits.forEach(adUnit => {
92
- expect(adUnit).to.have.all.keys('id', 'bidId', 'type', 'sizes', 'transactionId')
93
- expect(adUnit.id).to.be.a('number')
94
- expect(adUnit.bidId).to.be.a('string')
95
- expect(adUnit.type).to.be.a('string')
96
- expect(adUnit.transactionId).to.be.a('string')
97
- expect(adUnit.sizes).to.be.an('array')
142
+ expect(adUnit).to.have.all.keys(
143
+ 'id',
144
+ 'bidId',
145
+ 'type',
146
+ 'sizes',
147
+ 'transactionId',
148
+ 'publisherId',
149
+ 'userIdAsEids'
150
+ );
151
+ expect(adUnit.id).to.be.a('number');
152
+ expect(adUnit.bidId).to.be.a('string');
153
+ expect(adUnit.type).to.be.a('string');
154
+ expect(adUnit.transactionId).to.be.a('string');
155
+ expect(adUnit.sizes).to.be.an('array');
156
+ expect(adUnit.userIdAsEids).to.be.an('array');
98
157
  })
99
158
  })
100
159
  })
@@ -192,7 +251,7 @@ describe('limelightDigitalAdapter', function () {
192
251
  expect(dataItem.meta.advertiserDomains).to.be.an('array');
193
252
  expect(dataItem.meta.mediaType).to.be.a('string');
194
253
  }
195
- it('Returns an empty array if invalid response is passed', function () {
254
+ it('should return an empty array if invalid response is passed', function () {
196
255
  serverResponses = spec.interpretResponse('invalid_response');
197
256
  expect(serverResponses).to.be.an('array').that.is.empty;
198
257
  });
@@ -456,10 +515,10 @@ describe('limelightDigitalAdapter', function () {
456
515
  });
457
516
 
458
517
  function validateAdUnit(adUnit, bid) {
459
- expect(adUnit.id).to.equal(bid.params.adUnitId)
460
- expect(adUnit.bidId).to.equal(bid.bidId)
461
- expect(adUnit.type).to.equal(bid.params.adUnitType.toUpperCase())
462
- expect(adUnit.transactionId).to.equal(bid.transactionId)
518
+ expect(adUnit.id).to.equal(bid.params.adUnitId);
519
+ expect(adUnit.bidId).to.equal(bid.bidId);
520
+ expect(adUnit.type).to.equal(bid.params.adUnitType.toUpperCase());
521
+ expect(adUnit.transactionId).to.equal(bid.transactionId);
463
522
  let bidSizes = [];
464
523
  if (bid.mediaTypes) {
465
524
  if (bid.mediaTypes.video && bid.mediaTypes.video.playerSize) {
@@ -478,4 +537,6 @@ function validateAdUnit(adUnit, bid) {
478
537
  height: size[1]
479
538
  }
480
539
  }));
540
+ expect(adUnit.publisherId).to.equal(bid.params.publisherId);
541
+ expect(adUnit.userIdAsEids).to.deep.equal(bid.userIdAsEids);
481
542
  }