From 8b335a727d836a0d7bd5e7dbdfaad7b6655e1151 Mon Sep 17 00:00:00 2001 From: "kacper.fus" Date: Tue, 2 Sep 2025 08:29:02 +0200 Subject: [PATCH 01/10] return buyer exts in response to DSP --- .../server/bidder/openx/OpenxBidder.java | 67 ++++++++++- .../bidder/openx/proto/OpenxBidExt.java | 15 +++ .../server/bidder/openx/OpenxBidderTest.java | 109 ++++++++++++++++++ 3 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index 09412abe65f..ae7f0c183aa 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -17,6 +17,7 @@ import org.prebid.server.bidder.model.HttpRequest; import org.prebid.server.bidder.model.Result; import org.prebid.server.bidder.openx.model.OpenxImpType; +import org.prebid.server.bidder.openx.proto.OpenxBidExt; import org.prebid.server.bidder.openx.proto.OpenxBidResponse; import org.prebid.server.bidder.openx.proto.OpenxBidResponseExt; import org.prebid.server.bidder.openx.proto.OpenxRequestExt; @@ -29,6 +30,8 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.openx.ExtImpOpenx; import org.prebid.server.proto.openrtb.ext.response.BidType; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebid; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta; import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidVideo; import org.prebid.server.proto.openrtb.ext.response.ExtIgi; import org.prebid.server.proto.openrtb.ext.response.ExtIgiIgs; @@ -59,6 +62,9 @@ public class OpenxBidder implements Bidder { private static final TypeReference> OPENX_EXT_TYPE_REFERENCE = new TypeReference<>() { }; + private static final TypeReference> EXT_PREBID_TYPE_REFERENCE = + new TypeReference<>() { + }; private final String endpointUrl; private final JacksonMapper mapper; @@ -270,13 +276,13 @@ private ObjectNode makeImpExt(ObjectNode impExt, boolean addCustomParams) { return openxImpExt; } - private static List extractBids(BidRequest bidRequest, OpenxBidResponse bidResponse) { + private List extractBids(BidRequest bidRequest, OpenxBidResponse bidResponse) { return bidResponse == null || CollectionUtils.isEmpty(bidResponse.getSeatbid()) ? Collections.emptyList() : bidsFromResponse(bidRequest, bidResponse); } - private static List bidsFromResponse(BidRequest bidRequest, OpenxBidResponse bidResponse) { + private List bidsFromResponse(BidRequest bidRequest, OpenxBidResponse bidResponse) { final Map impIdToBidType = impIdToBidType(bidRequest); final String bidCurrency = StringUtils.isNotBlank(bidResponse.getCur()) @@ -288,6 +294,7 @@ private static List bidsFromResponse(BidRequest bidRequest, OpenxBidR .map(SeatBid::getBid) .filter(Objects::nonNull) .flatMap(Collection::stream) + .map(bid -> bid.toBuilder().ext(updateBidMeta(bid)).build()) .map(bid -> toBidderBid(bid, impIdToBidType, bidCurrency)) .toList(); } @@ -334,4 +341,60 @@ private static List extractIgi(OpenxBidResponse bidResponse) { return igs.isEmpty() ? null : Collections.singletonList(ExtIgi.builder().igs(igs).build()); } + + private ObjectNode updateBidMeta(Bid bid) { + final var ext = bid.getExt(); + if (ext == null) { + return null; + } + + final var openxBidExt = parseOpenxBidExt(ext); + final int buyerId = parseStringToInt(openxBidExt.getBuyerId()); + final int dspId = parseStringToInt(openxBidExt.getDspId()); + final int brandId = parseStringToInt(openxBidExt.getBrandId()); + + if (buyerId == 0 && dspId == 0 && brandId == 0) { + return ext; + } + + final var extPrebid = getExtPrebid(ext, bid.getId()); + final var updatedMeta = ExtBidPrebidMeta.builder() + .networkId(dspId) + .advertiserId(buyerId) + .brandId(brandId) + .build(); + + final var modifiedExtBidPrebid = Optional.ofNullable(extPrebid.getPrebid()) + .map(p -> p.toBuilder().meta(updatedMeta).build()) + .orElse(ExtBidPrebid.builder().meta(updatedMeta).build()); + + final var updatedExt = ext.deepCopy(); + updatedExt.set(PREBID_EXT, mapper.mapper().valueToTree(modifiedExtBidPrebid)); + + return updatedExt; + } + + private OpenxBidExt parseOpenxBidExt(ObjectNode ext) { + try { + return mapper.mapper().convertValue(ext, OpenxBidExt.class); + } catch (IllegalArgumentException e) { + return new OpenxBidExt(); + } + } + + private ExtPrebid getExtPrebid(ObjectNode bidExt, String bidId) { + try { + return mapper.mapper().convertValue(bidExt, EXT_PREBID_TYPE_REFERENCE); + } catch (IllegalArgumentException e) { + throw new PreBidException("Invalid ext in bid with id: " + bidId, e); + } + } + + private int parseStringToInt(String value) { + try { + return value != null ? Integer.parseInt(value) : 0; + } catch (NumberFormatException e) { + return 0; + } + } } diff --git a/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java b/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java new file mode 100644 index 00000000000..31002bae3f3 --- /dev/null +++ b/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java @@ -0,0 +1,15 @@ +package org.prebid.server.bidder.openx.proto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +@Getter +public class OpenxBidExt { + + @JsonProperty("dsp_id") + String dspId; + @JsonProperty("buyer_id") + String buyerId; + @JsonProperty("brand_id") + String brandId; +} diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 461f300c051..0b6cc249ae2 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Audio; import com.iab.openrtb.request.Banner; @@ -990,4 +991,112 @@ private static Map givenCustomParams(String key, Object values private static BidderCall givenHttpCall(String body) { return BidderCall.succeededHttp(null, HttpResponse.of(200, null, body), null); } + + @Test + public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { + // given + final var allBuyerExt = new ObjectNode(JsonNodeFactory.instance); + final var onlyBrandExt = new ObjectNode(JsonNodeFactory.instance); + final var badExt = new ObjectNode(JsonNodeFactory.instance); + + allBuyerExt.put("dsp_id", "1").put("buyer_id", "2").put("brand_id", "3"); + onlyBrandExt.put("brand_id", "4"); + badExt.put("dsp_id", "abc").put("brand_id", "cba"); + badExt.put("something", "abc"); + + final var allBuyerExpectedExtJson = "{\"dsp_id\":\"1\",\"buyer_id\":\"2\",\"brand_id\":\"3\",\"prebid\":" + + "{\"meta\":{\"advertiserId\":2,\"brandId\":3,\"networkId\":1}}}"; + final var onlyBrandExpectedExtJson = "{\"brand_id\":\"4\",\"prebid\":{\"meta\":{\"advertiserId\":0," + + "\"brandId\":4,\"networkId\":0}}}"; + final var badExpectedExtJson = "{\"dsp_id\":\"abc\",\"brand_id\":\"cba\"}"; + + final var allBuyerExpectedExt = (ObjectNode) mapper.readTree(allBuyerExpectedExtJson); + final var onlyBrandExpectedExt = (ObjectNode) mapper.readTree(onlyBrandExpectedExtJson); + final var badExpectedExt = (ObjectNode) mapper.readTree(badExpectedExtJson); + + final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString(BidResponse.builder() + .seatbid(singletonList(SeatBid.builder() + .bid(List.of( + Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1") + .dealid("dealid") + .adm("
This is an Ad
") + .ext(allBuyerExt) + .build(), + Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1") + .dealid("dealid2") + .adm("
This is an Ad
") + .ext(onlyBrandExt) + .build(), + Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1") + .dealid("dealid3") + .adm("
This is an Ad
") + .ext(badExt) + .build() + )) + .build())) + .build())); + + final BidRequest bidRequest = BidRequest.builder() + .id("bidRequestId") + .imp(List.of( + Imp.builder() + .id("impId1") + .banner(Banner.builder().build()) + .build() + )) + .build(); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()).hasSize(3).containsExactlyInAnyOrder( + BidderBid.of( + Bid.builder() + .impid("impId1") + .price(BigDecimal.ONE) + .dealid("dealid") + .w(200) + .h(150) + .adm("
This is an Ad
") + .ext(allBuyerExpectedExt) + .build(), + BidType.banner, "USD"), + BidderBid.of( + Bid.builder() + .impid("impId1") + .price(BigDecimal.ONE) + .dealid("dealid2") + .w(200) + .h(150) + .adm("
This is an Ad
") + .ext(onlyBrandExpectedExt) + .build(), + BidType.banner, "USD"), + BidderBid.of( + Bid.builder() + .impid("impId1") + .price(BigDecimal.ONE) + .dealid("dealid3") + .w(200) + .h(150) + .adm("
This is an Ad
") + .ext(badExpectedExt) + .build(), + BidType.banner, "USD") + ); + } } From d85bf2fc05d8e31ff1a23c72836537678b99b5f4 Mon Sep 17 00:00:00 2001 From: "kacper.fus" Date: Tue, 2 Sep 2025 08:43:02 +0200 Subject: [PATCH 02/10] fix test and refactor --- .../prebid/server/bidder/openx/OpenxBidder.java | 16 +--------------- .../server/bidder/openx/OpenxBidderTest.java | 1 - 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index ae7f0c183aa..1096c8cae13 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -62,9 +62,6 @@ public class OpenxBidder implements Bidder { private static final TypeReference> OPENX_EXT_TYPE_REFERENCE = new TypeReference<>() { }; - private static final TypeReference> EXT_PREBID_TYPE_REFERENCE = - new TypeReference<>() { - }; private final String endpointUrl; private final JacksonMapper mapper; @@ -357,16 +354,13 @@ private ObjectNode updateBidMeta(Bid bid) { return ext; } - final var extPrebid = getExtPrebid(ext, bid.getId()); final var updatedMeta = ExtBidPrebidMeta.builder() .networkId(dspId) .advertiserId(buyerId) .brandId(brandId) .build(); - final var modifiedExtBidPrebid = Optional.ofNullable(extPrebid.getPrebid()) - .map(p -> p.toBuilder().meta(updatedMeta).build()) - .orElse(ExtBidPrebid.builder().meta(updatedMeta).build()); + final var modifiedExtBidPrebid = ExtBidPrebid.builder().meta(updatedMeta).build(); final var updatedExt = ext.deepCopy(); updatedExt.set(PREBID_EXT, mapper.mapper().valueToTree(modifiedExtBidPrebid)); @@ -382,14 +376,6 @@ private OpenxBidExt parseOpenxBidExt(ObjectNode ext) { } } - private ExtPrebid getExtPrebid(ObjectNode bidExt, String bidId) { - try { - return mapper.mapper().convertValue(bidExt, EXT_PREBID_TYPE_REFERENCE); - } catch (IllegalArgumentException e) { - throw new PreBidException("Invalid ext in bid with id: " + bidId, e); - } - } - private int parseStringToInt(String value) { try { return value != null ? Integer.parseInt(value) : 0; diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 0b6cc249ae2..2dbbe4c263a 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -1002,7 +1002,6 @@ public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { allBuyerExt.put("dsp_id", "1").put("buyer_id", "2").put("brand_id", "3"); onlyBrandExt.put("brand_id", "4"); badExt.put("dsp_id", "abc").put("brand_id", "cba"); - badExt.put("something", "abc"); final var allBuyerExpectedExtJson = "{\"dsp_id\":\"1\",\"buyer_id\":\"2\",\"brand_id\":\"3\",\"prebid\":" + "{\"meta\":{\"advertiserId\":2,\"brandId\":3,\"networkId\":1}}}"; From 61206a5e8d6fd47f6bbf7af1c419fe577c8972b0 Mon Sep 17 00:00:00 2001 From: "kacper.fus" Date: Tue, 2 Sep 2025 08:47:42 +0200 Subject: [PATCH 03/10] refactor --- .../java/org/prebid/server/bidder/openx/OpenxBidder.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index 1096c8cae13..ed7edd828d8 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -362,10 +362,9 @@ private ObjectNode updateBidMeta(Bid bid) { final var modifiedExtBidPrebid = ExtBidPrebid.builder().meta(updatedMeta).build(); - final var updatedExt = ext.deepCopy(); - updatedExt.set(PREBID_EXT, mapper.mapper().valueToTree(modifiedExtBidPrebid)); + ext.set(PREBID_EXT, mapper.mapper().valueToTree(modifiedExtBidPrebid)); - return updatedExt; + return ext; } private OpenxBidExt parseOpenxBidExt(ObjectNode ext) { From c164516512da8a1959b8f8332b9945164e006e0f Mon Sep 17 00:00:00 2001 From: "kacper.fus" Date: Tue, 2 Sep 2025 11:15:47 +0200 Subject: [PATCH 04/10] remove var --- .../server/bidder/openx/OpenxBidder.java | 8 +++---- .../server/bidder/openx/OpenxBidderTest.java | 24 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index ed7edd828d8..796d0f066d2 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -340,12 +340,12 @@ private static List extractIgi(OpenxBidResponse bidResponse) { } private ObjectNode updateBidMeta(Bid bid) { - final var ext = bid.getExt(); + final ObjectNode ext = bid.getExt(); if (ext == null) { return null; } - final var openxBidExt = parseOpenxBidExt(ext); + final OpenxBidExt openxBidExt = parseOpenxBidExt(ext); final int buyerId = parseStringToInt(openxBidExt.getBuyerId()); final int dspId = parseStringToInt(openxBidExt.getDspId()); final int brandId = parseStringToInt(openxBidExt.getBrandId()); @@ -354,13 +354,13 @@ private ObjectNode updateBidMeta(Bid bid) { return ext; } - final var updatedMeta = ExtBidPrebidMeta.builder() + final ExtBidPrebidMeta updatedMeta = ExtBidPrebidMeta.builder() .networkId(dspId) .advertiserId(buyerId) .brandId(brandId) .build(); - final var modifiedExtBidPrebid = ExtBidPrebid.builder().meta(updatedMeta).build(); + final ExtBidPrebid modifiedExtBidPrebid = ExtBidPrebid.builder().meta(updatedMeta).build(); ext.set(PREBID_EXT, mapper.mapper().valueToTree(modifiedExtBidPrebid)); diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 2dbbe4c263a..82e367cb4d4 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -995,23 +995,23 @@ private static BidderCall givenHttpCall(String body) { @Test public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { // given - final var allBuyerExt = new ObjectNode(JsonNodeFactory.instance); - final var onlyBrandExt = new ObjectNode(JsonNodeFactory.instance); - final var badExt = new ObjectNode(JsonNodeFactory.instance); + final ObjectNode allBuyerExt = new ObjectNode(JsonNodeFactory.instance); + final ObjectNode onlyBrandExt = new ObjectNode(JsonNodeFactory.instance); + final ObjectNode badExt = new ObjectNode(JsonNodeFactory.instance); allBuyerExt.put("dsp_id", "1").put("buyer_id", "2").put("brand_id", "3"); onlyBrandExt.put("brand_id", "4"); badExt.put("dsp_id", "abc").put("brand_id", "cba"); - final var allBuyerExpectedExtJson = "{\"dsp_id\":\"1\",\"buyer_id\":\"2\",\"brand_id\":\"3\",\"prebid\":" + final String allBuyerExpectedExtJson = "{\"dsp_id\":\"1\",\"buyer_id\":\"2\",\"brand_id\":\"3\",\"prebid\":" + "{\"meta\":{\"advertiserId\":2,\"brandId\":3,\"networkId\":1}}}"; - final var onlyBrandExpectedExtJson = "{\"brand_id\":\"4\",\"prebid\":{\"meta\":{\"advertiserId\":0," + final String onlyBrandExpectedExtJson = "{\"brand_id\":\"4\",\"prebid\":{\"meta\":{\"advertiserId\":0," + "\"brandId\":4,\"networkId\":0}}}"; - final var badExpectedExtJson = "{\"dsp_id\":\"abc\",\"brand_id\":\"cba\"}"; + final String badExpectedExtJson = "{\"dsp_id\":\"abc\",\"brand_id\":\"cba\"}"; - final var allBuyerExpectedExt = (ObjectNode) mapper.readTree(allBuyerExpectedExtJson); - final var onlyBrandExpectedExt = (ObjectNode) mapper.readTree(onlyBrandExpectedExtJson); - final var badExpectedExt = (ObjectNode) mapper.readTree(badExpectedExtJson); + final ObjectNode allBuyerExpectedExt = (ObjectNode) mapper.readTree(allBuyerExpectedExtJson); + final ObjectNode onlyBrandExpectedExt = (ObjectNode) mapper.readTree(onlyBrandExpectedExtJson); + final ObjectNode badExpectedExt = (ObjectNode) mapper.readTree(badExpectedExtJson); final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString(BidResponse.builder() .seatbid(singletonList(SeatBid.builder() @@ -1042,8 +1042,7 @@ public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { .dealid("dealid3") .adm("
This is an Ad
") .ext(badExt) - .build() - )) + .build())) .build())) .build())); @@ -1053,8 +1052,7 @@ public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { Imp.builder() .id("impId1") .banner(Banner.builder().build()) - .build() - )) + .build())) .build(); // when From 62fd676b5882b6667d27f40647e272ac882f8983 Mon Sep 17 00:00:00 2001 From: "kacper.fus" Date: Tue, 2 Sep 2025 12:58:03 +0200 Subject: [PATCH 05/10] refactor after suggestions --- .../server/bidder/openx/OpenxBidder.java | 24 ++--- .../server/bidder/openx/OpenxBidderTest.java | 97 +++++++------------ 2 files changed, 48 insertions(+), 73 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index 796d0f066d2..810de467328 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -291,7 +291,7 @@ private List bidsFromResponse(BidRequest bidRequest, OpenxBidResponse .map(SeatBid::getBid) .filter(Objects::nonNull) .flatMap(Collection::stream) - .map(bid -> bid.toBuilder().ext(updateBidMeta(bid)).build()) + .map(bid -> bid.toBuilder().ext(getBidExt(bid)).build()) .map(bid -> toBidderBid(bid, impIdToBidType, bidCurrency)) .toList(); } @@ -339,30 +339,30 @@ private static List extractIgi(OpenxBidResponse bidResponse) { return igs.isEmpty() ? null : Collections.singletonList(ExtIgi.builder().igs(igs).build()); } - private ObjectNode updateBidMeta(Bid bid) { + private ObjectNode getBidExt(Bid bid) { final ObjectNode ext = bid.getExt(); if (ext == null) { return null; } final OpenxBidExt openxBidExt = parseOpenxBidExt(ext); - final int buyerId = parseStringToInt(openxBidExt.getBuyerId()); - final int dspId = parseStringToInt(openxBidExt.getDspId()); - final int brandId = parseStringToInt(openxBidExt.getBrandId()); + final Integer buyerId = parseStringToInt(openxBidExt.getBuyerId()); + final Integer dspId = parseStringToInt(openxBidExt.getDspId()); + final Integer brandId = parseStringToInt(openxBidExt.getBrandId()); - if (buyerId == 0 && dspId == 0 && brandId == 0) { + if (buyerId == null && dspId == null && brandId == null) { return ext; } - final ExtBidPrebidMeta updatedMeta = ExtBidPrebidMeta.builder() + final ExtBidPrebidMeta meta = ExtBidPrebidMeta.builder() .networkId(dspId) .advertiserId(buyerId) .brandId(brandId) .build(); - final ExtBidPrebid modifiedExtBidPrebid = ExtBidPrebid.builder().meta(updatedMeta).build(); + final ExtBidPrebid extBidPrebid = ExtBidPrebid.builder().meta(meta).build(); - ext.set(PREBID_EXT, mapper.mapper().valueToTree(modifiedExtBidPrebid)); + ext.set(PREBID_EXT, mapper.mapper().valueToTree(extBidPrebid)); return ext; } @@ -375,11 +375,11 @@ private OpenxBidExt parseOpenxBidExt(ObjectNode ext) { } } - private int parseStringToInt(String value) { + private static Integer parseStringToInt(String value) { try { - return value != null ? Integer.parseInt(value) : 0; + return Integer.parseInt(value); } catch (NumberFormatException e) { - return 0; + return null; } } } diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 82e367cb4d4..be2f97f740e 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -16,6 +16,9 @@ import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.prebid.server.VertxTest; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; @@ -43,6 +46,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Stream; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -992,9 +996,7 @@ private static BidderCall givenHttpCall(String body) { return BidderCall.succeededHttp(null, HttpResponse.of(200, null, body), null); } - @Test - public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { - // given + private static Stream makeBidsShouldReturnBidWithExtBidPrebidMetaArgs() throws JsonProcessingException { final ObjectNode allBuyerExt = new ObjectNode(JsonNodeFactory.instance); final ObjectNode onlyBrandExt = new ObjectNode(JsonNodeFactory.instance); final ObjectNode badExt = new ObjectNode(JsonNodeFactory.instance); @@ -1005,46 +1007,41 @@ public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { final String allBuyerExpectedExtJson = "{\"dsp_id\":\"1\",\"buyer_id\":\"2\",\"brand_id\":\"3\",\"prebid\":" + "{\"meta\":{\"advertiserId\":2,\"brandId\":3,\"networkId\":1}}}"; - final String onlyBrandExpectedExtJson = "{\"brand_id\":\"4\",\"prebid\":{\"meta\":{\"advertiserId\":0," - + "\"brandId\":4,\"networkId\":0}}}"; + final String onlyBrandExpectedExtJson = "{\"brand_id\":\"4\",\"prebid\":{\"meta\":{\"brandId\":4}}}"; final String badExpectedExtJson = "{\"dsp_id\":\"abc\",\"brand_id\":\"cba\"}"; final ObjectNode allBuyerExpectedExt = (ObjectNode) mapper.readTree(allBuyerExpectedExtJson); final ObjectNode onlyBrandExpectedExt = (ObjectNode) mapper.readTree(onlyBrandExpectedExtJson); final ObjectNode badExpectedExt = (ObjectNode) mapper.readTree(badExpectedExtJson); - final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString(BidResponse.builder() - .seatbid(singletonList(SeatBid.builder() - .bid(List.of( - Bid.builder() - .w(200) - .h(150) - .price(BigDecimal.ONE) - .impid("impId1") - .dealid("dealid") - .adm("
This is an Ad
") - .ext(allBuyerExt) - .build(), - Bid.builder() - .w(200) - .h(150) - .price(BigDecimal.ONE) - .impid("impId1") - .dealid("dealid2") - .adm("
This is an Ad
") - .ext(onlyBrandExt) - .build(), - Bid.builder() - .w(200) - .h(150) - .price(BigDecimal.ONE) - .impid("impId1") - .dealid("dealid3") - .adm("
This is an Ad
") - .ext(badExt) - .build())) - .build())) - .build())); + return Stream.of( + Arguments.of(allBuyerExt, allBuyerExpectedExt), + Arguments.of(onlyBrandExt, onlyBrandExpectedExt), + Arguments.of(badExt, badExpectedExt) + ); + } + + @ParameterizedTest + @MethodSource("makeBidsShouldReturnBidWithExtBidPrebidMetaArgs") + public void makeBidsShouldReturnBidWithExtBidPrebidMeta( + ObjectNode bidExt, + ObjectNode expectedExtWithBidMeta) throws JsonProcessingException { + // given + final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString( + BidResponse.builder() + .seatbid(singletonList(SeatBid.builder() + .bid(List.of( + Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1") + .dealid("dealid") + .adm("
This is an Ad
") + .ext(bidExt) + .build())) + .build())) + .build())); final BidRequest bidRequest = BidRequest.builder() .id("bidRequestId") @@ -1060,7 +1057,7 @@ public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getBids()).hasSize(3).containsExactlyInAnyOrder( + assertThat(result.getBids()).hasSize(1).containsExactlyInAnyOrder( BidderBid.of( Bid.builder() .impid("impId1") @@ -1069,29 +1066,7 @@ public void makeBidsShouldReturnBidMeta() throws JsonProcessingException { .w(200) .h(150) .adm("
This is an Ad
") - .ext(allBuyerExpectedExt) - .build(), - BidType.banner, "USD"), - BidderBid.of( - Bid.builder() - .impid("impId1") - .price(BigDecimal.ONE) - .dealid("dealid2") - .w(200) - .h(150) - .adm("
This is an Ad
") - .ext(onlyBrandExpectedExt) - .build(), - BidType.banner, "USD"), - BidderBid.of( - Bid.builder() - .impid("impId1") - .price(BigDecimal.ONE) - .dealid("dealid3") - .w(200) - .h(150) - .adm("
This is an Ad
") - .ext(badExpectedExt) + .ext(expectedExtWithBidMeta) .build(), BidType.banner, "USD") ); From 252d4db1ed3a096053f0e61874b50f01ebd73bb0 Mon Sep 17 00:00:00 2001 From: "kacper.fus" Date: Tue, 2 Sep 2025 13:00:56 +0200 Subject: [PATCH 06/10] new test case --- .../java/org/prebid/server/bidder/openx/OpenxBidderTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index be2f97f740e..edcf2e0a0df 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -1017,7 +1017,8 @@ private static Stream makeBidsShouldReturnBidWithExtBidPrebidMetaArgs return Stream.of( Arguments.of(allBuyerExt, allBuyerExpectedExt), Arguments.of(onlyBrandExt, onlyBrandExpectedExt), - Arguments.of(badExt, badExpectedExt) + Arguments.of(badExt, badExpectedExt), + Arguments.of(null, null) ); } From 93906c0964bbeef75dc29e40e467544b86b5b546 Mon Sep 17 00:00:00 2001 From: gmiedlar-ox Date: Tue, 2 Sep 2025 16:57:28 +0200 Subject: [PATCH 07/10] EXCH-13811 Make test more readable --- .../bidder/openx/proto/OpenxBidExt.java | 6 ++ .../server/bidder/openx/OpenxBidderTest.java | 83 ++++++++++++------- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java b/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java index 31002bae3f3..fd29facb8d1 100644 --- a/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java +++ b/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java @@ -1,9 +1,15 @@ package org.prebid.server.bidder.openx.proto; import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class OpenxBidExt { @JsonProperty("dsp_id") diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index edcf2e0a0df..54f26208f6e 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -27,6 +27,7 @@ import org.prebid.server.bidder.model.HttpRequest; import org.prebid.server.bidder.model.HttpResponse; import org.prebid.server.bidder.model.Result; +import org.prebid.server.bidder.openx.proto.OpenxBidExt; import org.prebid.server.bidder.openx.proto.OpenxBidResponse; import org.prebid.server.bidder.openx.proto.OpenxBidResponseExt; import org.prebid.server.bidder.openx.proto.OpenxRequestExt; @@ -996,23 +997,50 @@ private static BidderCall givenHttpCall(String body) { return BidderCall.succeededHttp(null, HttpResponse.of(200, null, body), null); } - private static Stream makeBidsShouldReturnBidWithExtBidPrebidMetaArgs() throws JsonProcessingException { - final ObjectNode allBuyerExt = new ObjectNode(JsonNodeFactory.instance); - final ObjectNode onlyBrandExt = new ObjectNode(JsonNodeFactory.instance); - final ObjectNode badExt = new ObjectNode(JsonNodeFactory.instance); - - allBuyerExt.put("dsp_id", "1").put("buyer_id", "2").put("brand_id", "3"); - onlyBrandExt.put("brand_id", "4"); - badExt.put("dsp_id", "abc").put("brand_id", "cba"); - - final String allBuyerExpectedExtJson = "{\"dsp_id\":\"1\",\"buyer_id\":\"2\",\"brand_id\":\"3\",\"prebid\":" - + "{\"meta\":{\"advertiserId\":2,\"brandId\":3,\"networkId\":1}}}"; - final String onlyBrandExpectedExtJson = "{\"brand_id\":\"4\",\"prebid\":{\"meta\":{\"brandId\":4}}}"; - final String badExpectedExtJson = "{\"dsp_id\":\"abc\",\"brand_id\":\"cba\"}"; - - final ObjectNode allBuyerExpectedExt = (ObjectNode) mapper.readTree(allBuyerExpectedExtJson); - final ObjectNode onlyBrandExpectedExt = (ObjectNode) mapper.readTree(onlyBrandExpectedExtJson); - final ObjectNode badExpectedExt = (ObjectNode) mapper.readTree(badExpectedExtJson); + private static Stream bidWithExtTestCases() throws JsonProcessingException { + final ObjectNode allBuyerExt = mapper.valueToTree(OpenxBidExt.builder() + .dspId("1") + .buyerId("2") + .brandId("3") + .build()); + final ObjectNode onlyBrandExt = mapper.valueToTree(OpenxBidExt.builder() + .brandId("4") + .build()); + final ObjectNode badExt = mapper.valueToTree(OpenxBidExt.builder() + .dspId("abc") + .brandId("cba") + .build()); + + final ObjectNode allBuyerExpectedExt = (ObjectNode) mapper.readTree(""" + { + "dsp_id": "1", + "buyer_id": "2", + "brand_id": "3", + "prebid": { + "meta": { + "advertiserId":2, + "brandId":3, + "networkId":1 + } + } + } + """); + final ObjectNode onlyBrandExpectedExt = (ObjectNode) mapper.readTree(""" + { + "brand_id": "4", + "prebid": { + "meta": { + "brandId":4 + } + } + } + """); + final ObjectNode badExpectedExt = (ObjectNode) mapper.readTree(""" + { + "dsp_id": "abc", + "brand_id": "cba" + } + """); return Stream.of( Arguments.of(allBuyerExt, allBuyerExpectedExt), @@ -1023,8 +1051,8 @@ private static Stream makeBidsShouldReturnBidWithExtBidPrebidMetaArgs } @ParameterizedTest - @MethodSource("makeBidsShouldReturnBidWithExtBidPrebidMetaArgs") - public void makeBidsShouldReturnBidWithExtBidPrebidMeta( + @MethodSource("bidWithExtTestCases") + public void makeBidsShouldReturnBidWithExt( ObjectNode bidExt, ObjectNode expectedExtWithBidMeta) throws JsonProcessingException { // given @@ -1058,18 +1086,9 @@ public void makeBidsShouldReturnBidWithExtBidPrebidMeta( // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getBids()).hasSize(1).containsExactlyInAnyOrder( - BidderBid.of( - Bid.builder() - .impid("impId1") - .price(BigDecimal.ONE) - .dealid("dealid") - .w(200) - .h(150) - .adm("
This is an Ad
") - .ext(expectedExtWithBidMeta) - .build(), - BidType.banner, "USD") - ); + assertThat(result.getBids()).hasSize(1) + .extracting(BidderBid::getBid) + .extracting(Bid::getExt) + .containsExactly(expectedExtWithBidMeta); } } From 36d996ce6f7bf170ef71389192c0324bcd4a36e4 Mon Sep 17 00:00:00 2001 From: gmiedlar-ox Date: Tue, 2 Sep 2025 16:59:25 +0200 Subject: [PATCH 08/10] EXCH-13811 Remove unused import --- .../java/org/prebid/server/bidder/openx/OpenxBidderTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 54f26208f6e..7819bc2ad0f 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Audio; import com.iab.openrtb.request.Banner; From 1cf8c186bb754970c8f93b8b09a75a12a26df5e8 Mon Sep 17 00:00:00 2001 From: gmiedlar-ox Date: Fri, 5 Sep 2025 12:46:32 +0200 Subject: [PATCH 09/10] Apply CR suggestions --- .../server/bidder/openx/OpenxBidder.java | 7 +- .../bidder/openx/proto/OpenxBidExt.java | 12 +- .../server/bidder/openx/OpenxBidderTest.java | 173 ++++++++++++------ 3 files changed, 117 insertions(+), 75 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index 810de467328..00a8c8dc3fb 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -291,16 +291,15 @@ private List bidsFromResponse(BidRequest bidRequest, OpenxBidResponse .map(SeatBid::getBid) .filter(Objects::nonNull) .flatMap(Collection::stream) - .map(bid -> bid.toBuilder().ext(getBidExt(bid)).build()) .map(bid -> toBidderBid(bid, impIdToBidType, bidCurrency)) .toList(); } - private static BidderBid toBidderBid(Bid bid, Map impIdToBidType, String bidCurrency) { + private BidderBid toBidderBid(Bid bid, Map impIdToBidType, String bidCurrency) { final BidType bidType = getBidType(bid, impIdToBidType); final ExtBidPrebidVideo videoInfo = bidType == BidType.video ? getVideoInfo(bid) : null; return BidderBid.builder() - .bid(bid) + .bid(bid.toBuilder().ext(getBidExt(bid)).build()) .type(bidType) .bidCurrency(bidCurrency) .videoInfo(videoInfo) @@ -371,7 +370,7 @@ private OpenxBidExt parseOpenxBidExt(ObjectNode ext) { try { return mapper.mapper().convertValue(ext, OpenxBidExt.class); } catch (IllegalArgumentException e) { - return new OpenxBidExt(); + return OpenxBidExt.builder().build(); } } diff --git a/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java b/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java index fd29facb8d1..2a5fac5b445 100644 --- a/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java +++ b/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java @@ -1,21 +1,13 @@ package org.prebid.server.bidder.openx.proto; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.Value; -@Getter @Builder -@NoArgsConstructor -@AllArgsConstructor +@Value public class OpenxBidExt { - @JsonProperty("dsp_id") String dspId; - @JsonProperty("buyer_id") String buyerId; - @JsonProperty("brand_id") String brandId; } diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 7819bc2ad0f..fe5f681f1d8 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Audio; import com.iab.openrtb.request.Banner; @@ -15,9 +16,6 @@ import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; import org.prebid.server.VertxTest; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; @@ -46,7 +44,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.stream.Stream; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -988,73 +985,115 @@ public void makeBidsShouldReturnResultContainingEmptyValueAndErrorsWhenSeatBidEm .containsOnly(Collections.emptyList(), Collections.emptyList()); } - private static Map givenCustomParams(String key, Object values) { - return singletonMap(key, mapper.valueToTree(values)); - } - - private static BidderCall givenHttpCall(String body) { - return BidderCall.succeededHttp(null, HttpResponse.of(200, null, body), null); - } - - private static Stream bidWithExtTestCases() throws JsonProcessingException { - final ObjectNode allBuyerExt = mapper.valueToTree(OpenxBidExt.builder() + @Test + public void makeBidShouldReturnBidWithExtPrebidMetaContainingAllFieldsFromBidExt() throws JsonProcessingException { + // given + final ObjectNode bidExt = mapper.valueToTree(OpenxBidExt.builder() .dspId("1") .buyerId("2") .brandId("3") .build()); - final ObjectNode onlyBrandExt = mapper.valueToTree(OpenxBidExt.builder() + final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString( + BidResponse.builder() + .seatbid(singletonList(SeatBid.builder() + .bid(List.of( + Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1") + .dealid("dealid") + .adm("
This is an Ad
") + .ext(bidExt) + .build())) + .build())) + .build())); + + final BidRequest bidRequest = BidRequest.builder() + .id("bidRequestId") + .imp(List.of( + Imp.builder() + .id("impId1") + .banner(Banner.builder().build()) + .build())) + .build(); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); + + // then + final ObjectNode expectedExtWithBidMeta = JsonNodeFactory.instance.objectNode() + .put("dsp_id", "1") + .put("buyer_id", "2") + .put("brand_id", "3") + .set("prebid", JsonNodeFactory.instance.objectNode() + .set("meta", JsonNodeFactory.instance.objectNode() + .put("advertiserId", 2) + .put("brandId", 3) + .put("networkId", 1))); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()).hasSize(1) + .extracting(BidderBid::getBid) + .extracting(Bid::getExt) + .containsExactly(expectedExtWithBidMeta); + } + + @Test + public void makeBidShouldReturnBidWithExtPrebidMetaContainingBrandIdFieldOnly() throws JsonProcessingException { + // given + final ObjectNode bidExt = mapper.valueToTree(OpenxBidExt.builder() .brandId("4") .build()); - final ObjectNode badExt = mapper.valueToTree(OpenxBidExt.builder() - .dspId("abc") - .brandId("cba") - .build()); + final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString( + BidResponse.builder() + .seatbid(singletonList(SeatBid.builder() + .bid(List.of( + Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1") + .dealid("dealid") + .adm("
This is an Ad
") + .ext(bidExt) + .build())) + .build())) + .build())); + + final BidRequest bidRequest = BidRequest.builder() + .id("bidRequestId") + .imp(List.of( + Imp.builder() + .id("impId1") + .banner(Banner.builder().build()) + .build())) + .build(); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); - final ObjectNode allBuyerExpectedExt = (ObjectNode) mapper.readTree(""" - { - "dsp_id": "1", - "buyer_id": "2", - "brand_id": "3", - "prebid": { - "meta": { - "advertiserId":2, - "brandId":3, - "networkId":1 - } - } - } - """); - final ObjectNode onlyBrandExpectedExt = (ObjectNode) mapper.readTree(""" - { - "brand_id": "4", - "prebid": { - "meta": { - "brandId":4 - } - } - } - """); - final ObjectNode badExpectedExt = (ObjectNode) mapper.readTree(""" - { - "dsp_id": "abc", - "brand_id": "cba" - } - """); - - return Stream.of( - Arguments.of(allBuyerExt, allBuyerExpectedExt), - Arguments.of(onlyBrandExt, onlyBrandExpectedExt), - Arguments.of(badExt, badExpectedExt), - Arguments.of(null, null) - ); + // then + final ObjectNode expectedExtWithBidMeta = JsonNodeFactory.instance.objectNode() + .put("brand_id", "4") + .set("prebid", JsonNodeFactory.instance.objectNode() + .set("meta", JsonNodeFactory.instance.objectNode() + .put("brandId", 4))); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()).hasSize(1) + .extracting(BidderBid::getBid) + .extracting(Bid::getExt) + .containsExactly(expectedExtWithBidMeta); } - @ParameterizedTest - @MethodSource("bidWithExtTestCases") - public void makeBidsShouldReturnBidWithExt( - ObjectNode bidExt, - ObjectNode expectedExtWithBidMeta) throws JsonProcessingException { + @Test + public void makeBidShouldReturnBidWithExtPrebidMetaNotContainingFieldsWithInvalidValues() + throws JsonProcessingException { // given + final ObjectNode bidExt = mapper.valueToTree(OpenxBidExt.builder() + .dspId("abc") + .buyerId("xyz") + .brandId("cba") + .build()); final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString( BidResponse.builder() .seatbid(singletonList(SeatBid.builder() @@ -1084,10 +1123,22 @@ public void makeBidsShouldReturnBidWithExt( final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); // then + final ObjectNode expectedExtWithBidMeta = JsonNodeFactory.instance.objectNode() + .put("dsp_id", "abc") + .put("buyer_id", "xyz") + .put("brand_id", "cba"); assertThat(result.getErrors()).isEmpty(); assertThat(result.getBids()).hasSize(1) .extracting(BidderBid::getBid) .extracting(Bid::getExt) .containsExactly(expectedExtWithBidMeta); } + + private static Map givenCustomParams(String key, Object values) { + return singletonMap(key, mapper.valueToTree(values)); + } + + private static BidderCall givenHttpCall(String body) { + return BidderCall.succeededHttp(null, HttpResponse.of(200, null, body), null); + } } From 227cbb635854f0c3191c4f8ad1a0d1664d29fa59 Mon Sep 17 00:00:00 2001 From: "kacper.fus" Date: Thu, 18 Sep 2025 11:03:48 +0200 Subject: [PATCH 10/10] suggestions --- .../server/bidder/openx/proto/OpenxBidExt.java | 2 ++ .../server/bidder/openx/OpenxBidderTest.java | 15 +++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java b/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java index 2a5fac5b445..00305cfb64b 100644 --- a/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java +++ b/src/main/java/org/prebid/server/bidder/openx/proto/OpenxBidExt.java @@ -8,6 +8,8 @@ public class OpenxBidExt { String dspId; + String buyerId; + String brandId; } diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index fe5f681f1d8..fab9bedceb7 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Audio; import com.iab.openrtb.request.Banner; @@ -1022,12 +1021,12 @@ public void makeBidShouldReturnBidWithExtPrebidMetaContainingAllFieldsFromBidExt final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); // then - final ObjectNode expectedExtWithBidMeta = JsonNodeFactory.instance.objectNode() + final ObjectNode expectedExtWithBidMeta = mapper.createObjectNode() .put("dsp_id", "1") .put("buyer_id", "2") .put("brand_id", "3") - .set("prebid", JsonNodeFactory.instance.objectNode() - .set("meta", JsonNodeFactory.instance.objectNode() + .set("prebid", mapper.createObjectNode() + .set("meta", mapper.createObjectNode() .put("advertiserId", 2) .put("brandId", 3) .put("networkId", 1))); @@ -1073,10 +1072,10 @@ public void makeBidShouldReturnBidWithExtPrebidMetaContainingBrandIdFieldOnly() final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); // then - final ObjectNode expectedExtWithBidMeta = JsonNodeFactory.instance.objectNode() + final ObjectNode expectedExtWithBidMeta = mapper.createObjectNode() .put("brand_id", "4") - .set("prebid", JsonNodeFactory.instance.objectNode() - .set("meta", JsonNodeFactory.instance.objectNode() + .set("prebid", mapper.createObjectNode() + .set("meta", mapper.createObjectNode() .put("brandId", 4))); assertThat(result.getErrors()).isEmpty(); assertThat(result.getBids()).hasSize(1) @@ -1123,7 +1122,7 @@ public void makeBidShouldReturnBidWithExtPrebidMetaNotContainingFieldsWithInvali final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); // then - final ObjectNode expectedExtWithBidMeta = JsonNodeFactory.instance.objectNode() + final ObjectNode expectedExtWithBidMeta = mapper.createObjectNode() .put("dsp_id", "abc") .put("buyer_id", "xyz") .put("brand_id", "cba");