From 080aa68b0a785aa2ffb8a1496d3262a6bd1ce766 Mon Sep 17 00:00:00 2001 From: vmalitskyi Date: Wed, 19 Feb 2025 10:33:08 +0100 Subject: [PATCH] Fix IX bidder crash --- .../org/prebid/server/bidder/ix/IxBidder.java | 5 +- .../prebid/server/bidder/ix/IxBidderTest.java | 81 +++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prebid/server/bidder/ix/IxBidder.java b/src/main/java/org/prebid/server/bidder/ix/IxBidder.java index be29b4d1d4a..12916afd6e7 100644 --- a/src/main/java/org/prebid/server/bidder/ix/IxBidder.java +++ b/src/main/java/org/prebid/server/bidder/ix/IxBidder.java @@ -386,12 +386,15 @@ private String mergeNativeImpTrackers(boolean isV11, Response response, List eventTrackers) { + final Stream impTrackers = Optional.of(response) + .map(Response::getImptrackers).stream().flatMap(Collection::stream); + return response.toBuilder() .imptrackers(Stream.concat( eventTrackers.stream() .filter(IxBidder::isImpTracker) .map(EventTracker::getUrl), - response.getImptrackers().stream()) + impTrackers) .distinct() .toList()) .build(); diff --git a/src/test/java/org/prebid/server/bidder/ix/IxBidderTest.java b/src/test/java/org/prebid/server/bidder/ix/IxBidderTest.java index e91a0300df1..ee0fdfa3368 100644 --- a/src/test/java/org/prebid/server/bidder/ix/IxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/ix/IxBidderTest.java @@ -55,6 +55,7 @@ import java.util.function.UnaryOperator; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.function.UnaryOperator.identity; import static org.assertj.core.api.Assertions.assertThat; @@ -540,6 +541,86 @@ public void makeBidderResponseShouldReturnAdmContainingImpTrackersAndEventImpTra .containsExactly(mapper.writeValueAsString(expectedNativeResponse)); } + @Test + public void makeBidderResponseShouldReturnAdmContainingEventImpTrackersUrlsWhenImpTrackersAreNull() + throws JsonProcessingException { + // given + final String adm = mapper.writeValueAsString( + Response.builder() + .eventtrackers(singletonList( + EventTracker.builder() + .event(EventType.IMPRESSION.getValue()) + .url("eventUrl") + .build())) + .build()); + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(Imp.builder().id("123").xNative(Native.builder().build()).build())) + .build(); + final BidderCall httpCall = givenHttpCall( + bidRequest, + mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder + .impid("123") + .adm(adm)))); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); + + // then + final Response expectedNativeResponse = Response.builder() + .imptrackers(asList("eventUrl")) + .eventtrackers(singletonList(EventTracker.builder() + .event(EventType.IMPRESSION.getValue()) + .url("eventUrl") + .build())) + .build(); + + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()) + .extracting(BidderBid::getBid) + .extracting(Bid::getAdm) + .containsExactly(mapper.writeValueAsString(expectedNativeResponse)); + } + + @Test + public void makeBidderResponseShouldReturnAdmWithoutImpTrackers() + throws JsonProcessingException { + // given + final String adm = mapper.writeValueAsString( + Response.builder() + .eventtrackers(singletonList( + EventTracker.builder() + .event(EventType.VIEWABLE_VIDEO50.getValue()) + .url("eventUrl") + .build())) + .build()); + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(Imp.builder().id("123").xNative(Native.builder().build()).build())) + .build(); + final BidderCall httpCall = givenHttpCall( + bidRequest, + mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder + .impid("123") + .adm(adm)))); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); + + // then + final Response expectedNativeResponse = Response.builder() + .imptrackers(emptyList()) + .eventtrackers(singletonList(EventTracker.builder() + .event(EventType.VIEWABLE_VIDEO50.getValue()) + .url("eventUrl") + .build())) + .build(); + + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()) + .extracting(BidderBid::getBid) + .extracting(Bid::getAdm) + .containsExactly(mapper.writeValueAsString(expectedNativeResponse)); + } + @Test public void makeBidderResponseShouldReturnAdmContainingOnlyUniqueImpTrackersUrls() throws JsonProcessingException { // given