prebid.js 8.1.0 → 8.3.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 (214) hide show
  1. package/.devcontainer/devcontainer.json +3 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admanBidAdapter.js +1 -1
  8. package/dist/adqueryBidAdapter.js +1 -1
  9. package/dist/adrelevantisBidAdapter.js +1 -1
  10. package/dist/adtelligentBidAdapter.js +1 -1
  11. package/dist/adtrgtmeBidAdapter.js +1 -1
  12. package/dist/adxcgBidAdapter.js +1 -1
  13. package/dist/adyoulikeBidAdapter.js +1 -1
  14. package/dist/ajaBidAdapter.js +1 -1
  15. package/dist/amxBidAdapter.js +1 -1
  16. package/dist/amxIdSystem.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/beopBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bridBidAdapter.js +1 -0
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/carodaBidAdapter.js +1 -1
  28. package/dist/categoryTranslation.js +1 -1
  29. package/dist/chtnwBidAdapter.js +1 -1
  30. package/dist/cmp.js +1 -0
  31. package/dist/concertBidAdapter.js +1 -1
  32. package/dist/connectadBidAdapter.js +1 -1
  33. package/dist/consentManagement.js +1 -1
  34. package/dist/consentManagementGpp.js +1 -1
  35. package/dist/consentManagementUsp.js +1 -1
  36. package/dist/consumableBidAdapter.js +1 -1
  37. package/dist/conversantAnalyticsAdapter.js +1 -1
  38. package/dist/conversantBidAdapter.js +1 -1
  39. package/dist/craftBidAdapter.js +1 -1
  40. package/dist/criteoBidAdapter.js +1 -1
  41. package/dist/cwireBidAdapter.js +1 -1
  42. package/dist/dependencies.json +15 -0
  43. package/dist/discoveryBidAdapter.js +1 -1
  44. package/dist/dspxBidAdapter.js +1 -1
  45. package/dist/eplanningBidAdapter.js +1 -1
  46. package/dist/euidIdSystem.js +1 -1
  47. package/dist/feedadBidAdapter.js +1 -1
  48. package/dist/finativeBidAdapter.js +1 -1
  49. package/dist/freewheel-sspBidAdapter.js +1 -1
  50. package/dist/gmosspBidAdapter.js +1 -1
  51. package/dist/goldbachBidAdapter.js +1 -1
  52. package/dist/gppControl_usnat.js +1 -0
  53. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  54. package/dist/greenbidsRtdProvider.js +1 -1
  55. package/dist/gridBidAdapter.js +1 -1
  56. package/dist/gumgumBidAdapter.js +1 -1
  57. package/dist/h12mediaBidAdapter.js +1 -1
  58. package/dist/holidBidAdapter.js +1 -1
  59. package/dist/hypelabBidAdapter.js +1 -1
  60. package/dist/id5IdSystem.js +1 -1
  61. package/dist/imdsBidAdapter.js +1 -1
  62. package/dist/improvedigitalBidAdapter.js +1 -1
  63. package/dist/insticatorBidAdapter.js +1 -1
  64. package/dist/intentIqIdSystem.js +1 -1
  65. package/dist/ixBidAdapter.js +1 -1
  66. package/dist/justpremiumBidAdapter.js +1 -1
  67. package/dist/kargoBidAdapter.js +1 -1
  68. package/dist/konduitAnalyticsAdapter.js +1 -1
  69. package/dist/kueezBidAdapter.js +1 -1
  70. package/dist/kueezRtbBidAdapter.js +1 -1
  71. package/dist/kulturemediaBidAdapter.js +1 -1
  72. package/dist/lassoBidAdapter.js +1 -1
  73. package/dist/lifestreetBidAdapter.js +1 -1
  74. package/dist/liveIntentIdSystem.js +1 -1
  75. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  76. package/dist/logicadBidAdapter.js +1 -1
  77. package/dist/loglyliftBidAdapter.js +1 -1
  78. package/dist/magniteAnalyticsAdapter.js +1 -1
  79. package/dist/malltvAnalyticsAdapter.js +1 -1
  80. package/dist/marsmediaBidAdapter.js +1 -1
  81. package/dist/mediafuseBidAdapter.js +1 -1
  82. package/dist/mediagoBidAdapter.js +1 -1
  83. package/dist/mediasquareBidAdapter.js +1 -1
  84. package/dist/mgidBidAdapter.js +1 -1
  85. package/dist/minutemediaBidAdapter.js +1 -1
  86. package/dist/minutemediaplusBidAdapter.js +1 -1
  87. package/dist/mspa.js +1 -0
  88. package/dist/nexx360BidAdapter.js +1 -1
  89. package/dist/not-for-prod/prebid.js +144 -140
  90. package/dist/oguryBidAdapter.js +1 -1
  91. package/dist/onetagBidAdapter.js +1 -1
  92. package/dist/ooloAnalyticsAdapter.js +1 -1
  93. package/dist/optidigitalBidAdapter.js +1 -1
  94. package/dist/outbrainBidAdapter.js +1 -1
  95. package/dist/oxxionRtdProvider.js +1 -1
  96. package/dist/parrableIdSystem.js +1 -1
  97. package/dist/pixfutureBidAdapter.js +1 -1
  98. package/dist/prebid-core.js +1 -1
  99. package/dist/publinkIdSystem.js +1 -1
  100. package/dist/pubmaticBidAdapter.js +1 -1
  101. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  102. package/dist/pxyzBidAdapter.js +1 -1
  103. package/dist/quantcastBidAdapter.js +1 -1
  104. package/dist/readpeakBidAdapter.js +1 -1
  105. package/dist/relaidoBidAdapter.js +1 -1
  106. package/dist/retailspotBidAdapter.js +1 -1
  107. package/dist/rhythmoneBidAdapter.js +1 -1
  108. package/dist/riseBidAdapter.js +1 -1
  109. package/dist/rubiconBidAdapter.js +1 -1
  110. package/dist/seedingAllianceBidAdapter.js +1 -1
  111. package/dist/seedtagBidAdapter.js +1 -1
  112. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  113. package/dist/sharethroughBidAdapter.js +1 -1
  114. package/dist/shinezBidAdapter.js +1 -1
  115. package/dist/smaatoBidAdapter.js +1 -1
  116. package/dist/smartadserverBidAdapter.js +1 -1
  117. package/dist/smartxBidAdapter.js +1 -1
  118. package/dist/smartyadsBidAdapter.js +1 -1
  119. package/dist/smilewantedBidAdapter.js +1 -1
  120. package/dist/sonobiBidAdapter.js +1 -1
  121. package/dist/sovrnAnalyticsAdapter.js +1 -1
  122. package/dist/sovrnBidAdapter.js +1 -1
  123. package/dist/sspBCBidAdapter.js +1 -1
  124. package/dist/stvBidAdapter.js +1 -1
  125. package/dist/sublimeBidAdapter.js +1 -1
  126. package/dist/targetVideoBidAdapter.js +1 -1
  127. package/dist/teadsBidAdapter.js +1 -1
  128. package/dist/trafficgateBidAdapter.js +1 -1
  129. package/dist/trionBidAdapter.js +1 -1
  130. package/dist/tripleliftBidAdapter.js +1 -1
  131. package/dist/ttdBidAdapter.js +1 -1
  132. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  133. package/dist/uid2IdSystem.js +1 -1
  134. package/dist/underdogmediaBidAdapter.js +1 -1
  135. package/dist/undertoneBidAdapter.js +1 -1
  136. package/dist/userId.js +1 -1
  137. package/dist/vidazooBidAdapter.js +1 -1
  138. package/dist/videobyteBidAdapter.js +1 -1
  139. package/dist/visxBidAdapter.js +1 -1
  140. package/dist/vuukleBidAdapter.js +1 -1
  141. package/dist/widespaceBidAdapter.js +1 -1
  142. package/dist/winrBidAdapter.js +1 -1
  143. package/dist/yahoosspBidAdapter.js +1 -1
  144. package/dist/yieldmoBidAdapter.js +1 -1
  145. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  146. package/libraries/cmp/cmpClient.js +139 -0
  147. package/libraries/mspa/activityControls.js +91 -0
  148. package/modules/adagioBidAdapter.js +2 -1
  149. package/modules/admanBidAdapter.js +5 -0
  150. package/modules/adtelligentBidAdapter.js +8 -0
  151. package/modules/beopBidAdapter.js +6 -6
  152. package/modules/beopBidAdapter.md +35 -1
  153. package/modules/bridBidAdapter.js +223 -0
  154. package/modules/cadentApertureMXBidAdapter.md +2 -2
  155. package/modules/categoryTranslation.js +3 -2
  156. package/modules/consentManagement.js +12 -86
  157. package/modules/consentManagementGpp.js +47 -126
  158. package/modules/consentManagementUsp.js +19 -97
  159. package/modules/discoveryBidAdapter.js +1 -1
  160. package/modules/gppControl_usnat.js +11 -0
  161. package/modules/holidBidAdapter.js +49 -30
  162. package/modules/intentIqIdSystem.js +6 -5
  163. package/modules/ixBidAdapter.js +2 -1
  164. package/modules/liveIntentIdSystem.js +8 -3
  165. package/modules/livewrappedAnalyticsAdapter.js +33 -33
  166. package/modules/mediagoBidAdapter.js +1 -0
  167. package/modules/mediasquareBidAdapter.js +19 -23
  168. package/modules/oxxionRtdProvider.js +124 -11
  169. package/modules/oxxionRtdProvider.md +19 -4
  170. package/modules/smartyadsBidAdapter.js +6 -3
  171. package/modules/sovrnBidAdapter.js +5 -0
  172. package/modules/trafficgateBidAdapter.js +126 -72
  173. package/modules/tripleliftBidAdapter.js +21 -1
  174. package/modules/userId/eids.js +29 -0
  175. package/modules/userId/eids.md +19 -2
  176. package/modules/userId/index.js +78 -29
  177. package/modules/userId/userId.md +3 -0
  178. package/modules/vidazooBidAdapter.js +68 -16
  179. package/package.json +1 -1
  180. package/src/activities/params.js +4 -1
  181. package/test/spec/libraries/cmp/cmpClient_spec.js +233 -0
  182. package/test/spec/libraries/mspa/activityControls_spec.js +315 -0
  183. package/test/spec/modules/adagioBidAdapter_spec.js +2 -1
  184. package/test/spec/modules/admanBidAdapter_spec.js +8 -2
  185. package/test/spec/modules/adqueryBidAdapter_spec.js +5 -1
  186. package/test/spec/modules/adtelligentBidAdapter_spec.js +8 -0
  187. package/test/spec/modules/beopBidAdapter_spec.js +18 -2
  188. package/test/spec/modules/bridBidAdapter_spec.js +129 -0
  189. package/test/spec/modules/byDataAnalyticsAdapter_spec.js +9 -7
  190. package/test/spec/modules/cadentApertureMXBidAdapter_spec.js +1 -1
  191. package/test/spec/modules/chtnwBidAdapter_spec.js +4 -1
  192. package/test/spec/modules/consentManagementGpp_spec.js +84 -7
  193. package/test/spec/modules/consentManagement_spec.js +8 -18
  194. package/test/spec/modules/datablocksBidAdapter_spec.js +7 -3
  195. package/test/spec/modules/eids_spec.js +87 -0
  196. package/test/spec/modules/holidBidAdapter_spec.js +26 -6
  197. package/test/spec/modules/insticatorBidAdapter_spec.js +6 -2
  198. package/test/spec/modules/intentIqIdSystem_spec.js +36 -2
  199. package/test/spec/modules/ixBidAdapter_spec.js +52 -18
  200. package/test/spec/modules/lassoBidAdapter_spec.js +6 -4
  201. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +17 -2
  202. package/test/spec/modules/liveIntentIdSystem_spec.js +11 -6
  203. package/test/spec/modules/mediasquareBidAdapter_spec.js +3 -0
  204. package/test/spec/modules/onetagBidAdapter_spec.js +81 -75
  205. package/test/spec/modules/orbidderBidAdapter_spec.js +6 -3
  206. package/test/spec/modules/oxxionRtdProvider_spec.js +113 -1
  207. package/test/spec/modules/relaidoBidAdapter_spec.js +4 -3
  208. package/test/spec/modules/smartyadsBidAdapter_spec.js +1 -1
  209. package/test/spec/modules/sovrnBidAdapter_spec.js +34 -0
  210. package/test/spec/modules/trafficgateBidAdapter_spec.js +1349 -199
  211. package/test/spec/modules/tripleliftBidAdapter_spec.js +20 -1
  212. package/test/spec/modules/ucfunnelBidAdapter_spec.js +37 -16
  213. package/test/spec/modules/userId_spec.js +393 -6
  214. package/test/spec/modules/vidazooBidAdapter_spec.js +131 -0
