From 050fbcce2834817b16184086de37fbe9d0352a32 Mon Sep 17 00:00:00 2001 From: rgoncharuk Date: Fri, 20 Sep 2019 05:35:34 +0300 Subject: [PATCH] Pass Prebid adSlot to Rubicon bidder XAPI --- .../server/bidder/rubicon/RubiconBidder.java | 9 ++++++ .../bidder/rubicon/RubiconBidderTest.java | 32 +++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java b/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java index bb6c966622f..3cbcfab53bd 100644 --- a/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java +++ b/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java @@ -289,6 +289,15 @@ private static JsonNode makeTarget(Imp imp, ExtImpRubicon rubiconImpExt, Site si final ObjectNode contextDataNode = context != null ? context.getData() : null; if (contextDataNode != null) { inventoryNode.setAll(contextDataNode); + + // copy OPENRTB.imp[].ext.context.data.adslot to XAPI.imp[].ext.rp.target.dfp_ad_unit_code without + // leading slash + final JsonNode adSlotNode = contextDataNode.get("adslot"); + if (adSlotNode != null && adSlotNode.isTextual()) { + final String adSlot = adSlotNode.textValue(); + final String adUnitCode = adSlot.indexOf('/') == 0 ? adSlot.substring(1) : adSlot; + inventoryNode.put("dfp_ad_unit_code", adUnitCode); + } } // copy OPENRTB.imp[].ext.context.keywords to XAPI.imp[].ext.rp.target.keywords diff --git a/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java b/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java index c337c6045de..1cfe7744dc3 100644 --- a/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java @@ -827,15 +827,43 @@ public void makeHttpRequestsShouldCreateRequestPerImp() { } @Test - public void makeHttpRequestsShouldCopyImpExtContextDataFieldsToRubiconImpExtRpTarget() { + public void makeHttpRequestsShouldCopyAndModifyImpExtContextDataFieldsToRubiconImpExtRpTarget() { // given - final ObjectNode impExtContextDataNode = mapper.createObjectNode().put("property", "value"); final BidRequest bidRequest = givenBidRequest( requestBuilder -> requestBuilder.ext(givenExtBidRequestWithRubiconFirstPartyData()), impBuilder -> impBuilder.video(Video.builder().build()), identity()); final ObjectNode impExt = bidRequest.getImp().get(0).getExt(); + final ObjectNode impExtContextDataNode = mapper.createObjectNode().put("property", "value") + .put("adslot", "/test"); + impExt.set("context", mapper.valueToTree(ExtImpContext.of(null, null, impExtContextDataNode))); + + // when + final Result>> result = rubiconBidder.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getExt) + .extracting(objectNode -> mapper.convertValue(objectNode, RubiconImpExt.class)) + .extracting(RubiconImpExt::getRp) + .extracting(RubiconImpExtRp::getTarget) + .containsOnly(impExtContextDataNode.put("dfp_ad_unit_code", "test")); + } + + @Test + public void makeHttpRequestsShouldNotCopyAndModifyImpExtContextDataAdslotToRubiconImpExtRpTargetDfpAdUnitCode() { + // given + final BidRequest bidRequest = givenBidRequest( + requestBuilder -> requestBuilder.ext(givenExtBidRequestWithRubiconFirstPartyData()), + impBuilder -> impBuilder.video(Video.builder().build()), + identity()); + + final ObjectNode impExt = bidRequest.getImp().get(0).getExt(); + final ObjectNode impExtContextDataNode = mapper.createObjectNode().put("adslot", 123); impExt.set("context", mapper.valueToTree(ExtImpContext.of(null, null, impExtContextDataNode))); // when