prebid.js 7.22.0 → 7.23.1
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/aaxBlockmeterRtdProvider.js +1 -0
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/analyticsAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidViewability.js +1 -1
- package/dist/bidViewabilityIO.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/browsiRtdProvider.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -0
- package/dist/cleanioRtdProvider.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.js +1 -1
- package/dist/consentManagementUsp.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/currency.js +1 -1
- package/dist/dependencies.json +19 -0
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/dgkeywordRtdProvider.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/googleAnalyticsAdapter.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/id5AnalyticsAdapter.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/instreamTracking.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/jwplayerVideoProvider.js +1 -0
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.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/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/multibid.js +1 -1
- package/dist/not-for-prod/prebid.js +141 -132
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxOrtbBidAdapter.js +1 -1
- package/dist/ortbConverter.js +1 -0
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/oxxionRtdProvider.js +1 -0
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pbsExtensions.js +1 -0
- 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/pubCommonId.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/rtdModule.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/schain.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/spotxBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/teadsIdSystem.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/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/video.js +1 -0
- package/dist/videoModule.js +1 -0
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/videojsVideoProvider.js +1 -0
- 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/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +98 -0
- package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +89 -0
- package/integrationExamples/videoModule/jwplayer/eventListeners.html +244 -0
- package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +122 -0
- package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +80 -0
- package/integrationExamples/videoModule/jwplayer/playlist.html +122 -0
- package/integrationExamples/videoModule/videojs/bidMarkedAsUsed.html +126 -0
- package/integrationExamples/videoModule/videojs/bidRequestScheduling.html +132 -0
- package/integrationExamples/videoModule/videojs/eventListeners.html +238 -0
- package/integrationExamples/videoModule/videojs/gamAdServerMediation.html +138 -0
- package/integrationExamples/videoModule/videojs/mediaMetadata.html +103 -0
- package/integrationExamples/videoModule/videojs/playlist.html +151 -0
- package/libraries/ortbConverter/README.md +378 -0
- package/libraries/ortbConverter/converter.js +135 -0
- package/libraries/ortbConverter/lib/composer.js +43 -0
- package/libraries/ortbConverter/lib/mergeProcessors.js +9 -0
- package/libraries/ortbConverter/lib/sizes.js +14 -0
- package/libraries/ortbConverter/processors/banner.js +40 -0
- package/libraries/ortbConverter/processors/default.js +167 -0
- package/libraries/ortbConverter/processors/mediaType.js +21 -0
- package/libraries/ortbConverter/processors/native.js +37 -0
- package/libraries/ortbConverter/processors/video.js +66 -0
- package/libraries/pbsExtensions/pbsExtensions.js +12 -0
- package/libraries/pbsExtensions/processors/aliases.js +17 -0
- package/libraries/pbsExtensions/processors/mediaType.js +23 -0
- package/libraries/pbsExtensions/processors/params.js +22 -0
- package/libraries/pbsExtensions/processors/pbs.js +99 -0
- package/libraries/pbsExtensions/processors/requestExtPrebid.js +30 -0
- package/libraries/pbsExtensions/processors/video.js +23 -0
- package/libraries/video/constants/enums.js +5 -0
- package/libraries/video/constants/events.js +97 -0
- package/libraries/video/constants/ortb.js +169 -0
- package/libraries/video/constants/vendorCodes.js +6 -0
- package/libraries/video/shared/eventHandler.js +18 -0
- package/libraries/video/shared/parentModule.js +82 -0
- package/libraries/video/shared/state.js +47 -0
- package/libraries/video/shared/vastXmlBuilder.js +77 -0
- package/libraries/video/shared/vastXmlEditor.js +115 -0
- package/modules/.submodules.json +6 -1
- package/modules/aaxBlockmeterRtdProvider.js +59 -0
- package/modules/aaxBlockmeterRtdProvider.md +48 -0
- package/modules/appnexusBidAdapter.js +38 -1
- package/modules/chtnwBidAdapter.js +110 -0
- package/modules/chtnwBidAdapter.md +31 -0
- package/modules/concertBidAdapter.js +44 -2
- package/modules/consentManagement.js +22 -1
- package/modules/consentManagementUsp.js +29 -7
- package/modules/criteoBidAdapter.js +25 -5
- package/modules/currency.js +9 -0
- package/modules/dgkeywordRtdProvider.js +3 -3
- package/modules/gridNMBidAdapter.js +10 -14
- package/modules/improvedigitalBidAdapter.js +191 -470
- package/modules/ixBidAdapter.js +24 -64
- package/modules/jwplayerVideoProvider.js +929 -0
- package/modules/jwplayerVideoProvider.md +25 -0
- package/modules/kargoBidAdapter.js +1 -1
- package/modules/multibid/index.js +12 -0
- package/modules/openxOrtbBidAdapter.js +120 -275
- package/modules/oxxionRtdProvider.js +119 -0
- package/modules/oxxionRtdProvider.md +48 -0
- package/modules/prebidServerBidAdapter/index.js +19 -716
- package/modules/prebidServerBidAdapter/ortbConverter.js +274 -0
- package/modules/priceFloors.js +73 -1
- package/modules/rtdModule/index.js +22 -1
- package/modules/schain.js +24 -1
- package/modules/spotxBidAdapter.js +16 -15
- package/modules/synacormediaBidAdapter.js +1 -1
- package/modules/teadsIdSystem.js +5 -0
- package/modules/userId/index.js +64 -6
- package/modules/videoModule/addingSubmodule.md +521 -0
- package/modules/videoModule/coreVideo.js +234 -0
- package/modules/videoModule/gamAdServerSubmodule.js +27 -0
- package/modules/videoModule/index.js +244 -0
- package/modules/videoModule/videoImpressionVerifier.js +206 -0
- package/modules/videojsVideoProvider.js +854 -0
- package/modules/videojsVideoProvider.md +17 -0
- package/package.json +5 -1
- package/src/adapterManager.js +56 -7
- package/src/adloader.js +2 -1
- package/src/auction.js +5 -0
- package/src/events.js +5 -1
- package/src/pbjsORTB.js +35 -0
- package/src/prebid.js +137 -112
- package/src/targeting.js +10 -2
- package/src/utils/currency.js +16 -0
- package/src/utils.js +21 -0
- package/test/spec/auctionmanager_spec.js +6 -0
- package/test/spec/modules/aaxBlockmeter_spec.js +58 -0
- package/test/spec/modules/chtnwBidAdapter_spec.js +105 -0
- package/test/spec/modules/concertBidAdapter_spec.js +56 -0
- package/test/spec/modules/consentManagementUsp_spec.js +64 -18
- package/test/spec/modules/criteoBidAdapter_spec.js +28 -0
- package/test/spec/modules/dgkeywordRtdProvider_spec.js +3 -3
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +231 -211
- package/test/spec/modules/ixBidAdapter_spec.js +230 -371
- package/test/spec/modules/openxOrtbBidAdapter_spec.js +77 -49
- package/test/spec/modules/oxxionRtdProvider_spec.js +142 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +139 -137
- package/test/spec/modules/realTimeDataModule_spec.js +65 -0
- package/test/spec/modules/userId_spec.js +67 -1
- package/test/spec/modules/videoModule/coreVideo_spec.js +98 -0
- package/test/spec/modules/videoModule/pbVideo_spec.js +362 -0
- package/test/spec/modules/videoModule/shared/parentModule_spec.js +73 -0
- package/test/spec/modules/videoModule/shared/state_spec.js +26 -0
- package/test/spec/modules/videoModule/shared/vastXmlBuilder_spec.js +103 -0
- package/test/spec/modules/videoModule/shared/vastXmlEditor_spec.js +209 -0
- package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +846 -0
- package/test/spec/modules/videoModule/submodules/videojsVideoProvider_spec.js +391 -0
- package/test/spec/modules/videoModule/videoImpressionVerifier_spec.js +112 -0
- package/test/spec/ortbConverter/banner_spec.js +203 -0
- package/test/spec/ortbConverter/composer_spec.js +69 -0
- package/test/spec/ortbConverter/converter_spec.js +283 -0
- package/test/spec/ortbConverter/currency_spec.js +40 -0
- package/test/spec/ortbConverter/default_processors_spec.js +61 -0
- package/test/spec/ortbConverter/gdpr_spec.js +38 -0
- package/test/spec/ortbConverter/mediaTypes_spec.js +67 -0
- package/test/spec/ortbConverter/mergeProcessors_spec.js +59 -0
- package/test/spec/ortbConverter/multibid_spec.js +35 -0
- package/test/spec/ortbConverter/native_spec.js +95 -0
- package/test/spec/ortbConverter/pbjsORTB_spec.js +67 -0
- package/test/spec/ortbConverter/pbsExtensions/aliases_spec.js +57 -0
- package/test/spec/ortbConverter/pbsExtensions/params_spec.js +96 -0
- package/test/spec/ortbConverter/pbsExtensions/video_spec.js +52 -0
- package/test/spec/ortbConverter/priceFloors_spec.js +143 -0
- package/test/spec/ortbConverter/schain_spec.js +33 -0
- package/test/spec/ortbConverter/userId_spec.js +21 -0
- package/test/spec/ortbConverter/usp_spec.js +15 -0
- package/test/spec/ortbConverter/video_spec.js +189 -0
- package/test/spec/unit/core/adapterManager_spec.js +102 -0
- package/test/spec/unit/core/targeting_spec.js +34 -0
- package/test/spec/unit/pbjs_api_spec.js +124 -45
- package/test/spec/utils_spec.js +45 -1
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import {fillVideoImp, fillVideoResponse, VALIDATIONS} from '../../../libraries/ortbConverter/processors/video.js';
|
|
2
|
+
import {BANNER, VIDEO} from '../../../src/mediaTypes.js';
|
|
3
|
+
|
|
4
|
+
describe('pbjs -> ortb video conversion', () => {
|
|
5
|
+
[
|
|
6
|
+
{
|
|
7
|
+
t: 'non-video request',
|
|
8
|
+
request: {
|
|
9
|
+
mediaTypes: {
|
|
10
|
+
banner: {}
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
imp: {}
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
t: 'instream video request',
|
|
17
|
+
request: {
|
|
18
|
+
mediaTypes: {
|
|
19
|
+
video: {
|
|
20
|
+
playerSize: [[1, 2]],
|
|
21
|
+
context: 'instream',
|
|
22
|
+
mimes: ['video/mp4'],
|
|
23
|
+
skip: 1,
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
imp: {
|
|
28
|
+
video: {
|
|
29
|
+
w: 1,
|
|
30
|
+
h: 2,
|
|
31
|
+
mimes: ['video/mp4'],
|
|
32
|
+
skip: 1,
|
|
33
|
+
placement: 1,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
t: 'outstream video request',
|
|
39
|
+
request: {
|
|
40
|
+
mediaTypes: {
|
|
41
|
+
video: {
|
|
42
|
+
playerSize: [[1, 2]],
|
|
43
|
+
context: 'outstream',
|
|
44
|
+
mimes: ['video/mp4'],
|
|
45
|
+
skip: 1
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
imp: {
|
|
50
|
+
video: {
|
|
51
|
+
w: 1,
|
|
52
|
+
h: 2,
|
|
53
|
+
mimes: ['video/mp4'],
|
|
54
|
+
skip: 1,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
t: 'video request with explicit placement',
|
|
60
|
+
request: {
|
|
61
|
+
mediaTypes: {
|
|
62
|
+
video: {
|
|
63
|
+
playerSize: [[1, 2]],
|
|
64
|
+
placement: 'explicit'
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
imp: {
|
|
69
|
+
video: {
|
|
70
|
+
w: 1,
|
|
71
|
+
h: 2,
|
|
72
|
+
placement: 'explicit',
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
t: 'video request with multiple playerSizes',
|
|
78
|
+
request: {
|
|
79
|
+
mediaTypes: {
|
|
80
|
+
video: {
|
|
81
|
+
playerSize: [[1, 2], [3, 4]]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
imp: {
|
|
86
|
+
video: {
|
|
87
|
+
w: 1,
|
|
88
|
+
h: 2,
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
t: 'video request with 2-tuple playerSize',
|
|
94
|
+
request: {
|
|
95
|
+
mediaTypes: {
|
|
96
|
+
video: {
|
|
97
|
+
playerSize: [1, 2]
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
imp: {
|
|
102
|
+
video: {
|
|
103
|
+
w: 1,
|
|
104
|
+
h: 2,
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
].forEach(({t, request, imp}) => {
|
|
109
|
+
it(`can handle ${t}`, () => {
|
|
110
|
+
const actual = {};
|
|
111
|
+
fillVideoImp(actual, request, {});
|
|
112
|
+
expect(actual).to.eql(imp);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should keep ortb2Imp.video', () => {
|
|
117
|
+
const imp = {
|
|
118
|
+
video: {
|
|
119
|
+
someParam: 'someValue'
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
fillVideoImp(imp, {mediaTypes: {video: {playerSize: [[1, 2]]}}}, {});
|
|
123
|
+
expect(imp.video.someParam).to.eql('someValue');
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('does nothing is context.mediaType is set but is not VIDEO', () => {
|
|
127
|
+
const imp = {};
|
|
128
|
+
fillVideoImp(imp, {mediaTypes: {video: {playerSize: [[1, 2]]}}}, {mediaType: BANNER});
|
|
129
|
+
expect(imp).to.eql({});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe('ortb -> pbjs video conversion', () => {
|
|
134
|
+
[
|
|
135
|
+
{
|
|
136
|
+
t: 'non-video response',
|
|
137
|
+
seatbid: {},
|
|
138
|
+
response: {
|
|
139
|
+
mediaType: BANNER
|
|
140
|
+
},
|
|
141
|
+
expected: {
|
|
142
|
+
mediaType: BANNER
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
t: 'simple video response',
|
|
147
|
+
seatbid: {
|
|
148
|
+
adm: 'mockAdm',
|
|
149
|
+
nurl: 'mockNurl'
|
|
150
|
+
},
|
|
151
|
+
response: {
|
|
152
|
+
mediaType: VIDEO,
|
|
153
|
+
},
|
|
154
|
+
context: {
|
|
155
|
+
imp: {
|
|
156
|
+
video: {
|
|
157
|
+
w: 1,
|
|
158
|
+
h: 2
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
expected: {
|
|
163
|
+
mediaType: VIDEO,
|
|
164
|
+
playerWidth: 1,
|
|
165
|
+
playerHeight: 2,
|
|
166
|
+
vastXml: 'mockAdm',
|
|
167
|
+
vastUrl: 'mockNurl'
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
t: 'video response without playerSize',
|
|
172
|
+
seatbid: {},
|
|
173
|
+
response: {
|
|
174
|
+
mediaType: VIDEO,
|
|
175
|
+
},
|
|
176
|
+
context: {
|
|
177
|
+
imp: {}
|
|
178
|
+
},
|
|
179
|
+
expected: {
|
|
180
|
+
mediaType: VIDEO
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
].forEach(({t, seatbid, context, response, expected}) => {
|
|
184
|
+
it(`can handle ${t}`, () => {
|
|
185
|
+
fillVideoResponse(response, seatbid, context);
|
|
186
|
+
expect(response).to.eql(expected);
|
|
187
|
+
})
|
|
188
|
+
})
|
|
189
|
+
})
|
|
@@ -20,6 +20,7 @@ import { setSizeConfig } from 'src/sizeMapping.js';
|
|
|
20
20
|
import {find, includes} from 'src/polyfill.js';
|
|
21
21
|
import s2sTesting from 'modules/s2sTesting.js';
|
|
22
22
|
import {hook} from '../../../../src/hook.js';
|
|
23
|
+
import {auctionManager} from '../../../../src/auctionManager.js';
|
|
23
24
|
var events = require('../../../../src/events');
|
|
24
25
|
|
|
25
26
|
const CONFIG = {
|
|
@@ -2543,4 +2544,105 @@ describe('adapterManager tests', function () {
|
|
|
2543
2544
|
})
|
|
2544
2545
|
});
|
|
2545
2546
|
});
|
|
2547
|
+
|
|
2548
|
+
describe('callDataDeletionRequest', () => {
|
|
2549
|
+
function delMethodForBidder(bidderCode) {
|
|
2550
|
+
const del = sinon.stub();
|
|
2551
|
+
adapterManager.registerBidAdapter({
|
|
2552
|
+
callBids: sinon.stub(),
|
|
2553
|
+
getSpec() {
|
|
2554
|
+
return {
|
|
2555
|
+
onDataDeletionRequest: del
|
|
2556
|
+
}
|
|
2557
|
+
}
|
|
2558
|
+
}, bidderCode);
|
|
2559
|
+
return del;
|
|
2560
|
+
}
|
|
2561
|
+
|
|
2562
|
+
function delMethodForAnalytics(provider) {
|
|
2563
|
+
const del = sinon.stub();
|
|
2564
|
+
adapterManager.registerAnalyticsAdapter({
|
|
2565
|
+
code: provider,
|
|
2566
|
+
adapter: {
|
|
2567
|
+
enableAnalytics: sinon.stub(),
|
|
2568
|
+
onDataDeletionRequest: del,
|
|
2569
|
+
},
|
|
2570
|
+
})
|
|
2571
|
+
return del;
|
|
2572
|
+
}
|
|
2573
|
+
|
|
2574
|
+
Object.entries({
|
|
2575
|
+
'bid adapters': delMethodForBidder,
|
|
2576
|
+
'analytics adapters': delMethodForAnalytics
|
|
2577
|
+
}).forEach(([t, getDelMethod]) => {
|
|
2578
|
+
describe(t, () => {
|
|
2579
|
+
it('invokes onDataDeletionRequest', () => {
|
|
2580
|
+
const del = getDelMethod('mockAdapter');
|
|
2581
|
+
adapterManager.callDataDeletionRequest();
|
|
2582
|
+
sinon.assert.calledOnce(del);
|
|
2583
|
+
});
|
|
2584
|
+
|
|
2585
|
+
it('does not choke if onDeletionRequest throws', () => {
|
|
2586
|
+
const del1 = getDelMethod('mockAdapter1');
|
|
2587
|
+
const del2 = getDelMethod('mockAdapter2');
|
|
2588
|
+
del1.throws(new Error());
|
|
2589
|
+
adapterManager.callDataDeletionRequest();
|
|
2590
|
+
sinon.assert.calledOnce(del1);
|
|
2591
|
+
sinon.assert.calledOnce(del2);
|
|
2592
|
+
});
|
|
2593
|
+
})
|
|
2594
|
+
})
|
|
2595
|
+
|
|
2596
|
+
describe('for bid adapters', () => {
|
|
2597
|
+
let bidderRequests;
|
|
2598
|
+
|
|
2599
|
+
beforeEach(() => {
|
|
2600
|
+
bidderRequests = [];
|
|
2601
|
+
sinon.stub(auctionManager, 'getBidsRequested').callsFake(() => bidderRequests);
|
|
2602
|
+
})
|
|
2603
|
+
afterEach(() => {
|
|
2604
|
+
auctionManager.getBidsRequested.restore();
|
|
2605
|
+
})
|
|
2606
|
+
|
|
2607
|
+
it('does not invoke onDataDeletionRequest on aliases', () => {
|
|
2608
|
+
const del = delMethodForBidder('mockBidder');
|
|
2609
|
+
adapterManager.aliasBidAdapter('mockBidder', 'mockBidderAlias');
|
|
2610
|
+
adapterManager.aliasBidAdapter('mockBidderAlias2', 'mockBidderAlias');
|
|
2611
|
+
adapterManager.callDataDeletionRequest();
|
|
2612
|
+
sinon.assert.calledOnce(del);
|
|
2613
|
+
});
|
|
2614
|
+
|
|
2615
|
+
it('passes known bidder requests', () => {
|
|
2616
|
+
const del1 = delMethodForBidder('mockBidder1');
|
|
2617
|
+
const del2 = delMethodForBidder('mockBidder2');
|
|
2618
|
+
adapterManager.aliasBidAdapter('mockBidder1', 'mockBidder1Alias');
|
|
2619
|
+
adapterManager.aliasBidAdapter('mockBidder1Alias', 'mockBidder1Alias2')
|
|
2620
|
+
bidderRequests = [
|
|
2621
|
+
{
|
|
2622
|
+
bidderCode: 'mockBidder1',
|
|
2623
|
+
id: 0
|
|
2624
|
+
},
|
|
2625
|
+
{
|
|
2626
|
+
bidderCode: 'mockBidder2',
|
|
2627
|
+
id: 1,
|
|
2628
|
+
},
|
|
2629
|
+
{
|
|
2630
|
+
bidderCode: 'mockBidder1Alias',
|
|
2631
|
+
id: 2,
|
|
2632
|
+
},
|
|
2633
|
+
{
|
|
2634
|
+
bidderCode: 'someOtherBidder',
|
|
2635
|
+
id: 3
|
|
2636
|
+
},
|
|
2637
|
+
{
|
|
2638
|
+
bidderCode: 'mockBidder1Alias2',
|
|
2639
|
+
id: 4
|
|
2640
|
+
}
|
|
2641
|
+
];
|
|
2642
|
+
adapterManager.callDataDeletionRequest();
|
|
2643
|
+
sinon.assert.calledWith(del1, [bidderRequests[0], bidderRequests[2], bidderRequests[4]]);
|
|
2644
|
+
sinon.assert.calledWith(del2, [bidderRequests[1]]);
|
|
2645
|
+
})
|
|
2646
|
+
})
|
|
2647
|
+
});
|
|
2546
2648
|
});
|
|
@@ -269,6 +269,40 @@ describe('targeting tests', function () {
|
|
|
269
269
|
bidCacheFilterFunction = undef;
|
|
270
270
|
});
|
|
271
271
|
|
|
272
|
+
describe('isBidNotExpired', () => {
|
|
273
|
+
let clock;
|
|
274
|
+
beforeEach(() => {
|
|
275
|
+
clock = sandbox.useFakeTimers(0);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
Object.entries({
|
|
279
|
+
'bid.ttlBuffer': (bid, ttlBuffer) => {
|
|
280
|
+
bid.ttlBuffer = ttlBuffer
|
|
281
|
+
},
|
|
282
|
+
'setConfig({ttlBuffer})': (_, ttlBuffer) => {
|
|
283
|
+
config.setConfig({ttlBuffer})
|
|
284
|
+
},
|
|
285
|
+
}).forEach(([t, setup]) => {
|
|
286
|
+
describe(`respects ${t}`, () => {
|
|
287
|
+
[0, 2].forEach(ttlBuffer => {
|
|
288
|
+
it(`when ttlBuffer is ${ttlBuffer}`, () => {
|
|
289
|
+
const bid = {
|
|
290
|
+
responseTimestamp: 0,
|
|
291
|
+
ttl: 10,
|
|
292
|
+
}
|
|
293
|
+
setup(bid, ttlBuffer);
|
|
294
|
+
|
|
295
|
+
expect(filters.isBidNotExpired(bid)).to.be.true;
|
|
296
|
+
clock.tick((bid.ttl - ttlBuffer) * 1000 - 100);
|
|
297
|
+
expect(filters.isBidNotExpired(bid)).to.be.true;
|
|
298
|
+
clock.tick(101);
|
|
299
|
+
expect(filters.isBidNotExpired(bid)).to.be.false;
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
|
|
272
306
|
describe('getAllTargeting', function () {
|
|
273
307
|
let amBidsReceivedStub;
|
|
274
308
|
let amGetAdUnitsStub;
|
|
@@ -21,7 +21,8 @@ import {hook} from '../../../src/hook.js';
|
|
|
21
21
|
import {reset as resetDebugging} from '../../../src/debugging.js';
|
|
22
22
|
import $$PREBID_GLOBAL$$ from 'src/prebid.js';
|
|
23
23
|
import {resetAuctionState} from 'src/auction.js';
|
|
24
|
-
|
|
24
|
+
import {stubAuctionIndex} from '../../helpers/indexStub.js';
|
|
25
|
+
import {createBid} from '../../../src/bidfactory.js';
|
|
25
26
|
var assert = require('chai').assert;
|
|
26
27
|
var expect = require('chai').expect;
|
|
27
28
|
|
|
@@ -1241,7 +1242,7 @@ describe('Unit: Prebid Module', function () {
|
|
|
1241
1242
|
|
|
1242
1243
|
it('should require doc and id params', function () {
|
|
1243
1244
|
$$PREBID_GLOBAL$$.renderAd();
|
|
1244
|
-
var error = 'Error trying to write ad Id :undefined to the page. Missing
|
|
1245
|
+
var error = 'Error trying to write ad Id :undefined to the page. Missing adId';
|
|
1245
1246
|
assert.ok(spyLogError.calledWith(error), 'expected param error was logged');
|
|
1246
1247
|
});
|
|
1247
1248
|
|
|
@@ -1458,7 +1459,7 @@ describe('Unit: Prebid Module', function () {
|
|
|
1458
1459
|
|
|
1459
1460
|
describe('requestBids', function () {
|
|
1460
1461
|
let logMessageSpy;
|
|
1461
|
-
let makeRequestsStub;
|
|
1462
|
+
let makeRequestsStub, createAuctionStub;
|
|
1462
1463
|
let adUnits;
|
|
1463
1464
|
let clock;
|
|
1464
1465
|
before(function () {
|
|
@@ -1467,7 +1468,6 @@ describe('Unit: Prebid Module', function () {
|
|
|
1467
1468
|
after(function () {
|
|
1468
1469
|
clock.restore();
|
|
1469
1470
|
});
|
|
1470
|
-
let bidsBackHandlerStub = sinon.stub();
|
|
1471
1471
|
|
|
1472
1472
|
const BIDDER_CODE = 'sampleBidder';
|
|
1473
1473
|
let bids = [{
|
|
@@ -1504,11 +1504,12 @@ describe('Unit: Prebid Module', function () {
|
|
|
1504
1504
|
'start': 1000
|
|
1505
1505
|
}];
|
|
1506
1506
|
|
|
1507
|
+
let spec, indexStub, auction, completeAuction;
|
|
1508
|
+
|
|
1507
1509
|
beforeEach(function () {
|
|
1508
1510
|
logMessageSpy = sinon.spy(utils, 'logMessage');
|
|
1509
1511
|
makeRequestsStub = sinon.stub(adapterManager, 'makeBidRequests');
|
|
1510
1512
|
makeRequestsStub.returns(bidRequests);
|
|
1511
|
-
|
|
1512
1513
|
adUnits = [{
|
|
1513
1514
|
code: 'adUnit-code',
|
|
1514
1515
|
mediaTypes: {
|
|
@@ -1516,45 +1517,53 @@ describe('Unit: Prebid Module', function () {
|
|
|
1516
1517
|
sizes: [[300, 250]]
|
|
1517
1518
|
}
|
|
1518
1519
|
},
|
|
1520
|
+
transactionId: 'mock-tid',
|
|
1519
1521
|
bids: [
|
|
1520
1522
|
{bidder: BIDDER_CODE, params: {placementId: 'id'}},
|
|
1521
1523
|
]
|
|
1522
1524
|
}];
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
auctionModule.newAuction.restore();
|
|
1538
|
-
utils.logMessage.restore();
|
|
1539
|
-
});
|
|
1540
|
-
|
|
1541
|
-
it('should execute callback after timeout', function () {
|
|
1542
|
-
let spec = {
|
|
1525
|
+
indexStub = sinon.stub(auctionManager, 'index');
|
|
1526
|
+
indexStub.get(() => stubAuctionIndex({adUnits, bidRequests}))
|
|
1527
|
+
sinon.stub(adapterManager, 'callBids').callsFake((_, bidrequests, addBidResponse, adapterDone) => {
|
|
1528
|
+
completeAuction = (bidsReceived) => {
|
|
1529
|
+
bidsReceived.forEach((bid) => addBidResponse(bid.adUnitCode, Object.assign(createBid(), bid)));
|
|
1530
|
+
bidRequests.forEach((req) => adapterDone.call(req));
|
|
1531
|
+
}
|
|
1532
|
+
})
|
|
1533
|
+
const origNewAuction = auctionModule.newAuction;
|
|
1534
|
+
sinon.stub(auctionModule, 'newAuction').callsFake(function (opts) {
|
|
1535
|
+
auction = origNewAuction(opts);
|
|
1536
|
+
return auction;
|
|
1537
|
+
})
|
|
1538
|
+
spec = {
|
|
1543
1539
|
code: BIDDER_CODE,
|
|
1544
1540
|
isBidRequestValid: sinon.stub(),
|
|
1545
1541
|
buildRequests: sinon.stub(),
|
|
1546
1542
|
interpretResponse: sinon.stub(),
|
|
1547
1543
|
getUserSyncs: sinon.stub(),
|
|
1548
|
-
onTimeout: sinon.stub()
|
|
1544
|
+
onTimeout: sinon.stub(),
|
|
1545
|
+
onSetTargeting: sinon.stub(),
|
|
1549
1546
|
};
|
|
1550
1547
|
|
|
1551
1548
|
registerBidder(spec);
|
|
1552
1549
|
spec.buildRequests.returns([{'id': 123, 'method': 'POST'}]);
|
|
1553
1550
|
spec.isBidRequestValid.returns(true);
|
|
1554
1551
|
spec.interpretResponse.returns(bids);
|
|
1552
|
+
});
|
|
1553
|
+
|
|
1554
|
+
afterEach(function () {
|
|
1555
|
+
clock.restore();
|
|
1556
|
+
adapterManager.makeBidRequests.restore();
|
|
1557
|
+
adapterManager.callBids.restore();
|
|
1558
|
+
indexStub.restore();
|
|
1559
|
+
auction.getBidsReceived = () => [];
|
|
1560
|
+
auctionModule.newAuction.restore();
|
|
1561
|
+
utils.logMessage.restore();
|
|
1562
|
+
});
|
|
1555
1563
|
|
|
1564
|
+
it('should execute callback after timeout', function () {
|
|
1556
1565
|
let requestObj = {
|
|
1557
|
-
bidsBackHandler:
|
|
1566
|
+
bidsBackHandler: sinon.stub(),
|
|
1558
1567
|
timeout: 2000,
|
|
1559
1568
|
adUnits: adUnits
|
|
1560
1569
|
};
|
|
@@ -1567,26 +1576,13 @@ describe('Unit: Prebid Module', function () {
|
|
|
1567
1576
|
clock.tick(1);
|
|
1568
1577
|
assert.ok(logMessageSpy.calledWith(sinon.match(re)), 'executeCallback called');
|
|
1569
1578
|
|
|
1570
|
-
expect(
|
|
1579
|
+
expect(requestObj.bidsBackHandler.getCall(0).args[1]).to.equal(true,
|
|
1571
1580
|
'bidsBackHandler should be called with timedOut=true');
|
|
1572
1581
|
|
|
1573
1582
|
sinon.assert.called(spec.onTimeout);
|
|
1574
1583
|
});
|
|
1575
1584
|
|
|
1576
|
-
it('should execute
|
|
1577
|
-
let spec = {
|
|
1578
|
-
code: BIDDER_CODE,
|
|
1579
|
-
isBidRequestValid: sinon.stub(),
|
|
1580
|
-
buildRequests: sinon.stub(),
|
|
1581
|
-
interpretResponse: sinon.stub(),
|
|
1582
|
-
onSetTargeting: sinon.stub()
|
|
1583
|
-
};
|
|
1584
|
-
|
|
1585
|
-
registerBidder(spec);
|
|
1586
|
-
spec.buildRequests.returns([{'id': 123, 'method': 'POST'}]);
|
|
1587
|
-
spec.isBidRequestValid.returns(true);
|
|
1588
|
-
spec.interpretResponse.returns(bids);
|
|
1589
|
-
|
|
1585
|
+
it('should execute `onSetTargeting` after setTargetingForGPTAsync', function () {
|
|
1590
1586
|
const bidId = 1;
|
|
1591
1587
|
const auctionId = 1;
|
|
1592
1588
|
let adResponse = Object.assign({
|
|
@@ -1595,6 +1591,7 @@ describe('Unit: Prebid Module', function () {
|
|
|
1595
1591
|
width: 300,
|
|
1596
1592
|
height: 250,
|
|
1597
1593
|
adUnitCode: bidRequests[0].bids[0].adUnitCode,
|
|
1594
|
+
transactionId: 'mock-tid',
|
|
1598
1595
|
adserverTargeting: {
|
|
1599
1596
|
'hb_bidder': BIDDER_CODE,
|
|
1600
1597
|
'hb_adid': bidId,
|
|
@@ -1603,20 +1600,102 @@ describe('Unit: Prebid Module', function () {
|
|
|
1603
1600
|
},
|
|
1604
1601
|
bidder: bids[0].bidderCode,
|
|
1605
1602
|
}, bids[0]);
|
|
1606
|
-
auction.getBidsReceived = function() { return [adResponse]; }
|
|
1607
|
-
auction.getAuctionId = () => auctionId;
|
|
1608
1603
|
|
|
1609
1604
|
let requestObj = {
|
|
1610
|
-
bidsBackHandler: null,
|
|
1605
|
+
bidsBackHandler: null,
|
|
1611
1606
|
timeout: 2000,
|
|
1612
1607
|
adUnits: adUnits
|
|
1613
1608
|
};
|
|
1614
1609
|
|
|
1615
1610
|
$$PREBID_GLOBAL$$.requestBids(requestObj);
|
|
1611
|
+
completeAuction([adResponse]);
|
|
1616
1612
|
$$PREBID_GLOBAL$$.setTargetingForGPTAsync();
|
|
1617
1613
|
|
|
1618
1614
|
sinon.assert.called(spec.onSetTargeting);
|
|
1619
1615
|
});
|
|
1616
|
+
|
|
1617
|
+
describe('returns a promise that resolves', () => {
|
|
1618
|
+
function delayHook(next, ...args) {
|
|
1619
|
+
setTimeout(() => next(...args))
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
beforeEach(() => {
|
|
1623
|
+
// make sure the return value works correctly when hooks give up priority
|
|
1624
|
+
$$PREBID_GLOBAL$$.requestBids.before(delayHook)
|
|
1625
|
+
});
|
|
1626
|
+
|
|
1627
|
+
afterEach(() => {
|
|
1628
|
+
$$PREBID_GLOBAL$$.requestBids.getHooks({hook: delayHook}).remove();
|
|
1629
|
+
});
|
|
1630
|
+
|
|
1631
|
+
Object.entries({
|
|
1632
|
+
'immediately, without bidsBackHandler': (req) => $$PREBID_GLOBAL$$.requestBids(req),
|
|
1633
|
+
'after bidsBackHandler': (() => {
|
|
1634
|
+
const bidsBackHandler = sinon.stub();
|
|
1635
|
+
return function (req) {
|
|
1636
|
+
return $$PREBID_GLOBAL$$.requestBids({...req, bidsBackHandler}).then(({bids, timedOut, auctionId}) => {
|
|
1637
|
+
sinon.assert.calledWith(bidsBackHandler, bids, timedOut, auctionId);
|
|
1638
|
+
return {bids, timedOut, auctionId};
|
|
1639
|
+
})
|
|
1640
|
+
}
|
|
1641
|
+
})(),
|
|
1642
|
+
'after a bidsBackHandler that throws': (req) => $$PREBID_GLOBAL$$.requestBids({...req, bidsBackHandler: () => { throw new Error() }})
|
|
1643
|
+
}).forEach(([t, requestBids]) => {
|
|
1644
|
+
describe(t, () => {
|
|
1645
|
+
it('with no args, when no adUnits are defined', () => {
|
|
1646
|
+
return requestBids({}).then((res) => {
|
|
1647
|
+
expect(res).to.eql({
|
|
1648
|
+
bids: undefined,
|
|
1649
|
+
timedOut: undefined,
|
|
1650
|
+
auctionId: undefined
|
|
1651
|
+
});
|
|
1652
|
+
});
|
|
1653
|
+
});
|
|
1654
|
+
|
|
1655
|
+
it('on timeout', (done) => {
|
|
1656
|
+
requestBids({
|
|
1657
|
+
auctionId: 'mock-auctionId',
|
|
1658
|
+
adUnits,
|
|
1659
|
+
timeout: 10
|
|
1660
|
+
}).then(({timedOut, bids, auctionId}) => {
|
|
1661
|
+
expect(timedOut).to.be.true;
|
|
1662
|
+
expect(bids).to.eql({});
|
|
1663
|
+
expect(auctionId).to.eql('mock-auctionId');
|
|
1664
|
+
done();
|
|
1665
|
+
});
|
|
1666
|
+
clock.tick(12);
|
|
1667
|
+
});
|
|
1668
|
+
|
|
1669
|
+
it('with auction result', (done) => {
|
|
1670
|
+
const bid = {
|
|
1671
|
+
bidder: 'mock-bidder',
|
|
1672
|
+
adUnitCode: adUnits[0].code,
|
|
1673
|
+
transactionId: adUnits[0].transactionId
|
|
1674
|
+
}
|
|
1675
|
+
requestBids({
|
|
1676
|
+
adUnits,
|
|
1677
|
+
}).then(({bids}) => {
|
|
1678
|
+
sinon.assert.match(bids[bid.adUnitCode].bids[0], bid)
|
|
1679
|
+
done();
|
|
1680
|
+
});
|
|
1681
|
+
// `completeAuction` won't work until we're out of `delayHook`
|
|
1682
|
+
// and the mocked auction has been set up;
|
|
1683
|
+
// setTimeout here takes us after the setTimeout in `delayHook`
|
|
1684
|
+
setTimeout(() => completeAuction([bid]));
|
|
1685
|
+
})
|
|
1686
|
+
})
|
|
1687
|
+
})
|
|
1688
|
+
})
|
|
1689
|
+
|
|
1690
|
+
it('should transfer ttlBuffer to adUnit.ttlBuffer', () => {
|
|
1691
|
+
$$PREBID_GLOBAL$$.requestBids({
|
|
1692
|
+
ttlBuffer: 123,
|
|
1693
|
+
adUnits: [adUnits[0], {...adUnits[0], ttlBuffer: 0}]
|
|
1694
|
+
});
|
|
1695
|
+
sinon.assert.calledWithMatch(auctionModule.newAuction, {
|
|
1696
|
+
adUnits: sinon.match((units) => units[0].ttlBuffer === 123 && units[1].ttlBuffer === 0)
|
|
1697
|
+
})
|
|
1698
|
+
});
|
|
1620
1699
|
})
|
|
1621
1700
|
|
|
1622
1701
|
describe('requestBids', function () {
|
package/test/spec/utils_spec.js
CHANGED
|
@@ -2,7 +2,7 @@ import { getAdServerTargeting } from 'test/fixtures/fixtures.js';
|
|
|
2
2
|
import { expect } from 'chai';
|
|
3
3
|
import CONSTANTS from 'src/constants.json';
|
|
4
4
|
import * as utils from 'src/utils.js';
|
|
5
|
-
import {deepEqual, waitForElementToLoad} from 'src/utils.js';
|
|
5
|
+
import {memoize, deepEqual, waitForElementToLoad} from 'src/utils.js';
|
|
6
6
|
|
|
7
7
|
var assert = require('assert');
|
|
8
8
|
|
|
@@ -1260,3 +1260,47 @@ describe('Utils', function () {
|
|
|
1260
1260
|
});
|
|
1261
1261
|
});
|
|
1262
1262
|
});
|
|
1263
|
+
|
|
1264
|
+
describe('memoize', () => {
|
|
1265
|
+
let fn;
|
|
1266
|
+
|
|
1267
|
+
beforeEach(() => {
|
|
1268
|
+
fn = sinon.stub().callsFake(function() {
|
|
1269
|
+
return Array.from(arguments);
|
|
1270
|
+
});
|
|
1271
|
+
});
|
|
1272
|
+
|
|
1273
|
+
it('delegates to fn', () => {
|
|
1274
|
+
expect(memoize(fn)('one', 'two')).to.eql(['one', 'two']);
|
|
1275
|
+
});
|
|
1276
|
+
|
|
1277
|
+
it('caches result after first call, if first argument is the same', () => {
|
|
1278
|
+
const mem = memoize(fn);
|
|
1279
|
+
mem('one', 'two');
|
|
1280
|
+
expect(mem('one', 'three')).to.eql(['one', 'two']);
|
|
1281
|
+
expect(fn.callCount).to.equal(1);
|
|
1282
|
+
});
|
|
1283
|
+
|
|
1284
|
+
it('delegates again when the first argument changes', () => {
|
|
1285
|
+
const mem = memoize(fn);
|
|
1286
|
+
mem('one', 'two');
|
|
1287
|
+
expect(mem('two', 'one')).to.eql(['two', 'one']);
|
|
1288
|
+
expect(fn.callCount).to.eql(2);
|
|
1289
|
+
});
|
|
1290
|
+
|
|
1291
|
+
it('can clear cache with .clear', () => {
|
|
1292
|
+
const mem = memoize(fn);
|
|
1293
|
+
mem('arg');
|
|
1294
|
+
mem.clear();
|
|
1295
|
+
expect(mem('arg')).to.eql(['arg']);
|
|
1296
|
+
expect(fn.callCount).to.equal(2);
|
|
1297
|
+
});
|
|
1298
|
+
|
|
1299
|
+
it('allows setting cache keys', () => {
|
|
1300
|
+
const mem = memoize(fn, (...args) => args.join(','))
|
|
1301
|
+
mem('one', 'two');
|
|
1302
|
+
mem('one', 'three');
|
|
1303
|
+
expect(mem('one', 'three')).to.eql(['one', 'three']);
|
|
1304
|
+
expect(fn.callCount).to.eql(2);
|
|
1305
|
+
})
|
|
1306
|
+
})
|