prebid.js 7.31.0 → 7.32.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.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/aidemBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/alkimiBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/aolBidAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/appushBidAdapter.js +1 -0
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/holidBidAdapter.js +1 -0
- package/dist/id5IdSystem.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/jwplayerVideoProvider.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetRtdProvider.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +126 -123
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/orbitsoftBidAdapter.js +1 -0
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/permutiveRtdProvider.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldlabBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/adloox.html +5 -0
- package/modules/adagioBidAdapter.js +0 -4
- package/modules/adagioBidAdapter.md +4 -22
- package/modules/adlooxAnalyticsAdapter.md +5 -3
- package/modules/adlooxRtdProvider.js +82 -278
- package/modules/adlooxRtdProvider.md +6 -6
- package/modules/aidemBidAdapter.js +4 -0
- package/modules/aidemBidAdapter.md +1 -0
- package/modules/alkimiBidAdapter.js +23 -6
- package/modules/aolBidAdapter.js +12 -0
- package/modules/appnexusBidAdapter.js +2 -2
- package/modules/appushBidAdapter.js +188 -0
- package/modules/appushBidAdapter.md +79 -0
- package/modules/asoBidAdapter.js +8 -5
- package/modules/confiantRtdProvider.js +1 -1
- package/modules/connectIdSystem.js +15 -1
- package/modules/feedadBidAdapter.js +7 -5
- package/modules/holidBidAdapter.js +170 -0
- package/modules/holidBidAdapter.md +36 -0
- package/modules/jwplayerVideoProvider.js +10 -3
- package/modules/kueezRtbBidAdapter.js +21 -8
- package/modules/medianetRtdProvider.js +4 -4
- package/modules/nexx360BidAdapter.js +5 -7
- package/modules/orbitsoftBidAdapter.js +150 -0
- package/modules/permutiveRtdProvider.js +1 -1
- package/modules/riseBidAdapter.js +2 -1
- package/modules/riseBidAdapter.md +2 -0
- package/modules/seedtagBidAdapter.js +12 -0
- package/modules/smartxBidAdapter.js +6 -0
- package/modules/taboolaBidAdapter.js +61 -14
- package/modules/yahoosspBidAdapter.js +5 -0
- package/modules/yieldlabBidAdapter.js +150 -134
- package/modules/yieldmoBidAdapter.js +1 -12
- package/package.json +1 -1
- package/test/spec/modules/adagioBidAdapter_spec.js +1 -28
- package/test/spec/modules/adlooxRtdProvider_spec.js +28 -120
- package/test/spec/modules/aidemBidAdapter_spec.js +10 -2
- package/test/spec/modules/alkimiBidAdapter_spec.js +15 -3
- package/test/spec/modules/aolBidAdapter_spec.js +22 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +7 -3
- package/test/spec/modules/appushBidAdapter_spec.js +372 -0
- package/test/spec/modules/connectIdSystem_spec.js +17 -5
- package/test/spec/modules/feedadBidAdapter_spec.js +23 -1
- package/test/spec/modules/holidBidAdapter_spec.js +165 -0
- package/test/spec/modules/kueezRtbBidAdapter_spec.js +147 -24
- package/test/spec/modules/medianetRtdProvider_spec.js +3 -3
- package/test/spec/modules/orbitsoftBidAdapter_spec.js +255 -0
- package/test/spec/modules/riseBidAdapter_spec.js +7 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +56 -10
- package/test/spec/modules/smartxBidAdapter_spec.js +10 -0
- package/test/spec/modules/taboolaBidAdapter_spec.js +142 -5
- package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +45 -10
- package/test/spec/modules/yahoosspBidAdapter_spec.js +16 -1
- package/test/spec/modules/yieldlabBidAdapter_spec.js +311 -301
- package/test/spec/modules/yieldmoBidAdapter_spec.js +70 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { config } from 'src/config.js';
|
|
2
|
-
import { expect } from 'chai'
|
|
3
|
-
import { spec } from 'modules/yieldlabBidAdapter.js'
|
|
4
|
-
import { newBidder } from 'src/adapters/bidderFactory.js'
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import { spec } from 'modules/yieldlabBidAdapter.js';
|
|
4
|
+
import { newBidder } from 'src/adapters/bidderFactory.js';
|
|
5
5
|
|
|
6
6
|
const DEFAULT_REQUEST = () => ({
|
|
7
7
|
bidder: 'yieldlab',
|
|
@@ -11,11 +11,11 @@ const DEFAULT_REQUEST = () => ({
|
|
|
11
11
|
targeting: {
|
|
12
12
|
key1: 'value1',
|
|
13
13
|
key2: 'value2',
|
|
14
|
-
notDoubleEncoded: 'value3,value4'
|
|
14
|
+
notDoubleEncoded: 'value3,value4',
|
|
15
15
|
},
|
|
16
16
|
customParams: {
|
|
17
17
|
extraParam: true,
|
|
18
|
-
foo: 'bar'
|
|
18
|
+
foo: 'bar',
|
|
19
19
|
},
|
|
20
20
|
extId: 'abc',
|
|
21
21
|
iabContent: {
|
|
@@ -31,8 +31,8 @@ const DEFAULT_REQUEST = () => ({
|
|
|
31
31
|
cat: ['cat1', 'cat2,ppp', 'cat3|||//'],
|
|
32
32
|
context: '7',
|
|
33
33
|
keywords: ['k1,', 'k2..'],
|
|
34
|
-
live: '0'
|
|
35
|
-
}
|
|
34
|
+
live: '0',
|
|
35
|
+
},
|
|
36
36
|
},
|
|
37
37
|
bidderRequestId: '143346cf0f1731',
|
|
38
38
|
auctionId: '2e41f65424c87c',
|
|
@@ -43,8 +43,14 @@ const DEFAULT_REQUEST = () => ({
|
|
|
43
43
|
source: 'netid.de',
|
|
44
44
|
uids: [{
|
|
45
45
|
id: 'fH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg',
|
|
46
|
-
atype: 1
|
|
47
|
-
}]
|
|
46
|
+
atype: 1,
|
|
47
|
+
}],
|
|
48
|
+
}, {
|
|
49
|
+
source: 'digitrust.de',
|
|
50
|
+
uids: [{
|
|
51
|
+
id: 'd8aa10fa-d86c-451d-aad8-5f16162a9e64',
|
|
52
|
+
atype: 2,
|
|
53
|
+
}],
|
|
48
54
|
}],
|
|
49
55
|
schain: {
|
|
50
56
|
ver: '1.0',
|
|
@@ -53,32 +59,32 @@ const DEFAULT_REQUEST = () => ({
|
|
|
53
59
|
{
|
|
54
60
|
asi: 'indirectseller.com',
|
|
55
61
|
sid: '1',
|
|
56
|
-
hp: 1
|
|
62
|
+
hp: 1,
|
|
57
63
|
},
|
|
58
64
|
{
|
|
59
65
|
asi: 'indirectseller2.com',
|
|
60
66
|
name: 'indirectseller2 name with comma , and bang !',
|
|
61
67
|
sid: '2',
|
|
62
|
-
hp: 1
|
|
63
|
-
}
|
|
64
|
-
]
|
|
65
|
-
}
|
|
66
|
-
})
|
|
68
|
+
hp: 1,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
});
|
|
67
73
|
|
|
68
74
|
const VIDEO_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
|
|
69
75
|
mediaTypes: {
|
|
70
76
|
video: {
|
|
71
77
|
playerSize: [[640, 480]],
|
|
72
|
-
context: 'instream'
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
})
|
|
78
|
+
context: 'instream',
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
});
|
|
76
82
|
|
|
77
83
|
const NATIVE_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
|
|
78
84
|
mediaTypes: {
|
|
79
|
-
native: {}
|
|
80
|
-
}
|
|
81
|
-
})
|
|
85
|
+
native: {},
|
|
86
|
+
},
|
|
87
|
+
});
|
|
82
88
|
|
|
83
89
|
const IAB_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
|
|
84
90
|
params: {
|
|
@@ -113,7 +119,7 @@ const IAB_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
|
|
|
113
119
|
name: 'bar',
|
|
114
120
|
cattax: 532,
|
|
115
121
|
cat: [1, 'foo', true],
|
|
116
|
-
domain: 'producer.test'
|
|
122
|
+
domain: 'producer.test',
|
|
117
123
|
},
|
|
118
124
|
data: {
|
|
119
125
|
id: 'foo',
|
|
@@ -123,8 +129,8 @@ const IAB_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
|
|
|
123
129
|
value: 'bar',
|
|
124
130
|
ext: {
|
|
125
131
|
foo: {
|
|
126
|
-
bar: 'bar'
|
|
127
|
-
}
|
|
132
|
+
bar: 'bar',
|
|
133
|
+
},
|
|
128
134
|
},
|
|
129
135
|
}, {
|
|
130
136
|
name: 'foo2',
|
|
@@ -133,27 +139,27 @@ const IAB_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
|
|
|
133
139
|
test: {
|
|
134
140
|
nums: {
|
|
135
141
|
int: 123,
|
|
136
|
-
float: 123.123
|
|
142
|
+
float: 123.123,
|
|
137
143
|
},
|
|
138
144
|
bool: true,
|
|
139
|
-
string: 'foo2'
|
|
140
|
-
}
|
|
141
|
-
}
|
|
145
|
+
string: 'foo2',
|
|
146
|
+
},
|
|
147
|
+
},
|
|
142
148
|
}],
|
|
143
149
|
},
|
|
144
150
|
network: {
|
|
145
151
|
id: 'foo',
|
|
146
152
|
name: 'bar',
|
|
147
|
-
domain: 'network.test'
|
|
153
|
+
domain: 'network.test',
|
|
148
154
|
},
|
|
149
155
|
channel: {
|
|
150
156
|
id: 'bar',
|
|
151
157
|
name: 'foo',
|
|
152
|
-
domain: 'channel.test'
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
})
|
|
158
|
+
domain: 'channel.test',
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
});
|
|
157
163
|
|
|
158
164
|
const RESPONSE = {
|
|
159
165
|
advertiser: 'yieldlab',
|
|
@@ -163,169 +169,173 @@ const RESPONSE = {
|
|
|
163
169
|
price: 1,
|
|
164
170
|
pid: 2222,
|
|
165
171
|
adsize: '728x90',
|
|
166
|
-
adtype: 'BANNER'
|
|
167
|
-
}
|
|
172
|
+
adtype: 'BANNER',
|
|
173
|
+
};
|
|
168
174
|
|
|
169
175
|
const NATIVE_RESPONSE = Object.assign({}, RESPONSE, {
|
|
170
176
|
adtype: 'NATIVE',
|
|
171
177
|
native: {
|
|
172
178
|
link: {
|
|
173
|
-
url: 'https://www.yieldlab.de'
|
|
179
|
+
url: 'https://www.yieldlab.de',
|
|
174
180
|
},
|
|
175
181
|
assets: [
|
|
176
182
|
{
|
|
177
183
|
id: 1,
|
|
178
184
|
title: {
|
|
179
|
-
text: 'This is a great headline'
|
|
180
|
-
}
|
|
185
|
+
text: 'This is a great headline',
|
|
186
|
+
},
|
|
181
187
|
},
|
|
182
188
|
{
|
|
183
189
|
id: 2,
|
|
184
190
|
img: {
|
|
185
191
|
url: 'https://localhost:8080/yl-logo100x100.jpg',
|
|
186
192
|
w: 100,
|
|
187
|
-
h: 100
|
|
188
|
-
}
|
|
193
|
+
h: 100,
|
|
194
|
+
},
|
|
189
195
|
},
|
|
190
196
|
{
|
|
191
197
|
id: 3,
|
|
192
198
|
data: {
|
|
193
|
-
value: 'Native body value'
|
|
194
|
-
}
|
|
195
|
-
}
|
|
199
|
+
value: 'Native body value',
|
|
200
|
+
},
|
|
201
|
+
},
|
|
196
202
|
],
|
|
197
203
|
imptrackers: [
|
|
198
204
|
'http://localhost:8080/ve?d=ODE9ZSY2MTI1MjAzNjMzMzYxPXN0JjA0NWUwZDk0NTY5Yi05M2FiLWUwZTQtOWFjNy1hYWY0MzFiZj1kaXQmMj12',
|
|
199
205
|
'http://localhost:8080/md/1111/9efa4e76-2030-4f04-bb9f-322541f8d611?mdata=false&pvid=false&ids=x:1',
|
|
200
|
-
'http://localhost:8080/imp?s=13216&d=2171514&a=12548955&ts=1633363025216&tid=fb134faa-7ca9-4e0e-ba39-b96549d0e540&l=0'
|
|
201
|
-
]
|
|
202
|
-
}
|
|
203
|
-
})
|
|
206
|
+
'http://localhost:8080/imp?s=13216&d=2171514&a=12548955&ts=1633363025216&tid=fb134faa-7ca9-4e0e-ba39-b96549d0e540&l=0',
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
});
|
|
204
210
|
|
|
205
211
|
const VIDEO_RESPONSE = Object.assign({}, RESPONSE, {
|
|
206
|
-
adtype: 'VIDEO'
|
|
207
|
-
})
|
|
212
|
+
adtype: 'VIDEO',
|
|
213
|
+
});
|
|
208
214
|
|
|
209
215
|
const PVID_RESPONSE = Object.assign({}, VIDEO_RESPONSE, {
|
|
210
|
-
pvid: '43513f11-55a0-4a83-94e5-0ebc08f54a2c'
|
|
211
|
-
})
|
|
216
|
+
pvid: '43513f11-55a0-4a83-94e5-0ebc08f54a2c',
|
|
217
|
+
});
|
|
212
218
|
|
|
213
219
|
const REQPARAMS = {
|
|
214
220
|
json: true,
|
|
215
|
-
ts: 1234567890
|
|
216
|
-
}
|
|
221
|
+
ts: 1234567890,
|
|
222
|
+
};
|
|
217
223
|
|
|
218
224
|
const REQPARAMS_GDPR = Object.assign({}, REQPARAMS, {
|
|
219
225
|
gdpr: true,
|
|
220
|
-
consent: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA'
|
|
221
|
-
})
|
|
226
|
+
consent: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA',
|
|
227
|
+
});
|
|
222
228
|
|
|
223
229
|
const REQPARAMS_IAB_CONTENT = Object.assign({}, REQPARAMS, {
|
|
224
|
-
iab_content: 'id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0'
|
|
225
|
-
})
|
|
230
|
+
iab_content: 'id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0',
|
|
231
|
+
});
|
|
226
232
|
|
|
227
233
|
describe('yieldlabBidAdapter', () => {
|
|
228
234
|
describe('instantiation from spec', () => {
|
|
229
235
|
it('is working properly', () => {
|
|
230
|
-
const yieldlabBidAdapter = newBidder(spec)
|
|
231
|
-
expect(yieldlabBidAdapter.callBids).to.exist.and.to.be.a('function')
|
|
232
|
-
})
|
|
233
|
-
})
|
|
236
|
+
const yieldlabBidAdapter = newBidder(spec);
|
|
237
|
+
expect(yieldlabBidAdapter.callBids).to.exist.and.to.be.a('function');
|
|
238
|
+
});
|
|
239
|
+
});
|
|
234
240
|
|
|
235
241
|
describe('isBidRequestValid', () => {
|
|
236
242
|
it('should return true when all required parameters are found', () => {
|
|
237
243
|
const request = {
|
|
238
244
|
params: {
|
|
239
245
|
adslotId: '1111',
|
|
240
|
-
supplyId: '2222'
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
expect(spec.isBidRequestValid(request)).to.equal(true)
|
|
244
|
-
})
|
|
246
|
+
supplyId: '2222',
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
expect(spec.isBidRequestValid(request)).to.equal(true);
|
|
250
|
+
});
|
|
245
251
|
|
|
246
252
|
it('should return false when required parameters are missing', () => {
|
|
247
|
-
expect(spec.isBidRequestValid({})).to.equal(false)
|
|
248
|
-
})
|
|
249
|
-
})
|
|
253
|
+
expect(spec.isBidRequestValid({})).to.equal(false);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
250
256
|
|
|
251
257
|
describe('buildRequests', () => {
|
|
252
|
-
const bidRequests = [DEFAULT_REQUEST()]
|
|
258
|
+
const bidRequests = [DEFAULT_REQUEST()];
|
|
253
259
|
|
|
254
260
|
describe('default functionality', () => {
|
|
255
|
-
let request
|
|
261
|
+
let request;
|
|
256
262
|
|
|
257
263
|
before(() => {
|
|
258
|
-
request = spec.buildRequests(bidRequests)
|
|
259
|
-
})
|
|
264
|
+
request = spec.buildRequests(bidRequests);
|
|
265
|
+
});
|
|
260
266
|
|
|
261
267
|
it('sends bid request to ENDPOINT via GET', () => {
|
|
262
|
-
expect(request.method).to.equal('GET')
|
|
263
|
-
})
|
|
268
|
+
expect(request.method).to.equal('GET');
|
|
269
|
+
});
|
|
264
270
|
|
|
265
271
|
it('returns a list of valid requests', () => {
|
|
266
|
-
expect(request.validBidRequests).to.eql(bidRequests)
|
|
267
|
-
})
|
|
272
|
+
expect(request.validBidRequests).to.eql(bidRequests);
|
|
273
|
+
});
|
|
268
274
|
|
|
269
275
|
it('passes single-encoded targeting to bid request', () => {
|
|
270
|
-
expect(request.url).to.include('t=key1%3Dvalue1%26key2%3Dvalue2%26notDoubleEncoded%3Dvalue3%2Cvalue4')
|
|
271
|
-
})
|
|
276
|
+
expect(request.url).to.include('t=key1%3Dvalue1%26key2%3Dvalue2%26notDoubleEncoded%3Dvalue3%2Cvalue4');
|
|
277
|
+
});
|
|
272
278
|
|
|
273
279
|
it('passes userids to bid request', () => {
|
|
274
|
-
expect(request.url).to.include('ids=netid.de%3AfH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg')
|
|
275
|
-
})
|
|
280
|
+
expect(request.url).to.include('ids=netid.de%3AfH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg%2Cdigitrust.de%3Ad8aa10fa-d86c-451d-aad8-5f16162a9e64');
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
it('passes atype to bid request', () => {
|
|
284
|
+
expect(request.url).to.include('atypes=netid.de%3A1%2Cdigitrust.de%3A2');
|
|
285
|
+
});
|
|
276
286
|
|
|
277
287
|
it('passes extra params to bid request', () => {
|
|
278
|
-
expect(request.url).to.include('extraParam=true&foo=bar')
|
|
279
|
-
})
|
|
288
|
+
expect(request.url).to.include('extraParam=true&foo=bar');
|
|
289
|
+
});
|
|
280
290
|
|
|
281
291
|
it('passes unencoded schain string to bid request', () => {
|
|
282
|
-
expect(request.url).to.include('schain=1.0,1!indirectseller.com,1,1,,,,!indirectseller2.com,2,1,,indirectseller2%20name%20with%20comma%20%2C%20and%20bang%20%21,,')
|
|
283
|
-
})
|
|
292
|
+
expect(request.url).to.include('schain=1.0,1!indirectseller.com,1,1,,,,!indirectseller2.com,2,1,,indirectseller2%20name%20with%20comma%20%2C%20and%20bang%20%21,,');
|
|
293
|
+
});
|
|
284
294
|
|
|
285
295
|
it('passes iab_content string to bid request', () => {
|
|
286
|
-
expect(request.url).to.include('iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0')
|
|
287
|
-
})
|
|
296
|
+
expect(request.url).to.include('iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0');
|
|
297
|
+
});
|
|
288
298
|
|
|
289
299
|
it('passes correct size to bid request', () => {
|
|
290
|
-
expect(request.url).to.include('728x90')
|
|
291
|
-
})
|
|
300
|
+
expect(request.url).to.include('728x90');
|
|
301
|
+
});
|
|
292
302
|
|
|
293
303
|
it('passes external id to bid request', () => {
|
|
294
|
-
expect(request.url).to.include('id=abc')
|
|
295
|
-
})
|
|
296
|
-
})
|
|
304
|
+
expect(request.url).to.include('id=abc');
|
|
305
|
+
});
|
|
306
|
+
});
|
|
297
307
|
|
|
298
308
|
describe('iab_content handling', () => {
|
|
299
309
|
const siteConfig = {
|
|
300
310
|
ortb2: {
|
|
301
311
|
site: {
|
|
302
312
|
content: {
|
|
303
|
-
id: 'id_from_config'
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
313
|
+
id: 'id_from_config',
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
};
|
|
308
318
|
|
|
309
319
|
beforeEach(() => {
|
|
310
|
-
config.setConfig(siteConfig)
|
|
311
|
-
})
|
|
320
|
+
config.setConfig(siteConfig);
|
|
321
|
+
});
|
|
312
322
|
|
|
313
323
|
afterEach(() => {
|
|
314
|
-
config.resetConfig()
|
|
315
|
-
})
|
|
324
|
+
config.resetConfig();
|
|
325
|
+
});
|
|
316
326
|
|
|
317
327
|
it('generates iab_content string from bidder params', () => {
|
|
318
|
-
const request = spec.buildRequests(bidRequests)
|
|
319
|
-
expect(request.url).to.include('iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0')
|
|
320
|
-
})
|
|
328
|
+
const request = spec.buildRequests(bidRequests);
|
|
329
|
+
expect(request.url).to.include('iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0');
|
|
330
|
+
});
|
|
321
331
|
|
|
322
332
|
it('generates iab_content string from first party data if not provided in bidder params', () => {
|
|
323
|
-
const requestWithoutIabContent = DEFAULT_REQUEST()
|
|
324
|
-
delete requestWithoutIabContent.params.iabContent
|
|
333
|
+
const requestWithoutIabContent = DEFAULT_REQUEST();
|
|
334
|
+
delete requestWithoutIabContent.params.iabContent;
|
|
325
335
|
|
|
326
|
-
const request = spec.buildRequests([{...requestWithoutIabContent, ...siteConfig}])
|
|
327
|
-
expect(request.url).to.include('iab_content=id%3Aid_from_config')
|
|
328
|
-
})
|
|
336
|
+
const request = spec.buildRequests([{...requestWithoutIabContent, ...siteConfig}]);
|
|
337
|
+
expect(request.url).to.include('iab_content=id%3Aid_from_config');
|
|
338
|
+
});
|
|
329
339
|
|
|
330
340
|
it('flattens the iabContent, encodes the values, joins the keywords into one value, and than encodes the iab_content request param ', () => {
|
|
331
341
|
const expectedIabContentValue = encodeURIComponent(
|
|
@@ -372,18 +382,18 @@ describe('yieldlabBidAdapter', () => {
|
|
|
372
382
|
'channel.id:bar,' +
|
|
373
383
|
'channel.name:foo,' +
|
|
374
384
|
'channel.domain:channel.test'
|
|
375
|
-
)
|
|
376
|
-
const request = spec.buildRequests([IAB_REQUEST()], REQPARAMS)
|
|
377
|
-
expect(request.url).to.include('iab_content=' + expectedIabContentValue)
|
|
378
|
-
})
|
|
379
|
-
})
|
|
385
|
+
);
|
|
386
|
+
const request = spec.buildRequests([IAB_REQUEST()], REQPARAMS);
|
|
387
|
+
expect(request.url).to.include('iab_content=' + expectedIabContentValue);
|
|
388
|
+
});
|
|
389
|
+
});
|
|
380
390
|
|
|
381
391
|
it('passes unencoded schain string to bid request when complete == 0', () => {
|
|
382
|
-
const schainRequest = DEFAULT_REQUEST()
|
|
392
|
+
const schainRequest = DEFAULT_REQUEST();
|
|
383
393
|
schainRequest.schain.complete = 0; //
|
|
384
|
-
const request = spec.buildRequests([schainRequest])
|
|
385
|
-
expect(request.url).to.include('schain=1.0,0!indirectseller.com,1,1,,,,!indirectseller2.com,2,1,,indirectseller2%20name%20with%20comma%20%2C%20and%20bang%20%21,,')
|
|
386
|
-
})
|
|
394
|
+
const request = spec.buildRequests([schainRequest]);
|
|
395
|
+
expect(request.url).to.include('schain=1.0,0!indirectseller.com,1,1,,,,!indirectseller2.com,2,1,,indirectseller2%20name%20with%20comma%20%2C%20and%20bang%20%21,,');
|
|
396
|
+
});
|
|
387
397
|
|
|
388
398
|
it('passes encoded referer to bid request', () => {
|
|
389
399
|
const refererRequest = spec.buildRequests(bidRequests, {
|
|
@@ -392,123 +402,123 @@ describe('yieldlabBidAdapter', () => {
|
|
|
392
402
|
numIframes: 0,
|
|
393
403
|
reachedTop: true,
|
|
394
404
|
page: 'https://www.yieldlab.de/test?with=querystring',
|
|
395
|
-
stack: ['https://www.yieldlab.de/test?with=querystring']
|
|
396
|
-
}
|
|
397
|
-
})
|
|
405
|
+
stack: ['https://www.yieldlab.de/test?with=querystring'],
|
|
406
|
+
},
|
|
407
|
+
});
|
|
398
408
|
|
|
399
|
-
expect(refererRequest.url).to.include('pubref=https%3A%2F%2Fwww.yieldlab.de%2Ftest%3Fwith%3Dquerystring')
|
|
400
|
-
})
|
|
409
|
+
expect(refererRequest.url).to.include('pubref=https%3A%2F%2Fwww.yieldlab.de%2Ftest%3Fwith%3Dquerystring');
|
|
410
|
+
});
|
|
401
411
|
|
|
402
412
|
it('passes gdpr flag and consent if present', () => {
|
|
403
413
|
const gdprRequest = spec.buildRequests(bidRequests, {
|
|
404
414
|
gdprConsent: {
|
|
405
415
|
consentString: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA',
|
|
406
|
-
gdprApplies: true
|
|
407
|
-
}
|
|
408
|
-
})
|
|
416
|
+
gdprApplies: true,
|
|
417
|
+
},
|
|
418
|
+
});
|
|
409
419
|
|
|
410
|
-
expect(gdprRequest.url).to.include('consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA')
|
|
411
|
-
expect(gdprRequest.url).to.include('gdpr=true')
|
|
412
|
-
})
|
|
420
|
+
expect(gdprRequest.url).to.include('consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
|
|
421
|
+
expect(gdprRequest.url).to.include('gdpr=true');
|
|
422
|
+
});
|
|
413
423
|
|
|
414
424
|
describe('sizes handling', () => {
|
|
415
425
|
it('passes correct size to bid request for mediaType banner', () => {
|
|
416
426
|
const bannerRequest = DEFAULT_REQUEST();
|
|
417
427
|
bannerRequest.mediaTypes = {
|
|
418
428
|
banner: {
|
|
419
|
-
sizes: [[123, 456]]
|
|
420
|
-
}
|
|
421
|
-
}
|
|
429
|
+
sizes: [[123, 456]],
|
|
430
|
+
},
|
|
431
|
+
};
|
|
422
432
|
|
|
423
433
|
// when mediaTypes is present it has precedence over the sizes field (728, 90)
|
|
424
|
-
let request = spec.buildRequests([bannerRequest], REQPARAMS)
|
|
425
|
-
expect(request.url).to.include('sizes')
|
|
426
|
-
expect(request.url).to.include('123x456')
|
|
427
|
-
|
|
428
|
-
bannerRequest.mediaTypes.banner.sizes = [123, 456]
|
|
429
|
-
request = spec.buildRequests([bannerRequest], REQPARAMS)
|
|
430
|
-
expect(request.url).to.include('123x456')
|
|
431
|
-
|
|
432
|
-
bannerRequest.mediaTypes.banner.sizes = [[123, 456], [320, 240]]
|
|
433
|
-
request = spec.buildRequests([bannerRequest], REQPARAMS)
|
|
434
|
-
expect(request.url).to.include('123x456')
|
|
435
|
-
expect(request.url).to.include('320x240')
|
|
436
|
-
})
|
|
434
|
+
let request = spec.buildRequests([bannerRequest], REQPARAMS);
|
|
435
|
+
expect(request.url).to.include('sizes');
|
|
436
|
+
expect(request.url).to.include('123x456');
|
|
437
|
+
|
|
438
|
+
bannerRequest.mediaTypes.banner.sizes = [123, 456];
|
|
439
|
+
request = spec.buildRequests([bannerRequest], REQPARAMS);
|
|
440
|
+
expect(request.url).to.include('123x456');
|
|
441
|
+
|
|
442
|
+
bannerRequest.mediaTypes.banner.sizes = [[123, 456], [320, 240]];
|
|
443
|
+
request = spec.buildRequests([bannerRequest], REQPARAMS);
|
|
444
|
+
expect(request.url).to.include('123x456');
|
|
445
|
+
expect(request.url).to.include('320x240');
|
|
446
|
+
});
|
|
437
447
|
|
|
438
448
|
it('passes correct sizes to bid request when mediaType is not present', () => {
|
|
439
449
|
// information is taken from the top level sizes field
|
|
440
450
|
const sizesRequest = DEFAULT_REQUEST();
|
|
441
451
|
|
|
442
|
-
let request = spec.buildRequests([sizesRequest], REQPARAMS)
|
|
443
|
-
expect(request.url).to.include('sizes')
|
|
444
|
-
expect(request.url).to.include('728x90')
|
|
452
|
+
let request = spec.buildRequests([sizesRequest], REQPARAMS);
|
|
453
|
+
expect(request.url).to.include('sizes');
|
|
454
|
+
expect(request.url).to.include('728x90');
|
|
445
455
|
|
|
446
|
-
sizesRequest.sizes = [[728, 90]]
|
|
447
|
-
request = spec.buildRequests([sizesRequest], REQPARAMS)
|
|
448
|
-
expect(request.url).to.include('728x90')
|
|
456
|
+
sizesRequest.sizes = [[728, 90]];
|
|
457
|
+
request = spec.buildRequests([sizesRequest], REQPARAMS);
|
|
458
|
+
expect(request.url).to.include('728x90');
|
|
449
459
|
|
|
450
|
-
sizesRequest.sizes = [[728, 90], [320, 240]]
|
|
451
|
-
request = spec.buildRequests([sizesRequest], REQPARAMS)
|
|
452
|
-
expect(request.url).to.include('728x90')
|
|
453
|
-
})
|
|
460
|
+
sizesRequest.sizes = [[728, 90], [320, 240]];
|
|
461
|
+
request = spec.buildRequests([sizesRequest], REQPARAMS);
|
|
462
|
+
expect(request.url).to.include('728x90');
|
|
463
|
+
});
|
|
454
464
|
|
|
455
465
|
it('does not pass the sizes parameter for mediaType video', () => {
|
|
456
466
|
const videoRequest = VIDEO_REQUEST();
|
|
457
467
|
|
|
458
|
-
let request = spec.buildRequests([videoRequest], REQPARAMS)
|
|
459
|
-
expect(request.url).to.not.include('sizes')
|
|
460
|
-
})
|
|
468
|
+
let request = spec.buildRequests([videoRequest], REQPARAMS);
|
|
469
|
+
expect(request.url).to.not.include('sizes');
|
|
470
|
+
});
|
|
461
471
|
|
|
462
472
|
it('does not pass the sizes parameter for mediaType native', () => {
|
|
463
473
|
const nativeRequest = NATIVE_REQUEST();
|
|
464
474
|
|
|
465
|
-
let request = spec.buildRequests([nativeRequest], REQPARAMS)
|
|
466
|
-
expect(request.url).to.not.include('sizes')
|
|
467
|
-
})
|
|
468
|
-
})
|
|
469
|
-
})
|
|
475
|
+
let request = spec.buildRequests([nativeRequest], REQPARAMS);
|
|
476
|
+
expect(request.url).to.not.include('sizes');
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
});
|
|
470
480
|
|
|
471
481
|
describe('interpretResponse', () => {
|
|
472
|
-
let bidRequest
|
|
482
|
+
let bidRequest;
|
|
473
483
|
|
|
474
484
|
before(() => {
|
|
475
|
-
bidRequest = DEFAULT_REQUEST()
|
|
476
|
-
})
|
|
485
|
+
bidRequest = DEFAULT_REQUEST();
|
|
486
|
+
});
|
|
477
487
|
|
|
478
488
|
it('handles nobid responses', () => {
|
|
479
|
-
expect(spec.interpretResponse({body: {}}, {validBidRequests: []}).length).to.equal(0)
|
|
480
|
-
expect(spec.interpretResponse({body: []}, {validBidRequests: []}).length).to.equal(0)
|
|
481
|
-
})
|
|
489
|
+
expect(spec.interpretResponse({body: {}}, {validBidRequests: []}).length).to.equal(0);
|
|
490
|
+
expect(spec.interpretResponse({body: []}, {validBidRequests: []}).length).to.equal(0);
|
|
491
|
+
});
|
|
482
492
|
|
|
483
493
|
it('should get correct bid response', () => {
|
|
484
|
-
const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [bidRequest], queryParams: REQPARAMS})
|
|
485
|
-
|
|
486
|
-
expect(result[0].requestId).to.equal('2d925f27f5079f')
|
|
487
|
-
expect(result[0].cpm).to.equal(0.01)
|
|
488
|
-
expect(result[0].width).to.equal(728)
|
|
489
|
-
expect(result[0].height).to.equal(90)
|
|
490
|
-
expect(result[0].creativeId).to.equal('1111')
|
|
491
|
-
expect(result[0].dealId).to.equal(2222)
|
|
492
|
-
expect(result[0].currency).to.equal('EUR')
|
|
493
|
-
expect(result[0].netRevenue).to.equal(false)
|
|
494
|
-
expect(result[0].ttl).to.equal(300)
|
|
495
|
-
expect(result[0].referrer).to.equal('')
|
|
496
|
-
expect(result[0].meta.advertiserDomains).to.equal('yieldlab')
|
|
497
|
-
expect(result[0].ad).to.include('<script src="https://ad.yieldlab.net/d/1111/2222/?ts=')
|
|
498
|
-
expect(result[0].ad).to.include('&id=abc')
|
|
499
|
-
})
|
|
494
|
+
const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [bidRequest], queryParams: REQPARAMS});
|
|
495
|
+
|
|
496
|
+
expect(result[0].requestId).to.equal('2d925f27f5079f');
|
|
497
|
+
expect(result[0].cpm).to.equal(0.01);
|
|
498
|
+
expect(result[0].width).to.equal(728);
|
|
499
|
+
expect(result[0].height).to.equal(90);
|
|
500
|
+
expect(result[0].creativeId).to.equal('1111');
|
|
501
|
+
expect(result[0].dealId).to.equal(2222);
|
|
502
|
+
expect(result[0].currency).to.equal('EUR');
|
|
503
|
+
expect(result[0].netRevenue).to.equal(false);
|
|
504
|
+
expect(result[0].ttl).to.equal(300);
|
|
505
|
+
expect(result[0].referrer).to.equal('');
|
|
506
|
+
expect(result[0].meta.advertiserDomains).to.equal('yieldlab');
|
|
507
|
+
expect(result[0].ad).to.include('<script src="https://ad.yieldlab.net/d/1111/2222/?ts=');
|
|
508
|
+
expect(result[0].ad).to.include('&id=abc');
|
|
509
|
+
});
|
|
500
510
|
|
|
501
511
|
it('should append gdpr parameters to adtag', () => {
|
|
502
|
-
const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [bidRequest], queryParams: REQPARAMS_GDPR})
|
|
512
|
+
const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [bidRequest], queryParams: REQPARAMS_GDPR});
|
|
503
513
|
|
|
504
|
-
expect(result[0].ad).to.include('&gdpr=true')
|
|
505
|
-
expect(result[0].ad).to.include('&consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA')
|
|
506
|
-
})
|
|
514
|
+
expect(result[0].ad).to.include('&gdpr=true');
|
|
515
|
+
expect(result[0].ad).to.include('&consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
|
|
516
|
+
});
|
|
507
517
|
|
|
508
518
|
it('should append iab_content to adtag', () => {
|
|
509
|
-
const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [bidRequest], queryParams: REQPARAMS_IAB_CONTENT})
|
|
510
|
-
expect(result[0].ad).to.include('&iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0')
|
|
511
|
-
})
|
|
519
|
+
const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [bidRequest], queryParams: REQPARAMS_IAB_CONTENT});
|
|
520
|
+
expect(result[0].ad).to.include('&iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0');
|
|
521
|
+
});
|
|
512
522
|
|
|
513
523
|
it('should get correct bid response when passing more than one size', () => {
|
|
514
524
|
const REQUEST2 = Object.assign(DEFAULT_REQUEST(), {
|
|
@@ -516,115 +526,115 @@ describe('yieldlabBidAdapter', () => {
|
|
|
516
526
|
[800, 250],
|
|
517
527
|
[728, 90],
|
|
518
528
|
[970, 90],
|
|
519
|
-
]
|
|
520
|
-
})
|
|
521
|
-
const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [REQUEST2], queryParams: REQPARAMS})
|
|
522
|
-
|
|
523
|
-
expect(result[0].requestId).to.equal('2d925f27f5079f')
|
|
524
|
-
expect(result[0].cpm).to.equal(0.01)
|
|
525
|
-
expect(result[0].width).to.equal(728)
|
|
526
|
-
expect(result[0].height).to.equal(90)
|
|
527
|
-
expect(result[0].creativeId).to.equal('1111')
|
|
528
|
-
expect(result[0].dealId).to.equal(2222)
|
|
529
|
-
expect(result[0].currency).to.equal('EUR')
|
|
530
|
-
expect(result[0].netRevenue).to.equal(false)
|
|
531
|
-
expect(result[0].ttl).to.equal(300)
|
|
532
|
-
expect(result[0].referrer).to.equal('')
|
|
533
|
-
expect(result[0].meta.advertiserDomains).to.equal('yieldlab')
|
|
534
|
-
expect(result[0].ad).to.include('<script src="https://ad.yieldlab.net/d/1111/2222/?ts=')
|
|
535
|
-
expect(result[0].ad).to.include('&id=abc')
|
|
536
|
-
})
|
|
529
|
+
],
|
|
530
|
+
});
|
|
531
|
+
const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [REQUEST2], queryParams: REQPARAMS});
|
|
532
|
+
|
|
533
|
+
expect(result[0].requestId).to.equal('2d925f27f5079f');
|
|
534
|
+
expect(result[0].cpm).to.equal(0.01);
|
|
535
|
+
expect(result[0].width).to.equal(728);
|
|
536
|
+
expect(result[0].height).to.equal(90);
|
|
537
|
+
expect(result[0].creativeId).to.equal('1111');
|
|
538
|
+
expect(result[0].dealId).to.equal(2222);
|
|
539
|
+
expect(result[0].currency).to.equal('EUR');
|
|
540
|
+
expect(result[0].netRevenue).to.equal(false);
|
|
541
|
+
expect(result[0].ttl).to.equal(300);
|
|
542
|
+
expect(result[0].referrer).to.equal('');
|
|
543
|
+
expect(result[0].meta.advertiserDomains).to.equal('yieldlab');
|
|
544
|
+
expect(result[0].ad).to.include('<script src="https://ad.yieldlab.net/d/1111/2222/?ts=');
|
|
545
|
+
expect(result[0].ad).to.include('&id=abc');
|
|
546
|
+
});
|
|
537
547
|
|
|
538
548
|
it('should add vastUrl when type is video', () => {
|
|
539
|
-
const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS})
|
|
549
|
+
const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS});
|
|
540
550
|
|
|
541
|
-
expect(result[0].requestId).to.equal('2d925f27f5079f')
|
|
542
|
-
expect(result[0].cpm).to.equal(0.01)
|
|
543
|
-
expect(result[0].mediaType).to.equal('video')
|
|
544
|
-
expect(result[0].vastUrl).to.include('https://ad.yieldlab.net/d/1111/2222/?ts=')
|
|
545
|
-
expect(result[0].vastUrl).to.include('&id=abc')
|
|
546
|
-
})
|
|
551
|
+
expect(result[0].requestId).to.equal('2d925f27f5079f');
|
|
552
|
+
expect(result[0].cpm).to.equal(0.01);
|
|
553
|
+
expect(result[0].mediaType).to.equal('video');
|
|
554
|
+
expect(result[0].vastUrl).to.include('https://ad.yieldlab.net/d/1111/2222/?ts=');
|
|
555
|
+
expect(result[0].vastUrl).to.include('&id=abc');
|
|
556
|
+
});
|
|
547
557
|
|
|
548
558
|
it('should add adUrl and native assets when type is Native', () => {
|
|
549
|
-
const result = spec.interpretResponse({body: [NATIVE_RESPONSE]}, {validBidRequests: [NATIVE_REQUEST()], queryParams: REQPARAMS})
|
|
550
|
-
|
|
551
|
-
expect(result[0].requestId).to.equal('2d925f27f5079f')
|
|
552
|
-
expect(result[0].cpm).to.equal(0.01)
|
|
553
|
-
expect(result[0].mediaType).to.equal('native')
|
|
554
|
-
expect(result[0].adUrl).to.include('https://ad.yieldlab.net/d/1111/2222/?ts=')
|
|
555
|
-
expect(result[0].native.title).to.equal('This is a great headline')
|
|
556
|
-
expect(result[0].native.body).to.equal('Native body value')
|
|
557
|
-
expect(result[0].native.image.url).to.equal('https://localhost:8080/yl-logo100x100.jpg')
|
|
558
|
-
expect(result[0].native.image.width).to.equal(100)
|
|
559
|
-
expect(result[0].native.image.height).to.equal(100)
|
|
560
|
-
expect(result[0].native.clickUrl).to.equal('https://www.yieldlab.de')
|
|
561
|
-
expect(result[0].native.impressionTrackers.length).to.equal(3)
|
|
562
|
-
})
|
|
559
|
+
const result = spec.interpretResponse({body: [NATIVE_RESPONSE]}, {validBidRequests: [NATIVE_REQUEST()], queryParams: REQPARAMS});
|
|
560
|
+
|
|
561
|
+
expect(result[0].requestId).to.equal('2d925f27f5079f');
|
|
562
|
+
expect(result[0].cpm).to.equal(0.01);
|
|
563
|
+
expect(result[0].mediaType).to.equal('native');
|
|
564
|
+
expect(result[0].adUrl).to.include('https://ad.yieldlab.net/d/1111/2222/?ts=');
|
|
565
|
+
expect(result[0].native.title).to.equal('This is a great headline');
|
|
566
|
+
expect(result[0].native.body).to.equal('Native body value');
|
|
567
|
+
expect(result[0].native.image.url).to.equal('https://localhost:8080/yl-logo100x100.jpg');
|
|
568
|
+
expect(result[0].native.image.width).to.equal(100);
|
|
569
|
+
expect(result[0].native.image.height).to.equal(100);
|
|
570
|
+
expect(result[0].native.clickUrl).to.equal('https://www.yieldlab.de');
|
|
571
|
+
expect(result[0].native.impressionTrackers.length).to.equal(3);
|
|
572
|
+
});
|
|
563
573
|
|
|
564
574
|
it('should add adUrl and default native assets when type is Native', () => {
|
|
565
575
|
const NATIVE_RESPONSE_2 = Object.assign({}, NATIVE_RESPONSE, {
|
|
566
576
|
native: {
|
|
567
577
|
link: {
|
|
568
|
-
url: 'https://www.yieldlab.de'
|
|
578
|
+
url: 'https://www.yieldlab.de',
|
|
569
579
|
},
|
|
570
580
|
assets: [],
|
|
571
|
-
imptrackers: []
|
|
572
|
-
}
|
|
573
|
-
})
|
|
574
|
-
const result = spec.interpretResponse({body: [NATIVE_RESPONSE_2]}, {validBidRequests: [NATIVE_REQUEST()], queryParams: REQPARAMS})
|
|
575
|
-
|
|
576
|
-
expect(result[0].requestId).to.equal('2d925f27f5079f')
|
|
577
|
-
expect(result[0].cpm).to.equal(0.01)
|
|
578
|
-
expect(result[0].mediaType).to.equal('native')
|
|
579
|
-
expect(result[0].adUrl).to.include('https://ad.yieldlab.net/d/1111/2222/?ts=')
|
|
580
|
-
expect(result[0].native.title).to.equal('')
|
|
581
|
-
expect(result[0].native.body).to.equal('')
|
|
582
|
-
expect(result[0].native.image.url).to.equal('')
|
|
583
|
-
expect(result[0].native.image.width).to.equal(0)
|
|
584
|
-
expect(result[0].native.image.height).to.equal(0)
|
|
585
|
-
})
|
|
581
|
+
imptrackers: [],
|
|
582
|
+
},
|
|
583
|
+
});
|
|
584
|
+
const result = spec.interpretResponse({body: [NATIVE_RESPONSE_2]}, {validBidRequests: [NATIVE_REQUEST()], queryParams: REQPARAMS});
|
|
585
|
+
|
|
586
|
+
expect(result[0].requestId).to.equal('2d925f27f5079f');
|
|
587
|
+
expect(result[0].cpm).to.equal(0.01);
|
|
588
|
+
expect(result[0].mediaType).to.equal('native');
|
|
589
|
+
expect(result[0].adUrl).to.include('https://ad.yieldlab.net/d/1111/2222/?ts=');
|
|
590
|
+
expect(result[0].native.title).to.equal('');
|
|
591
|
+
expect(result[0].native.body).to.equal('');
|
|
592
|
+
expect(result[0].native.image.url).to.equal('');
|
|
593
|
+
expect(result[0].native.image.width).to.equal(0);
|
|
594
|
+
expect(result[0].native.image.height).to.equal(0);
|
|
595
|
+
});
|
|
586
596
|
|
|
587
597
|
it('should append gdpr parameters to vastUrl', () => {
|
|
588
|
-
const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS_GDPR})
|
|
598
|
+
const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS_GDPR});
|
|
589
599
|
|
|
590
|
-
expect(result[0].vastUrl).to.include('&gdpr=true')
|
|
591
|
-
expect(result[0].vastUrl).to.include('&consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA')
|
|
592
|
-
})
|
|
600
|
+
expect(result[0].vastUrl).to.include('&gdpr=true');
|
|
601
|
+
expect(result[0].vastUrl).to.include('&consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
|
|
602
|
+
});
|
|
593
603
|
|
|
594
604
|
it('should add renderer if outstream context', () => {
|
|
595
605
|
const OUTSTREAM_REQUEST = Object.assign(DEFAULT_REQUEST(), {
|
|
596
606
|
mediaTypes: {
|
|
597
607
|
video: {
|
|
598
608
|
playerSize: [[640, 480]],
|
|
599
|
-
context: 'outstream'
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
})
|
|
603
|
-
const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [OUTSTREAM_REQUEST], queryParams: REQPARAMS})
|
|
604
|
-
|
|
605
|
-
expect(result[0].renderer.id).to.equal('2d925f27f5079f')
|
|
606
|
-
expect(result[0].renderer.url).to.equal('https://ad.adition.com/dynamic.ad?a=o193092&ma_loadEvent=ma-start-event')
|
|
607
|
-
expect(result[0].width).to.equal(640)
|
|
608
|
-
expect(result[0].height).to.equal(480)
|
|
609
|
-
})
|
|
609
|
+
context: 'outstream',
|
|
610
|
+
},
|
|
611
|
+
},
|
|
612
|
+
});
|
|
613
|
+
const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [OUTSTREAM_REQUEST], queryParams: REQPARAMS});
|
|
614
|
+
|
|
615
|
+
expect(result[0].renderer.id).to.equal('2d925f27f5079f');
|
|
616
|
+
expect(result[0].renderer.url).to.equal('https://ad.adition.com/dynamic.ad?a=o193092&ma_loadEvent=ma-start-event');
|
|
617
|
+
expect(result[0].width).to.equal(640);
|
|
618
|
+
expect(result[0].height).to.equal(480);
|
|
619
|
+
});
|
|
610
620
|
|
|
611
621
|
it('should add pvid to adtag urls when present', () => {
|
|
612
|
-
const result = spec.interpretResponse({body: [PVID_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS})
|
|
622
|
+
const result = spec.interpretResponse({body: [PVID_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS});
|
|
613
623
|
|
|
614
|
-
expect(result[0].ad).to.include('&pvid=43513f11-55a0-4a83-94e5-0ebc08f54a2c')
|
|
615
|
-
expect(result[0].vastUrl).to.include('&pvid=43513f11-55a0-4a83-94e5-0ebc08f54a2c')
|
|
616
|
-
})
|
|
624
|
+
expect(result[0].ad).to.include('&pvid=43513f11-55a0-4a83-94e5-0ebc08f54a2c');
|
|
625
|
+
expect(result[0].vastUrl).to.include('&pvid=43513f11-55a0-4a83-94e5-0ebc08f54a2c');
|
|
626
|
+
});
|
|
617
627
|
|
|
618
628
|
it('should append iab_content to vastUrl', () => {
|
|
619
|
-
const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS_IAB_CONTENT})
|
|
620
|
-
expect(result[0].vastUrl).to.include('&iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0')
|
|
621
|
-
})
|
|
622
|
-
})
|
|
629
|
+
const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS_IAB_CONTENT});
|
|
630
|
+
expect(result[0].vastUrl).to.include('&iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0');
|
|
631
|
+
});
|
|
632
|
+
});
|
|
623
633
|
|
|
624
634
|
describe('getUserSyncs', () => {
|
|
625
635
|
const syncOptions = {
|
|
626
636
|
iframeEnabled: true,
|
|
627
|
-
pixelEnabled: false
|
|
637
|
+
pixelEnabled: false,
|
|
628
638
|
};
|
|
629
639
|
const expectedUrlSnippets = ['https://ad.yieldlab.net/d/6846326/766/2x2?', 'ts=', 'type=h'];
|
|
630
640
|
|
|
@@ -632,9 +642,9 @@ describe('yieldlabBidAdapter', () => {
|
|
|
632
642
|
const bidRequest = {
|
|
633
643
|
gdprConsent: {
|
|
634
644
|
consentString: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA',
|
|
635
|
-
gdprApplies: true
|
|
645
|
+
gdprApplies: true,
|
|
636
646
|
},
|
|
637
|
-
uspConsent: '1YYY'
|
|
647
|
+
uspConsent: '1YYY',
|
|
638
648
|
};
|
|
639
649
|
const sync = spec.getUserSyncs(syncOptions, [], bidRequest.gdprConsent, bidRequest.uspConsent);
|
|
640
650
|
expect(expectedUrlSnippets.every(urlSnippet => sync[0].url.includes(urlSnippet)));
|
|
@@ -647,8 +657,8 @@ describe('yieldlabBidAdapter', () => {
|
|
|
647
657
|
|
|
648
658
|
it('should return user sync even without gdprApplies in gdprConsent', () => {
|
|
649
659
|
const gdprConsent = {
|
|
650
|
-
consentString: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA'
|
|
651
|
-
}
|
|
660
|
+
consentString: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA',
|
|
661
|
+
};
|
|
652
662
|
const sync = spec.getUserSyncs(syncOptions, [], gdprConsent, undefined);
|
|
653
663
|
expect(expectedUrlSnippets.every(urlSnippet => sync[0].url.includes(urlSnippet)));
|
|
654
664
|
expect(sync[0].url).to.have.string('gdpr_consent=' + gdprConsent.consentString);
|
|
@@ -662,64 +672,64 @@ describe('yieldlabBidAdapter', () => {
|
|
|
662
672
|
const getFloor = () => {
|
|
663
673
|
return {
|
|
664
674
|
currency: currency,
|
|
665
|
-
floor: floor
|
|
666
|
-
}
|
|
667
|
-
}
|
|
675
|
+
floor: floor,
|
|
676
|
+
};
|
|
677
|
+
};
|
|
668
678
|
|
|
669
679
|
it('should add valid bid floor in the format floor={adslotId}:{floorPriceInCents}[, ...]', () => {
|
|
670
680
|
bidRequest = Object.assign(DEFAULT_REQUEST(), {
|
|
671
681
|
getFloor: () => {
|
|
672
682
|
return {
|
|
673
683
|
currency: 'EUR',
|
|
674
|
-
floor: 1.33
|
|
675
|
-
}
|
|
684
|
+
floor: 1.33,
|
|
685
|
+
};
|
|
676
686
|
}});
|
|
677
687
|
bidRequest2 = Object.assign(DEFAULT_REQUEST(), {
|
|
678
688
|
params: {
|
|
679
|
-
adslotId: 2222
|
|
689
|
+
adslotId: 2222,
|
|
680
690
|
},
|
|
681
691
|
getFloor: () => {
|
|
682
692
|
return {
|
|
683
693
|
currency: 'EUR',
|
|
684
|
-
floor: 2.99
|
|
685
|
-
}
|
|
686
|
-
}
|
|
694
|
+
floor: 2.99,
|
|
695
|
+
};
|
|
696
|
+
},
|
|
687
697
|
});
|
|
688
|
-
const result = spec.buildRequests([bidRequest, bidRequest2], REQPARAMS)
|
|
689
|
-
expect(result).to.have.nested.property('queryParams.floor', '1111:133,2222:299')
|
|
698
|
+
const result = spec.buildRequests([bidRequest, bidRequest2], REQPARAMS);
|
|
699
|
+
expect(result).to.have.nested.property('queryParams.floor', '1111:133,2222:299');
|
|
690
700
|
});
|
|
691
701
|
|
|
692
702
|
it('should round the floor price up', () => {
|
|
693
703
|
currency = 'EUR';
|
|
694
704
|
floor = 0.745;
|
|
695
|
-
bidRequest = Object.assign(DEFAULT_REQUEST(), {getFloor})
|
|
696
|
-
const result = spec.buildRequests([bidRequest], REQPARAMS)
|
|
697
|
-
expect(result).to.have.nested.property('queryParams.floor', '1111:75')
|
|
705
|
+
bidRequest = Object.assign(DEFAULT_REQUEST(), {getFloor});
|
|
706
|
+
const result = spec.buildRequests([bidRequest], REQPARAMS);
|
|
707
|
+
expect(result).to.have.nested.property('queryParams.floor', '1111:75');
|
|
698
708
|
});
|
|
699
709
|
|
|
700
710
|
it('should round the floor price down', () => {
|
|
701
711
|
currency = 'EUR';
|
|
702
712
|
floor = 0.034;
|
|
703
|
-
bidRequest = Object.assign(DEFAULT_REQUEST(), {getFloor})
|
|
704
|
-
const result = spec.buildRequests([bidRequest], REQPARAMS)
|
|
705
|
-
expect(result).to.have.nested.property('queryParams.floor', '1111:3')
|
|
713
|
+
bidRequest = Object.assign(DEFAULT_REQUEST(), {getFloor});
|
|
714
|
+
const result = spec.buildRequests([bidRequest], REQPARAMS);
|
|
715
|
+
expect(result).to.have.nested.property('queryParams.floor', '1111:3');
|
|
706
716
|
});
|
|
707
717
|
|
|
708
718
|
it('should not add empty bid floor', () => {
|
|
709
719
|
bidRequest = Object.assign(DEFAULT_REQUEST(), {
|
|
710
720
|
getFloor: () => {
|
|
711
721
|
return {};
|
|
712
|
-
}})
|
|
713
|
-
const result = spec.buildRequests([bidRequest], REQPARAMS)
|
|
714
|
-
expect(result).not.to.have.nested.property('queryParams.floor')
|
|
722
|
+
}});
|
|
723
|
+
const result = spec.buildRequests([bidRequest], REQPARAMS);
|
|
724
|
+
expect(result).not.to.have.nested.property('queryParams.floor');
|
|
715
725
|
});
|
|
716
726
|
|
|
717
727
|
it('should not add bid floor when currency is not matching', () => {
|
|
718
728
|
currency = 'USD';
|
|
719
729
|
floor = 1.33;
|
|
720
|
-
bidRequest = Object.assign(DEFAULT_REQUEST(), {getFloor})
|
|
721
|
-
const result = spec.buildRequests([bidRequest], REQPARAMS)
|
|
722
|
-
expect(result).not.to.have.nested.property('queryParams.floor')
|
|
730
|
+
bidRequest = Object.assign(DEFAULT_REQUEST(), {getFloor});
|
|
731
|
+
const result = spec.buildRequests([bidRequest], REQPARAMS);
|
|
732
|
+
expect(result).not.to.have.nested.property('queryParams.floor');
|
|
723
733
|
});
|
|
724
734
|
});
|
|
725
|
-
})
|
|
735
|
+
});
|