From fa567fcacc20359e2b3efeb87de626e88798a474 Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Mon, 27 Jan 2025 21:27:50 +0200 Subject: [PATCH 1/2] Tests: Fix Bidder Aliases Validation --- .../server/functional/tests/AliasSpec.groovy | 71 ++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) 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..6023e295712 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy @@ -1,19 +1,21 @@ 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 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 @@ -209,6 +211,73 @@ 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: "PBs server with aliases config" + def pbsConfig = ["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()] + def pbsService = pbsServiceFactory.getService(pbsConfig) + + and: "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 = pbsService.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 + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } + + def "PBS should validate request as alias request and emit proper warnings when validation fails for request"() { + given: "PBs server with aliases config" + def pbsConfig = ["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()] + def pbsService = pbsServiceFactory.getService(pbsConfig) + + and: "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 = pbsService.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"] + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } + 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 { From cc7e3ec9813cec3ebea95ce38e4d513a30822fed Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Tue, 28 Jan 2025 11:13:38 +0200 Subject: [PATCH 2/2] update after review --- .../server/functional/tests/AliasSpec.groovy | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) 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 6023e295712..3a0133ffe35 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy @@ -6,6 +6,7 @@ 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.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 @@ -21,6 +22,21 @@ 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 { @@ -144,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) @@ -212,14 +228,7 @@ class AliasSpec extends BaseSpec { } def "PBS should validate request as alias request and without any warnings when required properties in place"() { - given: "PBs server with aliases config" - def pbsConfig = ["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()] - def pbsService = pbsServiceFactory.getService(pbsConfig) - - and: "Default bid request with openx and alias bidder" + 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 @@ -227,7 +236,7 @@ class AliasSpec extends BaseSpec { } when: "PBS processes auction request" - def bidResponse = pbsService.sendAuctionRequest(bidRequest) + def bidResponse = pbsServiceWithAdditionalBidders.sendAuctionRequest(bidRequest) then: "PBS contain http call for specific bidder" def responseDebug = bidResponse.ext.debug @@ -236,20 +245,10 @@ class AliasSpec extends BaseSpec { and: "PBS should not contain any warnings" assert !bidResponse.ext.warnings - - cleanup: "Stop and remove pbs container" - pbsServiceFactory.removeContainer(pbsConfig) } def "PBS should validate request as alias request and emit proper warnings when validation fails for request"() { - given: "PBs server with aliases config" - def pbsConfig = ["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()] - def pbsService = pbsServiceFactory.getService(pbsConfig) - - and: "Default bid request with openx and alias bidder" + 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 @@ -257,7 +256,7 @@ class AliasSpec extends BaseSpec { } when: "PBS processes auction request" - def bidResponse = pbsService.sendAuctionRequest(bidRequest) + def bidResponse = pbsServiceWithAdditionalBidders.sendAuctionRequest(bidRequest) then: "PBS shouldn't contain http calls" assert !bidResponse.ext.debug.httpcalls @@ -273,9 +272,6 @@ class AliasSpec extends BaseSpec { "\$.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"] - - cleanup: "Stop and remove pbs container" - pbsServiceFactory.removeContainer(pbsConfig) } def "PBS should invoke as aliases when alias is unknown and core bidder is specified"() {