prebid.js 9.53.2 → 9.53.3

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 (196) hide show
  1. package/dist/33acrossAnalyticsAdapter.js +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/BTBidAdapter.js +1 -1
  5. package/dist/adagioAnalyticsAdapter.js +1 -1
  6. package/dist/adagioBidAdapter.js +1 -1
  7. package/dist/adagioRtdProvider.js +1 -1
  8. package/dist/adagioUtils.js +1 -1
  9. package/dist/addefendBidAdapter.js +1 -1
  10. package/dist/adgenerationBidAdapter.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/adqueryBidAdapter.js +1 -1
  13. package/dist/adrelevantisBidAdapter.js +1 -1
  14. package/dist/adstirBidAdapter.js +1 -1
  15. package/dist/adtrgtmeBidAdapter.js +1 -1
  16. package/dist/adxcgAnalyticsAdapter.js +1 -1
  17. package/dist/adxcgBidAdapter.js +1 -1
  18. package/dist/adyoulikeBidAdapter.js +1 -1
  19. package/dist/agmaAnalyticsAdapter.js +1 -1
  20. package/dist/ajaBidAdapter.js +1 -1
  21. package/dist/amxBidAdapter.js +1 -1
  22. package/dist/amxIdSystem.js +1 -1
  23. package/dist/aniviewBidAdapter.js +1 -1
  24. package/dist/appierAnalyticsAdapter.js +1 -1
  25. package/dist/appnexusBidAdapter.js +1 -1
  26. package/dist/asoBidAdapter.js +1 -1
  27. package/dist/axonixBidAdapter.js +1 -1
  28. package/dist/beopBidAdapter.js +1 -1
  29. package/dist/bidglassBidAdapter.js +1 -1
  30. package/dist/big-richmediaBidAdapter.js +1 -1
  31. package/dist/bitmediaBidAdapter.js +1 -1
  32. package/dist/bridBidAdapter.js +1 -1
  33. package/dist/bridgeuppBidAdapter.js +1 -1
  34. package/dist/bridgewellBidAdapter.js +1 -1
  35. package/dist/brightMountainMediaBidAdapter.js +1 -1
  36. package/dist/carodaBidAdapter.js +1 -1
  37. package/dist/chtnwBidAdapter.js +1 -1
  38. package/dist/chunk-core.js +1 -1
  39. package/dist/concertBidAdapter.js +1 -1
  40. package/dist/connectadBidAdapter.js +1 -1
  41. package/dist/consumableBidAdapter.js +1 -1
  42. package/dist/contxtfulBidAdapter.js +1 -1
  43. package/dist/conversantAnalyticsAdapter.js +1 -1
  44. package/dist/conversantBidAdapter.js +1 -1
  45. package/dist/craftBidAdapter.js +1 -1
  46. package/dist/criteoBidAdapter.js +1 -1
  47. package/dist/cwireBidAdapter.js +1 -1
  48. package/dist/dailymotionBidAdapter.js +1 -1
  49. package/dist/debugging-standalone.js +1 -1
  50. package/dist/dspxBidAdapter.js +1 -1
  51. package/dist/dxkultureBidAdapter.js +1 -1
  52. package/dist/eplanningBidAdapter.js +1 -1
  53. package/dist/equativBidAdapter.js +1 -1
  54. package/dist/eskimiBidAdapter.js +1 -1
  55. package/dist/euidIdSystem.js +1 -1
  56. package/dist/exadsBidAdapter.js +1 -1
  57. package/dist/excoBidAdapter.js +1 -1
  58. package/dist/feedadBidAdapter.js +1 -1
  59. package/dist/finativeBidAdapter.js +1 -1
  60. package/dist/freewheel-sspBidAdapter.js +1 -1
  61. package/dist/gmosspBidAdapter.js +1 -1
  62. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  63. package/dist/greenbidsBidAdapter.js +1 -1
  64. package/dist/greenbidsRtdProvider.js +1 -1
  65. package/dist/gridBidAdapter.js +1 -1
  66. package/dist/gumgumBidAdapter.js +1 -1
  67. package/dist/h12mediaBidAdapter.js +1 -1
  68. package/dist/hypelabBidAdapter.js +1 -1
  69. package/dist/id5AnalyticsAdapter.js +1 -1
  70. package/dist/id5IdSystem.js +1 -1
  71. package/dist/imdsBidAdapter.js +1 -1
  72. package/dist/improvedigitalBidAdapter.js +1 -1
  73. package/dist/inmobiBidAdapter.js +1 -1
  74. package/dist/insticatorBidAdapter.js +1 -1
  75. package/dist/intentIqAnalyticsAdapter.js +1 -1
  76. package/dist/ixBidAdapter.js +1 -1
  77. package/dist/jixieBidAdapter.js +1 -1
  78. package/dist/justpremiumBidAdapter.js +1 -1
  79. package/dist/kargoBidAdapter.js +1 -1
  80. package/dist/kimberliteBidAdapter.js +1 -1
  81. package/dist/konduitAnalyticsAdapter.js +1 -1
  82. package/dist/kueezBidAdapter.js +1 -1
  83. package/dist/lassoBidAdapter.js +1 -1
  84. package/dist/lifestreetBidAdapter.js +1 -1
  85. package/dist/liveIntentId.js +1 -1
  86. package/dist/logicadBidAdapter.js +1 -1
  87. package/dist/loglyliftBidAdapter.js +1 -1
  88. package/dist/luceadBidAdapter.js +1 -1
  89. package/dist/mabidderBidAdapter.js +1 -1
  90. package/dist/madsenseBidAdapter.js +1 -1
  91. package/dist/magniteAnalyticsAdapter.js +1 -1
  92. package/dist/malltvAnalyticsAdapter.js +1 -1
  93. package/dist/marsmediaBidAdapter.js +1 -1
  94. package/dist/mediafuseBidAdapter.js +1 -1
  95. package/dist/medianetBidAdapter.js +1 -1
  96. package/dist/medianetUtils.js +1 -1
  97. package/dist/mediasquareBidAdapter.js +1 -1
  98. package/dist/mgidBidAdapter.js +1 -1
  99. package/dist/missenaBidAdapter.js +1 -1
  100. package/dist/mobilefuseBidAdapter.js +1 -1
  101. package/dist/nextMillenniumBidAdapter.js +1 -1
  102. package/dist/nexx360Utils.js +1 -1
  103. package/dist/nobidAnalyticsAdapter.js +1 -1
  104. package/dist/nobidBidAdapter.js +1 -1
  105. package/dist/nodalsAiRtdProvider.js +1 -1
  106. package/dist/not-for-prod/prebid.js +172 -172
  107. package/dist/objectGuard.js +1 -1
  108. package/dist/oguryBidAdapter.js +1 -1
  109. package/dist/onetagBidAdapter.js +1 -1
  110. package/dist/ooloAnalyticsAdapter.js +1 -1
  111. package/dist/openxBidAdapter.js +1 -1
  112. package/dist/optidigitalBidAdapter.js +1 -1
  113. package/dist/orbidderBidAdapter.js +1 -1
  114. package/dist/outbrainBidAdapter.js +1 -1
  115. package/dist/pixfutureBidAdapter.js +1 -1
  116. package/dist/publinkIdSystem.js +1 -1
  117. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  118. package/dist/pubmaticBidAdapter.js +1 -1
  119. package/dist/pubmaticIdSystem.js +1 -1
  120. package/dist/pubmaticRtdProvider.js +1 -1
  121. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  122. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  123. package/dist/pxyzBidAdapter.js +1 -1
  124. package/dist/quantcastBidAdapter.js +1 -1
  125. package/dist/readpeakBidAdapter.js +1 -1
  126. package/dist/relaidoBidAdapter.js +1 -1
  127. package/dist/retailspotBidAdapter.js +1 -1
  128. package/dist/rhythmoneBidAdapter.js +1 -1
  129. package/dist/riseUtils.js +1 -1
  130. package/dist/rtdModule.js +1 -1
  131. package/dist/rubiconBidAdapter.js +1 -1
  132. package/dist/seedingAllianceBidAdapter.js +1 -1
  133. package/dist/seedtagBidAdapter.js +1 -1
  134. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  135. package/dist/sharethroughBidAdapter.js +1 -1
  136. package/dist/showheroes-bsBidAdapter.js +1 -1
  137. package/dist/smaatoBidAdapter.js +1 -1
  138. package/dist/smartadserverBidAdapter.js +1 -1
  139. package/dist/smartxBidAdapter.js +1 -1
  140. package/dist/smilewantedBidAdapter.js +1 -1
  141. package/dist/snigelBidAdapter.js +1 -1
  142. package/dist/sonobiBidAdapter.js +1 -1
  143. package/dist/sovrnBidAdapter.js +1 -1
  144. package/dist/sparteoBidAdapter.js +1 -1
  145. package/dist/sspBCBidAdapter.js +1 -1
  146. package/dist/stvBidAdapter.js +1 -1
  147. package/dist/sublimeBidAdapter.js +1 -1
  148. package/dist/taboolaBidAdapter.js +1 -1
  149. package/dist/tappxBidAdapter.js +1 -1
  150. package/dist/targetVideoBidAdapter.js +1 -1
  151. package/dist/teadsBidAdapter.js +1 -1
  152. package/dist/terceptAnalyticsAdapter.js +1 -1
  153. package/dist/themoneytizerBidAdapter.js +1 -1
  154. package/dist/trionBidAdapter.js +1 -1
  155. package/dist/tripleliftBidAdapter.js +1 -1
  156. package/dist/ttdBidAdapter.js +1 -1
  157. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  158. package/dist/uid2IdSystem.js +1 -1
  159. package/dist/underdogmediaBidAdapter.js +1 -1
  160. package/dist/undertoneBidAdapter.js +1 -1
  161. package/dist/unrulyBidAdapter.js +1 -1
  162. package/dist/userId.js +1 -1
  163. package/dist/vidazooUtils.js +1 -1
  164. package/dist/videobyteBidAdapter.js +1 -1
  165. package/dist/visxBidAdapter.js +1 -1
  166. package/dist/vuukleBidAdapter.js +1 -1
  167. package/dist/widespaceBidAdapter.js +1 -1
  168. package/dist/winrBidAdapter.js +1 -1
  169. package/dist/yahooAdsBidAdapter.js +1 -1
  170. package/dist/yandexBidAdapter.js +1 -1
  171. package/dist/yieldmoBidAdapter.js +1 -1
  172. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  173. package/libraries/objectGuard/objectGuard.js +149 -48
  174. package/libraries/objectGuard/ortbGuard.js +33 -43
  175. package/modules/adagioAnalyticsAdapter.js +6 -1
  176. package/modules/adagioBidAdapter.js +12 -5
  177. package/modules/adagioRtdProvider.js +41 -35
  178. package/modules/pubmaticAnalyticsAdapter.js +311 -587
  179. package/modules/pubmaticBidAdapter.js +71 -8
  180. package/modules/pubmaticIdSystem.js +4 -4
  181. package/modules/pubmaticRtdProvider.js +12 -60
  182. package/modules/rtdModule/index.js +1 -5
  183. package/modules/ttdBidAdapter.js +0 -5
  184. package/modules/userId/eids.js +1 -1
  185. package/modules/userId/index.js +32 -1
  186. package/package.json +1 -1
  187. package/src/auction.js +3 -0
  188. package/test/spec/activities/objectGuard_spec.js +156 -32
  189. package/test/spec/activities/ortbGuard_spec.js +10 -15
  190. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +94 -24
  191. package/test/spec/modules/adagioRtdProvider_spec.js +17 -17
  192. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +634 -916
  193. package/test/spec/modules/pubmaticBidAdapter_spec.js +260 -1
  194. package/test/spec/modules/pubmaticRtdProvider_spec.js +78 -400
  195. package/test/spec/modules/ttdBidAdapter_spec.js +0 -33
  196. package/test/spec/modules/userId_spec.js +115 -1
