prebid.js 8.0.0 → 8.2.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 (232) 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/adtrgtmeBidAdapter.js +1 -1
  11. package/dist/adxcgBidAdapter.js +1 -1
  12. package/dist/adyoulikeBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/asoBidAdapter.js +1 -1
  19. package/dist/axonixBidAdapter.js +1 -1
  20. package/dist/bedigitechBidAdapter.js +1 -1
  21. package/dist/beopBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/bridBidAdapter.js +1 -0
  26. package/dist/bridgewellBidAdapter.js +1 -1
  27. package/dist/brightMountainMediaBidAdapter.js +1 -1
  28. package/dist/carodaBidAdapter.js +1 -1
  29. package/dist/categoryTranslation.js +1 -1
  30. package/dist/chtnwBidAdapter.js +1 -1
  31. package/dist/cmp.js +1 -0
  32. package/dist/colossussspBidAdapter.js +1 -1
  33. package/dist/conceptxBidAdapter.js +1 -1
  34. package/dist/concertBidAdapter.js +1 -1
  35. package/dist/connectadBidAdapter.js +1 -1
  36. package/dist/consentManagement.js +1 -1
  37. package/dist/consentManagementGpp.js +1 -1
  38. package/dist/consentManagementUsp.js +1 -1
  39. package/dist/consumableBidAdapter.js +1 -1
  40. package/dist/conversantAnalyticsAdapter.js +1 -1
  41. package/dist/conversantBidAdapter.js +1 -1
  42. package/dist/craftBidAdapter.js +1 -1
  43. package/dist/criteoBidAdapter.js +1 -1
  44. package/dist/cwireBidAdapter.js +1 -1
  45. package/dist/dependencies.json +15 -0
  46. package/dist/dspxBidAdapter.js +1 -1
  47. package/dist/eplanningBidAdapter.js +1 -1
  48. package/dist/euidIdSystem.js +1 -1
  49. package/dist/feedadBidAdapter.js +1 -1
  50. package/dist/finativeBidAdapter.js +1 -1
  51. package/dist/freepassBidAdapter.js +1 -0
  52. package/dist/freewheel-sspBidAdapter.js +1 -1
  53. package/dist/gmosspBidAdapter.js +1 -1
  54. package/dist/goldbachBidAdapter.js +1 -1
  55. package/dist/gppControl_usnat.js +1 -0
  56. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  57. package/dist/greenbidsRtdProvider.js +1 -1
  58. package/dist/gridBidAdapter.js +1 -1
  59. package/dist/gumgumBidAdapter.js +1 -1
  60. package/dist/h12mediaBidAdapter.js +1 -1
  61. package/dist/hypelabBidAdapter.js +1 -1
  62. package/dist/id5IdSystem.js +1 -1
  63. package/dist/imdsBidAdapter.js +1 -1
  64. package/dist/improvedigitalBidAdapter.js +1 -1
  65. package/dist/insticatorBidAdapter.js +1 -1
  66. package/dist/intentIqIdSystem.js +1 -1
  67. package/dist/ixBidAdapter.js +1 -1
  68. package/dist/justpremiumBidAdapter.js +1 -1
  69. package/dist/kargoBidAdapter.js +1 -1
  70. package/dist/kiviadsBidAdapter.js +1 -0
  71. package/dist/konduitAnalyticsAdapter.js +1 -1
  72. package/dist/kueezBidAdapter.js +1 -1
  73. package/dist/kueezRtbBidAdapter.js +1 -1
  74. package/dist/kulturemediaBidAdapter.js +1 -1
  75. package/dist/lassoBidAdapter.js +1 -1
  76. package/dist/lifestreetBidAdapter.js +1 -1
  77. package/dist/liveIntentIdSystem.js +1 -1
  78. package/dist/logicadBidAdapter.js +1 -1
  79. package/dist/loglyliftBidAdapter.js +1 -1
  80. package/dist/magniteAnalyticsAdapter.js +1 -1
  81. package/dist/malltvAnalyticsAdapter.js +1 -1
  82. package/dist/marsmediaBidAdapter.js +1 -1
  83. package/dist/mediafuseBidAdapter.js +1 -1
  84. package/dist/mediasquareBidAdapter.js +1 -1
  85. package/dist/mgidBidAdapter.js +1 -1
  86. package/dist/mgidXBidAdapter.js +1 -0
  87. package/dist/minutemediaBidAdapter.js +1 -1
  88. package/dist/minutemediaplusBidAdapter.js +1 -1
  89. package/dist/mspa.js +1 -0
  90. package/dist/nexx360BidAdapter.js +1 -1
  91. package/dist/not-for-prod/prebid.js +146 -139
  92. package/dist/oguryBidAdapter.js +1 -1
  93. package/dist/onetagBidAdapter.js +1 -1
  94. package/dist/ooloAnalyticsAdapter.js +1 -1
  95. package/dist/optidigitalBidAdapter.js +1 -1
  96. package/dist/outbrainBidAdapter.js +1 -1
  97. package/dist/oxxionAnalyticsAdapter.js +1 -1
  98. package/dist/oxxionRtdProvider.js +1 -1
  99. package/dist/parrableIdSystem.js +1 -1
  100. package/dist/pixfutureBidAdapter.js +1 -1
  101. package/dist/prebid-core.js +1 -1
  102. package/dist/publinkIdSystem.js +1 -1
  103. package/dist/pubmaticBidAdapter.js +1 -1
  104. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  105. package/dist/pxyzBidAdapter.js +1 -1
  106. package/dist/quantcastBidAdapter.js +1 -1
  107. package/dist/readpeakBidAdapter.js +1 -1
  108. package/dist/relaidoBidAdapter.js +1 -1
  109. package/dist/retailspotBidAdapter.js +1 -1
  110. package/dist/rhythmoneBidAdapter.js +1 -1
  111. package/dist/riseBidAdapter.js +1 -1
  112. package/dist/rtbhouseBidAdapter.js +1 -1
  113. package/dist/rubiconBidAdapter.js +1 -1
  114. package/dist/seedingAllianceBidAdapter.js +1 -1
  115. package/dist/seedtagBidAdapter.js +1 -1
  116. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  117. package/dist/sharethroughBidAdapter.js +1 -1
  118. package/dist/shinezBidAdapter.js +1 -1
  119. package/dist/smaatoBidAdapter.js +1 -1
  120. package/dist/smartadserverBidAdapter.js +1 -1
  121. package/dist/smartxBidAdapter.js +1 -1
  122. package/dist/smilewantedBidAdapter.js +1 -1
  123. package/dist/sonobiBidAdapter.js +1 -1
  124. package/dist/sovrnAnalyticsAdapter.js +1 -1
  125. package/dist/sovrnBidAdapter.js +1 -1
  126. package/dist/sspBCBidAdapter.js +1 -1
  127. package/dist/stvBidAdapter.js +1 -1
  128. package/dist/sublimeBidAdapter.js +1 -1
  129. package/dist/targetVideoBidAdapter.js +1 -1
  130. package/dist/teadsBidAdapter.js +1 -1
  131. package/dist/trionBidAdapter.js +1 -1
  132. package/dist/tripleliftBidAdapter.js +1 -1
  133. package/dist/ttdBidAdapter.js +1 -1
  134. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  135. package/dist/uid2IdSystem.js +1 -1
  136. package/dist/underdogmediaBidAdapter.js +1 -1
  137. package/dist/undertoneBidAdapter.js +1 -1
  138. package/dist/userId.js +1 -1
  139. package/dist/vidazooBidAdapter.js +1 -1
  140. package/dist/videobyteBidAdapter.js +1 -1
  141. package/dist/visxBidAdapter.js +1 -1
  142. package/dist/vuukleBidAdapter.js +1 -1
  143. package/dist/widespaceBidAdapter.js +1 -1
  144. package/dist/winrBidAdapter.js +1 -1
  145. package/dist/yahoosspBidAdapter.js +1 -1
  146. package/dist/yieldmoBidAdapter.js +1 -1
  147. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  148. package/libraries/cmp/cmpClient.js +139 -0
  149. package/libraries/mspa/activityControls.js +91 -0
  150. package/modules/admanBidAdapter.js +5 -0
  151. package/modules/amxBidAdapter.js +11 -12
  152. package/modules/bedigitechBidAdapter.js +15 -12
  153. package/modules/bedigitechBidAdapter.md +2 -2
  154. package/modules/beopBidAdapter.js +0 -4
  155. package/modules/bidwatchAnalyticsAdapter.js +33 -5
  156. package/modules/bridBidAdapter.js +223 -0
  157. package/modules/categoryTranslation.js +3 -2
  158. package/modules/colossussspBidAdapter.js +9 -0
  159. package/modules/conceptxBidAdapter.js +6 -3
  160. package/modules/consentManagement.js +12 -86
  161. package/modules/consentManagementGpp.js +47 -126
  162. package/modules/consentManagementUsp.js +19 -97
  163. package/modules/freepassBidAdapter.js +98 -0
  164. package/modules/freepassBidAdapter.md +31 -0
  165. package/modules/freepassIdSystem.md +1 -1
  166. package/modules/gppControl_usnat.js +11 -0
  167. package/modules/greenbidsAnalyticsAdapter.js +7 -13
  168. package/modules/gridBidAdapter.js +3 -4
  169. package/modules/intentIqIdSystem.js +11 -9
  170. package/modules/ixBidAdapter.js +284 -55
  171. package/modules/kiviadsBidAdapter.js +212 -0
  172. package/modules/kiviadsBidAdapter.md +79 -0
  173. package/modules/liveIntentIdSystem.js +8 -3
  174. package/modules/mediasquareBidAdapter.js +19 -23
  175. package/modules/mgidXBidAdapter.js +263 -0
  176. package/modules/mgidXBidAdapter.md +79 -0
  177. package/modules/oxxionAnalyticsAdapter.js +33 -5
  178. package/modules/oxxionRtdProvider.js +124 -11
  179. package/modules/oxxionRtdProvider.md +19 -4
  180. package/modules/pubmaticBidAdapter.js +18 -2
  181. package/modules/rtbhouseBidAdapter.js +9 -2
  182. package/modules/rtbhouseBidAdapter.md +27 -8
  183. package/modules/rubiconBidAdapter.js +13 -1
  184. package/modules/sharethroughBidAdapter.js +14 -0
  185. package/modules/sonobiBidAdapter.js +4 -7
  186. package/modules/tripleliftBidAdapter.js +21 -1
  187. package/modules/userId/eids.js +29 -0
  188. package/modules/userId/eids.md +19 -2
  189. package/modules/userId/index.js +78 -29
  190. package/modules/userId/userId.md +3 -0
  191. package/package.json +1 -1
  192. package/src/activities/params.js +4 -1
  193. package/test/spec/libraries/cmp/cmpClient_spec.js +233 -0
  194. package/test/spec/libraries/mspa/activityControls_spec.js +315 -0
  195. package/test/spec/modules/admanBidAdapter_spec.js +8 -2
  196. package/test/spec/modules/adqueryBidAdapter_spec.js +5 -1
  197. package/test/spec/modules/amxBidAdapter_spec.js +6 -3
  198. package/test/spec/modules/bedigitechBidAdapter_spec.js +25 -36
  199. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +21 -1
  200. package/test/spec/modules/bridBidAdapter_spec.js +129 -0
  201. package/test/spec/modules/byDataAnalyticsAdapter_spec.js +9 -7
  202. package/test/spec/modules/chtnwBidAdapter_spec.js +4 -1
  203. package/test/spec/modules/colossussspBidAdapter_spec.js +29 -0
  204. package/test/spec/modules/consentManagementGpp_spec.js +84 -7
  205. package/test/spec/modules/consentManagement_spec.js +8 -18
  206. package/test/spec/modules/datablocksBidAdapter_spec.js +7 -3
  207. package/test/spec/modules/eids_spec.js +87 -0
  208. package/test/spec/modules/freepassBidAdapter_spec.js +161 -0
  209. package/test/spec/modules/greenbidsAnalyticsAdapter_spec.js +0 -15
  210. package/test/spec/modules/gridBidAdapter_spec.js +29 -28
  211. package/test/spec/modules/insticatorBidAdapter_spec.js +6 -2
  212. package/test/spec/modules/intentIqIdSystem_spec.js +36 -2
  213. package/test/spec/modules/ixBidAdapter_spec.js +785 -15
  214. package/test/spec/modules/kiviadsBidAdapter_spec.js +404 -0
  215. package/test/spec/modules/lassoBidAdapter_spec.js +6 -4
  216. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +17 -2
  217. package/test/spec/modules/liveIntentIdSystem_spec.js +11 -6
  218. package/test/spec/modules/mediasquareBidAdapter_spec.js +3 -0
  219. package/test/spec/modules/mgidXBidAdapter_spec.js +426 -0
  220. package/test/spec/modules/onetagBidAdapter_spec.js +81 -75
  221. package/test/spec/modules/orbidderBidAdapter_spec.js +6 -3
  222. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +21 -2
  223. package/test/spec/modules/oxxionRtdProvider_spec.js +113 -1
  224. package/test/spec/modules/pubmaticBidAdapter_spec.js +25 -0
  225. package/test/spec/modules/relaidoBidAdapter_spec.js +4 -3
  226. package/test/spec/modules/rtbhouseBidAdapter_spec.js +35 -0
  227. package/test/spec/modules/rubiconBidAdapter_spec.js +41 -0
  228. package/test/spec/modules/sharethroughBidAdapter_spec.js +75 -0
  229. package/test/spec/modules/sonobiBidAdapter_spec.js +15 -15
  230. package/test/spec/modules/tripleliftBidAdapter_spec.js +20 -1
  231. package/test/spec/modules/ucfunnelBidAdapter_spec.js +37 -16
  232. package/test/spec/modules/userId_spec.js +393 -6
