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 f37547e90cf..09412abe65f 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -314,7 +314,12 @@ private static Map impIdToBidType(BidRequest bidRequest) { } private static BidType getBidType(Bid bid, Map impIdToBidType) { - return impIdToBidType.getOrDefault(bid.getImpid(), BidType.banner); + return switch (bid.getMtype()) { + case 1 -> BidType.banner; + case 2 -> BidType.video; + case 4 -> BidType.xNative; + case null, default -> impIdToBidType.getOrDefault(bid.getImpid(), BidType.banner); + }; } private static List extractIgi(OpenxBidResponse bidResponse) { 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 527fabb571d..461f300c051 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -466,7 +466,7 @@ public void makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultiFormat .banner(Banner.builder().w(300).h(150).build()) .xNative(Native.builder().request("{\"version\":1}").build()) .ext(mapper.valueToTree(ExtImpOpenx.builder().build())) - .build())) + .build())) .ext(jacksonMapper.fillExtension( ExtRequest.empty(), OpenxRequestExt.of(null, null, "hb_pbs_1.0.0"))) @@ -608,7 +608,7 @@ public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() { } @Test - public void makeBidsShouldReturnResultWithExpectedFields() throws JsonProcessingException { + public void makeBidsShouldReturnResultForBannerBidsWithExpectedFields() throws JsonProcessingException { // given final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString(OpenxBidResponse.builder() .seatbid(singletonList(SeatBid.builder() @@ -619,6 +619,7 @@ public void makeBidsShouldReturnResultWithExpectedFields() throws JsonProcessing .impid("impId1") .dealid("dealid") .adm("
This is an Ad
") + .mtype(1) .build())) .build())) .cur("UAH") @@ -654,6 +655,7 @@ public void makeBidsShouldReturnResultWithExpectedFields() throws JsonProcessing .w(200) .h(150) .adm("
This is an Ad
") + .mtype(1) .build(), BidType.banner, "UAH")); assertThat(result.getIgi()).containsExactly(igi); @@ -670,6 +672,7 @@ public void makeBidsShouldReturnResultForNativeBidsWithExpectedFields() throws J .price(BigDecimal.ONE) .impid("impId1") .adm("{\"ver\":\"1.2\"}") + .mtype(4) .build())) .build())) .cur("UAH") @@ -697,6 +700,7 @@ public void makeBidsShouldReturnResultForNativeBidsWithExpectedFields() throws J .w(200) .h(150) .adm("{\"ver\":\"1.2\"}") + .mtype(4) .build(), BidType.xNative, "UAH")); } @@ -715,6 +719,7 @@ public void makeBidsShouldReturnVideoInfoWhenAvailable() throws JsonProcessingEx .adm("
This is an Ad
") .dur(30) .cat(singletonList("category1")) + .mtype(2) .build())) .build())) .build())); @@ -737,6 +742,102 @@ public void makeBidsShouldReturnVideoInfoWhenAvailable() throws JsonProcessingEx .containsExactly(ExtBidPrebidVideo.of(30, "category1")); } + @Test + public void makeBidsShouldReturnBidsWithTypeFromImpWhenNoMtype() throws JsonProcessingException { + // given + final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString(OpenxBidResponse.builder() + .seatbid(List.of( + SeatBid.builder() + .bid(singletonList(Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1-banner") + .adm("
This is an Ad
") + .build())) + .build(), + SeatBid.builder() + .bid(singletonList(Bid.builder() + .w(300) + .h(150) + .price(BigDecimal.TWO) + .impid("impId2-video") + .adm("
This is an Ad
") + .dur(15) + .build())) + .build(), + SeatBid.builder() + .bid(singletonList(Bid.builder() + .w(150) + .h(150) + .price(BigDecimal.TEN) + .impid("impId3-native") + .adm("{\"ver\":\"1.2\"}") + .build())) + .build())) + .cur("UAH") + .build())); + + final BidRequest bidRequest = BidRequest.builder() + .id("bidRequestId") + .imp(List.of( + Imp.builder() + .id("impId1-banner") + .banner(Banner.builder().build()) + .build(), + Imp.builder() + .id("impId2-video") + .video(Video.builder().build()) + .build(), + Imp.builder() + .id("impId3-native") + .xNative(Native.builder().build()) + .build())) + .build(); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()).hasSize(3) + .contains(BidderBid.builder() + .bid(Bid.builder() + .impid("impId1-banner") + .price(BigDecimal.ONE) + .w(200) + .h(150) + .adm("
This is an Ad
") + .build()) + .type(BidType.banner) + .bidCurrency("UAH") + .build()) + .contains(BidderBid.builder() + .bid(Bid.builder() + .impid("impId2-video") + .price(BigDecimal.TWO) + .w(300) + .h(150) + .adm("
This is an Ad
") + .dur(15) + .build()) + .videoInfo(ExtBidPrebidVideo.of(15, null)) + .type(BidType.video) + .bidCurrency("UAH") + .build()) + .contains(BidderBid.builder() + .bid(Bid.builder() + .impid("impId3-native") + .price(BigDecimal.TEN) + .w(150) + .h(150) + .adm("{\"ver\":\"1.2\"}") + .build()) + .type(BidType.xNative) + .bidCurrency("UAH") + .build()); + } + @Test public void makeBidsShouldReturnFledgeConfigEvenIfNoBids() throws JsonProcessingException { // given @@ -770,7 +871,59 @@ public void makeBidsShouldReturnFledgeConfigEvenIfNoBids() throws JsonProcessing } @Test - public void makeBidsShouldReturnRespectBannerImpWhenBothBannerAndVideoImpWithSameIdExist() + public void makeBidsShouldRespectMtypeWhenBothBannerAndVideoImpWithSameIdExist() throws JsonProcessingException { + // given + final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString(BidResponse.builder() + .seatbid(singletonList(SeatBid.builder() + .bid(singletonList(Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1") + .dealid("dealid") + .adm("
This is an Ad
") + .dur(30) + .cat(singletonList("category1")) + .mtype(2) + .build())) + .build())) + .build())); + + final BidRequest bidRequest = BidRequest.builder() + .id("bidRequestId") + .imp(singletonList(Imp.builder() + .id("impId1") + .video(Video.builder().build()) + .banner(Banner.builder().build()) + .build())) + .build(); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()).hasSize(1) + .containsOnly( + BidderBid.builder() + .bid(Bid.builder() + .impid("impId1") + .price(BigDecimal.ONE) + .dealid("dealid") + .w(200) + .h(150) + .adm("
This is an Ad
") + .dur(30) + .cat(singletonList("category1")) + .mtype(2) + .build()) + .videoInfo(ExtBidPrebidVideo.of(30, "category1")) + .type(BidType.video) + .bidCurrency("USD").build()); + } + + @Test + public void makeBidsShouldRespectBannerImpWhenBothBannerAndVideoImpWithSameIdExistAndNoMtype() throws JsonProcessingException { // given final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString(BidResponse.builder()