|
6 | 6 | import com.iab.openrtb.request.Banner; |
7 | 7 | import com.iab.openrtb.request.BidRequest; |
8 | 8 | import com.iab.openrtb.request.Imp; |
| 9 | +import com.iab.openrtb.request.Native; |
9 | 10 | import com.iab.openrtb.request.Site; |
10 | 11 | import com.iab.openrtb.request.Video; |
11 | 12 | import com.iab.openrtb.response.Bid; |
|
21 | 22 | import org.prebid.server.bidder.model.BidderBid; |
22 | 23 | import org.prebid.server.bidder.model.BidderCall; |
23 | 24 | import org.prebid.server.bidder.model.BidderError; |
| 25 | +import org.prebid.server.bidder.model.CompositeBidderResponse; |
24 | 26 | import org.prebid.server.bidder.model.HttpRequest; |
25 | 27 | import org.prebid.server.bidder.model.HttpResponse; |
26 | 28 | import org.prebid.server.bidder.model.Result; |
27 | 29 | import org.prebid.server.currency.CurrencyConversionService; |
28 | 30 | import org.prebid.server.proto.openrtb.ext.ExtPrebid; |
29 | 31 | import org.prebid.server.proto.openrtb.ext.request.epsilon.ExtImpEpsilon; |
| 32 | +import org.prebid.server.proto.openrtb.ext.response.BidType; |
| 33 | +import org.prebid.server.proto.openrtb.ext.response.ExtBidResponse; |
30 | 34 |
|
31 | 35 | import java.math.BigDecimal; |
32 | 36 | import java.util.Collections; |
@@ -513,6 +517,65 @@ public void makeHttpRequestsShouldPrioritizeVideoProtocolsFromImpExtEvenIfInvali |
513 | 517 | .isEmpty(); |
514 | 518 | } |
515 | 519 |
|
| 520 | + @Test |
| 521 | + public void makeHttpRequestsShouldSetImpBidFloorFromImpExtIfPresentAndImpBidFloorIsInvalid() { |
| 522 | + // given |
| 523 | + final BidRequest bidRequest = givenBidRequest( |
| 524 | + impBuilder -> impBuilder.bidfloor(BigDecimal.valueOf(-1.00)), |
| 525 | + extBuilder -> extBuilder.bidfloor(BigDecimal.ONE)); |
| 526 | + |
| 527 | + // when |
| 528 | + final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest); |
| 529 | + |
| 530 | + // then |
| 531 | + assertThat(result.getErrors()).isEmpty(); |
| 532 | + assertThat(result.getValue()).hasSize(1) |
| 533 | + .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) |
| 534 | + .flatExtracting(BidRequest::getImp) |
| 535 | + .extracting(Imp::getBidfloor) |
| 536 | + .containsExactly(BigDecimal.ONE); |
| 537 | + } |
| 538 | + |
| 539 | + @Test |
| 540 | + public void makeHttpRequestsShouldNotSetImpBidFloorFromImpExt() { |
| 541 | + // given |
| 542 | + final BidRequest bidRequest = givenBidRequest( |
| 543 | + impBuilder -> impBuilder.bidfloor(BigDecimal.valueOf(-1.00)), |
| 544 | + extBuilder -> extBuilder.bidfloor(BigDecimal.valueOf(-2.00))); |
| 545 | + |
| 546 | + // when |
| 547 | + final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest); |
| 548 | + |
| 549 | + // then |
| 550 | + assertThat(result.getErrors()).isEmpty(); |
| 551 | + assertThat(result.getValue()).hasSize(1) |
| 552 | + .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) |
| 553 | + .flatExtracting(BidRequest::getImp) |
| 554 | + .extracting(Imp::getBidfloor) |
| 555 | + .containsExactly(BigDecimal.valueOf(-1.00)); |
| 556 | + } |
| 557 | + |
| 558 | + @Test |
| 559 | + public void makeHttpRequestsShouldReturnConvertedBidFloorCurrency() { |
| 560 | + // given |
| 561 | + given(currencyConversionService.convertCurrency(any(), any(), anyString(), anyString())) |
| 562 | + .willReturn(BigDecimal.ONE); |
| 563 | + |
| 564 | + final BidRequest bidRequest = givenBidRequest( |
| 565 | + impBuilder -> impBuilder.bidfloor(BigDecimal.TEN).bidfloorcur("EUR")); |
| 566 | + |
| 567 | + // when |
| 568 | + final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest); |
| 569 | + |
| 570 | + // then |
| 571 | + assertThat(result.getErrors()).isEmpty(); |
| 572 | + assertThat(result.getValue()) |
| 573 | + .extracting(HttpRequest::getPayload) |
| 574 | + .flatExtracting(BidRequest::getImp) |
| 575 | + .extracting(Imp::getBidfloor, Imp::getBidfloorcur) |
| 576 | + .containsOnly(AssertionsForClassTypes.tuple(BigDecimal.ONE, "USD")); |
| 577 | + } |
| 578 | + |
516 | 579 | @Test |
517 | 580 | public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() { |
518 | 581 | // given |
@@ -654,62 +717,55 @@ public void makeBidsShouldUpdateBidWithUUIDIfGenerateBidIdIsTrue() throws JsonPr |
654 | 717 | } |
655 | 718 |
|
656 | 719 | @Test |
657 | | - public void makeHttpRequestsShouldSetImpBidFloorFromImpExtIfPresentAndImpBidFloorIsInvalid() { |
| 720 | + public void makeBidsShouldReturnResultForNativeBidsWithExpectedFields() throws JsonProcessingException { |
658 | 721 | // given |
659 | | - final BidRequest bidRequest = givenBidRequest( |
660 | | - impBuilder -> impBuilder.bidfloor(BigDecimal.valueOf(-1.00)), |
661 | | - extBuilder -> extBuilder.bidfloor(BigDecimal.ONE)); |
662 | | - |
663 | | - // when |
664 | | - final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest); |
665 | | - |
666 | | - // then |
667 | | - assertThat(result.getErrors()).isEmpty(); |
668 | | - assertThat(result.getValue()).hasSize(1) |
669 | | - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) |
670 | | - .flatExtracting(BidRequest::getImp) |
671 | | - .extracting(Imp::getBidfloor) |
672 | | - .containsExactly(BigDecimal.ONE); |
673 | | - } |
674 | | - |
675 | | - @Test |
676 | | - public void makeHttpRequestsShouldNotSetImpBidFloorFromImpExt() { |
677 | | - // given |
678 | | - final BidRequest bidRequest = givenBidRequest( |
679 | | - impBuilder -> impBuilder.bidfloor(BigDecimal.valueOf(-1.00)), |
680 | | - extBuilder -> extBuilder.bidfloor(BigDecimal.valueOf(-2.00))); |
681 | | - |
682 | | - // when |
683 | | - final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest); |
684 | | - |
685 | | - // then |
686 | | - assertThat(result.getErrors()).isEmpty(); |
687 | | - assertThat(result.getValue()).hasSize(1) |
688 | | - .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) |
689 | | - .flatExtracting(BidRequest::getImp) |
690 | | - .extracting(Imp::getBidfloor) |
691 | | - .containsExactly(BigDecimal.valueOf(-1.00)); |
692 | | - } |
693 | | - |
694 | | - @Test |
695 | | - public void makeHttpRequestsShouldReturnConvertedBidFloorCurrency() { |
696 | | - // given |
697 | | - given(currencyConversionService.convertCurrency(any(), any(), anyString(), anyString())) |
698 | | - .willReturn(BigDecimal.ONE); |
| 722 | + final String nativeRequestString = |
| 723 | + "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":80}}"; |
| 724 | + final String nativeResponseString = |
| 725 | + "\"native\"{\"assets\": [{\"id\": 1, \"title\": {\"text\": \"Native test (Title)\"}}], " |
| 726 | + + "\"link\": {\"url\": \"https://www.epsilon.com/\"}, " |
| 727 | + + "\"imptrackers\":[\"https://iad-usadmm.dotomi.com/event\"],\"jstracker\":\"\"}"; |
| 728 | + final BidRequest bidRequest = BidRequest.builder() |
| 729 | + .id("native-test") |
| 730 | + .imp(singletonList(Imp.builder() |
| 731 | + .id("impid-0") |
| 732 | + .xNative(Native.builder() |
| 733 | + .request(nativeRequestString) |
| 734 | + .ver("1.2") |
| 735 | + .build()) |
| 736 | + .build())) |
| 737 | + .build(); |
699 | 738 |
|
700 | | - final BidRequest bidRequest = givenBidRequest( |
701 | | - impBuilder -> impBuilder.bidfloor(BigDecimal.TEN).bidfloorcur("EUR")); |
| 739 | + final BidderCall<BidRequest> httpCall = givenHttpCall(bidRequest, |
| 740 | + mapper.writeValueAsString(BidResponse.builder() |
| 741 | + .seatbid(singletonList(SeatBid.builder() |
| 742 | + .bid(singletonList(Bid.builder() |
| 743 | + .price(BigDecimal.ONE) |
| 744 | + .impid("impid-0") |
| 745 | + .adm(nativeResponseString) |
| 746 | + .mtype(4) |
| 747 | + .cat(singletonList("IAB3")) |
| 748 | + .build())) |
| 749 | + .build())) |
| 750 | + .cur("USD") |
| 751 | + .ext(ExtBidResponse.builder().build()) |
| 752 | + .build())); |
702 | 753 |
|
703 | 754 | // when |
704 | | - final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest); |
| 755 | + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); |
705 | 756 |
|
706 | 757 | // then |
707 | 758 | assertThat(result.getErrors()).isEmpty(); |
708 | | - assertThat(result.getValue()) |
709 | | - .extracting(HttpRequest::getPayload) |
710 | | - .flatExtracting(BidRequest::getImp) |
711 | | - .extracting(Imp::getBidfloor, Imp::getBidfloorcur) |
712 | | - .containsOnly(AssertionsForClassTypes.tuple(BigDecimal.ONE, "USD")); |
| 759 | + assertThat(result.getBids()).hasSize(1) |
| 760 | + .containsOnly(BidderBid.of( |
| 761 | + Bid.builder() |
| 762 | + .impid("impid-0") |
| 763 | + .price(BigDecimal.ONE) |
| 764 | + .adm(nativeResponseString) |
| 765 | + .cat(singletonList("IAB3")) |
| 766 | + .mtype(4) |
| 767 | + .build(), |
| 768 | + BidType.xNative, "USD")); |
713 | 769 | } |
714 | 770 |
|
715 | 771 | private static BidRequest givenBidRequest( |
|
0 commit comments