diff --git a/src/test/groovy/org/prebid/server/functional/model/request/Channel.groovy b/src/test/groovy/org/prebid/server/functional/model/request/Channel.groovy new file mode 100644 index 00000000000..0a21c56899f --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/request/Channel.groovy @@ -0,0 +1,13 @@ +package org.prebid.server.functional.model.request + +import groovy.transform.EqualsAndHashCode +import groovy.transform.ToString +import org.prebid.server.functional.model.ChannelType + +@ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode +class Channel { + + ChannelType name + String version +} diff --git a/src/test/groovy/org/prebid/server/functional/model/request/amp/AmpRequest.groovy b/src/test/groovy/org/prebid/server/functional/model/request/amp/AmpRequest.groovy index fffb2c86e05..d7a2d3ae3c6 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/amp/AmpRequest.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/amp/AmpRequest.groovy @@ -2,11 +2,13 @@ package org.prebid.server.functional.model.request.amp import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.util.PBSUtils @ToString(includeNames = true, ignoreNulls = true) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy) +@EqualsAndHashCode class AmpRequest { String tagId diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/AdjustmentRule.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/AdjustmentRule.groovy index 953f66fd988..f3d02d15e0f 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/AdjustmentRule.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/AdjustmentRule.groovy @@ -3,11 +3,13 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.model.Currency @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class AdjustmentRule { @JsonProperty('adjtype') diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Amp.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Amp.groovy index cbc381ce564..88638e60a34 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/Amp.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Amp.groovy @@ -1,9 +1,11 @@ package org.prebid.server.functional.model.request.auction +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.model.request.amp.AmpRequest @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class Amp { AmpRequest data diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/AppExt.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/AppExt.groovy index ee3c1c9a8f0..4a1d0d237a3 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/AppExt.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/AppExt.groovy @@ -1,8 +1,10 @@ package org.prebid.server.functional.model.request.auction +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class AppExt { AppExtData data diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/AppExtData.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/AppExtData.groovy index 3d12506410c..fbe97c6ba4b 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/AppExtData.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/AppExtData.groovy @@ -1,8 +1,10 @@ package org.prebid.server.functional.model.request.auction +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class AppExtData { String language diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/AppPrebid.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/AppPrebid.groovy index edb365d4d6f..f201aad5da4 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/AppPrebid.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/AppPrebid.groovy @@ -1,8 +1,10 @@ package org.prebid.server.functional.model.request.auction +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class AppPrebid { String source diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustment.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustment.groovy index 7f7250a6a75..f10d985e801 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustment.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustment.groovy @@ -2,11 +2,13 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.util.PBSUtils @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class BidAdjustment { Map mediaType diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustmentFactors.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustmentFactors.groovy index 9cb90edb27b..3c6360faa81 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustmentFactors.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustmentFactors.groovy @@ -4,11 +4,13 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter import com.fasterxml.jackson.annotation.JsonAnySetter import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.model.bidder.BidderName @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class BidAdjustmentFactors { @JsonAnySetter diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustmentRule.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustmentRule.groovy index 92af741601f..67f23edcf99 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustmentRule.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/BidAdjustmentRule.groovy @@ -1,9 +1,11 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.annotation.JsonProperty +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class BidAdjustmentRule { @JsonProperty('*') diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/ConsentedProvidersSettings.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/ConsentedProvidersSettings.groovy index aa7bd511cb2..720ddb40541 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/ConsentedProvidersSettings.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/ConsentedProvidersSettings.groovy @@ -2,10 +2,12 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @ToString(includeNames = true, ignoreNulls = true) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy) +@EqualsAndHashCode class ConsentedProvidersSettings { String consentedProviders diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/DeviceExt.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/DeviceExt.groovy index 72337563b4b..b5b3d62f87d 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/DeviceExt.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/DeviceExt.groovy @@ -1,13 +1,16 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.annotation.JsonValue +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @ToString +@EqualsAndHashCode class DeviceExt { Atts atts String cdep + DevicePrebid prebid enum Atts { diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/DevicePrebid.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/DevicePrebid.groovy new file mode 100644 index 00000000000..f6cc123133f --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/DevicePrebid.groovy @@ -0,0 +1,11 @@ +package org.prebid.server.functional.model.request.auction + +import groovy.transform.EqualsAndHashCode +import groovy.transform.ToString + +@EqualsAndHashCode +@ToString(includeNames = true, ignoreNulls = true) +class DevicePrebid { + + Interstitial interstitial +} diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContextDataAdServer.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContextDataAdServer.groovy index 775fa3d8c76..528bc6e8a7c 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContextDataAdServer.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContextDataAdServer.groovy @@ -2,8 +2,10 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString +@EqualsAndHashCode @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) @ToString(includeNames = true, ignoreNulls = true) class ImpExtContextDataAdServer { diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Interstitial.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Interstitial.groovy new file mode 100644 index 00000000000..7a56ca6899d --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Interstitial.groovy @@ -0,0 +1,15 @@ +package org.prebid.server.functional.model.request.auction + +import com.fasterxml.jackson.annotation.JsonProperty +import groovy.transform.EqualsAndHashCode +import groovy.transform.ToString + +@EqualsAndHashCode +@ToString(includeNames = true, ignoreNulls = true) +class Interstitial { + + @JsonProperty("minwidthperc") + Integer minWidthPercentage + @JsonProperty("minheightperc") + Integer minHeightPercentage +} diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/MultiBid.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/MultiBid.groovy index 5349fd495ad..83cafd74d45 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/MultiBid.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/MultiBid.groovy @@ -2,11 +2,13 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.model.bidder.BidderName @ToString(includeNames = true, ignoreNulls = false) @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) +@EqualsAndHashCode class MultiBid { BidderName bidder diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Prebid.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Prebid.groovy index 23b4e7f87a5..7a991c399da 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/Prebid.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Prebid.groovy @@ -4,9 +4,9 @@ import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming import groovy.transform.ToString -import org.prebid.server.functional.model.ChannelType import org.prebid.server.functional.model.bidder.BidderName import org.prebid.server.functional.model.config.AlternateBidderCodes +import org.prebid.server.functional.model.request.Channel @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) @ToString(includeNames = true, ignoreNulls = true) @@ -26,6 +26,8 @@ class Prebid { ExtRequestPrebidData data List bidderConfig List schains + List noSale + Long auctionTimestamp Amp amp Channel channel List multibid @@ -49,10 +51,7 @@ class Prebid { List profileNames @JsonProperty("kvps") Map keyValuePairs - - static class Channel { - - ChannelType name - String version - } + Boolean supportDeals + String integration + Map bidders } diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/PrebidCurrency.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/PrebidCurrency.groovy index 98488883cb7..f54f92634dc 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/PrebidCurrency.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/PrebidCurrency.groovy @@ -2,11 +2,13 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.model.Currency @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class PrebidCurrency { Map> rates diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/UserTime.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/UserTime.groovy index bc81ab3fc6f..f509d46aa68 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/UserTime.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/UserTime.groovy @@ -1,8 +1,10 @@ package org.prebid.server.functional.model.request.auction +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class UserTime { Integer userdow diff --git a/src/test/groovy/org/prebid/server/functional/tests/AmpFpdSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/AmpFpdSpec.groovy index e376f611e84..412f4776e69 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AmpFpdSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AmpFpdSpec.groovy @@ -233,9 +233,6 @@ class AmpFpdSpec extends BaseSpec { def bidderRequest = bidder.getBidderRequest(ampStoredRequest.id) assert ampStoredRequest.ext.prebid.bidderConfig[0].config.ortb2.site.domain == bidderRequest.site.domain assert ampStoredRequest.ext.prebid.bidderConfig[0].config.ortb2.user.keywords == bidderRequest.user.keywords - - and: "Bidder request shouldn't contain bidder config" - assert !bidderRequest.ext.prebid.bidderConfig } def "PBS should populate FPD from root when bidder was defined in prebid data"() { diff --git a/src/test/groovy/org/prebid/server/functional/tests/AuctionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/AuctionSpec.groovy index 1506e2e0a4d..a4c7d07f92e 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AuctionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AuctionSpec.groovy @@ -125,37 +125,6 @@ class AuctionSpec extends BaseSpec { "invalid-stored-impr" | { bidReq, storedReq -> bidReq.imp[0].ext.prebid.storedRequest = storedReq } } - def "PBS should copy imp level passThrough to bidresponse.seatbid[].bid[].ext.prebid.passThrough when the passThrough is present"() { - given: "Default bid request with passThrough" - def randomString = PBSUtils.randomString - def passThrough = [(randomString): randomString] - def bidRequest = BidRequest.defaultBidRequest.tap { - imp[0].ext.prebid.passThrough = passThrough - } - - when: "Requesting PBS auction" - def response = defaultPbsService.sendAuctionRequest(bidRequest) - - then: "BidResponse should contain the same passThrough as on request" - assert response.seatbid.first().bid.first().ext.prebid.passThrough == passThrough - } - - def "PBS should copy global level passThrough object to bidresponse.ext.prebid.passThrough when passThrough is present"() { - given: "Default bid request with passThrough" - def randomString = PBSUtils.randomString - def passThrough = [(randomString): randomString] - def bidRequest = BidRequest.defaultBidRequest.tap { - ext.prebid.passThrough = passThrough - } - - when: "Requesting PBS auction" - defaultPbsService.sendAuctionRequest(bidRequest) - - then: "BidResponse should contain the same passThrough as on request" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest.ext.prebid.passThrough == passThrough - } - def "PBS should populate bidder request buyeruid from buyeruids when buyeruids with appropriate bidder present in request"() { given: "Bid request with buyeruids" def buyeruid = PBSUtils.randomString @@ -169,6 +138,9 @@ class AuctionSpec extends BaseSpec { then: "Bidder request should contain buyeruid from the user.ext.prebid.buyeruids" def bidderRequest = bidder.getBidderRequest(bidRequest.id) assert bidderRequest?.user?.buyeruid == buyeruid + + and: "Bidder request shouldn't contain user.ext.prebid.buyeruids" + assert !bidderRequest?.user?.ext?.prebid?.buyeruids } def "PBS shouldn't populate bidder request buyeruid from buyeruids when buyeruids without appropriate bidder present in request"() { @@ -336,25 +308,6 @@ class AuctionSpec extends BaseSpec { assert !bidderRequest.ext.prebid.aliases } - def "PBS auction should pass ext.prebid.sdk requested to bidder request when sdk specified"() { - given: "Default bid request with aliases" - def bidRequest = BidRequest.defaultBidRequest.tap { - ext.prebid.sdk = new Sdk(renderers: [new Renderer( - name: PBSUtils.randomString, - version: PBSUtils.randomString, - data: new RendererData(any: PBSUtils.randomString))]) - } - - when: "Requesting PBS auction" - defaultPbsService.sendAuctionRequest(bidRequest) - - then: "Bidder request should contain sdk value same in request" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest.ext.prebid.sdk.renderers.name == bidRequest.ext.prebid.sdk.renderers.name - assert bidderRequest.ext.prebid.sdk.renderers.version == bidRequest.ext.prebid.sdk.renderers.version - assert bidderRequest.ext.prebid.sdk.renderers.data.any == bidRequest.ext.prebid.sdk.renderers.data.any - } - def "PBS auction should pass meta object to bid response when meta specified "() { given: "Default bid request with aliases" def bidRequest = BidRequest.defaultBidRequest diff --git a/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy index 7da1c89fffb..cf945b2bc6c 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy @@ -1,6 +1,5 @@ package org.prebid.server.functional.tests - import org.prebid.server.functional.model.bidder.Generic import org.prebid.server.functional.model.config.AccountAuctionConfig import org.prebid.server.functional.model.config.AccountConfig @@ -53,6 +52,7 @@ import static org.prebid.server.functional.model.request.auction.VideoPlcmtSubty import static org.prebid.server.functional.model.response.auction.ErrorType.PREBID import static org.prebid.server.functional.testcontainers.Dependencies.getNetworkServiceContainer import static org.prebid.server.functional.util.PBSUtils.getRandomDecimal +import static org.prebid.server.functional.util.PBSUtils.roundDecimal class BidAdjustmentSpec extends BaseSpec { @@ -96,13 +96,17 @@ class BidAdjustmentSpec extends BaseSpec { assert response?.seatbid?.first?.bid?.first?.price == bidResponse.seatbid.first.bid.first.price * bidAdjustmentFactor + and: "Bidder request shouldn't contain bid adjustment factors" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.bidAdjustmentFactors == bidRequest.ext.prebid.bidAdjustmentFactors + where: bidAdjustmentFactor << [0.9, 1.1] } def "PBS should prefer bid price adjustment based on media type when request has per-media-type bid adjustment factors"() { given: "Default bid request with bid adjustment" - def bidAdjustment = randomDecimal + def bidAdjustment = roundDecimal(getRandomDecimal(), 0) def mediaTypeBidAdjustment = bidAdjustmentFactor def bidRequest = BidRequest.getDefaultBidRequest(SITE).tap { ext.prebid.bidAdjustmentFactors = new BidAdjustmentFactors().tap { @@ -122,6 +126,10 @@ class BidAdjustmentSpec extends BaseSpec { assert response?.seatbid?.first?.bid?.first?.price == bidResponse.seatbid.first.bid.first.price * mediaTypeBidAdjustment + and: "Bidder request should contain bid bid adjustment factors" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.bidAdjustmentFactors == bidRequest.ext.prebid.bidAdjustmentFactors + where: bidAdjustmentFactor << [0.9, 1.1] } @@ -235,6 +243,9 @@ class BidAdjustmentSpec extends BaseSpec { assert bidderRequest.imp.bidFloorCur == [currency] assert bidderRequest.imp.bidFloor == [impPrice] + and: "Bidder request should contain bid adjustments" + assert bidderRequest.ext.prebid.bidAdjustments == bidRequest.ext.prebid.bidAdjustments + where: adjustmentType | ruleValue | mediaType | bidRequest MULTIPLIER | getRandomDecimal(MIN_ADJUST_VALUE, MAX_MULTIPLIER_ADJUST_VALUE) | BANNER | BidRequest.defaultBidRequest diff --git a/src/test/groovy/org/prebid/server/functional/tests/BidderFieldDisplayBehaviorSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BidderFieldDisplayBehaviorSpec.groovy new file mode 100644 index 00000000000..955a677bd65 --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderFieldDisplayBehaviorSpec.groovy @@ -0,0 +1,639 @@ +package org.prebid.server.functional.tests + +import org.prebid.server.functional.model.bidder.BidderName +import org.prebid.server.functional.model.bidder.Generic +import org.prebid.server.functional.model.config.AlternateBidderCodes +import org.prebid.server.functional.model.request.Channel +import org.prebid.server.functional.model.request.amp.AmpRequest +import org.prebid.server.functional.model.request.auction.AdServerTargeting +import org.prebid.server.functional.model.request.auction.AdjustmentRule +import org.prebid.server.functional.model.request.auction.Amp +import org.prebid.server.functional.model.request.auction.AppExt +import org.prebid.server.functional.model.request.auction.AppExtData +import org.prebid.server.functional.model.request.auction.AppPrebid +import org.prebid.server.functional.model.request.auction.BidAdjustment +import org.prebid.server.functional.model.request.auction.BidAdjustmentFactors +import org.prebid.server.functional.model.request.auction.BidAdjustmentRule +import org.prebid.server.functional.model.request.auction.BidRequest +import org.prebid.server.functional.model.request.auction.BidderConfig +import org.prebid.server.functional.model.request.auction.BidderConfigOrtb +import org.prebid.server.functional.model.request.auction.ConsentedProvidersSettings +import org.prebid.server.functional.model.request.auction.Device +import org.prebid.server.functional.model.request.auction.DeviceExt +import org.prebid.server.functional.model.request.auction.Dooh +import org.prebid.server.functional.model.request.auction.DoohExt +import org.prebid.server.functional.model.request.auction.EidPermission +import org.prebid.server.functional.model.request.auction.ExtPrebidBidderConfig +import org.prebid.server.functional.model.request.auction.ExtRequestPrebidData +import org.prebid.server.functional.model.request.auction.Interstitial +import org.prebid.server.functional.model.request.auction.MultiBid +import org.prebid.server.functional.model.request.auction.PaaFormat +import org.prebid.server.functional.model.request.auction.PrebidCache +import org.prebid.server.functional.model.request.auction.DevicePrebid +import org.prebid.server.functional.model.request.auction.PrebidCurrency +import org.prebid.server.functional.model.request.auction.Renderer +import org.prebid.server.functional.model.request.auction.RendererData +import org.prebid.server.functional.model.request.auction.Sdk +import org.prebid.server.functional.model.request.auction.Site +import org.prebid.server.functional.model.request.auction.SiteExt +import org.prebid.server.functional.model.request.auction.SiteExtData +import org.prebid.server.functional.model.request.auction.User +import org.prebid.server.functional.model.request.auction.UserExt +import org.prebid.server.functional.model.request.auction.UserExtPrebid +import org.prebid.server.functional.model.request.auction.UserTime +import org.prebid.server.functional.model.response.auction.BidResponse +import org.prebid.server.functional.util.PBSUtils + +import static org.prebid.server.functional.model.ChannelType.WEB +import static org.prebid.server.functional.model.Currency.USD +import static org.prebid.server.functional.model.bidder.BidderName.OPENX +import static org.prebid.server.functional.model.bidder.BidderName.RUBICON +import static org.prebid.server.functional.model.mock.services.currencyconversion.CurrencyConversionRatesResponse.defaultConversionRates +import static org.prebid.server.functional.model.request.auction.AdjustmentType.MULTIPLIER +import static org.prebid.server.functional.model.request.auction.BidAdjustmentMediaType.BANNER +import static org.prebid.server.functional.model.request.auction.BidAdjustmentMediaType.VIDEO +import static org.prebid.server.functional.model.request.auction.DebugCondition.ENABLED +import static org.prebid.server.functional.model.request.auction.DistributionChannel.APP +import static org.prebid.server.functional.model.request.auction.DistributionChannel.DOOH +import static org.prebid.server.functional.model.request.auction.DistributionChannel.SITE +import static org.prebid.server.functional.model.request.auction.TraceLevel.BASIC +import static org.prebid.server.functional.model.response.auction.ErrorType.GENERIC +import static org.prebid.server.functional.util.PBSUtils.getRandomDecimal +import static org.prebid.server.functional.util.PBSUtils.roundDecimal + +class BidderFieldDisplayBehaviorSpec extends BaseSpec { + + private static final WILDCARD = "*" + + def "PBS should pass ext.prebid.createTids to bidder request"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.createTids = PBSUtils.randomBoolean + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain createTids" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.createTids == bidRequest.ext.prebid.createTids + } + + def "PBS shouldn't pass ext.prebid.returnAllBidStatus to bidder request"() { + given: "Default basic bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.returnAllBidStatus = true + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain returnAllBidStatus" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.returnAllBidStatus + } + + def "PBS shouldn't pass aliasGvlIds to bidder request when aliasGvlIds or aliases specified"() { + given: "Default basic bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.alias = new Generic() + imp[0].ext.prebid.bidder.generic = null + ext.prebid.aliasgvlids = [(BidderName.ALIAS.value): PBSUtils.randomNumber] + ext.prebid.aliases = [(BidderName.ALIAS.value): BidderName.GENERIC] + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain aliasgvlids and aliases" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.aliasgvlids + assert !bidderRequest.ext.prebid.aliases + } + + def "PBS shouldn't pass adServerTargeting to bidder request when adServerTargeting specified"() { + given: "Default bid request" + def customBidRequest = "custom_bid_request" + def sourceOfBidRequest = "bidrequest" + def impId = "imp.id" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.tap { + adServerTargeting = [ + new AdServerTargeting().tap { + key = customBidRequest + source = sourceOfBidRequest + value = impId + }] + } + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain adServerTargeting" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.adServerTargeting + } + + def "PBS should pass supportDeals to bidder request when supportDeals specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.supportDeals = PBSUtils.randomBoolean + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain requested supportDeals" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.supportDeals == bidRequest.ext.prebid.supportDeals + } + + def "PBS shouldn't pass ext.prebid.cache to bidder request when cache specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.cache = new PrebidCache(winningOnly: PBSUtils.randomBoolean) + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain cache" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.cache + } + + def "PBS should pass ext.prebid.channel to bidder request when channel specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.channel = new Channel(name: WEB) + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain ext.prebid.channel" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.channel == bidRequest.ext.prebid.channel + } + + def "PBS should pass ext.prebid.currency.{usePbsRates/rates} to bidder request when usePbsRates or rates specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.currency = new PrebidCurrency( + usePbsRates: PBSUtils.randomBoolean, + rates: getDefaultConversionRates()) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain ext.prebid.currency" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.currency == bidRequest.ext.prebid.currency + } + + def "PBS shouldn't pass ext.prebid.data.{bidders,eidpermissions} to bidder request"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.data = new ExtRequestPrebidData(bidders: [GENERIC.value], + eidpermissions: [new EidPermission(source: PBSUtils.randomString, bidders: [BidderName.GENERIC])]) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain ext.prebid.data.{bidders,eidpermissions}" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest?.ext?.prebid?.data?.bidders + assert !bidderRequest?.ext?.prebid?.data?.eidpermissions + } + + def "PBS should pass ext.prebid.{trace,debug,integration} to bidder request"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.trace = BASIC + ext.prebid.debug = ENABLED + ext.prebid.integration = PBSUtils.randomString + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain ext.prebid.data.{debug,trace,integration}" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + verifyAll(bidderRequest) { + bidderRequest.ext.prebid.trace == bidRequest.ext.prebid.trace + bidderRequest.ext.prebid.debug == bidRequest.ext.prebid.debug + bidderRequest.ext.prebid.integration == bidRequest.ext.prebid.integration + } + } + + def "PBS shouldn't pass ext.prebid.events to bidder request when events specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + enableEvents() + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain events" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.events + } + + def "PBS shouldn't pass ext.prebid.noSale to bidder request when noSale specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.noSale = [PBSUtils.randomString] + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain noSale" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.noSale + } + + def "PBS should pass ext.prebid.amp to bidder request when amp specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.amp = new Amp(data: AmpRequest.getDefaultAmpRequest()) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain requested amp" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.amp == bidRequest.ext.prebid.amp + } + + def "PBS should copy imp level passThrough to bidresponse.seatbid[].bid[].ext.prebid.passThrough when the passThrough is present"() { + given: "Default bid request with passThrough" + def randomString = PBSUtils.randomString + def passThrough = [(randomString): randomString] + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.passThrough = passThrough + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain the same passThrough as on request" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.passThrough + + and: "Response should contain the same passThrough as on request" + assert response.seatbid.first().bid.first().ext.prebid.passThrough == passThrough + + and: "Response shouldn't contain in ext.prebid.passThrough" + assert !response.ext.prebid.passThrough + } + + def "PBS should copy global level passThrough object to bidresponse.ext.prebid.passThrough when passThrough is present"() { + given: "Default bid request with passThrough" + def randomString = PBSUtils.randomString + def passThrough = [(randomString): randomString] + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.passThrough = passThrough + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response shouldn't contain the same passThrough as on request" + assert !response.seatbid.first().bid.first().ext.prebid.passThrough + + and: "Response should contain in ext.prebid.passThrough" + assert response.ext.prebid.passThrough == passThrough + + and: "Bidder request shouldn't contain the same passThrough as on request" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.passThrough + } + + def "PBS auction should pass ext.prebid.sdk requested to bidder request when sdk specified"() { + given: "Default bid request with ext.prebid.sdk" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.sdk = new Sdk(renderers: [new Renderer( + name: PBSUtils.randomString, + version: PBSUtils.randomString, + data: new RendererData(any: PBSUtils.randomString))]) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain sdk value same in request" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + verifyAll { + bidderRequest.ext.prebid.sdk.renderers.name == bidRequest.ext.prebid.sdk.renderers.name + bidderRequest.ext.prebid.sdk.renderers.version == bidRequest.ext.prebid.sdk.renderers.version + bidderRequest.ext.prebid.sdk.renderers.data.any == bidRequest.ext.prebid.sdk.renderers.data.any + } + } + + def "PBS auction should pass ext.prebid.paaformat to bidder request when paaformat specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.paaFormat = PaaFormat.ORIGINAL + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain paaFormat value same in request" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.paaFormat == bidRequest.ext.prebid.paaFormat + } + + def "PBS auction shouldn't pass ext.prebid.kvps to bidder request when kvps specified"() { + given: "Default bid request with kvps" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.keyValuePairs = [(PBSUtils.randomString): PBSUtils.randomString] + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain keyValuePairs" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.keyValuePairs + } + + def "PBS auction should pass ext.prebid.alternatebiddercodes to bidder request when alternate bidder codes specified"() { + given: "Default bid request with alternateBidderCodes" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.alternateBidderCodes = new AlternateBidderCodes().tap { + it.enabled = true + it.bidders = [(BidderName.GENERIC): new org.prebid.server.functional.model.config.BidderConfig(enabled: true, allowedBidderCodes: [BidderName.GENERIC]), + (RUBICON) : new org.prebid.server.functional.model.config.BidderConfig(enabled: true, allowedBidderCodes: [RUBICON])] + } + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain ext.prebid.alternateBidderCodes" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.alternateBidderCodes.enabled == bidRequest.ext.prebid.alternateBidderCodes.enabled + assert bidderRequest.ext.prebid.alternateBidderCodes.bidders == [(BidderName.GENERIC): new org.prebid.server.functional.model.config.BidderConfig(enabled: true)] + } + + def "PBS should pass user.ext to bidder request when user.ext specified"() { + given: "Default basic BidRequest with generic bidder" + def bidRequest = BidRequest.defaultBidRequest.tap { + user = new User(ext: new UserExt().tap { + fcapids = [PBSUtils.randomString] + time = new UserTime(userdow: PBSUtils.randomNumber, userhour: PBSUtils.randomNumber) + prebid = new UserExtPrebid(buyeruids: [(BidderName.GENERIC): PBSUtils.randomString]) + consentedProvidersSettings = new ConsentedProvidersSettings(consentedProviders: PBSUtils.randomString) + }) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain user.ext.prebid.buyeruids" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest?.user?.ext?.prebid?.buyeruids + + and: "Bidder request should contain user.ext.{fcapid,time,consentedProvidersSettings}" + verifyAll(bidderRequest) { + bidderRequest.user.ext.fcapids == bidRequest.user.ext.fcapids + bidderRequest.user.ext.time == bidRequest.user.ext.time + bidderRequest.user.ext.consentedProvidersSettings == bidRequest.user.ext.consentedProvidersSettings + } + } + + def "PBS should pass site.ext to bidder request when site.ext specified"() { + given: "Default basic BidRequest with generic bidder" + def bidRequest = BidRequest.defaultBidRequest.tap { + site.ext = new SiteExt(amp: 0, data: new SiteExtData(id: PBSUtils.randomString)) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain site.ext.{amp,data}" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.site.ext.data == bidRequest.site.ext.data + assert bidderRequest.site.ext.amp == bidRequest.site.ext.amp + } + + def "PBS should pass device.ext to bidder request when device.ext specified"() { + given: "Default basic bid request with generic bidder" + def bidRequest = BidRequest.defaultBidRequest.tap { + device = new Device( + ext: new DeviceExt( + atts: DeviceExt.Atts.UNKNOWN, + cdep: PBSUtils.randomString, + prebid: new DevicePrebid(interstitial: new Interstitial( + minHeightPercentage: PBSUtils.getRandomNumber(0, 100), + minWidthPercentage: PBSUtils.getRandomNumber(0, 100))))) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain requested device.ext" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.device.ext == bidRequest.device.ext + } + + def "PBS should pass ext.prebid.auctionTimestamp to bidder request when auctionTimestamp specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.auctionTimestamp = PBSUtils.randomNumber + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain auctionTimestamp" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.auctionTimestamp + } + + def "PBS shouldn't pass ext.prebid.bidderConfig to bidder request when bidderConfig specified"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.bidderConfig = [new ExtPrebidBidderConfig(bidders: [BidderName.GENERIC], config: + new BidderConfig(ortb2: new BidderConfigOrtb(site: Site.configFPDSite, user: User.configFPDUser)))] + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain bidderConfig" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.bidderConfig + } + + def "PBS shouldn't pass bidder param to the bidder when bidder param bidder not requested"() { + given: "Default bid request with populated ext.prebid.bidderParams" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.bidderParams = [(RUBICON.value): PBSUtils.randomString] + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response shouldn't contain error" + assert !response.ext?.errors + + and: "Generic bidder request shouldn't contain bidder param" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.bidderParams + } + + def "PBS should pass bidder app.ext to the bidder request when app ext specified"() { + def bidRequest = BidRequest.getDefaultBidRequest(APP).tap { + app.ext = new AppExt(data: new AppExtData(language: PBSUtils.randomString), + prebid: new AppPrebid(source: PBSUtils.randomString, version: PBSUtils.randomString)) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain app.ext" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.app.ext == bidRequest.app.ext + } + + def "PBS should pass dooh.ext to bidder request when dooh.ext specified"() { + given: "Default bid request with bidRequest.dooh" + def bidRequest = BidRequest.getDefaultBidRequest(DOOH).tap { + dooh = new Dooh(id: PBSUtils.randomString, ext: DoohExt.defaultDoohExt) + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain dooh.ext" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.dooh.ext == bidRequest.dooh.ext + } + + def "PBS should pass ext.prebid.multiBid only bidder related entity for each bidder"() { + given: "Default basic BidRequest with generic bidder with includeBidderKeys = false" + def bidRequest = BidRequest.defaultBidRequest + + and: "Set maxbids = 2 for generic and rubicon bidder" + def maxBids = 2 + def genericMultiBid = new MultiBid(bidder: BidderName.GENERIC, maxBids: maxBids, targetBidderCodePrefix: PBSUtils.randomString) + def rubiconMultiBid = new MultiBid(bidder: RUBICON, maxBids: maxBids, targetBidderCodePrefix: PBSUtils.randomString) + bidRequest.ext.prebid.multibid = [genericMultiBid, rubiconMultiBid] + + and: "Default basic bid" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + + and: "Set bidder response" + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bid request should contain requested ext.prebid.multiBid" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.multibid == [genericMultiBid] + } + + def "PBS should pass ext.prebid.bidAdjustment only bidder related entry for each bidder"() { + given: "Default BidRequest with ext.prebid.bidAdjustments" + def currency = USD + def rule = new BidAdjustmentRule().tap { + generic = [(WILDCARD): [new AdjustmentRule(adjustmentType: MULTIPLIER, value: PBSUtils.randomPrice, currency: currency)]] + openx = [(WILDCARD): [new AdjustmentRule(adjustmentType: MULTIPLIER, value: PBSUtils.randomPrice, currency: currency)]] + } + def bidRequest = BidRequest.getDefaultBidRequest().tap { + ext.prebid.bidAdjustments = BidAdjustment.getDefaultWithSingleMediaTypeRule(BANNER, rule) + cur = [currency] + imp.first.bidFloor = PBSUtils.randomPrice + imp.first.bidFloorCur = currency + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain generic bid adjustments" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.bidAdjustments.version == bidRequest.ext.prebid.bidAdjustments.version + assert bidderRequest.ext.prebid.bidAdjustments.mediaType[BANNER].generic == bidRequest.ext.prebid.bidAdjustments.mediaType[BANNER].generic + + and: "Bidder request shouldn't contain openx bid adjustments" + assert !bidderRequest.ext.prebid.bidAdjustments.mediaType[BANNER].openx + } + + def "PBS should pass ext.prebid.bidAdjustmentFactors only bidder related entry for each bidder"() { + given: "Default bid request with bid adjustment" + def bidAdjustment = roundDecimal(getRandomDecimal(), 0) + def mediaTypeBidAdjustment = bidAdjustmentFactor + def bidRequest = BidRequest.getDefaultBidRequest(SITE).tap { + ext.prebid.bidAdjustmentFactors = new BidAdjustmentFactors().tap { + adjustments = [(BidderName.GENERIC): bidAdjustment, (OPENX): bidAdjustment] + mediaTypes = [(BANNER): [(BidderName.GENERIC): mediaTypeBidAdjustment], + (VIDEO): [(OPENX): mediaTypeBidAdjustment]] + } + } + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest) + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain generic bid adjustment factors" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.bidAdjustmentFactors.adjustments[BidderName.GENERIC] == bidRequest.ext.prebid.bidAdjustmentFactors.adjustments[BidderName.GENERIC] + assert bidderRequest.ext.prebid.bidAdjustmentFactors.mediaTypes[BANNER][GENERIC] == bidRequest.ext.prebid.bidAdjustmentFactors.mediaTypes[BANNER][GENERIC] + + and: "Bidder request shouldn't contain opneX bid adjustment factors for generic call" + assert !bidderRequest?.ext?.prebid?.bidAdjustmentFactors?.adjustments[OPENX] + assert !bidderRequest?.ext?.prebid?.bidAdjustmentFactors?.mediaTypes[BANNER][OPENX] + assert !bidderRequest?.ext?.prebid?.bidAdjustmentFactors?.mediaTypes[VIDEO] + + where: + bidAdjustmentFactor << [0.9, 1.1] + } +} diff --git a/src/test/groovy/org/prebid/server/functional/tests/BidderInsensitiveCaseSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BidderInsensitiveCaseSpec.groovy index f2fb2803f1f..ef74c3a9a06 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderInsensitiveCaseSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderInsensitiveCaseSpec.groovy @@ -201,25 +201,6 @@ class BidderInsensitiveCaseSpec extends BaseSpec { assert response.seatbid?.first()?.bid?.last()?.ext?.prebid?.targeting } - def "PBS should populate bidder request buyeruid from buyeruids when buyeruids with appropriate bidder present in request"() { - given: "Bid request with buyeruids" - def buyeruid = PBSUtils.randomString - def bidRequest = BidRequest.defaultBidRequest.tap { - imp[0].ext.prebid.bidder.tap { - genericCamelCase = new Generic() - generic = null - } - user = new User(ext: new UserExt(prebid: new UserExtPrebid(buyeruids: [(GENERIC_CAMEL_CASE): buyeruid]))) - } - - when: "PBS processes auction request" - defaultPbsService.sendAuctionRequest(bidRequest) - - then: "Bidder request should contain buyeruid from the user.ext.prebid.buyeruids" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest?.user?.buyeruid == buyeruid - } - def "PBS should be able to match requested bidder with original bidder name in ext.prebid.aliase"() { given: "Default bid request with alias" def bidRequest = BidRequest.defaultBidRequest.tap { diff --git a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy index 220585f008f..9dd11977525 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -34,6 +34,7 @@ import org.prebid.server.functional.model.response.auction.BidExt import org.prebid.server.functional.model.response.auction.BidResponse import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.CcpaConsent +import spock.lang.IgnoreRest import static org.prebid.server.functional.model.Currency.CHF import static org.prebid.server.functional.model.Currency.EUR @@ -262,9 +263,12 @@ class BidderParamsSpec extends BaseSpec { when: "PBS processes auction request" defaultPbsService.sendAuctionRequest(bidRequest) - then: "Response should contain zoneId value from imp[*].ext.prebid.bidder.BIDDER" + then: "Bidder request should contain zoneId value from imp[*].ext.prebid.bidder.BIDDER" def bidderRequest = bidder.getBidderRequest(bidRequest.id) assert bidderRequest.imp[0]?.ext?.bidder?.firstParam == firstParam + + and: "Bidder request should contain requested bidder param for related itself bidder" + assert bidderRequest.ext.prebid.bidderParams[GENERIC] == bidRequest.ext.prebid.bidderParams[GENERIC] } def "PBS should send bidder params from imp[*].ext.prebid.bidder.BIDDER when ext.prebid.bidderparams.BIDDER isn't specified"() { @@ -782,7 +786,7 @@ class BidderParamsSpec extends BaseSpec { when: "Requesting PBS auction" defaultPbsService.sendAuctionRequest(bidRequest) - then: "Response should contain imp[0].secure same value as in request" + then: "Bidder request should contain imp[0].secure same value as in request" def bidderRequest = bidder.getBidderRequest(bidRequest.id) assert bidderRequest.imp[0].secure == secureBidderRequest @@ -1424,8 +1428,9 @@ class BidderParamsSpec extends BaseSpec { and: "Response should contain repose millis with corresponding bidder" assert response.ext.responsetimemillis.containsKey(ALIAS.value) - and: "Bidder request should be valid" - assert bidder.getBidderRequests(bidRequest.id) + and: "Bidder request should be valid and not contain aliases" + def bidderRequests = bidder.getBidderRequests(bidRequest.id).first + assert !bidderRequests.ext.prebid.aliases } def "PBS should populate same code for adapter code when make call for generic hard code alias"() { diff --git a/src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy index ea169ad00ee..cb21fc92675 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy @@ -362,7 +362,7 @@ class DebugSpec extends BaseSpec { assert !response.ext?.warnings } - def "PBS should return STORED_BID_RESPONSE call type when call from stored bid response "() { + def "PBS should return STORED_BID_RESPONSE call type when call from stored bid response"() { given: "Default basic BidRequest with stored response" def bidRequest = BidRequest.defaultBidRequest def storedResponseId = PBSUtils.randomNumber diff --git a/src/test/groovy/org/prebid/server/functional/tests/FilterMultiFormatSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/FilterMultiFormatSpec.groovy index 1d36b8beadc..1ab45de4bec 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/FilterMultiFormatSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/FilterMultiFormatSpec.groovy @@ -65,6 +65,9 @@ class FilterMultiFormatSpec extends BaseSpec { assert bidderRequest.imp[0].banner assert bidderRequest.imp[0].audio + and: "Bidder request shouldn't contain biddercontrol" + assert !bidderRequest.ext.prebid.bidderControls + where: bidderControls << [ new BidderControls(generic: new GenericPreferredBidder(preferredMediaType: BANNER)), @@ -117,6 +120,9 @@ class FilterMultiFormatSpec extends BaseSpec { assert bidderRequest.imp[0].banner assert !bidderRequest.imp[0].audio + and: "Bidder request shouldn't contain biddercontrol" + assert !bidderRequest.ext.prebid.bidderControls + where: bidderControls << [ new BidderControls(generic: new GenericPreferredBidder(preferredMediaType: BANNER)), @@ -144,6 +150,9 @@ class FilterMultiFormatSpec extends BaseSpec { assert bidderRequest.imp.banner assert bidderRequest.imp.audio + and: "Bidder request shouldn't contain biddercontrol" + assert !bidderRequest.ext.prebid.bidderControls + where: bidderControls << [ new BidderControls(generic: new GenericPreferredBidder(preferredMediaType: BANNER)), @@ -221,6 +230,9 @@ class FilterMultiFormatSpec extends BaseSpec { assert bidderRequest.imp[0].banner assert !bidderRequest.imp[0].audio + and: "Bidder request shouldn't contain biddercontrol" + assert !bidderRequest.ext.prebid.bidderControls + where: bidderControls << [ new BidderControls(generic: new GenericPreferredBidder(preferredMediaType: BANNER)), diff --git a/src/test/groovy/org/prebid/server/functional/tests/MultibidSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/MultibidSpec.groovy index 233c863cbf6..e200f3562ed 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/MultibidSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/MultibidSpec.groovy @@ -39,6 +39,10 @@ class MultibidSpec extends BaseSpec { then: "PBS should not return targeting for non-winning bid" assert !response.seatbid?.first()?.bid?.last()?.ext?.prebid?.targeting + + and: "Bid request should contain requested ext.prebid.multiBid" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.multibid == [multiBid] } def "PBS should return seatbid[].bid[].ext.prebid.targeting for non-winning bid in multi-bid response when includeBidderKeys = true"() { @@ -66,6 +70,10 @@ class MultibidSpec extends BaseSpec { then: "PBS should return targeting for non-winning bid" assert response.seatbid?.first()?.bid?.last()?.ext?.prebid?.targeting + + and: "Bidder request should contain multibid" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.ext.prebid.multibid == [multiBid] } def "PBS should prefer bidRequest over account level config"() { diff --git a/src/test/groovy/org/prebid/server/functional/tests/ProfileSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/ProfileSpec.groovy index c6d600d518c..dd3b49efcc1 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/ProfileSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/ProfileSpec.groovy @@ -1299,7 +1299,8 @@ class ProfileSpec extends BaseSpec { assert metrics[MISSING_ACCOUNT_PROFILE_METRIC.formatted(accountId)] == 1 and: "Bidder request should contain data from profile" - verifyAll(bidder.getBidderRequest(bidRequest.id)) { + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + verifyAll(bidderRequest) { it.site.id == bidRequest.site.id it.site.name == bidRequest.site.name it.site.domain == bidRequest.site.domain @@ -1319,6 +1320,9 @@ class ProfileSpec extends BaseSpec { it.device.macmd5 == bidRequest.device.macmd5 it.device.dpidmd5 == bidRequest.device.dpidmd5 } + + and: "Bidder request should contain ext.prebid.profile" + assert bidderRequest.ext.prebid.profileNames } def "PBS should emit error and metrics when imp profile missing"() { diff --git a/src/test/groovy/org/prebid/server/functional/tests/SchainSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/SchainSpec.groovy index db67f6ce397..9b0dce39aec 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/SchainSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/SchainSpec.groovy @@ -41,6 +41,9 @@ class SchainSpec extends BaseSpec { then: "Configured schain node should be appended to the end of the node array" def bidderRequest = bidder.getBidderRequest(bidRequest.id) assert bidderRequest.source?.schain?.nodes == supplyChain.nodes + GLOBAL_SUPPLY_SCHAIN_NODE + + and: "Bidder request shouldn't contain schains as requested" + assert !bidderRequest.ext.prebid.schains } def "PBS should copy ext.schain to source.ext.schain when source.ext.schain doesn't exist"() { diff --git a/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy index d9d337b3c27..008f4c6a721 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy @@ -382,6 +382,13 @@ class TargetingSpec extends BaseSpec { then: "Amp response shouldn't contain custom targeting" assert !response.targeting[customKey] + and: "Bidder request should contain ext.prebid.targeting" + def bidderRequest = bidder.getBidderRequest(ampStoredRequest.id) + assert bidderRequest.ext.prebid.targeting + + and: "Bidder request shouldn't contain ext.prebid.adservertargeting" + assert !bidderRequest.ext.prebid.adServerTargeting + where: customSource | customValue "bidrequest" | "imp" @@ -450,6 +457,10 @@ class TargetingSpec extends BaseSpec { .every(map -> map.keySet() .every(key -> key.length() <= targetingLength))) + and: "Bidder request should contain ext.prebid.adservertargeting" + def bidderRequest = bidder.getBidderRequests(bidRequest.id) + assert bidderRequest.ext.prebid.targeting + cleanup: "Stop and remove pbs container" pbsServiceFactory.removeContainer(pbsConfig) } diff --git a/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsRulesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsRulesSpec.groovy index b586688398b..6c9638194c8 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsRulesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsRulesSpec.groovy @@ -13,6 +13,7 @@ import org.prebid.server.functional.model.pricefloors.MediaType import org.prebid.server.functional.model.pricefloors.PriceFloorData import org.prebid.server.functional.model.pricefloors.PriceFloorSchema import org.prebid.server.functional.model.pricefloors.Rule +import org.prebid.server.functional.model.request.Channel import org.prebid.server.functional.model.request.auction.Amx import org.prebid.server.functional.model.request.auction.Banner import org.prebid.server.functional.model.request.auction.BidRequest @@ -61,7 +62,6 @@ import static org.prebid.server.functional.model.request.auction.DistributionCha import static org.prebid.server.functional.model.request.auction.DistributionChannel.SITE import static org.prebid.server.functional.model.request.auction.FetchStatus.ERROR import static org.prebid.server.functional.model.request.auction.Location.NO_DATA -import static org.prebid.server.functional.model.request.auction.Prebid.Channel import static org.prebid.server.functional.model.response.auction.BidRejectionReason.RESPONSE_REJECTED_DUE_TO_PRICE_FLOOR import static org.prebid.server.functional.testcontainers.Dependencies.getNetworkServiceContainer diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAuctionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAuctionSpec.groovy index d544c7a2788..c1b275e7ed3 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAuctionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAuctionSpec.groovy @@ -2,6 +2,7 @@ package org.prebid.server.functional.tests.privacy import org.prebid.server.functional.model.ChannelType import org.prebid.server.functional.model.config.AccountCcpaConfig +import org.prebid.server.functional.model.request.Channel import org.prebid.server.functional.model.request.auction.DistributionChannel import org.prebid.server.functional.util.privacy.BogusConsent import org.prebid.server.functional.util.privacy.CcpaConsent @@ -16,7 +17,6 @@ import static org.prebid.server.functional.model.privacy.Metric.TEMPLATE_REQUEST import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_EIDS import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_PRECISE_GEO import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_UFPD -import static org.prebid.server.functional.model.request.auction.Prebid.Channel import static org.prebid.server.functional.model.request.auction.TraceLevel.BASIC import static org.prebid.server.functional.model.request.auction.TraceLevel.VERBOSE import static org.prebid.server.functional.util.privacy.CcpaConsent.Signal.ENFORCED diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy index 299d911a398..7097a30d6c7 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy @@ -8,6 +8,7 @@ import org.prebid.server.functional.model.config.AccountMetricsVerbosityLevel import org.prebid.server.functional.model.config.PurposeConfig import org.prebid.server.functional.model.config.PurposeEnforcement import org.prebid.server.functional.model.pricefloors.Country +import org.prebid.server.functional.model.request.Channel import org.prebid.server.functional.model.request.auction.DistributionChannel import org.prebid.server.functional.model.request.auction.Regs import org.prebid.server.functional.model.request.auction.RegsExt @@ -40,7 +41,6 @@ import static org.prebid.server.functional.model.request.auction.ActivityType.FE import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_EIDS import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_PRECISE_GEO import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_UFPD -import static org.prebid.server.functional.model.request.auction.Prebid.Channel import static org.prebid.server.functional.model.request.auction.PublicCountryIp.BGR_IP import static org.prebid.server.functional.model.request.auction.TraceLevel.BASIC import static org.prebid.server.functional.model.request.auction.TraceLevel.VERBOSE diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitTidActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitTidActivitiesSpec.groovy index df0d0ab531f..da13a3c1ff8 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitTidActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitTidActivitiesSpec.groovy @@ -87,7 +87,6 @@ class GppTransmitTidActivitiesSpec extends PrivacyBaseSpec { then: "Bidder request should generate (source/imp.ext).tid" def bidderRequest = bidder.getBidderRequest(bidRequest.id) - verifyAll { bidderRequest.imp[0].ext.tid bidderRequest.source.tid