@@ -1,4 +1,5 @@
1
1
  import {objectGuard, writeProtectRule} from '../../../libraries/objectGuard/objectGuard.js';
2
+ import {redactRule} from '../../../src/activities/redactor.js';
2
3
 
3
4
  describe('objectGuard', () => {
4
5
  describe('read rule', () => {
@@ -13,7 +14,7 @@ describe('objectGuard', () => {
13
14
  }
14
15
  })
15
16
  it('can prevent top level read access', () => {
16
- const {obj} = objectGuard([rule])({'foo': 1, 'other': 2});
17
+ const obj = objectGuard([rule])({'foo': 1, 'other': 2});
17
18
  expect(obj).to.eql({
18
19
  foo: 'repl1',
19
20
  other: 2
@@ -21,20 +22,27 @@ describe('objectGuard', () => {
21
22
  });
22
23
 
23
24
  it('does not choke if a guarded property is missing', () => {
24
- const {obj} = objectGuard([rule])({});
25
+ const obj = objectGuard([rule])({});
25
26
  expect(obj.foo).to.not.exist;
26
27
  });
27
28
 
29
+ it('allows concurrent reads', () => {
30
+ const obj = {'foo': 'bar'};
31
+ const guarded = objectGuard([rule])(obj);
32
+ obj.foo = 'baz';
33
+ expect(guarded.foo).to.eql('replbaz');
34
+ })
35
+
28
36
  it('does not prevent access if applies returns false', () => {
29
37
  applies = false;
30
- const {obj} = objectGuard([rule])({foo: 1});
38
+ const obj = objectGuard([rule])({foo: 1});
31
39
  expect(obj).to.eql({
32
40
  foo: 1
33
41
  });
34
42
  })
35
43
 
36
44
  it('can prevent nested property access', () => {
37
- const {obj} = objectGuard([rule])({
45
+ const obj = objectGuard([rule])({
38
46
  other: 0,
39
47
  outer: {
40
48
  foo: 1,
@@ -60,6 +68,11 @@ describe('objectGuard', () => {
60
68
  })
61
69
  });
62
70
 
71
+ it('prevents nested property access when a parent property is protected', () => {
72
+ const guard = objectGuard([rule])({foo: {inner: 'value'}});
73
+ expect(guard.inner?.value).to.not.exist;
74
+ })
75
+
63
76
  it('does not call applies more than once', () => {
64
77
  JSON.stringify(objectGuard([rule])({
65
78
  foo: 0,
@@ -68,7 +81,7 @@ describe('objectGuard', () => {
68
81
  foo: 1
69
82
  }
70
83
  }
71
- }).obj);
84
+ }));
72
85
  expect(rule.applies.callCount).to.equal(1);
73
86
  })
74
87
  });
@@ -84,35 +97,60 @@ describe('objectGuard', () => {
84
97
  });
85
98
  });
86
99
 
87
- it('should undo top-level writes', () => {
100
+ it('does not mess up array reads', () => {
101
+ const guard = objectGuard([rule])({foo: [{bar: 'baz'}]});
102
+ expect(guard.foo).to.eql([{bar: 'baz'}]);
103
+ })
104
+
105
+ it('prevents array modification', () => {
106
+ const obj = {foo: ['value']};
107
+ const guard = objectGuard([rule])(obj);
108
+ guard.foo.pop();
109
+ guard.foo.push('test');
110
+ expect(obj.foo).to.eql(['value']);
111
+ })
112
+
113
+ it('allows array modification when not applicable', () => {
114
+ applies = false;
115
+ const obj = {foo: ['value']};
116
+ const guard = objectGuard([rule])(obj);
117
+ guard.foo.pop();
118
+ guard.foo.push('test');
119
+ expect(obj.foo).to.eql(['test']);
120
+ })
121
+
122
+ it('should prevent top-level writes', () => {
88
123
  const obj = {bar: {nested: 'val'}, other: 'val'};
89
124
  const guard = objectGuard([rule])(obj);
90
- guard.obj.foo = 'denied';
91
- guard.obj.bar.nested = 'denied';
92
- guard.obj.bar.other = 'denied';
93
- guard.obj.other = 'allowed';
94
- guard.verify();
95
- expect(obj).to.eql({bar: {nested: 'val'}, other: 'allowed'});
125
+ guard.foo = 'denied';
126
+ guard.bar.nested = 'denied';
127
+ guard.bar.other = 'denied';
128
+ guard.other = 'allowed';
129
+ expect(guard).to.eql({bar: {nested: 'val'}, other: 'allowed'});
96
130
  });
97
131
 
98
- it('should undo top-level deletes', () => {
132
+ it('should not prevent no-op writes', () => {
133
+ const guard = objectGuard([rule])({foo: {some: 'value'}});
134
+ guard.foo = {some: 'value'};
135
+ sinon.assert.notCalled(rule.applies);
136
+ })
137
+
138
+ it('should prevent top-level deletes', () => {
99
139
  const obj = {foo: {nested: 'val'}, bar: 'val'};
100
140
  const guard = objectGuard([rule])(obj);
101
- delete guard.obj.foo.nested;
102
- delete guard.obj.bar;
103
- guard.verify();
104
- expect(obj).to.eql({foo: {nested: 'val'}, bar: 'val'});
141
+ delete guard.foo.nested;
142
+ delete guard.bar;
143
+ expect(guard).to.eql({foo: {nested: 'val'}, bar: 'val'});
105
144
  })
106
145
 
107
- it('should undo nested writes', () => {
146
+ it('should prevent nested writes', () => {
108
147
  const obj = {outer: {inner: {bar: {nested: 'val'}, other: 'val'}}};
109
148
  const guard = objectGuard([rule])(obj);
110
- guard.obj.outer.inner.bar.other = 'denied';
111
- guard.obj.outer.inner.bar.nested = 'denied';
112
- guard.obj.outer.inner.foo = 'denied';
113
- guard.obj.outer.inner.other = 'allowed';
114
- guard.verify();
115
- expect(obj).to.eql({
149
+ guard.outer.inner.bar.other = 'denied';
150
+ guard.outer.inner.bar.nested = 'denied';
151
+ guard.outer.inner.foo = 'denied';
152
+ guard.outer.inner.other = 'allowed';
153
+ expect(guard).to.eql({
116
154
  outer: {
117
155
  inner: {
118
156
  bar: {
@@ -124,21 +162,107 @@ describe('objectGuard', () => {
124
162
  })
125
163
  });
126
164
 
127
- it('should undo nested deletes', () => {
165
+ it('should prevent writes if upper levels are protected', () => {
166
+ const obj = {foo: {inner: {}}};
167
+ const guard = objectGuard([rule])(obj);
168
+ guard.foo.inner.prop = 'value';
169
+ expect(obj).to.eql({foo: {inner: {}}});
170
+ })
171
+
172
+ it('should prevent deletes if a higher level property is protected', () => {
173
+ const obj = {foo: {inner: {prop: 'value'}}};
174
+ const guard = objectGuard([rule])(obj);
175
+ delete guard.foo.inner.prop;
176
+ expect(obj).to.eql({foo: {inner: {prop: 'value'}}});
177
+ })
178
+
179
+ it('should clean up top-level writes that would result in inner properties changing', () => {
180
+ const guard = objectGuard([rule])({outer: {inner: {bar: 'baz'}}});
181
+ guard.outer = {inner: {bar: 'baz', foo: 'baz', prop: 'allowed'}};
182
+ expect(guard).to.eql({outer: {inner: {bar: 'baz', prop: 'allowed'}}});
183
+ })
184
+
185
+ it('should not prevent writes that are not protected', () => {
186
+ const obj = {};
187
+ const guard = objectGuard([rule])(obj);
188
+ guard.outer = {
189
+ test: 'value'
190
+ }
191
+ expect(obj.outer.test).to.eql('value');
192
+ })
193
+
194
+ it('should not choke on type mismatch: overwrite object with scalar', () => {
195
+ const obj = {outer: {inner: {}}};
196
+ const guard = objectGuard([rule])(obj);
197
+ guard.outer = null;
198
+ expect(obj).to.eql({outer: {inner: {}}});
199
+ });
200
+
201
+ it('should not choke on type mismatch: overwrite scalar with object', () => {
202
+ const obj = {outer: null};
203
+ const guard = objectGuard([rule])(obj);
204
+ guard.outer = {inner: {bar: 'denied', other: 'allowed'}};
205
+ expect(obj).to.eql({outer: {inner: {other: 'allowed'}}});
206
+ })
207
+
208
+ it('should prevent nested deletes', () => {
128
209
  const obj = {outer: {inner: {foo: {nested: 'val'}, bar: 'val'}}};
129
210
  const guard = objectGuard([rule])(obj);
130
- delete guard.obj.outer.inner.foo.nested;
131
- delete guard.obj.outer.inner.bar;
132
- guard.verify();
133
- expect(obj).to.eql({outer: {inner: {foo: {nested: 'val'}, bar: 'val'}}})
211
+ delete guard.outer.inner.foo.nested;
212
+ delete guard.outer.inner.bar;
213
+ expect(guard).to.eql({outer: {inner: {foo: {nested: 'val'}, bar: 'val'}}})
134
214
  });
135
215
 
216
+ it('should prevent higher level deletes that would result in inner properties changing', () => {
217
+ const guard = objectGuard([rule])({outer: {inner: {bar: 'baz'}}});
218
+ delete guard.outer.inner;
219
+ expect(guard).to.eql({outer: {inner: {bar: 'baz'}}});
220
+ })
221
+
136
222
  it('should work on null properties', () => {
137
223
  const obj = {foo: null};
138
224
  const guard = objectGuard([rule])(obj);
139
- guard.obj.foo = 'denied';
140
- guard.verify();
141
- expect(obj).to.eql({foo: null});
225
+ guard.foo = 'denied';
226
+ expect(guard).to.eql({foo: null});
142
227
  });
143
228
  });
229
+ describe('multiple rules on the same path', () => {
230
+ it('should each be checked for redacts', () => {
231
+ const obj = objectGuard([
232
+ redactRule({
233
+ paths: ['foo'],
234
+ applies: () => true,
235
+ get(val) {
236
+ return '1' + val;
237
+ }
238
+ }),
239
+ redactRule({
240
+ paths: ['foo'],
241
+ applies: () => true,
242
+ get(val) {
243
+ return '2' + val;
244
+ }
245
+ })
246
+ ])({foo: 'bar'});
247
+ expect(obj.foo).to.eql('21bar');
248
+ });
249
+
250
+ it('can apply both redact and write protect', () => {
251
+ const obj = objectGuard([
252
+ redactRule({
253
+ paths: ['foo'],
254
+ applies: () => true,
255
+ get(val) {
256
+ return 'redact' + val;
257
+ },
258
+ }),
259
+ writeProtectRule({
260
+ paths: ['foo'],
261
+ applies: () => true,
262
+ })
263
+ ])({foo: 'bar'});
264
+ obj.foo = 'baz';
265
+ expect(obj.foo).to.eql('redactbar');
266
+ });
267
+ })
144
268
  });
@@ -45,7 +45,7 @@ describe('ortb2Guard', () => {
45
45
 
46
46
  function testPropertiesAreProtected(properties, allowed) {
47
47
  properties.forEach(prop => {
48
- it(`should ${allowed ? 'keep' : 'undo'} additions to ${prop}`, () => {
48
+ it(`should ${allowed ? 'keep' : 'prevent'} additions to ${prop}`, () => {
49
49
  const orig = [{n: 'orig'}];
50
50
  const ortb2 = {};
51
51
  deepSetValue(ortb2, prop, deepClone(orig));
@@ -53,8 +53,7 @@ describe('ortb2Guard', () => {
53
53
  const mod = {};
54
54
  const insert = [{n: 'new'}];
55
55
  deepSetValue(mod, prop, insert);
56
- mergeDeep(guard.obj, mod);
57
- guard.verify();
56
+ mergeDeep(guard, mod);
58
57
  const actual = deepAccess(ortb2, prop);
59
58
  if (allowed) {
60
59
  expect(actual).to.eql(orig.concat(insert))
@@ -63,13 +62,12 @@ describe('ortb2Guard', () => {
63
62
  }
64
63
  });
65
64
 
66
- it(`should ${allowed ? 'keep' : 'undo'} modifications to ${prop}`, () => {
65
+ it(`should ${allowed ? 'keep' : 'prevent'} modifications to ${prop}`, () => {
67
66
  const orig = [{n: 'orig'}];
68
67
  const ortb2 = {};
69
68
  deepSetValue(ortb2, prop, orig);
70
69
  const guard = ortb2Guard(ortb2, activityParams(MOD_TYPE, MOD_NAME));
71
- deepSetValue(guard.obj, `${prop}.0.n`, 'new');
72
- guard.verify();
70
+ deepSetValue(guard, `${prop}.0.n`, 'new');
73
71
  const actual = deepAccess(ortb2, prop);
74
72
  if (allowed) {
75
73
  expect(actual).to.eql([{n: 'new'}]);
@@ -102,19 +100,18 @@ describe('ortb2FragmentsGuard', () => {
102
100
  guardFragments = ortb2FragmentsGuardFactory(testGuard);
103
101
  });
104
102
 
105
- it('should undo changes to global FPD', () => {
103
+ it('should prevent changes to global FPD', () => {
106
104
  const fragments = {
107
105
  global: {
108
106
  foo: {inner: 'val'}
109
107
  }
110
108
  }
111
109
  const guard = guardFragments(fragments);
112
- guard.obj.global.foo = 'other';
113
- guard.verify();
110
+ guard.global.foo = 'other';
114
111
  expect(fragments.global.foo).to.eql({inner: 'val'});
115
112
  });
116
113
 
117
- it('should undo changes to bidder FPD', () => {
114
+ it('should prevent changes to bidder FPD', () => {
118
115
  const fragments = {
119
116
  bidder: {
120
117
  A: {
@@ -123,18 +120,16 @@ describe('ortb2FragmentsGuard', () => {
123
120
  }
124
121
  };
125
122
  const guard = guardFragments(fragments);
126
- guard.obj.bidder.A.foo = 'denied';
127
- guard.verify();
123
+ guard.bidder.A.foo = 'denied';
128
124
  expect(fragments.bidder.A).to.eql({foo: 'val'});
129
125
  });
130
126
 
131
- it('should undo changes to bidder FPD that was not initially there', () => {
127
+ it('should prevent changes to bidder FPD that was not initially there', () => {
132
128
  const fragments = {
133
129
  bidder: {}
134
130
  };
135
131
  const guard = guardFragments(fragments);
136
- guard.obj.bidder.A = {foo: 'denied', other: 'allowed'};
137
- guard.verify();
132
+ guard.bidder.A = {foo: 'denied', other: 'allowed'};
138
133
  expect(fragments.bidder.A).to.eql({other: 'allowed'});
139
134
  });
140
135
  })
@@ -4,6 +4,7 @@ import adagioAnalyticsAdapter, { _internal } from 'modules/adagioAnalyticsAdapte
4
4
  import { EVENTS } from 'src/constants.js';
5
5
  import { expect } from 'chai';
6
6
  import { server } from 'test/mocks/xhr.js';
7
+ import { deepClone } from 'src/utils.js';
7
8
 
8
9
  let adapterManager = require('src/adapterManager').default;
9
10
  let events = require('src/events');
@@ -191,8 +192,10 @@ const BID_CACHED = Object.assign({}, BID_ADAGIO, {
191
192
  latestTargetedAuctionId: BID_ADAGIO.auctionId,
192
193
  });
193
194
 
195
+ const PARAMS_PLCMT = 'placement_from_params';
194
196
  const PARAMS_ADG = {
195
197
  environment: 'desktop',
198
+ placement: PARAMS_PLCMT,
196
199
  };
197
200
 
198
201
  const ORTB_DATA = {
@@ -208,6 +211,13 @@ const ADG_RTD = {
208
211
  }
209
212
  };
210
213
 
214
+ const ORTB2IMP_PLCMT = 'placement_from_ortb2imp';
215
+ const ORTB2IMP_DATA_ADG = {
216
+ 'adg_rtd': {
217
+ 'placement': ORTB2IMP_PLCMT
218
+ }
219
+ };
220
+
211
221
  const AUCTION_INIT_ANOTHER = {
212
222
  'auctionId': AUCTION_ID,
213
223
  'timestamp': 1519767010567,
@@ -228,6 +238,11 @@ const AUCTION_INIT_ANOTHER = {
228
238
  ]
229
239
  }
230
240
  },
241
+ 'ortb2Imp': {
242
+ 'ext': {
243
+ 'data': ORTB2IMP_DATA_ADG
244
+ }
245
+ },
231
246
  'sizes': [[640, 480]],
232
247
  'bids': [ {
233
248
  'bidder': 'another',
@@ -250,14 +265,7 @@ const AUCTION_INIT_ANOTHER = {
250
265
  'publisherId': '1001'
251
266
  },
252
267
  }, ],
253
- 'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
254
- 'ortb2Imp': {
255
- 'ext': {
256
- 'data': {
257
- 'placement': 'pave_top',
258
- }
259
- }
260
- },
268
+ 'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014'
261
269
  }, {
262
270
  'code': '/19968336/footer-bid-tag-1',
263
271
  'mediaTypes': {
@@ -281,7 +289,9 @@ const AUCTION_INIT_ANOTHER = {
281
289
  'ortb2Imp': {
282
290
  'ext': {
283
291
  'data': {
284
- 'placement': 'pave_top',
292
+ 'adg_rtd': {
293
+ 'placement': 'footer'
294
+ }
285
295
  }
286
296
  }
287
297
  },
@@ -303,6 +313,11 @@ const AUCTION_INIT_ANOTHER = {
303
313
  'sizes': [[640, 480]]
304
314
  }
305
315
  },
316
+ 'ortb2Imp': {
317
+ 'ext': {
318
+ 'data': ORTB2IMP_DATA_ADG
319
+ }
320
+ },
306
321
  'adUnitCode': '/19968336/header-bid-tag-1',
307
322
  'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
308
323
  'sizes': [[640, 480]],
@@ -363,6 +378,12 @@ const AUCTION_INIT_ANOTHER = {
363
378
  'sizes': [[640, 480]]
364
379
  }
365
380
  },
381
+
382
+ 'ortb2Imp': {
383
+ 'ext': {
384
+ 'data': ORTB2IMP_DATA_ADG
385
+ }
386
+ },
366
387
  'adUnitCode': '/19968336/header-bid-tag-1',
367
388
  'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
368
389
  'sizes': [[640, 480]],
@@ -405,6 +426,11 @@ const AUCTION_INIT_ANOTHER = {
405
426
  'sizes': [[640, 480]]
406
427
  }
407
428
  },
429
+ 'ortb2Imp': {
430
+ 'ext': {
431
+ 'data': ORTB2IMP_DATA_ADG
432
+ }
433
+ },
408
434
  'adUnitCode': '/19968336/header-bid-tag-1',
409
435
  'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
410
436
  'sizes': [[640, 480]],
@@ -453,7 +479,12 @@ const AUCTION_INIT_ANOTHER = {
453
479
  'bidderRequestId': '1be65d7958826a',
454
480
  'auctionId': AUCTION_ID,
455
481
  'src': 'client',
456
- 'bidRequestsCount': 1
482
+ 'bidRequestsCount': 1,
483
+ 'ortb2Imp': {
484
+ 'ext': {
485
+ 'data': ORTB2IMP_DATA_ADG
486
+ }
487
+ },
457
488
  }
458
489
  ],
459
490
  'timeout': 3000,
@@ -514,9 +545,7 @@ const AUCTION_INIT_CACHE = {
514
545
  'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
515
546
  'ortb2Imp': {
516
547
  'ext': {
517
- 'data': {
518
- 'placement': 'pave_top',
519
- }
548
+ 'data': ORTB2IMP_DATA_ADG
520
549
  }
521
550
  },
522
551
  }, {
@@ -539,13 +568,6 @@ const AUCTION_INIT_CACHE = {
539
568
  },
540
569
  } ],
541
570
  'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
542
- 'ortb2Imp': {
543
- 'ext': {
544
- 'data': {
545
- 'placement': 'pave_top',
546
- }
547
- }
548
- },
549
571
  } ],
550
572
  'adUnitCodes': ['/19968336/header-bid-tag-1', '/19968336/footer-bid-tag-1'],
551
573
  'bidderRequests': [ {
@@ -562,6 +584,11 @@ const AUCTION_INIT_CACHE = {
562
584
  'sizes': [[640, 480]]
563
585
  }
564
586
  },
587
+ 'ortb2Imp': {
588
+ 'ext': {
589
+ 'data': ORTB2IMP_DATA_ADG
590
+ }
591
+ },
565
592
  'adUnitCode': '/19968336/header-bid-tag-1',
566
593
  'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
567
594
  'sizes': [[640, 480]],
@@ -621,6 +648,11 @@ const AUCTION_INIT_CACHE = {
621
648
  'sizes': [[640, 480]]
622
649
  }
623
650
  },
651
+ 'ortb2Imp': {
652
+ 'ext': {
653
+ 'data': ORTB2IMP_DATA_ADG
654
+ }
655
+ },
624
656
  'adUnitCode': '/19968336/header-bid-tag-1',
625
657
  'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014',
626
658
  'sizes': [[640, 480]],
@@ -818,7 +850,7 @@ describe('adagio analytics adapter', () => {
818
850
  expect(search.pv_id).to.equal('a68e6d70-213b-496c-be0a-c468ff387106');
819
851
  expect(search.url_dmn).to.equal(window.location.hostname);
820
852
  expect(search.pgtyp).to.equal('article');
821
- expect(search.plcmt).to.equal('pave_top');
853
+ expect(search.plcmt).to.equal(ORTB2IMP_PLCMT);
822
854
  expect(search.mts).to.equal('ban');
823
855
  expect(search.ban_szs).to.equal('640x100,640x480');
824
856
  expect(search.bdrs).to.equal('adagio,another,anotherWithAlias,nobid');
@@ -869,6 +901,7 @@ describe('adagio analytics adapter', () => {
869
901
  expect(search.auct_id).to.equal(RTD_AUCTION_ID);
870
902
  expect(search.adu_code).to.equal('/19968336/header-bid-tag-1');
871
903
  expect(search.win_bdr).to.equal('another');
904
+ expect(search.plcmt).to.equal(ORTB2IMP_PLCMT);
872
905
  expect(search.win_mt).to.equal('ban');
873
906
  expect(search.win_ban_sz).to.equal('728x90');
874
907
  expect(search.win_net_cpm).to.equal('2.052');
@@ -877,6 +910,43 @@ describe('adagio analytics adapter', () => {
877
910
  }
878
911
  });
879
912
 
913
+ it('it fallback on the adUnit.params.placement value if adg_rtd.placement is not set', () => {
914
+ const mockAuctionInit = deepClone(MOCK.AUCTION_INIT.another);
915
+ for (const adUnit of mockAuctionInit.adUnits) {
916
+ delete adUnit.ortb2Imp?.ext?.data.adg_rtd;
917
+ }
918
+ for (const bidRequest of mockAuctionInit.bidderRequests) {
919
+ for (const bid of bidRequest.bids) {
920
+ delete bid.ortb2Imp?.ext?.data.adg_rtd;
921
+ }
922
+ }
923
+
924
+ events.emit(EVENTS.AUCTION_INIT, mockAuctionInit);
925
+ {
926
+ const { protocol, hostname, pathname, search } = utils.parseUrl(server.requests[0].url);
927
+ expect(protocol).to.equal('https');
928
+ expect(hostname).to.equal('c.4dex.io');
929
+ expect(pathname).to.equal('/pba.gif');
930
+ expect(search.v).to.equal('1');
931
+ expect(search.pbjsv).to.equal('$prebid.version$');
932
+ expect(search.s_id).to.equal(SESSION_ID);
933
+ expect(search.auct_id).to.equal(RTD_AUCTION_ID);
934
+ expect(search.adu_code).to.equal('/19968336/header-bid-tag-1');
935
+ expect(search.org_id).to.equal('1001');
936
+ expect(search.site).to.equal('test-com');
937
+ expect(search.pv_id).to.equal('a68e6d70-213b-496c-be0a-c468ff387106');
938
+ expect(search.url_dmn).to.equal(window.location.hostname);
939
+ expect(search.pgtyp).to.equal('article');
940
+ expect(search.plcmt).to.equal(PARAMS_PLCMT);
941
+ expect(search.mts).to.equal('ban');
942
+ expect(search.ban_szs).to.equal('640x100,640x480');
943
+ expect(search.bdrs).to.equal('adagio,another,anotherWithAlias,nobid');
944
+ expect(search.bdrs_code).to.equal('adagio,another,another,nobid');
945
+ expect(search.bdrs_timeout).to.not.exist;
946
+ expect(search.adg_mts).to.equal('ban');
947
+ }
948
+ });
949
+
880
950
  it('builds and sends auction data with a cached bid win', () => {
881
951
  events.emit(EVENTS.AUCTION_INIT, MOCK.AUCTION_INIT.bidcached);
882
952
  events.emit(EVENTS.AUCTION_INIT, MOCK.AUCTION_INIT.another);
@@ -903,7 +973,7 @@ describe('adagio analytics adapter', () => {
903
973
  expect(search.pv_id).to.equal('a68e6d70-213b-496c-be0a-c468ff387106');
904
974
  expect(search.url_dmn).to.equal(window.location.hostname);
905
975
  expect(search.pgtyp).to.equal('article');
906
- expect(search.plcmt).to.equal('pave_top');
976
+ expect(search.plcmt).to.equal(ORTB2IMP_PLCMT);
907
977
  expect(search.mts).to.equal('ban');
908
978
  expect(search.ban_szs).to.equal('640x100,640x480');
909
979
  expect(search.bdrs).to.equal('adagio,another');
@@ -928,7 +998,7 @@ describe('adagio analytics adapter', () => {
928
998
  expect(search.pv_id).to.equal('a68e6d70-213b-496c-be0a-c468ff387106');
929
999
  expect(search.url_dmn).to.equal(window.location.hostname);
930
1000
  expect(search.pgtyp).to.equal('article');
931
- expect(search.plcmt).to.equal('pave_top');
1001
+ expect(search.plcmt).to.be.undefined; // no placement set, no adagio bidder for this adUnit.
932
1002
  expect(search.mts).to.equal('ban');
933
1003
  expect(search.ban_szs).to.equal('640x480');
934
1004
  expect(search.bdrs).to.equal('another');
@@ -951,7 +1021,7 @@ describe('adagio analytics adapter', () => {
951
1021
  expect(search.pv_id).to.equal('a68e6d70-213b-496c-be0a-c468ff387106');
952
1022
  expect(search.url_dmn).to.equal(window.location.hostname);
953
1023
  expect(search.pgtyp).to.equal('article');
954
- expect(search.plcmt).to.equal('pave_top');
1024
+ expect(search.plcmt).to.equal(ORTB2IMP_PLCMT);
955
1025
  expect(search.mts).to.equal('ban');
956
1026
  expect(search.ban_szs).to.equal('640x100,640x480');
957
1027
  expect(search.bdrs).to.equal('adagio,another,anotherWithAlias,nobid');
@@ -507,7 +507,7 @@ describe('Adagio Rtd Provider', function () {
507
507
  expect(ortb2ImpExt.adunit_position).equal('');
508
508
  });
509
509
 
510
- describe('update the ortb2Imp.ext.data.placement if not present', function() {
510
+ describe('set the ortb2Imp.ext.data.adg_rtd.placement', function() {
511
511
  const config = {
512
512
  name: SUBMODULE_NAME,
513
513
  params: {
@@ -516,50 +516,50 @@ describe('Adagio Rtd Provider', function () {
516
516
  }
517
517
  };
518
518
 
519
- it('update the placement value with the adUnit.code value', function() {
519
+ it('set the adg_rtd.placement value from the adUnit[].bids adagio.params.placement value', function() {
520
+ const placement = 'placement-value';
521
+
520
522
  const configCopy = utils.deepClone(config);
521
- configCopy.params.placementSource = PLACEMENT_SOURCES.ADUNITCODE;
522
523
 
523
524
  const bidRequest = utils.deepClone(bidReqConfig);
525
+ bidRequest.adUnits[0].bids[0].params.placement = placement;
524
526
 
525
527
  adagioRtdSubmodule.getBidRequestData(bidRequest, cb, configCopy);
526
528
  expect(bidRequest.adUnits[0]).to.have.property('ortb2Imp');
527
- expect(bidRequest.adUnits[0].ortb2Imp.ext.data.placement).to.equal('div-gpt-ad-1460505748561-0');
529
+ expect(bidRequest.adUnits[0].ortb2Imp.ext.data.adg_rtd.placement).to.equal(placement);
528
530
  });
529
531
 
530
- it('update the placement value with the gpid value', function() {
532
+ it('fallback on the adUnit.code value to set the adg_rtd.placement value', function() {
531
533
  const configCopy = utils.deepClone(config);
532
- configCopy.params.placementSource = PLACEMENT_SOURCES.GPID;
534
+ configCopy.params.placementSource = PLACEMENT_SOURCES.ADUNITCODE;
533
535
 
534
536
  const bidRequest = utils.deepClone(bidReqConfig);
535
- const gpid = '/19968336/header-bid-tag-0'
536
- utils.deepSetValue(bidRequest.adUnits[0], 'ortb2Imp.ext.gpid', gpid)
537
537
 
538
538
  adagioRtdSubmodule.getBidRequestData(bidRequest, cb, configCopy);
539
539
  expect(bidRequest.adUnits[0]).to.have.property('ortb2Imp');
540
- expect(bidRequest.adUnits[0].ortb2Imp.ext.data.placement).to.equal(gpid);
540
+ expect(bidRequest.adUnits[0].ortb2Imp.ext.data.adg_rtd.placement).to.equal('div-gpt-ad-1460505748561-0');
541
541
  });
542
542
 
543
- it('update the placement value the legacy adUnit[].bids adagio.params.placement value', function() {
544
- const placement = 'placement-value';
545
-
543
+ it('fallback on the the gpid value to set the adg_rtd.placement value ', function() {
546
544
  const configCopy = utils.deepClone(config);
545
+ configCopy.params.placementSource = PLACEMENT_SOURCES.GPID;
547
546
 
548
547
  const bidRequest = utils.deepClone(bidReqConfig);
549
- bidRequest.adUnits[0].bids[0].params.placement = placement;
548
+ const gpid = '/19968336/header-bid-tag-0'
549
+ utils.deepSetValue(bidRequest.adUnits[0], 'ortb2Imp.ext.gpid', gpid)
550
550
 
551
551
  adagioRtdSubmodule.getBidRequestData(bidRequest, cb, configCopy);
552
552
  expect(bidRequest.adUnits[0]).to.have.property('ortb2Imp');
553
- expect(bidRequest.adUnits[0].ortb2Imp.ext.data.placement).to.equal(placement);
553
+ expect(bidRequest.adUnits[0].ortb2Imp.ext.data.adg_rtd.placement).to.equal(gpid);
554
554
  });
555
555
 
556
- it('it does not populate `ortb2Imp.ext.data.placement` if no fallback', function() {
556
+ it('it does not populate `ortb2Imp.ext.data.adg_rtd.placement` if no fallback', function() {
557
557
  const configCopy = utils.deepClone(config);
558
558
  const bidRequest = utils.deepClone(bidReqConfig);
559
559
 
560
560
  adagioRtdSubmodule.getBidRequestData(bidRequest, cb, configCopy);
561
561
  expect(bidRequest.adUnits[0]).to.have.property('ortb2Imp');
562
- expect(bidRequest.adUnits[0].ortb2Imp.ext.data.placement).to.not.exist;
562
+ expect(bidRequest.adUnits[0].ortb2Imp.ext.data.adg_rtd.placement).to.not.exist;
563
563
  });
564
564
 
565
565
  it('ensure we create the `ortb2Imp` object if it does not exist', function() {
@@ -571,7 +571,7 @@ describe('Adagio Rtd Provider', function () {
571
571
 
572
572
  adagioRtdSubmodule.getBidRequestData(bidRequest, cb, configCopy);
573
573
  expect(bidRequest.adUnits[0]).to.have.property('ortb2Imp');
574
- expect(bidRequest.adUnits[0].ortb2Imp.ext.data.placement).to.equal('div-gpt-ad-1460505748561-0');
574
+ expect(bidRequest.adUnits[0].ortb2Imp.ext.data.adg_rtd.placement).to.equal('div-gpt-ad-1460505748561-0');
575
575
  });
576
576
  });
577
577
  });