diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 6bd182cd770..319dd51084f 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -1,6 +1,5 @@ package org.prebid.server.auction; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.App; @@ -56,7 +55,6 @@ import org.prebid.server.bidder.model.Price; import org.prebid.server.cookie.UidsCookie; import org.prebid.server.exception.InvalidRequestException; -import org.prebid.server.exception.PreBidException; import org.prebid.server.execution.timeout.Timeout; import org.prebid.server.execution.timeout.TimeoutFactory; import org.prebid.server.floors.PriceFloorAdjuster; @@ -79,8 +77,6 @@ import org.prebid.server.proto.openrtb.ext.request.ExtApp; import org.prebid.server.proto.openrtb.ext.request.ExtBidderConfigOrtb; import org.prebid.server.proto.openrtb.ext.request.ExtDooh; -import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebidBidderFields; -import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebidFloors; import org.prebid.server.proto.openrtb.ext.request.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidBidderConfig; @@ -126,6 +122,8 @@ public class ExchangeService { private static final Integer DEFAULT_MULTIBID_LIMIT_MAX = 9; private static final String EID_ALLOWED_FOR_ALL_BIDDERS = "*"; private static final BigDecimal THOUSAND = BigDecimal.valueOf(1000); + private static final Set BIDDER_FIELDS_EXCEPTION_LIST = Set.of( + "adunitcode", "storedrequest", "options", "is_rewarded_inventory"); private final double logSamplingRate; private final BidderCatalog bidderCatalog; @@ -870,7 +868,7 @@ private Imp prepareImp(Imp imp, return imp.toBuilder() .bidfloor(adjustedPrice.getValue()) .bidfloorcur(adjustedPrice.getCurrency()) - .ext(prepareImpExt(bidder, imp.getExt(), adjustedPrice.getValue(), transmitTid, useFirstPartyData)) + .ext(prepareImpExt(bidder, imp.getExt(), transmitTid, useFirstPartyData)) .build(); } @@ -885,11 +883,10 @@ private Price resolveBidPrice(Imp imp, private ObjectNode prepareImpExt(String bidder, ObjectNode impExt, - BigDecimal adjustedFloor, boolean transmitTid, boolean useFirstPartyData) { final JsonNode bidderNode = bidderParamsFromImpExt(impExt).get(bidder); - final JsonNode impExtPrebid = prepareImpExt(impExt.get(PREBID_EXT), adjustedFloor); + final JsonNode impExtPrebid = cleanUpImpExtPrebid(impExt.get(PREBID_EXT)); Optional.ofNullable(impExtPrebid).ifPresentOrElse( ext -> impExt.set(PREBID_EXT, ext), () -> impExt.remove(PREBID_EXT)); @@ -901,32 +898,22 @@ private ObjectNode prepareImpExt(String bidder, return fpdResolver.resolveImpExt(impExt, useFirstPartyData); } - private JsonNode prepareImpExt(JsonNode extImpPrebidNode, BigDecimal adjustedFloor) { - if (extImpPrebidNode.size() <= 1) { + private JsonNode cleanUpImpExtPrebid(JsonNode extImpPrebid) { + if (extImpPrebid.size() <= 1) { return null; } - final ExtImpPrebidBidderFields extImpPrebid = extImpPrebid(extImpPrebidNode); - final ExtImpPrebidFloors floors = extImpPrebid.getFloors(); - final ExtImpPrebidFloors updatedFloors = floors != null - ? ExtImpPrebidFloors.of(floors.getFloorRule(), - floors.getFloorRuleValue(), - adjustedFloor, - floors.getFloorMin(), - floors.getFloorMinCur()) - : null; - - return mapper.mapper().valueToTree(extImpPrebid(extImpPrebidNode).toBuilder() - .floors(updatedFloors) - .build()); - } + final Iterator fieldsIterator = extImpPrebid.fieldNames(); + final ObjectNode modifiedExtImpPrebid = extImpPrebid.deepCopy(); - private ExtImpPrebidBidderFields extImpPrebid(JsonNode extImpPrebid) { - try { - return mapper.mapper().treeToValue(extImpPrebid, ExtImpPrebidBidderFields.class); - } catch (JsonProcessingException e) { - throw new PreBidException("Error decoding imp.ext.prebid: " + e.getMessage(), e); + while (fieldsIterator.hasNext()) { + final String fieldName = fieldsIterator.next(); + if (!BIDDER_FIELDS_EXCEPTION_LIST.contains(fieldName)) { + modifiedExtImpPrebid.remove(fieldName); + } } + + return modifiedExtImpPrebid; } private App prepareApp(App app, ObjectNode fpdApp, boolean useFirstPartyData) { 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 ebc7a7dccf4..0692c72f36d 100644 --- a/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java +++ b/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java @@ -1,6 +1,5 @@ package org.prebid.server.bidder.rubicon; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -52,7 +51,6 @@ import org.prebid.server.bidder.rubicon.proto.request.RubiconExtPrebidBiddersBidder; import org.prebid.server.bidder.rubicon.proto.request.RubiconExtPrebidBiddersBidderDebug; import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExt; -import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExtPrebid; import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExtRp; import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExtRpRtb; import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExtRpTrack; @@ -89,7 +87,6 @@ import org.prebid.server.proto.openrtb.ext.request.ExtDevice; import org.prebid.server.proto.openrtb.ext.request.ExtImpContextDataAdserver; import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebid; -import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebidFloors; import org.prebid.server.proto.openrtb.ext.request.ExtPublisher; import org.prebid.server.proto.openrtb.ext.request.ExtRegs; import org.prebid.server.proto.openrtb.ext.request.ExtRegsDsa; @@ -507,16 +504,7 @@ private Imp makeImp(Imp imp, final Imp.ImpBuilder builder = imp.toBuilder() .metric(makeMetrics(imp)) .ext(mapper.mapper().valueToTree( - makeImpExt( - imp, - bidRequest, - extImpRubicon, - resolvedFormats, - site, - app, - extRequest, - ipfCurrency, - priceFloorResult))); + makeImpExt(imp, extImpRubicon, resolvedFormats, site, app, extRequest))); final BigDecimal resolvedBidFloor = ipfFloor != null ? convertToXAPICurrency(ipfFloor, ipfCurrency, imp, bidRequest) @@ -672,18 +660,11 @@ private BigDecimal convertBidFloorCurrency(BigDecimal bidFloor, } private RubiconImpExt makeImpExt(Imp imp, - BidRequest bidRequest, ExtImpRubicon rubiconImpExt, Set formats, Site site, App app, - ExtRequest extRequest, - String ipfResolvedCurrency, - PriceFloorResult priceFloorResult) { - - final RubiconImpExtPrebid rubiconImpExtPrebid = priceFloorResult != null - ? makeRubiconExtPrebid(priceFloorResult, ipfResolvedCurrency, imp, bidRequest) - : null; + ExtRequest extRequest) { final RubiconImpExtRpRtb rubiconImpExtRpRtb = CollectionUtils.isNotEmpty(formats) ? RubiconImpExtRpRtb.of(formats) @@ -702,7 +683,6 @@ private RubiconImpExt makeImpExt(Imp imp, .gpid(getGpid(imp.getExt())) .skadn(getSkadn(imp.getExt())) .tid(getTid(imp.getExt())) - .prebid(rubiconImpExtPrebid) .build(); } @@ -722,30 +702,6 @@ private JsonNode makeTarget(Imp imp, ExtImpRubicon rubiconImpExt, Site site, App return result; } - private RubiconImpExtPrebid makeRubiconExtPrebid(PriceFloorResult priceFloorResult, - String currency, - Imp imp, - BidRequest bidRequest) { - final ObjectNode impExt = imp.getExt(); - final ExtImpPrebid extImpPrebid = extImpPrebid(impExt.get(PREBID_EXT)); - final ExtImpPrebidFloors floors = extImpPrebid != null ? extImpPrebid.getFloors() : null; - - return RubiconImpExtPrebid.of(ExtImpPrebidFloors.of( - priceFloorResult.getFloorRule(), - convertToXAPICurrency(priceFloorResult.getFloorRuleValue(), currency, imp, bidRequest), - convertToXAPICurrency(priceFloorResult.getFloorValue(), currency, imp, bidRequest), - floors != null ? floors.getFloorMin() : null, - floors != null ? floors.getFloorMinCur() : null)); - } - - private ExtImpPrebid extImpPrebid(JsonNode extImpPrebid) { - try { - return mapper.mapper().treeToValue(extImpPrebid, ExtImpPrebid.class); - } catch (JsonProcessingException e) { - throw new PreBidException("Error decoding imp.ext.prebid: " + e.getMessage(), e); - } - } - private void mergeFirstPartyDataFromSite(Site site, ObjectNode result) { // merge OPENRTB.site.ext.data.* to every impression – XAPI.imp[].ext.rp.target.* final ExtSite siteExt = site != null ? site.getExt() : null; diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtImpPrebid.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtImpPrebid.java index 6933ca2b320..0d626029c9f 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtImpPrebid.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtImpPrebid.java @@ -3,28 +3,68 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; +import lombok.Builder; +import lombok.Value; import java.util.List; -@Data -@SuperBuilder(toBuilder = true) -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -public class ExtImpPrebid extends ExtImpPrebidBidderFields { +/** + * Defines the contract for bidrequest.imp[i].ext.prebid + */ +@Builder(toBuilder = true) +@Value +public class ExtImpPrebid { + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.storedrequest + */ + ExtStoredRequest storedrequest; + + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.storedauctionresponse + */ @JsonProperty("storedauctionresponse") ExtStoredAuctionResponse storedAuctionResponse; + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.storedbidresponse + */ @JsonProperty("storedbidresponse") List storedBidResponse; + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.options + */ + ExtOptions options; + + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.is_rewarded_inventory + */ + Integer isRewardedInventory; + + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.BIDDER + */ ObjectNode bidder; + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.floors + */ + ExtImpPrebidFloors floors; + + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.passthrough + */ JsonNode passthrough; + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.imp + */ ObjectNode imp; + + /** + * Defines the contract for bidrequest.imp[i].ext.prebid.adunitcode + */ + @JsonProperty("adunitcode") + String adUnitCode; } diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtImpPrebidBidderFields.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtImpPrebidBidderFields.java deleted file mode 100644 index f7f5b222df7..00000000000 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtImpPrebidBidderFields.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.prebid.server.proto.openrtb.ext.request; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Data -@SuperBuilder(toBuilder = true) -@NoArgsConstructor -public class ExtImpPrebidBidderFields { - - ExtStoredRequest storedrequest; - - ExtOptions options; - - Integer isRewardedInventory; - - ExtImpPrebidFloors floors; - - @JsonProperty("adunitcode") - String adUnitCode; -} diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index fdcd5da7e2d..72ea7a78bbe 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -3667,44 +3667,10 @@ public void shouldProperPopulateImpExtPrebid() { "storedrequest", Map.of("id", "id"), "options", Map.of("echovideoattrs", true), "is_rewarded_inventory", 1, - "floors", Map.of("floorRule", "rule"), "adunitcode", "adCodeValue"), "bidder", Map.of("test-host", "unknownHost", "publisher_id", "ps4")))); } - @Test - public void shouldThrowErrorIfCannotBeParsedImpExtPrebid() { - // given - final String prebid = "prebid"; - final String bidderKey = "bidder"; - final String optionKey = "options"; - final String bidderName = "bidderName"; - final String optionValue = "1"; - final Map> bidderValue = - singletonMap(bidderName, Map.of("test-host", "unknownHost", "publisher_id", "ps4")); - - final ObjectNode prebidJsonNodes = mapper.valueToTree( - singletonMap(prebid, Map.of(optionKey, optionValue, bidderKey, bidderValue))); - - final Imp imp = Imp.builder().ext(prebidJsonNodes).build(); - final BidRequest bidRequest = givenBidRequest(singletonList(imp), identity()); - final AuctionContext auctionContext = givenRequestContext(bidRequest); - - given(privacyEnforcementService.mask(any(), anyMap(), any())) - .willReturn(Future.succeededFuture(singletonList(BidderPrivacyResult.builder() - .requestBidder(bidderName) - .build()))); - - // when - final Future result = target.holdAuction(auctionContext); - - // then - assertThat(result.failed()).isTrue(); - assertThat(result.cause()) - .hasMessageStartingWith("Error decoding imp.ext.prebid: " - + "Cannot construct instance of `org.prebid.server.proto.openrtb.ext.request.ExtOptions`"); - } - @Test public void shouldReturnsSourceWithCorrespondingRequestExtPrebidSchainsIfSchainIsNotNull() { // given 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 d49f874c0e8..b5487cdd48b 100644 --- a/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java @@ -2993,152 +2993,6 @@ public void makeHttpRequestsShouldReturnOnlyLineItemRequestsWithExpectedFieldsWh givenImpExtRpTarget().put("line_item", "234")); } - @Test - public void makeHttpRequestsShouldFillImpExtWithFloorsForVideoImp() { - // given - final PriceFloorResult priceFloorResult = PriceFloorResult.of("video", BigDecimal.TEN, BigDecimal.TEN, "JPY"); - when(currencyConversionService.convertCurrency(any(), any(), any(), any())) - .thenReturn(BigDecimal.ONE); - when(priceFloorResolver.resolve(any(), any(), any(), any(), any(), any(), any())).thenReturn(priceFloorResult); - final JsonNode impFloorsNode = mapper.valueToTree(ExtImpPrebidFloors.of( - null, null, null, BigDecimal.TEN, "CUR")); - final ObjectNode givenImpExt = mapper.createObjectNode(); - final ObjectNode givenImpExtPrebid = mapper.createObjectNode(); - givenImpExtPrebid.set("floors", impFloorsNode); - givenImpExt.set("bidder", mapper.createObjectNode()); - givenImpExt.set("prebid", givenImpExtPrebid); - - final BidRequest bidRequest = givenBidRequest( - builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder() - .floors(givenFloors(floors -> floors.data(givenFloorData( - floorData -> floorData.modelGroups(singletonList( - givenModelGroup(UnaryOperator.identity()))))))) - .build())), - builder -> builder.video(Video.builder().build()).ext(givenImpExt), - identity()); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - verify(priceFloorResolver).resolve(any(), any(), any(), eq(ImpMediaType.video), any(), any(), any()); - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1).doesNotContainNull() - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) - .flatExtracting(BidRequest::getImp).doesNotContainNull() - .extracting(Imp::getExt).doesNotContainNull() - .extracting(ext -> mapper.treeToValue(ext, RubiconImpExt.class)) - .extracting(RubiconImpExt::getPrebid) - .extracting(RubiconImpExtPrebid::getFloors) - .containsOnly(ExtImpPrebidFloors.of("video", BigDecimal.ONE, BigDecimal.ONE, BigDecimal.TEN, "CUR")); - } - - @Test - public void makeHttpRequestsShouldFillImpExtWithFloorsForBannerImp() { - // given - final PriceFloorResult priceFloorResult = PriceFloorResult.of("banner", BigDecimal.TEN, BigDecimal.TEN, "JPY"); - when(currencyConversionService.convertCurrency(any(), any(), any(), any())) - .thenReturn(BigDecimal.ONE); - when(priceFloorResolver.resolve(any(), any(), any(), any(), any(), any(), any())).thenReturn(priceFloorResult); - - final BidRequest bidRequest = givenBidRequest( - builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder() - .floors(givenFloors(floors -> floors.data(givenFloorData( - floorData -> floorData.modelGroups(singletonList( - givenModelGroup(UnaryOperator.identity()))))))) - .build())), - builder -> builder.banner(Banner.builder().w(300).h(500).build()), - builder -> builder - .zoneId(4001) - .inventory(mapper.valueToTree(Inventory.of(singletonList("5-star"), singletonList("tech"))))); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - verify(priceFloorResolver).resolve(any(), any(), any(), eq(ImpMediaType.banner), any(), any(), any()); - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1).doesNotContainNull() - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) - .flatExtracting(BidRequest::getImp).doesNotContainNull() - .extracting(Imp::getExt).doesNotContainNull() - .extracting(ext -> mapper.treeToValue(ext, RubiconImpExt.class)) - .extracting(RubiconImpExt::getPrebid) - .extracting(RubiconImpExtPrebid::getFloors) - .containsOnly(ExtImpPrebidFloors.of("banner", BigDecimal.ONE, BigDecimal.ONE, null, null)); - } - - @Test - public void makeHttpRequestsShouldFillImpExtWithFloorsForNativeImp() { - // given - final PriceFloorResult priceFloorResult = PriceFloorResult.of("native", BigDecimal.TEN, BigDecimal.TEN, "JPY"); - when(currencyConversionService.convertCurrency(any(), any(), any(), any())) - .thenReturn(BigDecimal.ONE); - when(priceFloorResolver.resolve(any(), any(), any(), any(), any(), any(), any())).thenReturn(priceFloorResult); - - final BidRequest bidRequest = givenBidRequest( - builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder() - .floors(givenFloors(floors -> floors.data(givenFloorData( - floorData -> floorData.modelGroups(singletonList( - givenModelGroup(UnaryOperator.identity()))))))) - .build())), - builder -> builder.xNative(Native.builder().ver("1.0").build()), - builder -> builder - .zoneId(4001) - .inventory(mapper.valueToTree(Inventory.of(singletonList("5-star"), singletonList("tech"))))); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - verify(priceFloorResolver).resolve(any(), any(), any(), eq(ImpMediaType.xNative), any(), any(), any()); - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1).doesNotContainNull() - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) - .flatExtracting(BidRequest::getImp).doesNotContainNull() - .extracting(Imp::getExt).doesNotContainNull() - .extracting(ext -> mapper.treeToValue(ext, RubiconImpExt.class)) - .extracting(RubiconImpExt::getPrebid) - .extracting(RubiconImpExtPrebid::getFloors) - .containsOnly(ExtImpPrebidFloors.of("native", BigDecimal.ONE, BigDecimal.ONE, null, null)); - } - - @Test - public void makeHttpRequestsShouldAssumeDefaultIpfCurrencyAsUSD() { - // given - final PriceFloorResult priceFloorResult = PriceFloorResult.of("video", BigDecimal.TEN, BigDecimal.TEN, null); - when(currencyConversionService.convertCurrency(any(), any(), any(), any())) - .thenReturn(BigDecimal.ONE); - when(priceFloorResolver.resolve(any(), any(), any(), any(), any(), any(), any())).thenReturn(priceFloorResult); - - final BidRequest bidRequest = givenBidRequest( - builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder() - .debug(1) - .floors(givenFloors(floors -> floors.data(givenFloorData( - floorData -> floorData.modelGroups(singletonList( - givenModelGroup(UnaryOperator.identity()))))))) - .build())), - builder -> builder.id("123").video(Video.builder().build()), - builder -> builder - .zoneId(4001) - .inventory(mapper.valueToTree(Inventory.of(singletonList("5-star"), singletonList("tech"))))); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).containsExactly( - BidderError.badInput("Ipf for imp `123` provided floor with no currency, assuming USD")); - assertThat(result.getValue()).hasSize(1).doesNotContainNull() - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) - .flatExtracting(BidRequest::getImp).doesNotContainNull() - .extracting(Imp::getExt).doesNotContainNull() - .extracting(ext -> mapper.treeToValue(ext, RubiconImpExt.class)) - .extracting(RubiconImpExt::getPrebid) - .extracting(RubiconImpExtPrebid::getFloors) - .containsOnly(ExtImpPrebidFloors.of("video", BigDecimal.TEN, BigDecimal.TEN, null, null)); - } - @Test public void makeHttpRequestsShouldConvertBidFloor() { // given @@ -3176,49 +3030,6 @@ public void makeHttpRequestsShouldConvertBidFloor() { .containsExactly(BigDecimal.ONE); } - @Test - public void makeHttpRequestsShouldFillImpExtWithFloorsWhenBothVideoAndBanner() { - // given - final PriceFloorResult priceFloorResult = PriceFloorResult.of("video", BigDecimal.TEN, BigDecimal.TEN, "JPY"); - when(priceFloorResolver.resolve(any(), any(), any(), any(), any(), any(), any())).thenReturn(priceFloorResult); - when(currencyConversionService.convertCurrency(any(), any(), any(), any())) - .thenReturn(BigDecimal.ONE); - - final BidRequest bidRequest = givenBidRequest( - builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder() - .floors(givenFloors(floors -> floors.data(givenFloorData( - floorData -> floorData.modelGroups(singletonList( - givenModelGroup(UnaryOperator.identity()))))))) - .build())), - builder -> builder - .video(Video.builder() - .mimes(singletonList("mime")) - .protocols(singletonList(1)) - .maxduration(10) - .linearity(10) - .build()) - .banner(Banner.builder() - .format(singletonList(Format.builder().h(300).w(250).build())) - .build()), - builder -> builder - .zoneId(4001) - .inventory(mapper.valueToTree(Inventory.of(singletonList("5-star"), singletonList("tech"))))); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1).doesNotContainNull() - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) - .flatExtracting(BidRequest::getImp).doesNotContainNull() - .extracting(Imp::getExt).doesNotContainNull() - .extracting(ext -> mapper.treeToValue(ext, RubiconImpExt.class)) - .extracting(RubiconImpExt::getPrebid) - .extracting(RubiconImpExtPrebid::getFloors) - .containsOnly(ExtImpPrebidFloors.of("video", BigDecimal.ONE, BigDecimal.ONE, null, null)); - } - @Test public void makeHttpRequestsShouldMoveSourceSchain() { // given