diff --git a/src/main/java/org/prebid/server/bidder/epsilon/EpsilonBidder.java b/src/main/java/org/prebid/server/bidder/epsilon/EpsilonBidder.java index bc4625ba905..4be70d935fc 100644 --- a/src/main/java/org/prebid/server/bidder/epsilon/EpsilonBidder.java +++ b/src/main/java/org/prebid/server/bidder/epsilon/EpsilonBidder.java @@ -261,10 +261,12 @@ private Bid updateBidWithId(Bid bid) { private static BidType getType(String impId, List imps) { for (Imp imp : imps) { if (imp.getId().equals(impId)) { - if (imp.getVideo() != null) { - return BidType.video; - } else if (imp.getAudio() != null) { + if (imp.getAudio() != null) { return BidType.audio; + } else if (imp.getXNative() != null) { + return BidType.xNative; + } else if (imp.getVideo() != null) { + return BidType.video; } else { return BidType.banner; } diff --git a/src/main/resources/bidder-config/epsilon.yaml b/src/main/resources/bidder-config/epsilon.yaml index ba7472331d7..44970a25db2 100644 --- a/src/main/resources/bidder-config/epsilon.yaml +++ b/src/main/resources/bidder-config/epsilon.yaml @@ -12,10 +12,12 @@ adapters: - banner - video - audio + - native site-media-types: - banner - video - audio + - native supported-vendors: vendor-id: 24 usersync: diff --git a/src/test/java/org/prebid/server/bidder/epsilon/EpsilonBidderTest.java b/src/test/java/org/prebid/server/bidder/epsilon/EpsilonBidderTest.java index 872a04c0a96..f69fb0f5415 100644 --- a/src/test/java/org/prebid/server/bidder/epsilon/EpsilonBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/epsilon/EpsilonBidderTest.java @@ -6,6 +6,7 @@ import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; +import com.iab.openrtb.request.Native; import com.iab.openrtb.request.Site; import com.iab.openrtb.request.Video; import com.iab.openrtb.response.Bid; @@ -21,12 +22,15 @@ import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; import org.prebid.server.bidder.model.BidderError; +import org.prebid.server.bidder.model.CompositeBidderResponse; 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.currency.CurrencyConversionService; import org.prebid.server.proto.openrtb.ext.ExtPrebid; import org.prebid.server.proto.openrtb.ext.request.epsilon.ExtImpEpsilon; +import org.prebid.server.proto.openrtb.ext.response.BidType; +import org.prebid.server.proto.openrtb.ext.response.ExtBidResponse; import java.math.BigDecimal; import java.util.Collections; @@ -513,6 +517,65 @@ public void makeHttpRequestsShouldPrioritizeVideoProtocolsFromImpExtEvenIfInvali .isEmpty(); } + @Test + public void makeHttpRequestsShouldSetImpBidFloorFromImpExtIfPresentAndImpBidFloorIsInvalid() { + // given + final BidRequest bidRequest = givenBidRequest( + impBuilder -> impBuilder.bidfloor(BigDecimal.valueOf(-1.00)), + extBuilder -> extBuilder.bidfloor(BigDecimal.ONE)); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getBidfloor) + .containsExactly(BigDecimal.ONE); + } + + @Test + public void makeHttpRequestsShouldNotSetImpBidFloorFromImpExt() { + // given + final BidRequest bidRequest = givenBidRequest( + impBuilder -> impBuilder.bidfloor(BigDecimal.valueOf(-1.00)), + extBuilder -> extBuilder.bidfloor(BigDecimal.valueOf(-2.00))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getBidfloor) + .containsExactly(BigDecimal.valueOf(-1.00)); + } + + @Test + public void makeHttpRequestsShouldReturnConvertedBidFloorCurrency() { + // given + given(currencyConversionService.convertCurrency(any(), any(), anyString(), anyString())) + .willReturn(BigDecimal.ONE); + + final BidRequest bidRequest = givenBidRequest( + impBuilder -> impBuilder.bidfloor(BigDecimal.TEN).bidfloorcur("EUR")); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getBidfloor, Imp::getBidfloorcur) + .containsOnly(AssertionsForClassTypes.tuple(BigDecimal.ONE, "USD")); + } + @Test public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() { // given @@ -654,62 +717,55 @@ public void makeBidsShouldUpdateBidWithUUIDIfGenerateBidIdIsTrue() throws JsonPr } @Test - public void makeHttpRequestsShouldSetImpBidFloorFromImpExtIfPresentAndImpBidFloorIsInvalid() { + public void makeBidsShouldReturnResultForNativeBidsWithExpectedFields() throws JsonProcessingException { // given - final BidRequest bidRequest = givenBidRequest( - impBuilder -> impBuilder.bidfloor(BigDecimal.valueOf(-1.00)), - extBuilder -> extBuilder.bidfloor(BigDecimal.ONE)); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1) - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getBidfloor) - .containsExactly(BigDecimal.ONE); - } - - @Test - public void makeHttpRequestsShouldNotSetImpBidFloorFromImpExt() { - // given - final BidRequest bidRequest = givenBidRequest( - impBuilder -> impBuilder.bidfloor(BigDecimal.valueOf(-1.00)), - extBuilder -> extBuilder.bidfloor(BigDecimal.valueOf(-2.00))); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1) - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getBidfloor) - .containsExactly(BigDecimal.valueOf(-1.00)); - } - - @Test - public void makeHttpRequestsShouldReturnConvertedBidFloorCurrency() { - // given - given(currencyConversionService.convertCurrency(any(), any(), anyString(), anyString())) - .willReturn(BigDecimal.ONE); + final String nativeRequestString = + "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":80}}"; + final String nativeResponseString = + "\"native\"{\"assets\": [{\"id\": 1, \"title\": {\"text\": \"Native test (Title)\"}}], " + + "\"link\": {\"url\": \"https://www.epsilon.com/\"}, " + + "\"imptrackers\":[\"https://iad-usadmm.dotomi.com/event\"],\"jstracker\":\"\"}"; + final BidRequest bidRequest = BidRequest.builder() + .id("native-test") + .imp(singletonList(Imp.builder() + .id("impid-0") + .xNative(Native.builder() + .request(nativeRequestString) + .ver("1.2") + .build()) + .build())) + .build(); - final BidRequest bidRequest = givenBidRequest( - impBuilder -> impBuilder.bidfloor(BigDecimal.TEN).bidfloorcur("EUR")); + final BidderCall httpCall = givenHttpCall(bidRequest, + mapper.writeValueAsString(BidResponse.builder() + .seatbid(singletonList(SeatBid.builder() + .bid(singletonList(Bid.builder() + .price(BigDecimal.ONE) + .impid("impid-0") + .adm(nativeResponseString) + .mtype(4) + .cat(singletonList("IAB3")) + .build())) + .build())) + .cur("USD") + .ext(ExtBidResponse.builder().build()) + .build())); // when - final Result>> result = target.makeHttpRequests(bidRequest); + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()) - .extracting(HttpRequest::getPayload) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getBidfloor, Imp::getBidfloorcur) - .containsOnly(AssertionsForClassTypes.tuple(BigDecimal.ONE, "USD")); + assertThat(result.getBids()).hasSize(1) + .containsOnly(BidderBid.of( + Bid.builder() + .impid("impid-0") + .price(BigDecimal.ONE) + .adm(nativeResponseString) + .cat(singletonList("IAB3")) + .mtype(4) + .build(), + BidType.xNative, "USD")); } private static BidRequest givenBidRequest(