• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

prebid / Prebid.js / 19940596084

04 Dec 2025 06:57PM UTC coverage: 96.209%. Remained the same
19940596084

Pull #14238

github

feaad1
dgirardi
add configuration options for keyword lookup, include both meta and json by default
Pull Request #14238: Core: Add support to also use keywords from application/ld+json to 1p enrichment

53731 of 65825 branches covered (81.63%)

65 of 66 new or added lines in 2 files covered. (98.48%)

53 existing lines in 9 files now uncovered.

205149 of 213233 relevant lines covered (96.21%)

72.07 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.0
/modules/adqueryBidAdapter.js
1
import {registerBidder} from '../src/adapters/bidderFactory.js';
1✔
2
import {BANNER} from '../src/mediaTypes.js';
3
import {buildUrl, logInfo, logMessage, parseSizesInput, triggerPixel} from '../src/utils.js';
4

5
/**
6
 * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
7
 * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid
8
 * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest
9
 * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec
10
 * @typedef {import('../src/adapters/bidderFactory.js').TimedOutBid} TimedOutBid
11
 */
12

13
const ADQUERY_GVLID = 902;
1✔
14
const ADQUERY_BIDDER_CODE = 'adquery';
1✔
15
const ADQUERY_BIDDER_DOMAIN_PROTOCOL = 'https';
1✔
16
const ADQUERY_BIDDER_DOMAIN = 'bidder.adquery.io';
1✔
17
const ADQUERY_STATIC_DOMAIN_PROTOCOL = 'https';
1✔
18
const ADQUERY_STATIC_DOMAIN = 'api.adquery.io';
1✔
19
const ADQUERY_USER_SYNC_DOMAIN = ADQUERY_BIDDER_DOMAIN;
1✔
20
const ADQUERY_DEFAULT_CURRENCY = 'PLN';
1✔
21
const ADQUERY_NET_REVENUE = true;
1✔
22
const ADQUERY_TTL = 360;
1✔
23

