Skip to content

Commit 5b88cd5

Browse files
authored
Epsilon: native support (#3880)
1 parent 159efa6 commit 5b88cd5

File tree

3 files changed

+112
-52
lines changed

3 files changed

+112
-52
lines changed

src/main/java/org/prebid/server/bidder/epsilon/EpsilonBidder.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,12 @@ private Bid updateBidWithId(Bid bid) {
261261
private static BidType getType(String impId, List<Imp> imps) {
262262
for (Imp imp : imps) {
263263
if (imp.getId().equals(impId)) {
264-
if (imp.getVideo() != null) {
265-
return BidType.video;
266-
} else if (imp.getAudio() != null) {
264+
if (imp.getAudio() != null) {
267265
return BidType.audio;
266+
} else if (imp.getXNative() != null) {
267+
return BidType.xNative;
268+
} else if (imp.getVideo() != null) {
269+
return BidType.video;
268270
} else {
269271
return BidType.banner;
270272
}

src/main/resources/bidder-config/epsilon.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ adapters:
1212
- banner
1313
- video
1414
- audio
15+
- native
1516
site-media-types:
1617
- banner
1718
- video
1819
- audio
20+
- native
1921
supported-vendors:
2022
vendor-id: 24
2123
usersync:

src/test/java/org/prebid/server/bidder/epsilon/EpsilonBidderTest.java

Lines changed: 105 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.iab.openrtb.request.Banner;
77
import com.iab.openrtb.request.BidRequest;
88
import com.iab.openrtb.request.Imp;
9+
import com.iab.openrtb.request.Native;
910
import com.iab.openrtb.request.Site;
1011
import com.iab.openrtb.request.Video;
1112
import com.iab.openrtb.response.Bid;
@@ -21,12 +22,15 @@
2122
import org.prebid.server.bidder.model.BidderBid;
2223
import org.prebid.server.bidder.model.BidderCall;
2324
import org.prebid.server.bidder.model.BidderError;
25+
import org.prebid.server.bidder.model.CompositeBidderResponse;
2426
import org.prebid.server.bidder.model.HttpRequest;
2527
import org.prebid.server.bidder.model.HttpResponse;
2628
import org.prebid.server.bidder.model.Result;
2729
import org.prebid.server.currency.CurrencyConversionService;
2830
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
2931
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;
3034

3135
import java.math.BigDecimal;
3236
import java.util.Collections;
@@ -513,6 +517,65 @@ public void makeHttpRequestsShouldPrioritizeVideoProtocolsFromImpExtEvenIfInvali
513517
.isEmpty();
514518
}
515519

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+
516579
@Test
517580
public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() {
518581
// given
@@ -654,62 +717,55 @@ public void makeBidsShouldUpdateBidWithUUIDIfGenerateBidIdIsTrue() throws JsonPr
654717
}
655718

656719
@Test
657-
public void makeHttpRequestsShouldSetImpBidFloorFromImpExtIfPresentAndImpBidFloorIsInvalid() {
720+
public void makeBidsShouldReturnResultForNativeBidsWithExpectedFields() throws JsonProcessingException {
658721
// 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();
699738

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()));
702753

703754
// when
704-
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
755+
final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest);
705756

706757
// then
707758
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"));
713769
}
714770

715771
private static BidRequest givenBidRequest(

0 commit comments

Comments
 (0)