prebid.js 7.33.0 → 7.35.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/.devcontainer/devcontainer.json +2 -1
- package/.github/workflows/issue_tracker.yml +27 -16
- 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/admaticBidAdapter.js +1 -1
- package/dist/admixerBidAdapter.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/arcspanRtdProvider.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/bliinkBidAdapter.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/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.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/cwireBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/emx_digitalBidAdapter.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/hadronIdSystem.js +1 -1
- package/dist/holidBidAdapter.js +1 -1
- 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/kargoBidAdapter.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/lotamePanoramaIdSystem.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/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +140 -149
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/ortbConverter.js +1 -1
- 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/prebidServerBidAdapter.js +1 -1
- package/dist/priceFloors.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pulsepointBidAdapter.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/smartytechBidAdapter.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/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspBidAdapter.js +1 -1
- package/dist/zeusPrimeRtdProvider.js +4 -14
- package/integrationExamples/gpt/hello_world.html +0 -0
- package/libraries/ortbConverter/processors/default.js +19 -1
- package/modules/.submodules.json +1 -0
- package/modules/admaticBidAdapter.js +2 -1
- package/modules/admixerBidAdapter.js +26 -4
- package/modules/adnuntiusBidAdapter.js +36 -38
- package/modules/adyoulikeBidAdapter.js +2 -0
- package/modules/arcspanRtdProvider.js +73 -0
- package/modules/arcspanRtdProvider.md +11 -0
- package/modules/bliinkBidAdapter.js +1 -1
- package/modules/consentManagement.js +33 -5
- package/modules/consumableBidAdapter.js +20 -2
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/cwireBidAdapter.js +169 -242
- package/modules/cwireBidAdapter.md +15 -14
- package/modules/emx_digitalBidAdapter.js +9 -2
- package/modules/hadronIdSystem.js +37 -32
- package/modules/holidBidAdapter.js +9 -4
- package/modules/kargoBidAdapter.js +5 -1
- package/modules/lotamePanoramaIdSystem.js +9 -1
- package/modules/nextMillenniumBidAdapter.js +19 -9
- package/modules/nexx360BidAdapter.js +1 -2
- package/modules/onetagBidAdapter.js +12 -1
- package/modules/openxBidAdapter.js +5 -0
- package/modules/outbrainBidAdapter.js +103 -6
- package/modules/permutiveRtdProvider.js +17 -12
- package/modules/prebidServerBidAdapter/index.js +14 -1
- package/modules/prebidServerBidAdapter/ortbConverter.js +1 -1
- package/modules/priceFloors.js +7 -8
- package/modules/pulsepointBidAdapter.js +2 -0
- package/modules/seedingAllianceBidAdapter.js +129 -116
- package/modules/smartadserverBidAdapter.js +39 -28
- package/modules/smartyadsBidAdapter.md +9 -0
- package/modules/smartytechBidAdapter.js +67 -10
- package/modules/smartytechBidAdapter.md +44 -33
- package/modules/sonobiBidAdapter.js +17 -10
- package/modules/taboolaBidAdapter.js +2 -1
- package/modules/tripleliftBidAdapter.js +4 -0
- package/modules/vidazooBidAdapter.js +56 -22
- package/modules/zeta_global_sspBidAdapter.js +15 -0
- package/modules/zeusPrimeRtdProvider.js +3 -323
- package/modules/zeusPrimeRtdProvider.md +3 -0
- package/package.json +1 -1
- package/src/adloader.js +2 -1
- package/src/auction.js +2 -11
- package/src/prebid.js +8 -0
- package/src/utils/cpm.js +17 -0
- package/test/spec/modules/admixerBidAdapter_spec.js +140 -60
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +120 -120
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +3 -0
- package/test/spec/modules/arcspanRtdProvider_spec.js +187 -0
- package/test/spec/modules/bliinkBidAdapter_spec.js +7 -7
- package/test/spec/modules/consentManagement_spec.js +49 -1
- package/test/spec/modules/consumableBidAdapter_spec.js +46 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +249 -335
- package/test/spec/modules/emx_digitalBidAdapter_spec.js +30 -1
- package/test/spec/modules/hadronIdSystem_spec.js +4 -6
- package/test/spec/modules/holidBidAdapter_spec.js +29 -0
- package/test/spec/modules/kargoBidAdapter_spec.js +32 -0
- package/test/spec/modules/lotamePanoramaIdSystem_spec.js +16 -10
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +14 -2
- package/test/spec/modules/nexx360BidAdapter_spec.js +0 -4
- package/test/spec/modules/onetagBidAdapter_spec.js +43 -0
- package/test/spec/modules/openxBidAdapter_spec.js +41 -0
- package/test/spec/modules/openxOrtbBidAdapter_spec.js +41 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +182 -18
- package/test/spec/modules/prebidServerBidAdapter_spec.js +138 -0
- package/test/spec/modules/pulsepointBidAdapter_spec.js +11 -1
- package/test/spec/modules/seedingAllianceAdapter_spec.js +66 -23
- package/test/spec/modules/smartadserverBidAdapter_spec.js +116 -5
- package/test/spec/modules/smartytechBidAdapter_spec.js +172 -14
- package/test/spec/modules/sonobiBidAdapter_spec.js +2 -1
- package/test/spec/modules/taboolaBidAdapter_spec.js +12 -3
- package/test/spec/modules/tripleliftBidAdapter_spec.js +13 -0
- package/test/spec/modules/userId_spec.js +19 -14
- package/test/spec/modules/vidazooBidAdapter_spec.js +61 -22
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +8 -0
- package/test/spec/ortbConverter/default_processors_spec.js +23 -0
- package/test/spec/unit/pbjs_api_spec.js +14 -0
- package/test/spec/unit/utils/cpm_spec.js +64 -0
- package/test/spec/modules/zeusPrimeRtdProvider_spec.js +0 -410
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {expect} from 'chai';
|
|
2
|
-
import {spec} from 'modules/outbrainBidAdapter.js';
|
|
3
|
-
import {config} from 'src/config.js';
|
|
4
|
-
import {server} from 'test/mocks/xhr';
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { spec } from 'modules/outbrainBidAdapter.js';
|
|
3
|
+
import { config } from 'src/config.js';
|
|
4
|
+
import { server } from 'test/mocks/xhr';
|
|
5
5
|
import { createEidsArray } from 'modules/userId/eids.js';
|
|
6
6
|
|
|
7
7
|
describe('Outbrain Adapter', function () {
|
|
@@ -45,6 +45,26 @@ describe('Outbrain Adapter', function () {
|
|
|
45
45
|
]
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
const videoBidRequestParams = {
|
|
49
|
+
mediaTypes: {
|
|
50
|
+
video: {
|
|
51
|
+
playerSize: [[640, 480]],
|
|
52
|
+
mimes: ['video/mp4'],
|
|
53
|
+
protocols: [1, 2, 3, 4, 5, 6, 7, 8],
|
|
54
|
+
playbackmethod: [1],
|
|
55
|
+
skip: 1,
|
|
56
|
+
api: [2],
|
|
57
|
+
minbitrate: 1000,
|
|
58
|
+
maxbitrate: 3000,
|
|
59
|
+
minduration: 3,
|
|
60
|
+
maxduration: 10,
|
|
61
|
+
startdelay: 2,
|
|
62
|
+
placement: 4,
|
|
63
|
+
linearity: 1
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
48
68
|
describe('isBidRequestValid', function () {
|
|
49
69
|
before(() => {
|
|
50
70
|
config.setConfig({
|
|
@@ -93,6 +113,34 @@ describe('Outbrain Adapter', function () {
|
|
|
93
113
|
}
|
|
94
114
|
expect(spec.isBidRequestValid(bid)).to.equal(true)
|
|
95
115
|
})
|
|
116
|
+
it('should succeed when bid contains video', function () {
|
|
117
|
+
const bid = {
|
|
118
|
+
bidder: 'outbrain',
|
|
119
|
+
params: {
|
|
120
|
+
publisher: {
|
|
121
|
+
id: 'publisher-id',
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
...videoBidRequestParams,
|
|
125
|
+
}
|
|
126
|
+
expect(spec.isBidRequestValid(bid)).to.equal(true)
|
|
127
|
+
})
|
|
128
|
+
it('should fail when bid contains insufficient video information', function () {
|
|
129
|
+
const bid = {
|
|
130
|
+
bidder: 'outbrain',
|
|
131
|
+
params: {
|
|
132
|
+
publisher: {
|
|
133
|
+
id: 'publisher-id',
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
mediaTypes: {
|
|
137
|
+
video: {
|
|
138
|
+
context: 'outstream'
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
}
|
|
142
|
+
expect(spec.isBidRequestValid(bid)).to.equal(false)
|
|
143
|
+
})
|
|
96
144
|
it('should fail if publisher id is not set', function () {
|
|
97
145
|
const bid = {
|
|
98
146
|
bidder: 'outbrain',
|
|
@@ -298,6 +346,61 @@ describe('Outbrain Adapter', function () {
|
|
|
298
346
|
expect(res.data).to.deep.equal(JSON.stringify(expectedData))
|
|
299
347
|
})
|
|
300
348
|
|
|
349
|
+
it('should build video request', function () {
|
|
350
|
+
const bidRequest = {
|
|
351
|
+
...commonBidRequest,
|
|
352
|
+
...videoBidRequestParams,
|
|
353
|
+
}
|
|
354
|
+
const expectedData = {
|
|
355
|
+
site: {
|
|
356
|
+
page: 'https://example.com/',
|
|
357
|
+
publisher: {
|
|
358
|
+
id: 'publisher-id'
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
device: {
|
|
362
|
+
ua: navigator.userAgent
|
|
363
|
+
},
|
|
364
|
+
source: {
|
|
365
|
+
fd: 1
|
|
366
|
+
},
|
|
367
|
+
cur: [
|
|
368
|
+
'USD'
|
|
369
|
+
],
|
|
370
|
+
imp: [
|
|
371
|
+
{
|
|
372
|
+
id: '1',
|
|
373
|
+
video: {
|
|
374
|
+
w: 640,
|
|
375
|
+
h: 480,
|
|
376
|
+
protocols: [1, 2, 3, 4, 5, 6, 7, 8],
|
|
377
|
+
playbackmethod: [1],
|
|
378
|
+
mimes: ['video/mp4'],
|
|
379
|
+
skip: 1,
|
|
380
|
+
api: [2],
|
|
381
|
+
minbitrate: 1000,
|
|
382
|
+
maxbitrate: 3000,
|
|
383
|
+
minduration: 3,
|
|
384
|
+
maxduration: 10,
|
|
385
|
+
startdelay: 2,
|
|
386
|
+
placement: 4,
|
|
387
|
+
linearity: 1
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
],
|
|
391
|
+
ext: {
|
|
392
|
+
prebid: {
|
|
393
|
+
channel: {
|
|
394
|
+
name: 'pbjs', version: '$prebid.version$'
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
const res = spec.buildRequests([bidRequest], commonBidderRequest)
|
|
400
|
+
expect(res.url).to.equal('https://bidder-url.com')
|
|
401
|
+
expect(res.data).to.deep.equal(JSON.stringify(expectedData))
|
|
402
|
+
})
|
|
403
|
+
|
|
301
404
|
it('should pass optional parameters in request', function () {
|
|
302
405
|
const bidRequest = {
|
|
303
406
|
...commonBidRequest,
|
|
@@ -390,7 +493,7 @@ describe('Outbrain Adapter', function () {
|
|
|
390
493
|
...commonBidRequest,
|
|
391
494
|
...nativeBidRequestParams,
|
|
392
495
|
}
|
|
393
|
-
config.setConfig({coppa: true})
|
|
496
|
+
config.setConfig({ coppa: true })
|
|
394
497
|
|
|
395
498
|
const res = spec.buildRequests([bidRequest], commonBidderRequest)
|
|
396
499
|
const resData = JSON.parse(res.data)
|
|
@@ -412,7 +515,7 @@ describe('Outbrain Adapter', function () {
|
|
|
412
515
|
let res = spec.buildRequests([bidRequest], commonBidderRequest);
|
|
413
516
|
const resData = JSON.parse(res.data)
|
|
414
517
|
expect(resData.user.ext.eids).to.deep.equal([
|
|
415
|
-
{source: 'liveramp.com', uids: [{id: 'id-value', atype: 3}]}
|
|
518
|
+
{ source: 'liveramp.com', uids: [{ id: 'id-value', atype: 3 }] }
|
|
416
519
|
]);
|
|
417
520
|
});
|
|
418
521
|
|
|
@@ -421,7 +524,7 @@ describe('Outbrain Adapter', function () {
|
|
|
421
524
|
...commonBidRequest,
|
|
422
525
|
...nativeBidRequestParams,
|
|
423
526
|
}
|
|
424
|
-
bidRequest.getFloor = function() {
|
|
527
|
+
bidRequest.getFloor = function () {
|
|
425
528
|
return {
|
|
426
529
|
currency: 'USD',
|
|
427
530
|
floor: 1.23,
|
|
@@ -619,6 +722,67 @@ describe('Outbrain Adapter', function () {
|
|
|
619
722
|
const res = spec.interpretResponse(serverResponse, request)
|
|
620
723
|
expect(res).to.deep.equal(expectedRes)
|
|
621
724
|
});
|
|
725
|
+
|
|
726
|
+
it('should interpret video response', function () {
|
|
727
|
+
const serverResponse = {
|
|
728
|
+
body: {
|
|
729
|
+
id: '123',
|
|
730
|
+
seatbid: [
|
|
731
|
+
{
|
|
732
|
+
bid: [
|
|
733
|
+
{
|
|
734
|
+
id: '111',
|
|
735
|
+
impid: '1',
|
|
736
|
+
price: 1.1,
|
|
737
|
+
adm: '\u003cVAST version="3.0"\u003e\u003cAd\u003e\u003cInLine\u003e\u003cAdSystem\u003ezemanta\u003c/AdSystem\u003e\u003cAdTitle\u003e1\u003c/AdTitle\u003e\u003cImpression\u003ehttp://win.com\u003c/Impression\u003e\u003cImpression\u003ehttp://example.com/imptracker\u003c/Impression\u003e\u003cCreatives\u003e\u003cCreative\u003e\u003cLinear\u003e\u003cDuration\u003e00:00:25\u003c/Duration\u003e\u003cTrackingEvents\u003e\u003cTracking event="start"\u003ehttp://example.com/start\u003c/Tracking\u003e\u003cTracking event="progress" offset="00:00:03"\u003ehttp://example.com/p3s\u003c/Tracking\u003e\u003c/TrackingEvents\u003e\u003cVideoClicks\u003e\u003cClickThrough\u003ehttp://link.com\u003c/ClickThrough\u003e\u003c/VideoClicks\u003e\u003cMediaFiles\u003e\u003cMediaFile delivery="progressive" type="video/mp4" bitrate="700" width="640" height="360"\u003ehttps://example.com/123_360p.mp4\u003c/MediaFile\u003e\u003c/MediaFiles\u003e\u003c/Linear\u003e\u003c/Creative\u003e\u003c/Creatives\u003e\u003c/InLine\u003e\u003c/Ad\u003e\u003c/VAST\u003e',
|
|
738
|
+
adid: '100',
|
|
739
|
+
cid: '5',
|
|
740
|
+
crid: '29998660',
|
|
741
|
+
cat: ['cat-1'],
|
|
742
|
+
adomain: [
|
|
743
|
+
'example.com'
|
|
744
|
+
],
|
|
745
|
+
nurl: 'http://example.com/win/${AUCTION_PRICE}'
|
|
746
|
+
}
|
|
747
|
+
],
|
|
748
|
+
seat: '100',
|
|
749
|
+
group: 1
|
|
750
|
+
}
|
|
751
|
+
],
|
|
752
|
+
bidid: '456',
|
|
753
|
+
cur: 'USD'
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
const request = {
|
|
757
|
+
bids: [
|
|
758
|
+
{
|
|
759
|
+
...commonBidRequest,
|
|
760
|
+
...videoBidRequestParams
|
|
761
|
+
}
|
|
762
|
+
]
|
|
763
|
+
}
|
|
764
|
+
const expectedRes = [
|
|
765
|
+
{
|
|
766
|
+
requestId: request.bids[0].bidId,
|
|
767
|
+
cpm: 1.1,
|
|
768
|
+
creativeId: '29998660',
|
|
769
|
+
ttl: 360,
|
|
770
|
+
netRevenue: false,
|
|
771
|
+
currency: 'USD',
|
|
772
|
+
mediaType: 'video',
|
|
773
|
+
nurl: 'http://example.com/win/${AUCTION_PRICE}',
|
|
774
|
+
vastXml: '<VAST version=\"3.0\"><Ad><InLine><AdSystem>zemanta</AdSystem><AdTitle>1</AdTitle><Impression>http://win.com</Impression><Impression>http://example.com/imptracker</Impression><Creatives><Creative><Linear><Duration>00:00:25</Duration><TrackingEvents><Tracking event=\"start\">http://example.com/start</Tracking><Tracking event=\"progress\" offset=\"00:00:03\">http://example.com/p3s</Tracking></TrackingEvents><VideoClicks><ClickThrough>http://link.com</ClickThrough></VideoClicks><MediaFiles><MediaFile delivery=\"progressive\" type=\"video/mp4\" bitrate=\"700\" width=\"640\" height=\"360\">https://example.com/123_360p.mp4</MediaFile></MediaFiles></Linear></Creative></Creatives></InLine></Ad></VAST>',
|
|
775
|
+
meta: {
|
|
776
|
+
'advertiserDomains': [
|
|
777
|
+
'example.com'
|
|
778
|
+
]
|
|
779
|
+
},
|
|
780
|
+
}
|
|
781
|
+
]
|
|
782
|
+
|
|
783
|
+
const res = spec.interpretResponse(serverResponse, request)
|
|
784
|
+
expect(res).to.deep.equal(expectedRes)
|
|
785
|
+
});
|
|
622
786
|
})
|
|
623
787
|
})
|
|
624
788
|
|
|
@@ -637,41 +801,41 @@ describe('Outbrain Adapter', function () {
|
|
|
637
801
|
})
|
|
638
802
|
|
|
639
803
|
it('should return user sync if pixel enabled with outbrain config', function () {
|
|
640
|
-
const ret = spec.getUserSyncs({pixelEnabled: true})
|
|
641
|
-
expect(ret).to.deep.equal([{type: 'image', url: usersyncUrl}])
|
|
804
|
+
const ret = spec.getUserSyncs({ pixelEnabled: true })
|
|
805
|
+
expect(ret).to.deep.equal([{ type: 'image', url: usersyncUrl }])
|
|
642
806
|
})
|
|
643
807
|
|
|
644
808
|
it('should not return user sync if pixel disabled', function () {
|
|
645
|
-
const ret = spec.getUserSyncs({pixelEnabled: false})
|
|
809
|
+
const ret = spec.getUserSyncs({ pixelEnabled: false })
|
|
646
810
|
expect(ret).to.be.an('array').that.is.empty
|
|
647
811
|
})
|
|
648
812
|
|
|
649
813
|
it('should not return user sync if url is not set', function () {
|
|
650
814
|
config.resetConfig()
|
|
651
|
-
const ret = spec.getUserSyncs({pixelEnabled: true})
|
|
815
|
+
const ret = spec.getUserSyncs({ pixelEnabled: true })
|
|
652
816
|
expect(ret).to.be.an('array').that.is.empty
|
|
653
817
|
})
|
|
654
818
|
|
|
655
|
-
it('should pass GDPR consent', function() {
|
|
656
|
-
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {gdprApplies: true, consentString: 'foo'}, undefined)).to.deep.equal([{
|
|
819
|
+
it('should pass GDPR consent', function () {
|
|
820
|
+
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: true, consentString: 'foo' }, undefined)).to.deep.equal([{
|
|
657
821
|
type: 'image', url: `${usersyncUrl}?gdpr=1&gdpr_consent=foo`
|
|
658
822
|
}]);
|
|
659
|
-
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {gdprApplies: false, consentString: 'foo'}, undefined)).to.deep.equal([{
|
|
823
|
+
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: false, consentString: 'foo' }, undefined)).to.deep.equal([{
|
|
660
824
|
type: 'image', url: `${usersyncUrl}?gdpr=0&gdpr_consent=foo`
|
|
661
825
|
}]);
|
|
662
|
-
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {gdprApplies: true, consentString: undefined}, undefined)).to.deep.equal([{
|
|
826
|
+
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: true, consentString: undefined }, undefined)).to.deep.equal([{
|
|
663
827
|
type: 'image', url: `${usersyncUrl}?gdpr=1&gdpr_consent=`
|
|
664
828
|
}]);
|
|
665
829
|
});
|
|
666
830
|
|
|
667
|
-
it('should pass US consent', function() {
|
|
831
|
+
it('should pass US consent', function () {
|
|
668
832
|
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, undefined, '1NYN')).to.deep.equal([{
|
|
669
833
|
type: 'image', url: `${usersyncUrl}?us_privacy=1NYN`
|
|
670
834
|
}]);
|
|
671
835
|
});
|
|
672
836
|
|
|
673
|
-
it('should pass GDPR and US consent', function() {
|
|
674
|
-
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {gdprApplies: true, consentString: 'foo'}, '1NYN')).to.deep.equal([{
|
|
837
|
+
it('should pass GDPR and US consent', function () {
|
|
838
|
+
expect(spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: true, consentString: 'foo' }, '1NYN')).to.deep.equal([{
|
|
675
839
|
type: 'image', url: `${usersyncUrl}?gdpr=1&gdpr_consent=foo&us_privacy=1NYN`
|
|
676
840
|
}]);
|
|
677
841
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable no-trailing-spaces */
|
|
1
2
|
import {expect} from 'chai';
|
|
2
3
|
import {
|
|
3
4
|
PrebidServer as Adapter,
|
|
@@ -1505,6 +1506,28 @@ describe('S2S Adapter', function () {
|
|
|
1505
1506
|
});
|
|
1506
1507
|
});
|
|
1507
1508
|
|
|
1509
|
+
it('site should not be present when app is present', function () {
|
|
1510
|
+
const _config = {
|
|
1511
|
+
s2sConfig: CONFIG,
|
|
1512
|
+
app: { bundle: 'com.test.app' },
|
|
1513
|
+
site: {
|
|
1514
|
+
publisher: {
|
|
1515
|
+
id: '1234',
|
|
1516
|
+
domain: 'test.com'
|
|
1517
|
+
},
|
|
1518
|
+
content: {
|
|
1519
|
+
language: 'en'
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
};
|
|
1523
|
+
|
|
1524
|
+
config.setConfig(_config);
|
|
1525
|
+
adapter.callBids(REQUEST, BID_REQUESTS, addBidResponse, done, ajax);
|
|
1526
|
+
const requestBid = JSON.parse(server.requests[0].requestBody);
|
|
1527
|
+
expect(requestBid.site).to.not.exist;
|
|
1528
|
+
expect(requestBid.app).to.exist.and.to.be.a('object');
|
|
1529
|
+
});
|
|
1530
|
+
|
|
1508
1531
|
it('adds appnexus aliases to request', function () {
|
|
1509
1532
|
config.setConfig({ s2sConfig: CONFIG });
|
|
1510
1533
|
|
|
@@ -1703,6 +1726,121 @@ describe('S2S Adapter', function () {
|
|
|
1703
1726
|
}]);
|
|
1704
1727
|
});
|
|
1705
1728
|
|
|
1729
|
+
describe('filterSettings', function () {
|
|
1730
|
+
const getRequestBid = userSync => {
|
|
1731
|
+
let cookieSyncConfig = utils.deepClone(CONFIG);
|
|
1732
|
+
const s2sBidRequest = utils.deepClone(REQUEST);
|
|
1733
|
+
cookieSyncConfig.syncEndpoint = { p1Consent: 'https://prebid.adnxs.com/pbs/v1/cookie_sync' };
|
|
1734
|
+
s2sBidRequest.s2sConfig = cookieSyncConfig;
|
|
1735
|
+
|
|
1736
|
+
config.setConfig({ userSync, s2sConfig: cookieSyncConfig });
|
|
1737
|
+
|
|
1738
|
+
let bidRequest = utils.deepClone(BID_REQUESTS);
|
|
1739
|
+
adapter.callBids(s2sBidRequest, bidRequest, addBidResponse, done, ajax);
|
|
1740
|
+
return JSON.parse(server.requests[0].requestBody);
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
it('correctly adds filterSettings to the cookie_sync request if userSync.filterSettings is present in the config and only the all key is present in userSync.filterSettings', function () {
|
|
1744
|
+
const userSync = {
|
|
1745
|
+
filterSettings: {
|
|
1746
|
+
all: {
|
|
1747
|
+
bidders: ['appnexus', 'rubicon', 'pubmatic'],
|
|
1748
|
+
filter: 'exclude'
|
|
1749
|
+
}
|
|
1750
|
+
}
|
|
1751
|
+
};
|
|
1752
|
+
const requestBid = getRequestBid(userSync);
|
|
1753
|
+
|
|
1754
|
+
expect(requestBid.filterSettings).to.deep.equal({
|
|
1755
|
+
'image': {
|
|
1756
|
+
'bidders': ['appnexus', 'rubicon', 'pubmatic'],
|
|
1757
|
+
'filter': 'exclude'
|
|
1758
|
+
},
|
|
1759
|
+
'iframe': {
|
|
1760
|
+
'bidders': ['appnexus', 'rubicon', 'pubmatic'],
|
|
1761
|
+
'filter': 'exclude'
|
|
1762
|
+
}
|
|
1763
|
+
});
|
|
1764
|
+
});
|
|
1765
|
+
|
|
1766
|
+
it('correctly adds filterSettings to the cookie_sync request if userSync.filterSettings is present in the config and only the iframe key is present in userSync.filterSettings', function () {
|
|
1767
|
+
const userSync = {
|
|
1768
|
+
filterSettings: {
|
|
1769
|
+
iframe: {
|
|
1770
|
+
bidders: ['rubicon', 'pubmatic'],
|
|
1771
|
+
filter: 'include'
|
|
1772
|
+
}
|
|
1773
|
+
}
|
|
1774
|
+
};
|
|
1775
|
+
const requestBid = getRequestBid(userSync);
|
|
1776
|
+
|
|
1777
|
+
expect(requestBid.filterSettings).to.deep.equal({
|
|
1778
|
+
'image': {
|
|
1779
|
+
'bidders': '*',
|
|
1780
|
+
'filter': 'include'
|
|
1781
|
+
},
|
|
1782
|
+
'iframe': {
|
|
1783
|
+
'bidders': ['rubicon', 'pubmatic'],
|
|
1784
|
+
'filter': 'include'
|
|
1785
|
+
}
|
|
1786
|
+
});
|
|
1787
|
+
});
|
|
1788
|
+
|
|
1789
|
+
it('correctly adds filterSettings to the cookie_sync request if userSync.filterSettings is present in the config and the image and iframe keys are both present in userSync.filterSettings', function () {
|
|
1790
|
+
const userSync = {
|
|
1791
|
+
filterSettings: {
|
|
1792
|
+
image: {
|
|
1793
|
+
bidders: ['triplelift', 'appnexus'],
|
|
1794
|
+
filter: 'include'
|
|
1795
|
+
},
|
|
1796
|
+
iframe: {
|
|
1797
|
+
bidders: ['pulsepoint', 'triplelift', 'appnexus', 'rubicon'],
|
|
1798
|
+
filter: 'exclude'
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1801
|
+
};
|
|
1802
|
+
const requestBid = getRequestBid(userSync);
|
|
1803
|
+
|
|
1804
|
+
expect(requestBid.filterSettings).to.deep.equal({
|
|
1805
|
+
'image': {
|
|
1806
|
+
'bidders': ['triplelift', 'appnexus'],
|
|
1807
|
+
'filter': 'include'
|
|
1808
|
+
},
|
|
1809
|
+
'iframe': {
|
|
1810
|
+
'bidders': ['pulsepoint', 'triplelift', 'appnexus', 'rubicon'],
|
|
1811
|
+
'filter': 'exclude'
|
|
1812
|
+
}
|
|
1813
|
+
});
|
|
1814
|
+
});
|
|
1815
|
+
|
|
1816
|
+
it('correctly adds filterSettings to the cookie_sync request if userSync.filterSettings is present in the config and the all and iframe keys are both present in userSync.filterSettings', function () {
|
|
1817
|
+
const userSync = {
|
|
1818
|
+
filterSettings: {
|
|
1819
|
+
all: {
|
|
1820
|
+
bidders: ['triplelift', 'appnexus'],
|
|
1821
|
+
filter: 'include'
|
|
1822
|
+
},
|
|
1823
|
+
iframe: {
|
|
1824
|
+
bidders: ['pulsepoint', 'triplelift', 'appnexus', 'rubicon'],
|
|
1825
|
+
filter: 'exclude'
|
|
1826
|
+
}
|
|
1827
|
+
}
|
|
1828
|
+
};
|
|
1829
|
+
const requestBid = getRequestBid(userSync);
|
|
1830
|
+
|
|
1831
|
+
expect(requestBid.filterSettings).to.deep.equal({
|
|
1832
|
+
'image': {
|
|
1833
|
+
'bidders': ['triplelift', 'appnexus'],
|
|
1834
|
+
'filter': 'include'
|
|
1835
|
+
},
|
|
1836
|
+
'iframe': {
|
|
1837
|
+
'bidders': ['pulsepoint', 'triplelift', 'appnexus', 'rubicon'],
|
|
1838
|
+
'filter': 'exclude'
|
|
1839
|
+
}
|
|
1840
|
+
});
|
|
1841
|
+
});
|
|
1842
|
+
});
|
|
1843
|
+
|
|
1706
1844
|
it('adds limit to the cookie_sync request if userSyncLimit is greater than 0', function () {
|
|
1707
1845
|
let cookieSyncConfig = utils.deepClone(CONFIG);
|
|
1708
1846
|
cookieSyncConfig.syncEndpoint = { p1Consent: 'https://prebid.adnxs.com/pbs/v1/cookie_sync' };
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
import {expect} from 'chai';
|
|
3
3
|
import {spec} from 'modules/pulsepointBidAdapter.js';
|
|
4
4
|
import {deepClone} from 'src/utils.js';
|
|
5
|
-
import { config } from 'src/config.js';
|
|
6
5
|
|
|
7
6
|
describe('PulsePoint Adapter Tests', function () {
|
|
8
7
|
const slotConfigs = [{
|
|
@@ -225,6 +224,8 @@ describe('PulsePoint Adapter Tests', function () {
|
|
|
225
224
|
expect(ortbRequest.imp[1].banner).to.not.equal(null);
|
|
226
225
|
expect(ortbRequest.imp[1].banner.w).to.equal(728);
|
|
227
226
|
expect(ortbRequest.imp[1].banner.h).to.equal(90);
|
|
227
|
+
// tmax
|
|
228
|
+
expect(ortbRequest.tmax).to.equal(500);
|
|
228
229
|
});
|
|
229
230
|
|
|
230
231
|
it('Verify parse response', function () {
|
|
@@ -918,4 +919,13 @@ describe('PulsePoint Adapter Tests', function () {
|
|
|
918
919
|
}
|
|
919
920
|
});
|
|
920
921
|
});
|
|
922
|
+
|
|
923
|
+
it('Verify bid request timeouts', function () {
|
|
924
|
+
const mkRequest = (bidderRequest) => spec.buildRequests(slotConfigs, bidderRequest).data;
|
|
925
|
+
// assert default is used when no bidderRequest.timeout value is available
|
|
926
|
+
expect(mkRequest(bidderRequest).tmax).to.equal(500)
|
|
927
|
+
|
|
928
|
+
// assert bidderRequest value is used when available
|
|
929
|
+
expect(mkRequest(Object.assign({}, { timeout: 6000 }, bidderRequest)).tmax).to.equal(6000)
|
|
930
|
+
});
|
|
921
931
|
});
|
|
@@ -38,7 +38,7 @@ describe('SeedingAlliance adapter', function () {
|
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
it('should have default request structure', function () {
|
|
41
|
-
let keys = 'site,
|
|
41
|
+
let keys = 'site,cur,imp,regs'.split(',');
|
|
42
42
|
let validBidRequests = [{
|
|
43
43
|
bidId: 'bidId',
|
|
44
44
|
params: {}
|
|
@@ -60,14 +60,17 @@ describe('SeedingAlliance adapter', function () {
|
|
|
60
60
|
assert.equal(request.id, validBidRequests[0].auctionId);
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
it('Verify the
|
|
63
|
+
it('Verify the site url', function () {
|
|
64
|
+
let siteUrl = 'https://www.yourdomain.tld/your-directory/';
|
|
64
65
|
let validBidRequests = [{
|
|
65
66
|
bidId: 'bidId',
|
|
66
|
-
params: {
|
|
67
|
+
params: {
|
|
68
|
+
url: siteUrl
|
|
69
|
+
}
|
|
67
70
|
}];
|
|
68
71
|
let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data);
|
|
69
72
|
|
|
70
|
-
assert.equal(request.
|
|
73
|
+
assert.equal(request.site.page, siteUrl);
|
|
71
74
|
});
|
|
72
75
|
|
|
73
76
|
it('Verify native asset ids', function () {
|
|
@@ -109,7 +112,7 @@ describe('SeedingAlliance adapter', function () {
|
|
|
109
112
|
});
|
|
110
113
|
|
|
111
114
|
describe('interpretResponse', function () {
|
|
112
|
-
const
|
|
115
|
+
const goodNativeResponse = {
|
|
113
116
|
body: {
|
|
114
117
|
cur: 'EUR',
|
|
115
118
|
id: '4b516b80-886e-4ec0-82ae-9209e6d625fb',
|
|
@@ -136,51 +139,91 @@ describe('SeedingAlliance adapter', function () {
|
|
|
136
139
|
]
|
|
137
140
|
}
|
|
138
141
|
};
|
|
142
|
+
|
|
143
|
+
const goodBannerResponse = {
|
|
144
|
+
body: {
|
|
145
|
+
cur: 'EUR',
|
|
146
|
+
id: 'b4516b80-886e-4ec0-82ae-9209e6d625fb',
|
|
147
|
+
seatbid: [
|
|
148
|
+
{
|
|
149
|
+
seat: 'seedingAlliance',
|
|
150
|
+
bid: [{
|
|
151
|
+
adm: '<iframe src="https://domain.tld/cds/delivery?wp=0.90"></iframe>',
|
|
152
|
+
impid: 1,
|
|
153
|
+
price: 0.90,
|
|
154
|
+
h: 250,
|
|
155
|
+
w: 300
|
|
156
|
+
}]
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
139
162
|
const badResponse = { body: {
|
|
140
163
|
cur: 'EUR',
|
|
141
164
|
id: '4b516b80-886e-4ec0-82ae-9209e6d625fb',
|
|
142
165
|
seatbid: []
|
|
143
166
|
}};
|
|
144
167
|
|
|
145
|
-
const
|
|
168
|
+
const bidNativeRequest = {
|
|
146
169
|
data: {},
|
|
147
|
-
|
|
170
|
+
bidRequests: [{bidId: 'bidId1', nativeParams: {title: {required: true, len: 800}}}]
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const bidBannerRequest = {
|
|
174
|
+
data: {},
|
|
175
|
+
bidRequests: [{bidId: 'bidId1', sizes: [300, 250]}]
|
|
148
176
|
};
|
|
149
177
|
|
|
150
178
|
it('should return null if body is missing or empty', function () {
|
|
151
|
-
const result = spec.interpretResponse(badResponse,
|
|
179
|
+
const result = spec.interpretResponse(badResponse, bidNativeRequest);
|
|
152
180
|
assert.equal(result.length, 0);
|
|
153
181
|
|
|
154
182
|
delete badResponse.body
|
|
155
183
|
|
|
156
|
-
const result1 = spec.interpretResponse(badResponse,
|
|
184
|
+
const result1 = spec.interpretResponse(badResponse, bidNativeRequest);
|
|
157
185
|
assert.equal(result.length, 0);
|
|
158
186
|
});
|
|
159
187
|
|
|
160
188
|
it('should return the correct params', function () {
|
|
161
|
-
const
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
assert.deepEqual(
|
|
165
|
-
assert.deepEqual(
|
|
166
|
-
assert.deepEqual(
|
|
167
|
-
assert.deepEqual(
|
|
168
|
-
assert.deepEqual(
|
|
169
|
-
assert.deepEqual(
|
|
189
|
+
const resultNative = spec.interpretResponse(goodNativeResponse, bidNativeRequest);
|
|
190
|
+
const bidNative = goodNativeResponse.body.seatbid[0].bid[0];
|
|
191
|
+
|
|
192
|
+
assert.deepEqual(resultNative[0].bidderCode, 'seedingAlliance');
|
|
193
|
+
assert.deepEqual(resultNative[0].currency, goodNativeResponse.body.cur);
|
|
194
|
+
assert.deepEqual(resultNative[0].requestId, bidNativeRequest.bidRequests[0].bidId);
|
|
195
|
+
assert.deepEqual(resultNative[0].cpm, bidNative.price);
|
|
196
|
+
assert.deepEqual(resultNative[0].creativeId, bidNative.crid);
|
|
197
|
+
assert.deepEqual(resultNative[0].mediaType, 'native');
|
|
198
|
+
|
|
199
|
+
const resultBanner = spec.interpretResponse(goodBannerResponse, bidBannerRequest);
|
|
200
|
+
|
|
201
|
+
assert.deepEqual(resultBanner[0].bidderCode, 'seedingAlliance');
|
|
202
|
+
assert.deepEqual(resultBanner[0].mediaType, 'banner');
|
|
203
|
+
assert.deepEqual(resultBanner[0].width, bidBannerRequest.bidRequests[0].sizes[0]);
|
|
204
|
+
assert.deepEqual(resultBanner[0].height, bidBannerRequest.bidRequests[0].sizes[1]);
|
|
170
205
|
});
|
|
171
206
|
|
|
172
|
-
it('should return the correct tracking links', function () {
|
|
173
|
-
const result = spec.interpretResponse(
|
|
174
|
-
const bid =
|
|
207
|
+
it('should return the correct native tracking links', function () {
|
|
208
|
+
const result = spec.interpretResponse(goodNativeResponse, bidNativeRequest);
|
|
209
|
+
const bid = goodNativeResponse.body.seatbid[0].bid[0];
|
|
175
210
|
const regExpPrice = new RegExp('price=' + bid.price);
|
|
176
211
|
|
|
177
212
|
result[0].native.clickTrackers.forEach(function (clickTracker) {
|
|
178
|
-
|
|
213
|
+
assert.ok(clickTracker.search(regExpPrice) > -1);
|
|
179
214
|
});
|
|
180
215
|
|
|
181
216
|
result[0].native.impressionTrackers.forEach(function (impTracker) {
|
|
182
|
-
|
|
217
|
+
assert.ok(impTracker.search(regExpPrice) > -1);
|
|
183
218
|
});
|
|
184
219
|
});
|
|
220
|
+
|
|
221
|
+
it('should return the correct banner content', function () {
|
|
222
|
+
const result = spec.interpretResponse(goodBannerResponse, bidBannerRequest);
|
|
223
|
+
const bid = goodBannerResponse.body.seatbid[0].bid[0];
|
|
224
|
+
const regExpContent = new RegExp('<iframe.+?' + bid.price + '.+?</iframe>');
|
|
225
|
+
|
|
226
|
+
assert.ok(result[0].ad.search(regExpContent) > -1);
|
|
227
|
+
});
|
|
185
228
|
});
|
|
186
229
|
});
|