diff --git a/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java b/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java index b3dc01cee97..a5b5687c1b4 100644 --- a/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java +++ b/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java @@ -1,6 +1,8 @@ package org.prebid.server.bidder.cpmstar; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; import com.iab.openrtb.response.Bid; @@ -79,7 +81,17 @@ private Imp createImp(ExtImpCpmStar extImpCpmStar, Imp imp) { if (extImpCpmStar == null) { throw new PreBidException("imp id=%s: bidder.ext is null".formatted(imp.getId())); } - return imp.toBuilder().ext(mapper.mapper().valueToTree(extImpCpmStar)).build(); + + final ObjectNode impExt = imp.getExt() != null + ? imp.getExt().deepCopy() + : mapper.mapper().createObjectNode(); + + final JsonNode bidderNode = impExt.remove("bidder"); + if (bidderNode != null && bidderNode.isObject()) { + bidderNode.fields().forEachRemaining(entry -> impExt.set(entry.getKey(), entry.getValue())); + } + + return imp.toBuilder().ext(impExt).build(); } @Override diff --git a/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java b/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java index a5f77bc0394..80ee546bfe3 100644 --- a/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java @@ -1,6 +1,7 @@ package org.prebid.server.bidder.cpmstar; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Audio; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; @@ -87,6 +88,41 @@ public void makeHttpRequestsShouldSkipInvalidImpressionAndAddError() { assertThat(result.getValue()).isEmpty(); } + @Test + public void makeHttpRequestsShouldPreserveExistingExtFieldsWhenFlatteningBidder() throws JsonProcessingException { + // given: + final ObjectNode ext = mapper.createObjectNode(); + ext.set("bidder", mapper.valueToTree(ExtImpCpmStar.of(12, 123))); + ext.put("gpid", "abc-123"); + + final Imp imp = Imp.builder() + .id("123") + .banner(Banner.builder().w(300).h(250).build()) + .ext(ext) + .build(); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(imp)) + .build(); + + final CpmStarBidder target = new CpmStarBidder("https://test.endpoint.com", jacksonMapper); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + + final BidRequest outgoing = result.getValue().getFirst().getPayload(); + final ObjectNode outgoingExt = outgoing.getImp().getFirst().getExt(); + + assertThat(outgoingExt.has("gpid")).isTrue(); + assertThat(outgoingExt.get("gpid").asText()).isEqualTo("abc-123"); + assertThat(outgoingExt.has("bidder")).isFalse(); + assertThat(outgoingExt.get("placementId").asInt()).isEqualTo(12); + assertThat(outgoingExt.get("subpoolId").asInt()).isEqualTo(123); + } + @Test public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() { // given diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-request.json b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-request.json index 9afb14a3c23..793cea67d5b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-request.json @@ -21,4 +21,4 @@ "gdpr": 0 } } -} \ No newline at end of file +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json index 99f805d86bc..b1f5b42ff89 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json @@ -9,14 +9,12 @@ "h": 250 }, "ext": { + "tid": "${json-unit.any-string}", "placementId": 1234, "subpoolId": 1234 } } ], - "source": { - "tid": "${json-unit.any-string}" - }, "site": { "domain": "www.example.com", "page": "http://www.example.com", @@ -36,6 +34,9 @@ "cur": [ "USD" ], + "source": { + "tid": "${json-unit.any-string}" + }, "regs": { "ext": { "gdpr": 0 @@ -52,3 +53,4 @@ } } } +