From 317eef37699cb452a8505c8039116df548df954f Mon Sep 17 00:00:00 2001 From: gmiedlar-ox Date: Thu, 27 Feb 2025 18:06:52 +0100 Subject: [PATCH 1/2] EXCH-11681 Determine bid type based on bid.mtype --- .../server/bidder/openx/OpenxBidder.java | 7 +- .../server/bidder/openx/OpenxBidderTest.java | 153 +++++++++++++++++- 2 files changed, 157 insertions(+), 3 deletions(-) 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..d3290750ed5 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -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,98 @@ 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.of( + Bid.builder() + .impid("impId1-banner") + .price(BigDecimal.ONE) + .w(200) + .h(150) + .adm("
This is an Ad
") + .build(), + BidType.banner, "UAH")) + .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.of( + Bid.builder() + .impid("impId3-native") + .price(BigDecimal.TEN) + .w(150) + .h(150) + .adm("{\"ver\":\"1.2\"}") + .build(), + BidType.xNative, "UAH")); + } + @Test public void makeBidsShouldReturnFledgeConfigEvenIfNoBids() throws JsonProcessingException { // given @@ -770,7 +867,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() From 2720b2f267fe3179a73895553a50e54f603c1723 Mon Sep 17 00:00:00 2001 From: gmiedlar-ox Date: Fri, 28 Feb 2025 17:20:30 +0100 Subject: [PATCH 2/2] EXCH-11681 Use BidderBid.builder() in test --- .../server/bidder/openx/OpenxBidderTest.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) 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 d3290750ed5..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"))) @@ -801,15 +801,17 @@ public void makeBidsShouldReturnBidsWithTypeFromImpWhenNoMtype() throws JsonProc // then assertThat(result.getErrors()).isEmpty(); assertThat(result.getBids()).hasSize(3) - .contains(BidderBid.of( - Bid.builder() + .contains(BidderBid.builder() + .bid(Bid.builder() .impid("impId1-banner") .price(BigDecimal.ONE) .w(200) .h(150) .adm("
This is an Ad
") - .build(), - BidType.banner, "UAH")) + .build()) + .type(BidType.banner) + .bidCurrency("UAH") + .build()) .contains(BidderBid.builder() .bid(Bid.builder() .impid("impId2-video") @@ -823,15 +825,17 @@ public void makeBidsShouldReturnBidsWithTypeFromImpWhenNoMtype() throws JsonProc .type(BidType.video) .bidCurrency("UAH") .build()) - .contains(BidderBid.of( - Bid.builder() + .contains(BidderBid.builder() + .bid(Bid.builder() .impid("impId3-native") .price(BigDecimal.TEN) .w(150) .h(150) .adm("{\"ver\":\"1.2\"}") - .build(), - BidType.xNative, "UAH")); + .build()) + .type(BidType.xNative) + .bidCurrency("UAH") + .build()); } @Test