From ff3bc9a58fcfc0d3a66358457644fe8e7125b1e8 Mon Sep 17 00:00:00 2001 From: markiian Date: Mon, 9 Mar 2026 12:49:03 +0200 Subject: [PATCH 1/3] Add tests for amp `targeting.site` --- .../functional/tests/TargetingSpec.groovy | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) 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..9a393c0b941 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy @@ -1906,6 +1906,37 @@ class TargetingSpec extends BaseSpec { ] } + def "PBS amp shouldn't emit error for targeting when site is array"() { + given: "Create targeting with array of site" + def anyRandomValue = PBSUtils.randomString + def targeting = ["site": [PBSUtils.randomString], "any" : anyRandomValue] + + and: "Encode targeting to string" + def encodeTargeting = URLEncoder.encode(encode(targeting), StandardCharsets.UTF_8) + + and: "Amp request with targeting" + def ampRequest = AmpRequest.defaultAmpRequest.tap { + it.targeting = encodeTargeting + } + + and: "Default bid request" + def ampStoredRequest = BidRequest.defaultBidRequest + + and: "Create and save stored request into DB" + def storedRequest = StoredRequest.getStoredRequest(ampRequest, ampStoredRequest) + storedRequestDao.save(storedRequest) + + when: "PBS processes amp request" + def ampResponse = pbsWithDefaultTargetingLength.sendAmpRequest(ampRequest) + + then: "Amp response should contain value from targeting in imp.ext.data" + def bidderRequest = bidder.getBidderRequest(ampStoredRequest.id) + assert bidderRequest.imp[0].ext.data.any == anyRandomValue + + and: "Amp response shouldn't contain error" + assert !ampResponse.ext.errors + } + private static Account createAccountWithPriceGranularity(String accountId, PriceGranularityType priceGranularity) { def accountAuctionConfig = new AccountAuctionConfig(priceGranularity: priceGranularity) def accountConfig = new AccountConfig(status: ACTIVE, auction: accountAuctionConfig) From 330a099bfa43de13204f257a0bdf57d731cc2266 Mon Sep 17 00:00:00 2001 From: markiian Date: Mon, 9 Mar 2026 12:50:28 +0200 Subject: [PATCH 2/3] Minor update --- .../org/prebid/server/functional/tests/TargetingSpec.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9a393c0b941..e54b9a9120f 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy @@ -1933,7 +1933,7 @@ class TargetingSpec extends BaseSpec { def bidderRequest = bidder.getBidderRequest(ampStoredRequest.id) assert bidderRequest.imp[0].ext.data.any == anyRandomValue - and: "Amp response shouldn't contain error" + and: "Amp response shouldn't contain any errors" assert !ampResponse.ext.errors } From 25a4386ef8465cdeb79bdabaacf801b34dea2b20 Mon Sep 17 00:00:00 2001 From: markiian Date: Tue, 10 Mar 2026 15:14:09 +0200 Subject: [PATCH 3/3] Update after review --- .../prebid/server/functional/tests/TargetingSpec.groovy | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 e54b9a9120f..2043da33436 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/TargetingSpec.groovy @@ -12,6 +12,7 @@ import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.db.StoredResponse 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.App import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Imp import org.prebid.server.functional.model.request.auction.MultiBid @@ -20,6 +21,7 @@ import org.prebid.server.functional.model.request.auction.PrebidCache import org.prebid.server.functional.model.request.auction.PrebidStoredRequest import org.prebid.server.functional.model.request.auction.PriceGranularity import org.prebid.server.functional.model.request.auction.Range +import org.prebid.server.functional.model.request.auction.Site import org.prebid.server.functional.model.request.auction.StoredAuctionResponse import org.prebid.server.functional.model.request.auction.StoredBidResponse import org.prebid.server.functional.model.request.auction.Targeting @@ -1909,7 +1911,7 @@ class TargetingSpec extends BaseSpec { def "PBS amp shouldn't emit error for targeting when site is array"() { given: "Create targeting with array of site" def anyRandomValue = PBSUtils.randomString - def targeting = ["site": [PBSUtils.randomString], "any" : anyRandomValue] + def targeting = ["site": siteValue, "any": anyRandomValue] and: "Encode targeting to string" def encodeTargeting = URLEncoder.encode(encode(targeting), StandardCharsets.UTF_8) @@ -1935,6 +1937,10 @@ class TargetingSpec extends BaseSpec { and: "Amp response shouldn't contain any errors" assert !ampResponse.ext.errors + + where: + siteValue << [null, [], [PBSUtils.randomString], [Site.defaultSite], [Site.defaultSite, PBSUtils.randomString], + [PBSUtils.randomString, Site.defaultSite], [App.defaultApp, Site.defaultSite]] } private static Account createAccountWithPriceGranularity(String accountId, PriceGranularityType priceGranularity) {