@@ -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
+ })
@@ -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 () {
@@ -39,7 +39,9 @@ const sampleBidderRequest = {
39
39
  gppString: 'example',
40
40
  applicableSections: 'example'
41
41
  },
42
- auctionId: utils.getUniqueIdentifierStr(),
42
+
43
+ auctionId: null,
44
+
43
45
  uspConsent: '1YYY',
44
46
  refererInfo: {
45
47
  reachedTop: true,
@@ -90,7 +92,8 @@ const sampleBidRequestBase = {
90
92
  adUnitCode: 'div-gpt-ad-example',
91
93
  transactionId: utils.getUniqueIdentifierStr(),
92
94
  bidId: sampleRequestId,
93
- auctionId: utils.getUniqueIdentifierStr(),
95
+
96
+ auctionId: null,
94
97
  };
95
98
 
96
99
  const schainConfig = {
@@ -494,7 +497,7 @@ describe('AmxBidAdapter', () => {
494
497
 
495
498
  it('can build a video request', () => {
496
499
  const { data } = spec.buildRequests(
497
- [{...sampleBidRequestVideo, params: { ...sampleBidRequestVideo.params, adUnitId: 'custom-auid' }}],
500
+ [{ ...sampleBidRequestVideo, params: { ...sampleBidRequestVideo.params, adUnitId: 'custom-auid' } }],
498
501
  sampleBidderRequest
499
502
  );
500
503
  expect(Object.keys(data.m).length).to.equal(1);
@@ -25,7 +25,7 @@ describe('BedigitechAdapter', function () {
25
25
  bidderRequestId: '22edbae2733bf6',
26
26
  auctionId: '1d1a030790a475',
27
27
  params: {
28
- placementId: 1234,
28
+ placementId: 309,
29
29
  },
30
30
  };
31
31
 
@@ -57,19 +57,19 @@ describe('BedigitechAdapter', function () {
57
57
  bidderRequestId: '22edbae2733bf6',
58
58
  auctionId: '1d1a030790a475',
59
59
  params: {
60
- placementId: 1234,
60
+ placementId: 309,
61
61
  },
62
62
  }];
63
63
 
64
64
  it('sends bid request to url via GET', function () {
65
65
  const request = spec.buildRequests(bidRequests)[0];
66
66
  expect(request.method).to.equal('GET');
67
- expect(request.url).to.equal('https://bedigitalhb.s3.amazonaws.com/hb.js');
67
+ expect(request.url).to.equal('https://bid.bedigitech.com/bid/pub_bid.php');
68
68
  });
69
69
 
70
70
  it('should attach pid to url', function () {
71
71
  const request = spec.buildRequests(bidRequests)[0];
72
- expect(request.data.pid).to.equal(1234);
72
+ expect(request.data.pid).to.equal(309);
73
73
  });
74
74
  });
75
75
 
@@ -77,15 +77,17 @@ describe('BedigitechAdapter', function () {
77
77
  const response = {
78
78
  'body': [
79
79
  {
80
- 'id': 'bedigitechMyidfdfdf',
81
- 'requestId': 'gshgfshdfgdfsd',
82
- 'cpm': '5.0',
83
80
  'ad': '%3C!--%20Creative%20--%3E',
84
- 'width': 300,
85
- 'height': 250,
81
+ 'cpm': '5.0',
82
+ 'crid': '0af345b42983cc4bc0',
86
83
  'currency': 'USD',
84
+ 'height': 250,
85
+ 'id': 'bedigitechMyidfdfdf',
86
+ 'netRevenue': true,
87
+ 'requestTime': 1686306237,
88
+ 'timeToRespond': 300,
87
89
  'ttl': 300,
88
- 'creativeId': '0af345b42983cc4bc0'
90
+ 'width': 300
89
91
  }
90
92
  ],
91
93
  'headers': {
@@ -93,41 +95,28 @@ describe('BedigitechAdapter', function () {
93
95
  }
94
96
  };
95
97
 
96
- const bidRequest = {
97
- bidder: 'bedigitech',
98
- adUnitCode: 'adunit-code',
99
- mediaTypes: {
100
- banner: {
101
- sizes: [[300, 250], [300, 600]]
102
- }
103
- },
104
- bidId: '30b31c1838de1e',
105
- bidderRequestId: '22edbae2733bf6',
106
- auctionId: '1d1a030790a475',
107
- params: {
108
- placementId: 1234,
109
- },
110
- };
111
-
112
- it('should get correct bid response', function () {
98
+ it('should get correct bid responseiiiiii', function () {
113
99
  const expectedResponse = [
114
100
  {
115
- 'id': 'bedigitechMyidfdfdf',
116
- 'requestId': 'gshgfshdfgdfsd',
117
- 'cpm': '5.0',
118
101
  'ad': '%3C!--%20Creative%20--%3E',
119
- 'width': 300,
120
- 'height': 250,
121
- 'currency': 'USD',
122
- 'ttl': 300,
102
+ 'cpm': '5.0',
123
103
  'creativeId': '0af345b42983cc4bc0',
104
+ 'currency': 'USD',
105
+ 'height': 250,
106
+ 'id': 'bedigitechMyidfdfdf',
124
107
  'meta': {
125
108
  'mediaType': BANNER,
126
109
  },
110
+ 'netRevenue': true,
111
+ 'requestId': 'bedigitechMyidfdfdf',
112
+ 'requestTimestamp': 1686306237,
113
+ 'timeToRespond': 300,
114
+ 'ttl': 300,
115
+ 'width': 300,
116
+ 'bidderCode': 'bedigitech',
127
117
  }
128
118
  ];
129
-
130
- const result = spec.interpretResponse(response, bidRequest);
119
+ const result = spec.interpretResponse(response);
131
120
  expect(result).to.have.lengthOf(1);
132
121
  let resultKeys = Object.keys(result[0]);
133
122
  expect(resultKeys.sort()).to.deep.equal(Object.keys(expectedResponse[0]).sort());
@@ -1,4 +1,5 @@
1
1
  import bidwatchAnalytics from 'modules/bidwatchAnalyticsAdapter.js';
2
+ import {dereferenceWithoutRenderer} from 'modules/bidwatchAnalyticsAdapter.js';
2
3
  import { expect } from 'chai';
3
4
  import { server } from 'test/mocks/xhr.js';
4
5
  let adapterManager = require('src/adapterManager').default;
@@ -155,7 +156,7 @@ describe('BidWatch Analytics', function () {
155
156
  'requestId': '34a63e5d5378a3',
156
157
  'transactionId': 'de664ccb-e18b-4436-aeb0-362382eb1b40',
157
158
  'auctionId': '1e8b993d-8f0a-4232-83eb-3639ddf3a44b',
158
- 'mediaType': 'banner',
159
+ 'mediaType': 'video',
159
160
  'source': 'client',
160
161
  'cpm': 27.4276,
161
162
  'creativeId': '158534630',
@@ -168,6 +169,7 @@ describe('BidWatch Analytics', function () {
168
169
  'example.com'
169
170
  ]
170
171
  },
172
+ 'renderer': 'something',
171
173
  'originalCpm': 25.02521,
172
174
  'originalCurrency': 'EUR',
173
175
  'responseTimestamp': 1647424261559,
@@ -221,6 +223,7 @@ describe('BidWatch Analytics', function () {
221
223
  'example.com'
222
224
  ]
223
225
  },
226
+ 'renderer': 'something',
224
227
  'originalCpm': 25.02521,
225
228
  'originalCurrency': 'EUR',
226
229
  'responseTimestamp': 1647424261558,
@@ -267,7 +270,24 @@ describe('BidWatch Analytics', function () {
267
270
  bidwatchAnalytics.disableAnalytics();
268
271
  bidwatchAnalytics.track.restore();
269
272
  });
273
+ it('test dereferenceWithoutRenderer', function () {
274
+ adapterManager.registerAnalyticsAdapter({
275
+ code: 'bidwatch',
276
+ adapter: bidwatchAnalytics
277
+ });
270
278
 
279
+ adapterManager.enableAnalytics({
280
+ provider: 'bidwatch',
281
+ options: {
282
+ domain: 'test'
283
+ }
284
+ });
285
+ let resultBidWon = JSON.parse(dereferenceWithoutRenderer(bidWon));
286
+ expect(resultBidWon).not.to.have.property('renderer');
287
+ let resultBid = JSON.parse(dereferenceWithoutRenderer(auctionEnd));
288
+ expect(resultBid).to.have.property('bidsReceived').and.to.have.lengthOf(1);
289
+ expect(resultBid.bidsReceived[0]).not.to.have.property('renderer');
290
+ });
271
291
  it('test auctionEnd', function () {
272
292
  adapterManager.registerAnalyticsAdapter({
273
293
  code: 'bidwatch',
@@ -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
+ });