diff --git a/src/test/groovy/org/prebid/server/functional/tests/AlternateBidderCodeSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/AlternateBidderCodeSpec.groovy index 048a4983050..a1ab76389aa 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AlternateBidderCodeSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AlternateBidderCodeSpec.groovy @@ -11,6 +11,7 @@ import org.prebid.server.functional.model.request.auction.Targeting import org.prebid.server.functional.model.response.auction.BidExt import org.prebid.server.functional.model.response.auction.BidResponse import org.prebid.server.functional.model.response.auction.ErrorType +import org.prebid.server.functional.service.PrebidServerException import org.prebid.server.functional.service.PrebidServerService import org.prebid.server.functional.util.PBSUtils import spock.lang.Shared @@ -78,6 +79,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == ALIAS.value assert targeting["hb_bidder_${ALIAS}"] == ALIAS.value + 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) @@ -127,6 +131,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == AMX.value assert targeting["hb_bidder_${AMX}"] == AMX.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -172,6 +179,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == AMX.value assert targeting["hb_bidder_${AMX}"] == AMX.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -214,6 +224,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == bidderCode.value assert targeting["hb_bidder_${bidderCode}"] == bidderCode.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(bidderCode.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -270,6 +283,9 @@ class AlternateBidderCodeSpec extends BaseSpec { def logs = pbsServiceWithAmxBidder.getLogsByValue(bidRequest.accountId) assert logs.contains(INVALID_BIDDER_CODE_LOGS.formatted(bidderName, AMX, bidRequest.accountId)) + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -325,6 +341,9 @@ class AlternateBidderCodeSpec extends BaseSpec { and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS.value) + and: "PBS should emit validation metrics" def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(ALIAS)] @@ -376,6 +395,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -430,6 +452,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == bidderCode.value assert targeting["hb_bidder_${bidderCode}"] == bidderCode.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(bidderCode.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -481,6 +506,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == AMX.value assert targeting["hb_bidder_${AMX}"] == AMX.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -554,6 +582,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert !response.ext?.errors assert !response.ext?.seatnonbid + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Response shouldn't contain demand source" assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource @@ -567,16 +598,44 @@ class AlternateBidderCodeSpec extends BaseSpec { new AlternateBidderCodes(enabled: true), new AlternateBidderCodes(enabled: false), new AlternateBidderCodes(bidders: [(AMX): new BidderConfig()]), - new AlternateBidderCodes(bidders: [(UNKNOWN): new BidderConfig()]), new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig()]), - new AlternateBidderCodes(enabled: true, bidders: [(UNKNOWN): new BidderConfig()]), - new AlternateBidderCodes(enabled: false, bidders: [(UNKNOWN): new BidderConfig()]), new AlternateBidderCodes(enabled: false, bidders: [(AMX): new BidderConfig()]), new AlternateBidderCodes(bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]), - new AlternateBidderCodes(bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])]), new AlternateBidderCodes(enabled: false, bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]), + new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]),] + } + + def "PBS should validate and throw error when request alternate bidder codes not fully configured"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + ext.prebid.alternateBidderCodes = requestedAlternateBidderCodes + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: AMX) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Request should fail with error" + def exception = thrown(PrebidServerException) + assert exception.statusCode == 400 + assert exception.responseBody == "Invalid request format: " + + "request.ext.prebid.alternatebiddercodes.bidders.unknown is not a known bidder or alias" + + + where: + requestedAlternateBidderCodes << [new AlternateBidderCodes(bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(enabled: true, bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(enabled: false, bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])]), new AlternateBidderCodes(enabled: false, bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])]), - new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]), new AlternateBidderCodes(enabled: true, bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])])] } @@ -615,6 +674,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -666,6 +728,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -735,6 +800,9 @@ class AlternateBidderCodeSpec extends BaseSpec { def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) } @@ -788,6 +856,9 @@ class AlternateBidderCodeSpec extends BaseSpec { def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -837,6 +908,9 @@ class AlternateBidderCodeSpec extends BaseSpec { and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Response shouldn't contain demand source" assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource @@ -884,6 +958,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -937,6 +1014,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -997,6 +1077,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Response shouldn't contain warnings and errors and seatNonBid" assert !response.ext?.warnings assert !response.ext?.errors @@ -1057,6 +1140,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == AMX.value assert targeting["hb_bidder_${AMX}"] == AMX.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -1114,6 +1200,9 @@ class AlternateBidderCodeSpec extends BaseSpec { def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -1166,6 +1255,9 @@ class AlternateBidderCodeSpec extends BaseSpec { def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -1227,6 +1319,9 @@ class AlternateBidderCodeSpec extends BaseSpec { def metrics = pbsService.sendCollectedMetricsRequest() assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -1274,6 +1369,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -1331,6 +1429,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) @@ -1351,6 +1452,72 @@ class AlternateBidderCodeSpec extends BaseSpec { null | new AlternateBidderCodes(enabled: true, bidders: [(ALIAS): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) } + def "PBS shouldn't discard bid when alternate bidder code allow and soft alias with case with base bidder in alternate bidder code"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.bidder.aliasUpperCase = new Generic() + imp[0].ext.prebid.bidder.amx = null + ext.prebid.aliases = [(ALIAS.value): AMX] + ext.prebid.alternateBidderCodes = requestAlternateBidderCode + } + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes = accountAlternateBidderCodes + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, ALIAS).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain exp data" + assert response.seatbid.seat == [GENERIC] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(ALIAS)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + requestAlternateBidderCode | accountAlternateBidderCodes + new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) | null + null | new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) + } + def "PBS should populate adapter code with requested bidder when conflict soft and hard alias and alternate bidder code"() { given: "PBS config with bidder" def pbsConfig = AMX_CONFIG + ["adapters.amx.aliases.alias.enabled" : "true", @@ -1391,6 +1558,9 @@ class AlternateBidderCodeSpec extends BaseSpec { assert targeting["hb_bidder"] == GENERIC.value assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) 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 d4fd06cad64..43b7a09777a 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy @@ -1108,6 +1108,9 @@ class BidAdjustmentSpec extends BaseSpec { assert response?.seatbid?.first?.bid?.first?.price == bidResponse.seatbid.first.bid.first.price * bidAdjustmentFactor + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + where: bidAdjustmentFactor << [0.9, 1.1] } @@ -1142,6 +1145,9 @@ class BidAdjustmentSpec extends BaseSpec { assert response?.seatbid?.first?.bid?.first?.price == bidResponse.seatbid.first.bid.first.price * bidAdjustmentFactor + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + where: bidAdjustmentFactor << [0.9, 1.1] } 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 5269d31b977..d92a6f17ee9 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -1420,6 +1420,9 @@ class BidderParamsSpec extends BaseSpec { assert targeting["hb_bidder"] == BidderName.ALIAS.value assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + 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) } @@ -1455,6 +1458,9 @@ class BidderParamsSpec extends BaseSpec { assert targeting["hb_bidder"] == BidderName.ALIAS.value assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + 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) @@ -1505,6 +1511,9 @@ class BidderParamsSpec extends BaseSpec { assert targeting["hb_bidder"] == BidderName.ALIAS.value assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + 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) @@ -1539,6 +1548,9 @@ class BidderParamsSpec extends BaseSpec { assert targeting["hb_bidder"] == ALIAS_UPPER_CASE.value assert targeting["hb_bidder_${ALIAS_UPPER_CASE}"] == ALIAS_UPPER_CASE.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS_UPPER_CASE.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) } @@ -1564,6 +1576,9 @@ class BidderParamsSpec extends BaseSpec { and: "Bid response should contain seat" assert response.seatbid.seat == [GENERIC_CAMEL_CASE] + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC_CAMEL_CASE.value) + and: "Response should contain adapter code" assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.GENERIC] } @@ -1593,6 +1608,9 @@ class BidderParamsSpec extends BaseSpec { assert targeting["hb_bidder"] == ALIAS_UPPER_CASE.value assert targeting["hb_bidder_${ALIAS_UPPER_CASE}"] == ALIAS_UPPER_CASE.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS_UPPER_CASE.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id) } @@ -1630,6 +1648,9 @@ class BidderParamsSpec extends BaseSpec { assert targeting["hb_bidder"] == BidderName.ALIAS.value assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + 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) @@ -1670,6 +1691,9 @@ class BidderParamsSpec extends BaseSpec { assert targeting["hb_bidder"] == BidderName.ALIAS.value assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + 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) @@ -1707,6 +1731,9 @@ class BidderParamsSpec extends BaseSpec { assert targeting["hb_bidder"] == AMX.value assert targeting["hb_bidder_${AMX}"] == AMX.value + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + and: "Bidder request should be valid" assert bidder.getBidderRequests(bidRequest.id)