@@ -0,0 +1,315 @@
1
+ import {mspaRule, setupRules, isTransmitUfpdConsentDenied, isTransmitGeoConsentDenied, isBasicConsentDenied, isSensitiveNoticeMissing, isConsentDenied} from '../../../../libraries/mspa/activityControls.js';
2
+ import {ruleRegistry} from '../../../../src/activities/rules.js';
3
+ describe('isBasicConsentDenied', () => {
4
+ const cd = {
5
+ // not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
6
+ Gpc: 0,
7
+ KnownChildSensitiveDataConsents: [0, 0],
8
+ MspaCoveredTransaction: 2,
9
+ MspaOptOutOptionMode: 0,
10
+ MspaServiceProviderMode: 0,
11
+ PersonalDataConsents: 0,
12
+ SaleOptOut: 2,
13
+ SaleOptOutNotice: 1,
14
+ SensitiveDataLimitUseNotice: 1,
15
+ SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
16
+ SensitiveDataProcessingOptOutNotice: 1,
17
+ SharingNotice: 1,
18
+ SharingOptOut: 2,
19
+ SharingOptOutNotice: 1,
20
+ TargetedAdvertisingOptOut: 2,
21
+ TargetedAdvertisingOptOutNotice: 1,
22
+ Version: 1
23
+ };
24
+ it('should be false (basic consent conditions pass) with variety of notice and opt in', () => {
25
+ const result = isBasicConsentDenied(cd);
26
+ expect(result).to.equal(false);
27
+ });
28
+ it('should be true (basic consent conditions do not pass) with personal data consent set to true (invalid state)', () => {
29
+ cd.PersonalDataConsents = 2;
30
+ const result = isBasicConsentDenied(cd);
31
+ expect(result).to.equal(true);
32
+ cd.PersonalDataConsents = 0;
33
+ });
34
+ it('should be true (basic consent conditions do not pass) with sensitive opt in but no notice', () => {
35
+ cd.SensitiveDataLimitUseNotice = 0;
36
+ const result = isBasicConsentDenied(cd);
37
+ expect(result).to.equal(true);
38
+ cd.SensitiveDataLimitUseNotice = 1;
39
+ });
40
+ })
41
+ describe('isSensitiveNoticeMissing', () => {
42
+ const cd = {
43
+ // not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
44
+ Gpc: 0,
45
+ KnownChildSensitiveDataConsents: [0, 0],
46
+ MspaCoveredTransaction: 2,
47
+ MspaOptOutOptionMode: 0,
48
+ MspaServiceProviderMode: 0,
49
+ PersonalDataConsents: 0,
50
+ SaleOptOut: 2,
51
+ SaleOptOutNotice: 1,
52
+ SensitiveDataLimitUseNotice: 1,
53
+ SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
54
+ SensitiveDataProcessingOptOutNotice: 1,
55
+ SharingNotice: 1,
56
+ SharingOptOut: 2,
57
+ SharingOptOutNotice: 1,
58
+ TargetedAdvertisingOptOut: 2,
59
+ TargetedAdvertisingOptOutNotice: 1,
60
+ Version: 1
61
+ };
62
+ it('should be false (sensitive notice is given or not needed) with variety of notice and opt in', () => {
63
+ const result = isSensitiveNoticeMissing(cd);
64
+ expect(result).to.equal(false);
65
+ });
66
+ it('should be true (sensitive notice is missing) with variety of notice and opt in', () => {
67
+ cd.SensitiveDataLimitUseNotice = 2;
68
+ const result = isSensitiveNoticeMissing(cd);
69
+ expect(result).to.equal(true);
70
+ cd.SensitiveDataLimitUseNotice = 1;
71
+ });
72
+ })
73
+ describe('isConsentDenied', () => {
74
+ const cd = {
75
+ // not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
76
+ Gpc: 0,
77
+ KnownChildSensitiveDataConsents: [0, 0],
78
+ MspaCoveredTransaction: 2,
79
+ MspaOptOutOptionMode: 0,
80
+ MspaServiceProviderMode: 0,
81
+ PersonalDataConsents: 0,
82
+ SaleOptOut: 2,
83
+ SaleOptOutNotice: 1,
84
+ SensitiveDataLimitUseNotice: 1,
85
+ SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
86
+ SensitiveDataProcessingOptOutNotice: 1,
87
+ SharingNotice: 1,
88
+ SharingOptOut: 2,
89
+ SharingOptOutNotice: 1,
90
+ TargetedAdvertisingOptOut: 2,
91
+ TargetedAdvertisingOptOutNotice: 1,
92
+ Version: 1
93
+ };
94
+ it('should be false (consent given personalized ads / sale / share) with variety of notice and opt in', () => {
95
+ const result = isConsentDenied(cd);
96
+ expect(result).to.equal(false);
97
+ });
98
+ it('should be true (no consent) on opt out of targeted ads via TargetedAdvertisingOptOut', () => {
99
+ cd.TargetedAdvertisingOptOut = 1;
100
+ const result = isConsentDenied(cd);
101
+ expect(result).to.equal(true);
102
+ cd.TargetedAdvertisingOptOut = 2;
103
+ });
104
+ it('should be true (no consent) on opt out of targeted ads via no TargetedAdvertisingOptOutNotice', () => {
105
+ cd.TargetedAdvertisingOptOutNotice = 2;
106
+ const result = isConsentDenied(cd);
107
+ expect(result).to.equal(true);
108
+ cd.TargetedAdvertisingOptOutNotice = 1;
109
+ });
110
+ it('should be true (no consent) if TargetedAdvertisingOptOutNotice is 0 and TargetedAdvertisingOptOut is 2', () => {
111
+ cd.TargetedAdvertisingOptOutNotice = 0;
112
+ const result = isConsentDenied(cd);
113
+ expect(result).to.equal(true);
114
+ cd.TargetedAdvertisingOptOutNotice = 1;
115
+ });
116
+ })
117
+ describe('isTransmitUfpdConsentDenied', () => {
118
+ const cd = {
119
+ // not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
120
+ Gpc: 0,
121
+ KnownChildSensitiveDataConsents: [0, 0],
122
+ MspaCoveredTransaction: 2,
123
+ MspaOptOutOptionMode: 0,
124
+ MspaServiceProviderMode: 0,
125
+ PersonalDataConsents: 0,
126
+ SaleOptOut: 2,
127
+ SaleOptOutNotice: 1,
128
+ SensitiveDataLimitUseNotice: 1,
129
+ SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
130
+ SensitiveDataProcessingOptOutNotice: 1,
131
+ SharingNotice: 1,
132
+ SharingOptOut: 2,
133
+ SharingOptOutNotice: 1,
134
+ TargetedAdvertisingOptOut: 2,
135
+ TargetedAdvertisingOptOutNotice: 1,
136
+ Version: 1
137
+ };
138
+ it('should be false (consent given to add ufpd) with variety of notice and opt in', () => {
139
+ const result = isTransmitUfpdConsentDenied(cd);
140
+ expect(result).to.equal(false);
141
+ });
142
+ it('should be true (consent denied to add ufpd) if no consent to process health information', () => {
143
+ cd.SensitiveDataProcessing[2] = 1;
144
+ const result = isTransmitUfpdConsentDenied(cd);
145
+ expect(result).to.equal(true);
146
+ cd.SensitiveDataProcessing[2] = 0;
147
+ });
148
+ it('should be true (consent denied to add ufpd) with consent to process biometric data, as this should not be on openrtb', () => {
149
+ cd.SensitiveDataProcessing[6] = 1;
150
+ const result = isTransmitUfpdConsentDenied(cd);
151
+ expect(result).to.equal(true);
152
+ cd.SensitiveDataProcessing[6] = 1;
153
+ });
154
+ it('should be true (consent denied to add ufpd) without sharing notice', () => {
155
+ cd.SharingNotice = 2;
156
+ const result = isTransmitUfpdConsentDenied(cd);
157
+ expect(result).to.equal(true);
158
+ cd.SharingNotice = 1;
159
+ });
160
+ it('should be true (consent denied to add ufpd) with sale opt out', () => {
161
+ cd.SaleOptOut = 1;
162
+ const result = isTransmitUfpdConsentDenied(cd);
163
+ expect(result).to.equal(true);
164
+ cd.SaleOptOut = 2;
165
+ });
166
+ it('should be true (consent denied to add ufpd) without targeted ads opt out', () => {
167
+ cd.TargetedAdvertisingOptOut = 1;
168
+ const result = isTransmitUfpdConsentDenied(cd);
169
+ expect(result).to.equal(true);
170
+ cd.TargetedAdvertisingOptOut = 2;
171
+ });
172
+ it('should be true (consent denied to add ufpd) with missing sensitive data limit notice', () => {
173
+ cd.SensitiveDataLimitUseNotice = 2;
174
+ const result = isTransmitUfpdConsentDenied(cd);
175
+ expect(result).to.equal(true);
176
+ cd.SensitiveDataLimitUseNotice = 1;
177
+ });
178
+ })
179
+
180
+ describe('isTransmitGeoConsentDenied', () => {
181
+ const cd = {
182
+ // not covered, opt out of geo
183
+ Gpc: 0,
184
+ KnownChildSensitiveDataConsents: [0, 0],
185
+ MspaCoveredTransaction: 2,
186
+ MspaOptOutOptionMode: 0,
187
+ MspaServiceProviderMode: 0,
188
+ PersonalDataConsents: 0,
189
+ SaleOptOut: 2,
190
+ SaleOptOutNotice: 1,
191
+ SensitiveDataLimitUseNotice: 1,
192
+ SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
193
+ SensitiveDataProcessingOptOutNotice: 1,
194
+ SharingNotice: 1,
195
+ SharingOptOut: 2,
196
+ SharingOptOutNotice: 1,
197
+ TargetedAdvertisingOptOut: 2,
198
+ TargetedAdvertisingOptOutNotice: 1,
199
+ Version: 1
200
+ };
201
+ it('should be true (consent denied to add precise geo) -- sensitive flag denied', () => {
202
+ const result = isTransmitGeoConsentDenied(cd);
203
+ expect(result).to.equal(true);
204
+ });
205
+ it('should be true (consent denied to add precise geo) -- sensitive data limit usage not given', () => {
206
+ cd.SensitiveDataLimitUseNotice = 0;
207
+ const result = isTransmitGeoConsentDenied(cd);
208
+ expect(result).to.equal(true);
209
+ cd.SensitiveDataLimitUseNotice = 1;
210
+ });
211
+ it('should be false (consent given to add precise geo) -- sensitive position 8 (index 7) is true', () => {
212
+ cd.SensitiveDataProcessing[7] = 2;
213
+ const result = isTransmitGeoConsentDenied(cd);
214
+ expect(result).to.equal(false);
215
+ cd.SensitiveDataProcessing[7] = 1;
216
+ });
217
+ })
218
+
219
+ describe('mspaRule', () => {
220
+ it('does not apply if SID is not applicable', () => {
221
+ const rule = mspaRule([1, 2], () => null, () => true, () => [3, 4]);
222
+ expect(rule()).to.not.exist;
223
+ });
224
+
225
+ it('does not apply when no SID is applicable', () => {
226
+ const rule = mspaRule([1], () => null, () => true, () => []);
227
+ expect(rule()).to.not.exist;
228
+ });
229
+
230
+ describe('when SID is applicable', () => {
231
+ let consent, denies;
232
+ function mkRule() {
233
+ return mspaRule([1, 2], () => consent, denies, () => [2])
234
+ }
235
+
236
+ beforeEach(() => {
237
+ consent = null;
238
+ denies = sinon.stub();
239
+ });
240
+
241
+ it('should deny when no consent is available', () => {
242
+ expect(mkRule()().allow).to.equal(false);
243
+ });
244
+
245
+ Object.entries({
246
+ 'denies': true,
247
+ 'allows': false
248
+ }).forEach(([t, denied]) => {
249
+ it(`should check if deny fn ${t}`, () => {
250
+ denies.returns(denied);
251
+ consent = {mock: 'value'};
252
+ const result = mkRule()();
253
+ sinon.assert.calledWith(denies, consent);
254
+ if (denied) {
255
+ expect(result.allow).to.equal(false);
256
+ } else {
257
+ expect(result).to.not.exist;
258
+ }
259
+ })
260
+ })
261
+ })
262
+ });
263
+
264
+ describe('setupRules', () => {
265
+ let rules, registerRule, isAllowed, consent;
266
+ beforeEach(() => {
267
+ rules = {
268
+ mockActivity: sinon.stub().returns(true)
269
+ };
270
+ ([registerRule, isAllowed] = ruleRegistry());
271
+ consent = {
272
+ applicableSections: [1],
273
+ sectionData: {
274
+ mockApi: {
275
+ mock: 'consent'
276
+ }
277
+ }
278
+ };
279
+ });
280
+
281
+ function runSetup(api, sids, normalize) {
282
+ return setupRules(api, sids, normalize, rules, registerRule, () => consent)
283
+ }
284
+
285
+ it('should use section data for the given api', () => {
286
+ runSetup('mockApi', [1]);
287
+ expect(isAllowed('mockActivity', {})).to.equal(false);
288
+ sinon.assert.calledWith(rules.mockActivity, {mock: 'consent'})
289
+ });
290
+
291
+ it('should not choke when no consent data is available', () => {
292
+ consent = null;
293
+ runSetup('mockApi', [1]);
294
+ expect(isAllowed('mockActivity', {})).to.equal(true);
295
+ });
296
+
297
+ it('should check applicableSections against given SIDs', () => {
298
+ runSetup('mockApi', [2]);
299
+ expect(isAllowed('mockActivity', {})).to.equal(true);
300
+ });
301
+
302
+ it('should pass consent through normalizeConsent', () => {
303
+ const normalize = sinon.stub().returns({normalized: 'consent'})
304
+ runSetup('mockApi', [1], normalize);
305
+ expect(isAllowed('mockActivity', {})).to.equal(false);
306
+ sinon.assert.calledWith(normalize, {mock: 'consent'});
307
+ sinon.assert.calledWith(rules.mockActivity, {normalized: 'consent'});
308
+ });
309
+
310
+ it('should return a function that unregisters activity controls', () => {
311
+ const dereg = runSetup('mockApi', [1]);
312
+ dereg();
313
+ expect(isAllowed('mockActivity', {})).to.equal(true);
314
+ });
315
+ })
@@ -269,7 +269,8 @@ describe('Adagio bid adapter', () => {
269
269
  'prebidVersion',
270
270
  'featuresVersion',
271
271
  'data',
272
- 'usIfr'
272
+ 'usIfr',
273
+ 'adgjs',
273
274
  ];
274
275
 
275
276
  it('groups requests by organizationId', function() {
@@ -106,8 +106,11 @@ describe('AdmanAdapter', function () {
106
106
  let placements = data['placements'];
107
107
  for (let i = 0; i < placements.length; i++) {
108
108
  let placement = placements[i];
109
- expect(placement).to.have.all.keys('placementId', 'eids', 'bidId', 'traffic', 'sizes', 'schain', 'bidFloor');
109
+ expect(placement).to.have.all.keys('placementId', 'eids', 'bidId', 'traffic', 'sizes', 'schain', 'bidFloor', 'ext');
110
110
  expect(placement.schain).to.be.an('object')
111
+ expect(placement.ext).to.be.an('object')
112
+ expect(placement.ext).to.have.key('tid')
113
+ expect(placement.ext.tid).to.equal(bidBanner.transactionId);
111
114
  expect(placement.placementId).to.be.a('number');
112
115
  expect(placement.bidId).to.be.a('string');
113
116
  expect(placement.traffic).to.be.a('string');
@@ -132,7 +135,10 @@ describe('AdmanAdapter', function () {
132
135
  let placement = placements[i];
133
136
  expect(placement).to.have.all.keys('placementId', 'eids', 'bidId', 'traffic', 'schain', 'bidFloor',
134
137
  'playerSize', 'minduration', 'maxduration', 'mimes', 'protocols', 'startdelay', 'placement', 'skip',
135
- 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity');
138
+ 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity', 'ext');
139
+ expect(placement.ext).to.be.an('object')
140
+ expect(placement.ext).to.have.key('tid')
141
+ expect(placement.ext.tid).to.equal(bidBanner.transactionId);
136
142
  expect(placement.schain).to.be.an('object')
137
143
  expect(placement.placementId).to.be.a('number');
138
144
  expect(placement.bidId).to.be.a('string');
@@ -80,7 +80,11 @@ describe('adqueryBidAdapter', function () {
80
80
  })
81
81
 
82
82
  describe('buildRequests', function () {
83
- let req = spec.buildRequests([ bidRequest ], { refererInfo: { } })[0]
83
+ let req;
84
+ beforeEach(() => {
85
+ req = spec.buildRequests([ bidRequest ], { refererInfo: { } })[0]
86
+ })
87
+
84
88
  let rdata
85
89
 
86
90
  it('should return request object', function () {
@@ -156,6 +156,10 @@ const displayBidderRequestWithConsents = {
156
156
  gdprApplies: true,
157
157
  consentString: 'test'
158
158
  },
159
+ gppConsent: {
160
+ gppString: 'abc12345234',
161
+ applicableSections: [7, 8]
162
+ },
159
163
  uspConsent: 'iHaveIt'
160
164
  };
161
165
 
@@ -364,6 +368,10 @@ describe('adtelligentBidAdapter', () => {
364
368
  expect(bidRequestWithPubSettingsData.GDPR).to.be.equal(1);
365
369
  expect(bidRequestWithPubSettingsData.GDPRConsent).to.be.equal(displayBidderRequestWithConsents.gdprConsent.consentString);
366
370
  });
371
+ it('sets GPP flags', () => {
372
+ expect(bidRequestWithPubSettingsData.GPP).to.be.equal(displayBidderRequestWithConsents.gppConsent.gppString);
373
+ expect(bidRequestWithPubSettingsData.GPPSid).to.be.equal('7,8');
374
+ });
367
375
  it('sets USP', () => {
368
376
  expect(bidRequestWithPubSettingsData.USP).to.be.equal(displayBidderRequestWithConsents.uspConsent);
369
377
  })
@@ -130,15 +130,15 @@ describe('BeOp Bid Adapter tests', () => {
130
130
  expect(payload.url).to.exist;
131
131
  // check that the protocol is added correctly
132
132
  expect(payload.url).to.equal('http://test.te');
133
- expect(payload.psegs).to.not.exist;
134
133
  });
135
134
 
136
- it('should call the endpoint with psegs data if any', function () {
135
+ it('should call the endpoint with psegs and bpsegs (stringified) data if any or [] if none', function () {
137
136
  let bidderRequest =
138
137
  {
139
138
  'ortb2': {
140
139
  'user': {
141
140
  'ext': {
141
+ 'bpsegs': ['axed', 'axec', 1234],
142
142
  'data': {
143
143
  'permutive': [1234, 5678, 910]
144
144
  }
@@ -154,6 +154,22 @@ describe('BeOp Bid Adapter tests', () => {
154
154
  expect(payload.psegs).to.include(5678);
155
155
  expect(payload.psegs).to.include(910);
156
156
  expect(payload.psegs).to.not.include(1);
157
+ expect(payload.bpsegs).to.exist;
158
+ expect(payload.bpsegs).to.include('axed');
159
+ expect(payload.bpsegs).to.include('axec');
160
+ expect(payload.bpsegs).to.include('1234');
161
+
162
+ let bidderRequest2 =
163
+ {
164
+ 'ortb2': {}
165
+ };
166
+
167
+ const request2 = spec.buildRequests(bidRequests, bidderRequest2);
168
+ const payload2 = JSON.parse(request2.data);
169
+ expect(payload2.psegs).to.exist;
170
+ expect(payload2.psegs).to.be.empty;
171
+ expect(payload2.bpsegs).to.exist;
172
+ expect(payload2.bpsegs).to.be.empty;
157
173
  });
158
174
 
159
175
  it('should not prepend the protocol in page url if already present', function () {
@@ -0,0 +1,129 @@
1
+ import { spec } from '../../../modules/bridBidAdapter.js'
2
+
3
+ describe('Brid Bid Adapter', function() {
4
+ const videoRequest = [{
5
+ bidder: 'brid',
6
+ params: {
7
+ placementId: 12345,
8
+ },
9
+ mediaTypes: {
10
+ video: {
11
+ playerSize: [[640, 360]],
12
+ context: 'instream',
13
+ playbackmethod: [1, 2, 3, 4]
14
+ }
15
+ }
16
+ }];
17
+
18
+ it('Test the bid validation function', function() {
19
+ const validBid = spec.isBidRequestValid(videoRequest[0]);
20
+ const invalidBid = spec.isBidRequestValid(null);
21
+
22
+ expect(validBid).to.be.true;
23
+ expect(invalidBid).to.be.false;
24
+ });
25
+
26
+ it('Test the request processing function', function () {
27
+ const request = spec.buildRequests(videoRequest, videoRequest[0]);
28
+ expect(request).to.not.be.empty;
29
+
30
+ const payload = JSON.parse(request[0].data);
31
+ expect(payload).to.not.be.empty;
32
+ expect(payload.sdk).to.deep.equal({
33
+ source: 'pbjs',
34
+ version: '$prebid.version$'
35
+ });
36
+ expect(payload.imp[0].ext.prebid.storedrequest.id).to.equal(12345);
37
+ });
38
+
39
+ it('Test nobid responses', function () {
40
+ const responseBody = {
41
+ 'id': 'test-id',
42
+ 'cur': 'USD',
43
+ 'seatbid': [],
44
+ 'nbr': 0
45
+ };
46
+ const bidderRequest = null;
47
+
48
+ const bidResponse = spec.interpretResponse({ body: responseBody }, {bidderRequest});
49
+
50
+ expect(bidResponse.length).to.equal(0);
51
+ });
52
+
53
+ it('Test the response parsing function', function () {
54
+ const responseBody = {
55
+ 'id': 'test-id',
56
+ 'cur': 'USD',
57
+ 'seatbid': [{
58
+ 'bid': [{
59
+ 'id': '5044997188309660254',
60
+ 'price': 5,
61
+ 'adm': 'test ad',
62
+ 'adid': '97517771',
63
+ 'crid': '97517771',
64
+ 'adomain': ['domain.com'],
65
+ 'w': 640,
66
+ 'h': 480
67
+ }],
68
+ 'seat': 'bidder'
69
+ }]
70
+ };
71
+ const bidderRequest = {
72
+ bidderCode: 'brid',
73
+ bidderRequestId: '22edbae2733bf6',
74
+ bids: videoRequest
75
+ };
76
+
77
+ const bidResponse = spec.interpretResponse({ body: responseBody }, {bidderRequest});
78
+ expect(bidResponse).to.not.be.empty;
79
+
80
+ const bid = bidResponse[0];
81
+ expect(bid).to.not.be.empty;
82
+ expect(bid.ad).to.equal('test ad');
83
+ expect(bid.cpm).to.equal(5);
84
+ expect(bid.width).to.equal(640);
85
+ expect(bid.height).to.equal(480);
86
+ expect(bid.currency).to.equal('USD');
87
+ });
88
+
89
+ it('Test GDPR and USP consents are present in the request', function () {
90
+ let gdprConsentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
91
+ let uspConsentString = '1YA-';
92
+ let bidderRequest = {
93
+ 'bidderCode': 'brid',
94
+ 'bidderRequestId': '22edbae2733bf6',
95
+ 'timeout': 3000,
96
+ 'uspConsent': uspConsentString,
97
+ 'gdprConsent': {
98
+ consentString: gdprConsentString,
99
+ gdprApplies: true,
100
+ addtlConsent: '1~7.12.35.62.66.70.89.93.108'
101
+ }
102
+ };
103
+ bidderRequest.bids = videoRequest;
104
+
105
+ const request = spec.buildRequests(videoRequest, bidderRequest);
106
+ const payload = JSON.parse(request[0].data);
107
+
108
+ expect(payload.user.ext.consent).to.equal(gdprConsentString);
109
+ expect(payload.regs.ext.us_privacy).to.equal(uspConsentString);
110
+ expect(payload.regs.ext.gdpr).to.equal(1);
111
+ });
112
+
113
+ it('Test GDPR is not present', function () {
114
+ let uspConsentString = '1YA-';
115
+ let bidderRequest = {
116
+ 'bidderCode': 'brid',
117
+ 'bidderRequestId': '22edbae2733bf6',
118
+ 'timeout': 3000,
119
+ 'uspConsent': uspConsentString
120
+ };
121
+ bidderRequest.bids = videoRequest;
122
+
123
+ const request = spec.buildRequests(videoRequest, bidderRequest);
124
+ const payload = JSON.parse(request[0].data);
125
+
126
+ expect(payload.regs.ext.gdpr).to.be.undefined;
127
+ expect(payload.regs.ext.us_privacy).to.equal(uspConsentString);
128
+ });
129
+ });
@@ -96,7 +96,7 @@ let expectedDataArgs = {
96
96
  aus: '300x250',
97
97
  bidadv: 'appnexus',
98
98
  bid: '14480e9832f2d2b',
99
- inb: 0,
99
+ inb: 1,
100
100
  ito: 0,
101
101
  ipwb: 0,
102
102
  iwb: 0,
@@ -107,7 +107,7 @@ let expectedDataArgs = {
107
107
  aus: '250x250',
108
108
  bidadv: 'appnexus',
109
109
  bid: '14480e9832f2d2b',
110
- inb: 0,
110
+ inb: 1,
111
111
  ito: 0,
112
112
  ipwb: 0,
113
113
  iwb: 0,
@@ -167,11 +167,13 @@ describe('byData Analytics Adapter ', () => {
167
167
  });
168
168
 
169
169
  describe('track-events', function () {
170
- ascAdapter.enableAnalytics(initOptions)
171
- // Step 1: Initialize adapter
172
- adapterManager.enableAnalytics({
173
- provider: 'bydata',
174
- options: initOptions
170
+ before(() => {
171
+ ascAdapter.enableAnalytics(initOptions)
172
+ // Step 1: Initialize adapter
173
+ adapterManager.enableAnalytics({
174
+ provider: 'bydata',
175
+ options: initOptions
176
+ });
175
177
  });
176
178
  it('sends and formatted auction data ', function () {
177
179
  events.emit(constants.EVENTS.BID_TIMEOUT, bidTimeoutArgs);
@@ -699,7 +699,7 @@ describe('cadent_aperture_mx Adapter', function () {
699
699
 
700
700
  it('should not throw an error when decoding an improperly encoded adm', function () {
701
701
  const badAdmServerResponse = utils.deepClone(serverResponse);
702
- badAdmServerResponse.seatbid[0].bid[0].adm = '<script\\ src\\=\\\"https\\:\\/\\/nym1\\-ib\\.adnxs\\.com\\/ab\\?an_audit\\=0\\&referrer=https%3A%2F%2Fwww.emxdigital.com%3Ftest%3DhAiE3%VVl%26prebid%3D%25123%25\\&e\\=wqT_3QLPCfBDzwQAAAMA1gAFAQj2iaPtBRCdw\\-qeto72gkEYlNWN2smGoJhTKjYJzGJi83G9KkARzGJi83G9KkAZAAAAgD0KEkAhzGIJGwApESTIMQAAAGBmZu4_MMvWgAc4zApAzApIAlDo\\-YEUWNbsR2AAaIrFCnjOpQWAAQGKAQNVU0SSBQbwQJgB2AWgAVqoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKAjp1ZignYScsIDI4OTEwMSwgMTU3MTM0MTU1OCk7ARwscicsIDQxOTc1MDE2Nh4A9DQBkgLhAiE3VVlCWndpQmpwOEpFT2o1Z1JRWUFDRFc3RWN3QURnQVFBUkl6QXBReTlhQUIxZ0FZTHdFYUFCd0NuZ0FnQUZFaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFGS1I2cF9jYjBxUU1FQlNrZXFmM0c5S2tESkFaR1JfRy1UVnRNXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFJQUNBSWdDcVlMWEJaQUNBWmdDQUtBQ0FLZ0NBTFVDQUFBQUFMMENBQUFBQU9BQ0FPZ0NBUGdDQUlBREFaZ0RBYWdEZ1k2ZkNib0RDVTVaVFRJNk5ESTRNdUFEOHhQNEE0NnV2Z3lJQkFDUUJBQ1lCQUd5QkFvSXFZTFhCUkNPcnI0TXdRUUFBQUFBQUFBQUFNa0VBQUFBBXgMQURSQgkJLEF3Q0ZBMkFRQThRUQ0SYEFBQVBnRUFJZ0Z1aUUumgKJASE2eElrelE2ZQGgMXV4SElBUW9BREU5Q3RlamNMMHFRRG9KVGxsTk1qbzBNamd5UVBNVFMRWAxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYw0MAaXwi2VBQS7YAqwD4AK30UbqAlxodHRwczovL3d3dy5jZWxlYnV6ei5jb20vZy90YXlsb3Itc3dpZnQtZGVidXRzLXJlZC1oYWlyLWluLXN1Z2FybGFuZC12aWRlby8_YmlkZHJfZGVidWc9dHJ1ZfICEwoPQ1VTVE9NX01PREVMX0lEEgDyAhoKFkNVU1RPERY8TEVBRl9OQU1FEgDyAh4KGjYdAPQqAUFTVF9NT0RJRklFRBIAgAMAiAMBkAMAmAMUoAMBqgMAwAOsAsgDANgDlCHgAwDoAwD4AwOABACSBAkvb3BlbnJ0YjKYBACiBA8xNDQuMTIxLjIzMy4yMzeoBIkWsgQMCAAQABgAIAAwADgAuAQAwAQAyASxgoIB0gQOMTM1NiNOWU0yOjQyODLaBAIIAeAEAPAE6PmBFPoEEgkAAAAAZqdHQBEAAAAgWpRewIgFAZgFAKAF____________AaoFFjQ5MTgxNTcxMzQxNTU2NTI2OTQ5ZTHABQDJBQAAAAAAAPA_0gUJCQAAAAAAAAAA2AUB4AUB8AXW7gr6BQQIABAAkAYAmAYAuAYAwQYAAAAAAADwP8gGANAGwgTaBhYKEAAAAAAAAAAAAAAABQpQEAAYAOAGAfIGAggAgAcBiAcAoAcB\\&s\\=630dbbd55f593c7bfd9e7bccc4dbaa28203daaed\\&pp\\=\\$\\{EMX_MACRO\\}\\\"\\>\\<\\/script\\>';
702
+ badAdmServerResponse.seatbid[0].bid[0].adm = '<script\\ src\\=\\\"https\\:\\/\\/nym1\\-ib\\.adnxs\\.com\\/ab\\?an_audit\\=0\\&referrer=https%3A%2F%2Fwww.cadent.tv%3Ftest%3DhAiE3%VVl%26prebid%3D%25123%25\\&e\\=wqT_3QLPCfBDzwQAAAMA1gAFAQj2iaPtBRCdw\\-qeto72gkEYlNWN2smGoJhTKjYJzGJi83G9KkARzGJi83G9KkAZAAAAgD0KEkAhzGIJGwApESTIMQAAAGBmZu4_MMvWgAc4zApAzApIAlDo\\-YEUWNbsR2AAaIrFCnjOpQWAAQGKAQNVU0SSBQbwQJgB2AWgAVqoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKAjp1ZignYScsIDI4OTEwMSwgMTU3MTM0MTU1OCk7ARwscicsIDQxOTc1MDE2Nh4A9DQBkgLhAiE3VVlCWndpQmpwOEpFT2o1Z1JRWUFDRFc3RWN3QURnQVFBUkl6QXBReTlhQUIxZ0FZTHdFYUFCd0NuZ0FnQUZFaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFGS1I2cF9jYjBxUU1FQlNrZXFmM0c5S2tESkFaR1JfRy1UVnRNXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFJQUNBSWdDcVlMWEJaQUNBWmdDQUtBQ0FLZ0NBTFVDQUFBQUFMMENBQUFBQU9BQ0FPZ0NBUGdDQUlBREFaZ0RBYWdEZ1k2ZkNib0RDVTVaVFRJNk5ESTRNdUFEOHhQNEE0NnV2Z3lJQkFDUUJBQ1lCQUd5QkFvSXFZTFhCUkNPcnI0TXdRUUFBQUFBQUFBQUFNa0VBQUFBBXgMQURSQgkJLEF3Q0ZBMkFRQThRUQ0SYEFBQVBnRUFJZ0Z1aUUumgKJASE2eElrelE2ZQGgMXV4SElBUW9BREU5Q3RlamNMMHFRRG9KVGxsTk1qbzBNamd5UVBNVFMRWAxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYw0MAaXwi2VBQS7YAqwD4AK30UbqAlxodHRwczovL3d3dy5jZWxlYnV6ei5jb20vZy90YXlsb3Itc3dpZnQtZGVidXRzLXJlZC1oYWlyLWluLXN1Z2FybGFuZC12aWRlby8_YmlkZHJfZGVidWc9dHJ1ZfICEwoPQ1VTVE9NX01PREVMX0lEEgDyAhoKFkNVU1RPERY8TEVBRl9OQU1FEgDyAh4KGjYdAPQqAUFTVF9NT0RJRklFRBIAgAMAiAMBkAMAmAMUoAMBqgMAwAOsAsgDANgDlCHgAwDoAwD4AwOABACSBAkvb3BlbnJ0YjKYBACiBA8xNDQuMTIxLjIzMy4yMzeoBIkWsgQMCAAQABgAIAAwADgAuAQAwAQAyASxgoIB0gQOMTM1NiNOWU0yOjQyODLaBAIIAeAEAPAE6PmBFPoEEgkAAAAAZqdHQBEAAAAgWpRewIgFAZgFAKAF____________AaoFFjQ5MTgxNTcxMzQxNTU2NTI2OTQ5ZTHABQDJBQAAAAAAAPA_0gUJCQAAAAAAAAAA2AUB4AUB8AXW7gr6BQQIABAAkAYAmAYAuAYAwQYAAAAAAADwP8gGANAGwgTaBhYKEAAAAAAAAAAAAAAABQpQEAAYAOAGAfIGAggAgAcBiAcAoAcB\\&s\\=630dbbd55f593c7bfd9e7bccc4dbaa28203daaed\\&pp\\=\\$\\{EMX_MACRO\\}\\\"\\>\\<\\/script\\>';
703
703
  badAdmServerResponse.seatbid[1].bid[0].adm = '%3F%%3Dcadent%3C3prebid';
704
704
 
705
705
  assert.doesNotThrow(() => spec.interpretResponse({
@@ -39,7 +39,10 @@ describe('ChtnwAdapter', function () {
39
39
  ],
40
40
  }];
41
41
 
42
- const request = spec.buildRequests(bidRequests);
42
+ let request;
43
+ before(() => {
44
+ request = spec.buildRequests(bidRequests);
45
+ })
43
46
 
44
47
  it('Returns POST method', function () {
45
48
  expect(request.method).to.equal('POST');