@@ -6,10 +6,14 @@ import org.prebid.server.functional.model.config.AlternateBidderCodes
66import org.prebid.server.functional.model.request.Channel
77import org.prebid.server.functional.model.request.amp.AmpRequest
88import org.prebid.server.functional.model.request.auction.AdServerTargeting
9+ import org.prebid.server.functional.model.request.auction.AdjustmentRule
910import org.prebid.server.functional.model.request.auction.Amp
1011import org.prebid.server.functional.model.request.auction.AppExt
1112import org.prebid.server.functional.model.request.auction.AppExtData
1213import org.prebid.server.functional.model.request.auction.AppPrebid
14+ import org.prebid.server.functional.model.request.auction.BidAdjustment
15+ import org.prebid.server.functional.model.request.auction.BidAdjustmentFactors
16+ import org.prebid.server.functional.model.request.auction.BidAdjustmentRule
1317import org.prebid.server.functional.model.request.auction.BidRequest
1418import org.prebid.server.functional.model.request.auction.BidderConfig
1519import org.prebid.server.functional.model.request.auction.BidderConfigOrtb
@@ -22,6 +26,7 @@ import org.prebid.server.functional.model.request.auction.EidPermission
2226import org.prebid.server.functional.model.request.auction.ExtPrebidBidderConfig
2327import org.prebid.server.functional.model.request.auction.ExtRequestPrebidData
2428import org.prebid.server.functional.model.request.auction.Interstitial
29+ import org.prebid.server.functional.model.request.auction.MultiBid
2530import org.prebid.server.functional.model.request.auction.PaaFormat
2631import org.prebid.server.functional.model.request.auction.PrebidCache
2732import org.prebid.server.functional.model.request.auction.DevicePrebid
@@ -40,16 +45,41 @@ import org.prebid.server.functional.model.response.auction.BidResponse
4045import org.prebid.server.functional.util.PBSUtils
4146
4247import static org.prebid.server.functional.model.ChannelType.WEB
48+ import static org.prebid.server.functional.model.Currency.USD
49+ import static org.prebid.server.functional.model.bidder.BidderName.OPENX
4350import static org.prebid.server.functional.model.bidder.BidderName.RUBICON
4451import static org.prebid.server.functional.model.mock.services.currencyconversion.CurrencyConversionRatesResponse.defaultConversionRates
52+ import static org.prebid.server.functional.model.request.auction.AdjustmentType.MULTIPLIER
53+ import static org.prebid.server.functional.model.request.auction.BidAdjustmentMediaType.BANNER
4554import static org.prebid.server.functional.model.request.auction.DebugCondition.ENABLED
4655import static org.prebid.server.functional.model.request.auction.DistributionChannel.APP
4756import static org.prebid.server.functional.model.request.auction.DistributionChannel.DOOH
57+ import static org.prebid.server.functional.model.request.auction.DistributionChannel.SITE
4858import static org.prebid.server.functional.model.request.auction.TraceLevel.BASIC
4959import static org.prebid.server.functional.model.response.auction.ErrorType.GENERIC
60+ import static org.prebid.server.functional.util.PBSUtils.getRandomDecimal
61+ import static org.prebid.server.functional.util.PBSUtils.roundDecimal
5062
5163class BidderFieldDisplayBehaviorSpec extends BaseSpec {
5264
65+ def " PBS should pass ext.prebid.createTids to bidder request" () {
66+ given : " Default bid request"
67+ def bidRequest = BidRequest . defaultBidRequest. tap {
68+ ext. prebid. createTids = PBSUtils . randomBoolean
69+ }
70+
71+ and : " Default bid response"
72+ def bidResponse = BidResponse . getDefaultBidResponse(bidRequest)
73+ bidder. setResponse(bidRequest. id, bidResponse)
74+
75+ when : " PBS processes auction request"
76+ defaultPbsService. sendAuctionRequest(bidRequest)
77+
78+ then : " Bidder request should contain createTids"
79+ def bidderRequest = bidder. getBidderRequest(bidRequest. id)
80+ assert bidderRequest. ext. prebid. createTids == bidRequest. ext. prebid. createTids
81+ }
82+
5383 def " PBS shouldn't pass ext.prebid.returnAllBidStatus to bidder request" () {
5484 given : " Default basic bid request"
5585 def bidRequest = BidRequest . defaultBidRequest. tap {
@@ -364,7 +394,8 @@ class BidderFieldDisplayBehaviorSpec extends BaseSpec {
364394 def bidRequest = BidRequest . defaultBidRequest. tap {
365395 ext. prebid. alternateBidderCodes = new AlternateBidderCodes (). tap {
366396 it. enabled = true
367- it. bidders = [(BidderName . GENERIC ): new org.prebid.server.functional.model.config.BidderConfig (enabled : true , allowedBidderCodes : [BidderName . GENERIC ])]
397+ it. bidders = [(BidderName . GENERIC ): new org.prebid.server.functional.model.config.BidderConfig (enabled : true , allowedBidderCodes : [BidderName . GENERIC ]),
398+ (RUBICON ) : new org.prebid.server.functional.model.config.BidderConfig (enabled : true , allowedBidderCodes : [RUBICON ])]
368399 }
369400 }
370401
@@ -515,4 +546,90 @@ class BidderFieldDisplayBehaviorSpec extends BaseSpec {
515546 def bidderRequest = bidder. getBidderRequest(bidRequest. id)
516547 assert bidderRequest. dooh. ext == bidRequest. dooh. ext
517548 }
549+
550+ def " PBS should pass ext.prebid.multiBid only bidder related entity for each bidder" () {
551+ given : " Default basic BidRequest with generic bidder with includeBidderKeys = false"
552+ def bidRequest = BidRequest . defaultBidRequest
553+
554+ and : " Set maxbids = 2 for generic and rubicon bidder"
555+ def maxBids = 2
556+ def genericMultiBid = new MultiBid (bidder : BidderName . GENERIC , maxBids : maxBids, targetBidderCodePrefix : PBSUtils . randomString)
557+ def rubiconMultiBid = new MultiBid (bidder : RUBICON , maxBids : maxBids, targetBidderCodePrefix : PBSUtils . randomString)
558+ bidRequest. ext. prebid. multibid = [genericMultiBid, rubiconMultiBid]
559+
560+ and : " Default basic bid"
561+ def bidResponse = BidResponse . getDefaultBidResponse(bidRequest)
562+
563+ and : " Set bidder response"
564+ bidder. setResponse(bidRequest. id, bidResponse)
565+
566+ when : " PBS processes auction request"
567+ defaultPbsService. sendAuctionRequest(bidRequest)
568+
569+ then : " Bid request should contain requested ext.prebid.multiBid"
570+ def bidderRequest = bidder. getBidderRequest(bidRequest. id)
571+ assert bidderRequest. ext. prebid. multibid == [genericMultiBid]
572+ }
573+
574+ def " PBS should pass ext.prebid.bidAdjustment only bidder related entry for each bidder" () {
575+ given : " Default BidRequest with ext.prebid.bidAdjustments"
576+ def currency = USD
577+ def rule = new BidAdjustmentRule (). tap {
578+ generic = [" *" : [new AdjustmentRule (adjustmentType : MULTIPLIER , value : PBSUtils . randomPrice, currency : currency)]]
579+ openx = [" *" : [new AdjustmentRule (adjustmentType : MULTIPLIER , value : PBSUtils . randomPrice, currency : currency)]]
580+ }
581+ def bidRequest = BidRequest . getDefaultBidRequest(). tap {
582+ ext. prebid. bidAdjustments = BidAdjustment . getDefaultWithSingleMediaTypeRule(BANNER , rule)
583+ cur = [currency]
584+ imp. first. bidFloor = PBSUtils . randomPrice
585+ imp. first. bidFloorCur = currency
586+ }
587+
588+ and : " Default bid response"
589+ def bidResponse = BidResponse . getDefaultBidResponse(bidRequest)
590+ bidder. setResponse(bidRequest. id, bidResponse)
591+
592+ when : " PBS processes auction request"
593+ defaultPbsService. sendAuctionRequest(bidRequest)
594+
595+ then : " Bidder request should contain generic bid adjustments"
596+ def bidderRequest = bidder. getBidderRequest(bidRequest. id)
597+ assert bidderRequest. ext. prebid. bidAdjustments. version == bidRequest. ext. prebid. bidAdjustments. version
598+ assert bidderRequest. ext. prebid. bidAdjustments. mediaType[BANNER ]. generic == bidRequest. ext. prebid. bidAdjustments. mediaType[BANNER ]. generic
599+
600+ and : " Bidder request shouldn't contain openx bid adjustments"
601+ assert ! bidderRequest. ext. prebid. bidAdjustments. mediaType[BANNER ]. openx
602+ }
603+
604+ def " PBS should pass ext.prebid.bidAdjustmentFactors only bidder related entry for each bidder" () {
605+ given : " Default bid request with bid adjustment"
606+ def bidAdjustment = roundDecimal(getRandomDecimal(), 0 )
607+ def mediaTypeBidAdjustment = bidAdjustmentFactor
608+ def bidRequest = BidRequest . getDefaultBidRequest(SITE ). tap {
609+ ext. prebid. bidAdjustmentFactors = new BidAdjustmentFactors (). tap {
610+ adjustments = [(BidderName . GENERIC ): bidAdjustment, (OPENX ): bidAdjustment]
611+ mediaTypes = [(BANNER ): [(BidderName . GENERIC ): mediaTypeBidAdjustment],
612+ (BANNER ): [(OPENX ): mediaTypeBidAdjustment]]
613+ }
614+ }
615+
616+ and : " Default bid response"
617+ def bidResponse = BidResponse . getDefaultBidResponse(bidRequest)
618+ bidder. setResponse(bidRequest. id, bidResponse)
619+
620+ when : " PBS processes auction request"
621+ defaultPbsService. sendAuctionRequest(bidRequest)
622+
623+ then : " Bidder request should contain generic bid adjustment factors"
624+ def bidderRequest = bidder. getBidderRequest(bidRequest. id)
625+ assert bidderRequest. ext. prebid. bidAdjustmentFactors. adjustments[BidderName . GENERIC ] == bidRequest. ext. prebid. bidAdjustmentFactors. adjustments[BidderName . GENERIC ]
626+ assert bidderRequest. ext. prebid. bidAdjustmentFactors. mediaTypes[BANNER ][GENERIC ] == bidRequest. ext. prebid. bidAdjustmentFactors. mediaTypes[BANNER ][GENERIC ]
627+
628+ and : " Bidder request shouldn't contain opneX bid adjustment factors for generic call"
629+ assert bidderRequest. ext. prebid. bidAdjustmentFactors. adjustments[OPENX ]
630+ assert bidderRequest. ext. prebid. bidAdjustmentFactors. mediaTypes[BANNER ][OPENX ]
631+
632+ where :
633+ bidAdjustmentFactor << [0.9 , 1.1 ]
634+ }
518635}
0 commit comments