diff --git a/src/main/java/org/prebid/server/bidder/teal/TealBidder.java b/src/main/java/org/prebid/server/bidder/teal/TealBidder.java index c1869421dd8..2c56e23ff2e 100644 --- a/src/main/java/org/prebid/server/bidder/teal/TealBidder.java +++ b/src/main/java/org/prebid/server/bidder/teal/TealBidder.java @@ -8,6 +8,7 @@ import com.iab.openrtb.request.Imp; import com.iab.openrtb.request.Publisher; import com.iab.openrtb.request.Site; +import com.iab.openrtb.response.Bid; import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; import org.apache.commons.collections4.CollectionUtils; @@ -177,13 +178,25 @@ private static List bidsFromResponse(BidRequest bidRequest, BidRespon .filter(Objects::nonNull) .flatMap(Collection::stream) .filter(Objects::nonNull) - .map(bid -> BidderBid.of(bid, getBidType(bid.getImpid(), bidRequest.getImp()), bidResponse.getCur())) + .map(bid -> BidderBid.of(bid, getBidType(bid, bidRequest.getImp()), bidResponse.getCur())) .toList(); } - private static BidType getBidType(String impId, List imps) { + private static BidType getBidType(Bid bid, List imps) { + final BidType bidType = Optional.ofNullable(bid.getExt()) + .map(ext -> ext.get("prebid")) + .map(extPrebid -> extPrebid.get("type")) + .filter(JsonNode::isTextual) + .map(JsonNode::textValue) + .map(BidType::fromString) + .orElse(null); + + if (bidType != null) { + return bidType; + } + for (Imp imp : imps) { - if (imp.getId().equals(impId)) { + if (imp.getId().equals(bid.getImpid())) { if (imp.getBanner() != null) { return BidType.banner; } else if (imp.getVideo() != null) { diff --git a/src/test/java/org/prebid/server/bidder/teal/TealBidderTest.java b/src/test/java/org/prebid/server/bidder/teal/TealBidderTest.java index 200902919df..9298dfe8e5e 100644 --- a/src/test/java/org/prebid/server/bidder/teal/TealBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/teal/TealBidderTest.java @@ -176,6 +176,26 @@ public void makeBidsShouldReturnErrorWhenResponseBodyCouldNotBeParsed() { assertThat(result.getValue()).isEmpty(); } + @Test + public void makeBidsShouldReturnBidTypeFromBidExtPrebidType() throws JsonProcessingException { + // given + final ObjectNode bidExt = mapper.createObjectNode(); + bidExt.putObject("prebid").put("type", "video"); + + final Bid responseBid = givenBid("imp1", 2, 1).toBuilder().ext(bidExt).build(); + final BidRequest bidRequest = givenBidRequest(imp -> imp.id("imp1").banner(Banner.builder().id("id").build())); + final BidderCall httpCall = givenHttpCall(bidRequest, singletonList(responseBid)); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + final Bid expectedBid = givenBid("imp1", 2, 1).toBuilder().ext(bidExt).build(); + + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).containsExactly(BidderBid.of(expectedBid, BidType.video, "USD")); + } + @Test public void makeBidsShouldReturnBannerBid() throws JsonProcessingException { // given @@ -231,6 +251,7 @@ private static BidRequest givenBidRequest(UnaryOperator impCusto return givenBidRequest(null, impCustomizer); } + @SafeVarargs private static BidRequest givenBidRequest(Site site, UnaryOperator... impCustomizers) { final List imps = Stream.of(impCustomizers) .map(customizer -> customizer.apply(Imp.builder().id("impId")).build())