24
/** @type {BidderSpec} */
25
export const spec = {
1✔
26
  code: ADQUERY_BIDDER_CODE,
27
  gvlid: ADQUERY_GVLID,
28
  supportedMediaTypes: [BANNER],
29

30
  /**
31
   * @param {object} bid
32
   * @return {boolean}
33
   */
34
  isBidRequestValid: (bid) => {
35
    return !!(bid && bid.params && bid.params.placementId && bid.mediaTypes.banner.sizes)
3✔
36
  },
37

38
  /**
39
   * @param {BidRequest[]} bidRequests
40
   * @param {*} bidderRequest
41
   * @return {ServerRequest}
42
   */
43
  buildRequests: (bidRequests, bidderRequest) => {
44
    const requests = [];
11✔
45

46
    const adqueryRequestUrl = buildUrl({
11✔
47
      protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL,
48
      hostname: ADQUERY_BIDDER_DOMAIN,
49
      pathname: '/prebid/bid',
50
      // search: params
51
    });
52

53
    for (let i = 0, len = bidRequests.length; i < len; i++) {
11✔
54
      const request = {
11✔
55
        method: 'POST',
56
        url: adqueryRequestUrl, // ADQUERY_BIDDER_DOMAIN_PROTOCOL + '://' + ADQUERY_BIDDER_DOMAIN + '/prebid/bid',
57
        data: buildRequest(bidRequests[i], bidderRequest),
58
        options: {
59
          withCredentials: false,
60
          crossOrigin: true
61
        }
62
      };
63
      requests.push(request);
11✔
64
    }
65
    return requests;
11✔
66
  },
67

68
  /**
69
   * @param {*} response
70
   * @param {ServerRequest} request
71
   * @return {Bid[]}
72
   */
73
  interpretResponse: (response, request) => {
74
    logMessage(request);
3✔
75
    logMessage(response);
3✔
76

77
    const res = response && response.body && response.body.data;
3✔
78
    const bidResponses = [];
3✔
79

80
    if (!res) {
3✔
81
      return [];
1✔
82
    }
83

84
    const bidResponse = {
2✔
85
      requestId: res.requestId,
86
      cpm: res.cpm,
87
      width: res.mediaType.width,
88
      height: res.mediaType.height,
89
      creativeId: res.creationId,
90
      dealId: res.dealid || '',
4✔
91
      currency: res.currency || ADQUERY_DEFAULT_CURRENCY,
2!
92
      netRevenue: ADQUERY_NET_REVENUE,
93
      ttl: ADQUERY_TTL,
94
      referrer: '',
95
      ad: '<script src="' + res.adqLib + '"></script>' + res.tag,
96
      mediaType: res.mediaType.name || 'banner',
2!
97
      meta: {
98
        advertiserDomains: res.adDomains && res.adDomains.length ? res.adDomains : [],
6!
99
        mediaType: res.mediaType.name || 'banner',
2!
100
      }
101
    };
102
    bidResponses.push(bidResponse);
2✔
103
    logInfo('bidResponses', bidResponses);
2✔
104

105
    return bidResponses;
2✔
106
  },
107

108
  /**
109
   * @param {TimedOutBid} timeoutData
110
   */
111
  onTimeout: (timeoutData) => {
112
    if (timeoutData == null) {
1!
UNCOV
113
      return;
×
114
    }
115
    logInfo('onTimeout ', timeoutData);
1✔
116
    const params = {
1✔
117
      bidder: timeoutData.bidder,
118
      bId: timeoutData.bidId,
119
      adUnitCode: timeoutData.adUnitCode,
120
      timeout: timeoutData.timeout,
121
      auctionId: timeoutData.auctionId,
122
    };
123
    const adqueryRequestUrl = buildUrl({
1✔
124
      protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL,
125
      hostname: ADQUERY_BIDDER_DOMAIN,
126
      pathname: '/prebid/eventTimeout',
127
      search: params
128
    });
129
    triggerPixel(adqueryRequestUrl);
1✔
130
  },
131

132
  /**
133
   * @param {Bid} bid
134
   */
135
  onBidWon: (bid) => {
136
    logInfo('onBidWon', bid);
1✔
137
    const copyOfBid = { ...bid }
1✔
138
    delete copyOfBid.ad
1✔
139
    const shortBidString = JSON.stringify(copyOfBid);
1✔
140
    const encodedBuf = window.btoa(shortBidString);
1✔
141

142
    const params = {
1✔
143
      q: encodedBuf,
144
    };
145
    const adqueryRequestUrl = buildUrl({
1✔
146
      protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL,
147
      hostname: ADQUERY_BIDDER_DOMAIN,
148
      pathname: '/prebid/eventBidWon',
149
      search: params
150
    });
151
    triggerPixel(adqueryRequestUrl);
1✔
152
  },
153

154
  /**
155
   * @param {Bid} bid
156
   */
157
  onSetTargeting: (bid) => {
UNCOV
158
    logInfo('onSetTargeting', bid);
×
159

UNCOV
160
    const params = {
×
161
      bidder: bid.bidder,
162
      width: bid.width,
163
      height: bid.height,
164
      bid: bid.adId,
165
      mediaType: bid.mediaType,
166
      cpm: bid.cpm,
167
      requestId: bid.requestId,
168
      adUnitCode: bid.adUnitCode
169
    };
170

UNCOV
171
    const adqueryRequestUrl = buildUrl({
×
172
      protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL,
173
      hostname: ADQUERY_BIDDER_DOMAIN,
174
      pathname: '/prebid/eventSetTargeting',
175
      search: params
176
    });
UNCOV
177
    triggerPixel(adqueryRequestUrl);
×
178
  },
179
  /**
180
   * Retrieves user synchronization URLs based on provided options and consents.
181
   *
182
   * @param {object} syncOptions - Options for synchronization.
183
   * @param {object[]} serverResponses - Array of server responses.
184
   * @param {object} gdprConsent - GDPR consent object.
185
   * @param {object} uspConsent - USP consent object.
186
   * @returns {object[]} - Array of synchronization URLs.
187
   */
188
  getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => {
189
    logMessage('getUserSyncs', syncOptions, serverResponses, gdprConsent, uspConsent);
3✔
190
    const syncData = {
3✔
191
      'gdpr': gdprConsent && gdprConsent.gdprApplies ? 1 : 0,
9!
192
      'gdpr_consent': gdprConsent && gdprConsent.consentString ? gdprConsent.consentString : '',
9!
193
      'ccpa_consent': uspConsent && uspConsent.uspConsent ? uspConsent.uspConsent : '',
9!
194
    };
195

196
    if (window.qid) { // only for new users (new qid)
3✔
197
      syncData.qid = window.qid;
3✔
198
    }
199

200
    const syncUrlObject = {
3✔
201
      protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL,
202
      hostname: ADQUERY_USER_SYNC_DOMAIN,
203
      pathname: '/prebid/userSync',
204
      search: syncData
205
    };
206

207
    if (syncOptions.iframeEnabled) {
3✔
208
      syncUrlObject.protocol = ADQUERY_STATIC_DOMAIN_PROTOCOL;
1✔
209
      syncUrlObject.hostname = ADQUERY_STATIC_DOMAIN;
1✔
210
      syncUrlObject.pathname = '/user-sync-iframe.html';
1✔
211

212
      return [{
1✔
213
        type: 'iframe',
214
        url: buildUrl(syncUrlObject)
215
      }];
216
    }
217

218
    return [{
2✔
219
      type: 'image',
220
      url: buildUrl(syncUrlObject)
221
    }];
222
  }
223
};
224

225
function buildRequest(validBidRequests, bidderRequest) {
226
  const bid = validBidRequests;
11✔
227
  logInfo('buildRequest: ', bid);
11✔
228

229
  let userId = null;
11✔
230
  if (window.qid) {
11✔
231
    userId = window.qid;
10✔
232
  }
233

234
  if (bid.userId && bid.userId.qid) {
11!
UNCOV
235
    userId = bid.userId.qid
×
236
  }
237

238
  if (!userId) {
11✔
239
    // onetime User ID
240
    const ramdomValues = Array.from(window.crypto.getRandomValues(new Uint32Array(4)));
1✔
241
    userId = ramdomValues.map(val => val.toString(36)).join('').substring(0, 20);
4✔
242
    logMessage('generated onetime User ID: ', userId);
1✔
243
    window.qid = userId;
1✔
244
  }
245

246
  let pageUrl = '';
11✔
247
  if (bidderRequest && bidderRequest.refererInfo) {
11✔
248
    pageUrl = bidderRequest.refererInfo.page || '';
11✔
249
  }
250

251
  return {
11✔
252
    v: '$prebid.version$',
253
    placementCode: bid.params.placementId,
254
    auctionId: null,
255
    type: bid.params.type,
256
    adUnitCode: bid.adUnitCode,
257
    bidQid: userId,
258
    bidId: bid.bidId,
259
    bidder: bid.bidder,
260
    bidPageUrl: pageUrl,
261
    bidderRequestId: bid.bidderRequestId,
262
    bidRequestsCount: bid.bidRequestsCount,
263
    bidderRequestsCount: bid.bidderRequestsCount,
264
    sizes: parseSizesInput(bid.mediaTypes.banner.sizes).toString(),
265
  };
266
}
267

268
registerBidder(spec);
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc