diff --git a/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy index d4b8f84c826..3a0133ffe35 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy @@ -1,24 +1,42 @@ package org.prebid.server.functional.tests +import org.prebid.server.functional.model.bidder.AppNexus import org.prebid.server.functional.model.bidder.Generic import org.prebid.server.functional.model.bidder.Openx import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.service.PrebidServerException -import org.prebid.server.functional.testcontainers.Dependencies import org.prebid.server.functional.util.PBSUtils +import spock.lang.Shared import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST import static org.prebid.server.functional.model.bidder.BidderName.ALIAS +import static org.prebid.server.functional.model.bidder.BidderName.APPNEXUS import static org.prebid.server.functional.model.bidder.BidderName.BOGUS import static org.prebid.server.functional.model.bidder.BidderName.GENERIC import static org.prebid.server.functional.model.bidder.BidderName.GENER_X import static org.prebid.server.functional.model.bidder.BidderName.OPENX import static org.prebid.server.functional.model.bidder.CompressionType.GZIP +import static org.prebid.server.functional.model.response.auction.ErrorType.PREBID import static org.prebid.server.functional.testcontainers.Dependencies.networkServiceContainer import static org.prebid.server.functional.util.HttpUtil.CONTENT_ENCODING_HEADER class AliasSpec extends BaseSpec { + private static final Map ADDITIONAL_BIDDERS_CONFIG = ["adapters.${OPENX.value}.enabled" : "true", + "adapters.${OPENX.value}.endpoint" : "$networkServiceContainer.rootUri/${OPENX.value}/auction".toString(), + "adapters.${APPNEXUS.value}.enabled" : "true", + "adapters.${APPNEXUS.value}.endpoint": "$networkServiceContainer.rootUri/${APPNEXUS.value}/auction".toString()] + @Shared + private static pbsServiceWithAdditionalBidders + + def setupSpec() { + pbsServiceWithAdditionalBidders = pbsServiceFactory.getService(ADDITIONAL_BIDDERS_CONFIG + GENERIC_ALIAS_CONFIG) + } + + def cleanupSpec() { + pbsServiceFactory.removeContainer(ADDITIONAL_BIDDERS_CONFIG + GENERIC_ALIAS_CONFIG) + } + def "PBS should be able to take alias from request"() { given: "Default bid request with alias" def bidRequest = BidRequest.defaultBidRequest.tap { @@ -142,7 +160,7 @@ class AliasSpec extends BaseSpec { } when: "PBS processes auction request" - prebidServerService.sendAuctionRequest(bidRequest) + pbsServiceWithAdditionalBidders.sendAuctionRequest(bidRequest) then: "Bidder request should contain request per-alies" def bidderRequests = bidder.getBidderRequests(bidRequest.id) @@ -209,6 +227,53 @@ class AliasSpec extends BaseSpec { pbsServiceFactory.removeContainer(pbsConfig) } + def "PBS should validate request as alias request and without any warnings when required properties in place"() { + given: "Default bid request with openx and alias bidder" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.appNexus = AppNexus.default + imp[0].ext.prebid.bidder.generic = null + ext.prebid.aliases = [(APPNEXUS.value): OPENX] + } + + when: "PBS processes auction request" + def bidResponse = pbsServiceWithAdditionalBidders.sendAuctionRequest(bidRequest) + + then: "PBS contain http call for specific bidder" + def responseDebug = bidResponse.ext.debug + assert responseDebug.httpcalls.size() == 1 + assert responseDebug.httpcalls[APPNEXUS.value]*.uri == ["$networkServiceContainer.rootUri/${APPNEXUS.value}/auction"] + + and: "PBS should not contain any warnings" + assert !bidResponse.ext.warnings + } + + def "PBS should validate request as alias request and emit proper warnings when validation fails for request"() { + given: "Default bid request with openx and alias bidder" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.appNexus = new AppNexus() + imp[0].ext.prebid.bidder.generic = null + ext.prebid.aliases = [(APPNEXUS.value): OPENX] + } + + when: "PBS processes auction request" + def bidResponse = pbsServiceWithAdditionalBidders.sendAuctionRequest(bidRequest) + + then: "PBS shouldn't contain http calls" + assert !bidResponse.ext.debug.httpcalls + + and: "Bid response should contain warning" + assert bidResponse.ext.warnings[PREBID]?.code == [999, 999] + assert bidResponse.ext?.warnings[PREBID]*.message == + ["WARNING: request.imp[0].ext.prebid.bidder.${APPNEXUS.value} was dropped with a reason: " + + "request.imp[0].ext.prebid.bidder.${APPNEXUS.value} failed validation.\n" + + "\$.placement_id: is missing but it is required\n" + + "\$.member: is missing but it is required\n" + + "\$.placementId: is missing but it is required\n" + + "\$.inv_code: is missing but it is required\n" + + "\$.invCode: is missing but it is required", + "WARNING: request.imp[0].ext must contain at least one valid bidder"] + } + def "PBS should invoke as aliases when alias is unknown and core bidder is specified"() { given: "Default bid request with generic and alias bidder" def bidRequest = BidRequest.defaultBidRequest.tap {