From 1bc4257c21ef81e4be9e5d01102d676d497cbee4 Mon Sep 17 00:00:00 2001 From: Philip Watson Date: Tue, 9 Dec 2025 14:48:53 +1300 Subject: [PATCH] StroeerCore: Use bid.ext as-is from the response --- .../bidder/stroeercore/StroeerCoreBidder.java | 18 +++-- .../stroeercore/model/StroeerCoreBid.java | 6 ++ .../stroeercore/StroeerCoreBidderTest.java | 68 ++++++++++++++++++- 3 files changed, 84 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java b/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java index cff5866d027..fea452f059d 100644 --- a/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java +++ b/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java @@ -106,10 +106,6 @@ private BidderBid toBidderBid(StroeerCoreBid stroeercoreBid, List e return null; } - final ObjectNode bidExt = stroeercoreBid.getDsa() != null - ? mapper.mapper().createObjectNode().set("dsa", stroeercoreBid.getDsa()) - : null; - return BidderBid.of( Bid.builder() .id(stroeercoreBid.getId()) @@ -121,12 +117,24 @@ private BidderBid toBidderBid(StroeerCoreBid stroeercoreBid, List e .crid(stroeercoreBid.getCreativeId()) .adomain(stroeercoreBid.getAdomain()) .mtype(bidType.ordinal() + 1) - .ext(bidExt) + .ext(getBidExt(stroeercoreBid)) .build(), bidType, BIDDER_CURRENCY); } + private ObjectNode getBidExt(StroeerCoreBid stroeercoreBid) { + final ObjectNode dsa = stroeercoreBid.getDsa(); + ObjectNode ext = stroeercoreBid.getExt(); + if (dsa == null) { + return ext; + } + if (ext == null) { + ext = mapper.mapper().createObjectNode(); + } + return ext.set("dsa", dsa); + } + private static BidType getBidType(String mtype) { return switch (mtype) { case "banner" -> BidType.banner; diff --git a/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java b/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java index 2c665a27ce5..980db6d1891 100644 --- a/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java +++ b/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java @@ -29,9 +29,15 @@ public class StroeerCoreBid { @JsonProperty("crid") String creativeId; + /** + * @deprecated The dsa will move to the bid's ext. + */ + @Deprecated(forRemoval = true) ObjectNode dsa; String mtype; List adomain; + + ObjectNode ext; } diff --git a/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java b/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java index aa918224d29..65126127f1e 100644 --- a/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java @@ -152,7 +152,9 @@ public void makeHttpRequestsShouldReturnErrorIfImpExtCouldNotBeParsed() { @Test public void makeBidsShouldReturnExpectedBannerBid() throws JsonProcessingException { // given - final ObjectNode dsaResponse = createDsaResponse(); + final ObjectNode bidExt = mapper.createObjectNode(); + bidExt.put("something", "else"); + bidExt.set("dsa", createDsaResponse()); final StroeerCoreBid bannerBid = StroeerCoreBid.builder() .id("1") @@ -163,7 +165,7 @@ public void makeBidsShouldReturnExpectedBannerBid() throws JsonProcessingExcepti .width(300) .height(600) .mtype("banner") - .dsa(dsaResponse.deepCopy()) + .ext(bidExt.deepCopy()) .adomain(List.of("domain1.com", "domain2.com")) .build(); @@ -184,13 +186,73 @@ public void makeBidsShouldReturnExpectedBannerBid() throws JsonProcessingExcepti .h(600) .adomain(List.of("domain1.com", "domain2.com")) .mtype(1) - .ext(mapper.createObjectNode().set("dsa", dsaResponse)) + .ext(bidExt) .build(); assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()).containsOnly(BidderBid.of(expectedBannerBid, BidType.banner, "EUR")); } + @Test + public void makeBidsShouldSupportDeprecatedDsaPath() throws JsonProcessingException { + // given + final ObjectNode dsa = createDsaResponse(); + + final StroeerCoreBid.StroeerCoreBidBuilder stroeerBidBuilder = StroeerCoreBid.builder() + .id("1") + .bidId("banner-imp-id") + .adMarkup("
") + .cpm(BigDecimal.valueOf(0.3)) + .creativeId("foo") + .width(300) + .height(600) + .mtype("banner") + .adomain(List.of("domain1.com", "domain2.com")) + .dsa(dsa.deepCopy()); + + final StroeerCoreBid bannerBidWithoutExt = stroeerBidBuilder + .ext(null) + .build(); + + final StroeerCoreBid bannerBidWithExt = stroeerBidBuilder + .ext(mapper.createObjectNode().put("xyz", true)) + .build(); + + final StroeerCoreBidResponse response = StroeerCoreBidResponse.of( + List.of(bannerBidWithoutExt, bannerBidWithExt) + ); + final BidderCall httpCall = createHttpCall(response); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + final Bid.BidBuilder expectedBannerBidBuilder = Bid.builder() + .id("1") + .impid("banner-imp-id") + .adm("
") + .price(BigDecimal.valueOf(0.3)) + .crid("foo") + .w(300) + .h(600) + .adomain(List.of("domain1.com", "domain2.com")) + .mtype(1); + + final Bid expectedBid1 = expectedBannerBidBuilder + .ext(mapper.createObjectNode().set("dsa", dsa)) + .build(); + + final Bid expectedBid2 = expectedBannerBidBuilder + .ext(mapper.createObjectNode().put("xyz", true).set("dsa", dsa)) + .build(); + + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).containsOnly( + BidderBid.of(expectedBid1, BidType.banner, "EUR"), + BidderBid.of(expectedBid2, BidType.banner, "EUR") + ); + } + @Test public void makeBidsShouldReturnExpectedBidderBids() throws JsonProcessingException { // given