diff --git a/src/main/java/org/prebid/server/bidder/floxis/FloxisBidder.java b/src/main/java/org/prebid/server/bidder/floxis/FloxisBidder.java index 7e51b073b12..02ad718b2c5 100644 --- a/src/main/java/org/prebid/server/bidder/floxis/FloxisBidder.java +++ b/src/main/java/org/prebid/server/bidder/floxis/FloxisBidder.java @@ -117,7 +117,8 @@ public Result> makeBids(BidderCall httpCall, BidRequ try { final BidResponse bidResponse = mapper.decodeValue(httpCall.getResponse().getBody(), BidResponse.class); final List errors = new ArrayList<>(); - final List bidderBids = extractBids(bidResponse, bidRequest.getImp(), errors); + final List imps = httpCall.getRequest().getPayload().getImp(); + final List bidderBids = extractBids(bidResponse, imps, errors); return Result.of(bidderBids, errors); } catch (DecodeException e) { return Result.withError(BidderError.badServerResponse(e.getMessage())); @@ -150,6 +151,12 @@ private static BidderBid makeBidderBid(Bid bid, List imps, String currency, } private static BidType getMediaTypeForBid(List imps, Bid bid) { + final Imp imp = imps.stream() + .filter(currentImp -> Objects.equals(currentImp.getId(), bid.getImpid())) + .findFirst() + .orElseThrow(() -> new PreBidException( + "unable to find impression %s for bid".formatted(bid.getImpid()))); + final Integer mtype = bid.getMtype(); if (mtype != null && mtype != 0) { return switch (mtype) { @@ -162,12 +169,6 @@ private static BidType getMediaTypeForBid(List imps, Bid bid) { }; } - final Imp imp = imps.stream() - .filter(currentImp -> Objects.equals(currentImp.getId(), bid.getImpid())) - .findFirst() - .orElseThrow(() -> new PreBidException( - "unable to find impression %s for bid".formatted(bid.getImpid()))); - if (countFormats(imp) != 1) { throw new PreBidException( "unable to resolve a single media type for impression %s; set bid.mtype" diff --git a/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java b/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java index f94d035289f..54ade32ad46 100644 --- a/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java @@ -537,22 +537,34 @@ public void makeBidsShouldReturnErrorForImpWithoutFormatAndWithoutMType() throws } @Test - public void makeBidsShouldReturnErrorWhenBidImpIdNotFound() throws Exception { + public void makeBidsShouldReturnErrorWhenBidImpIdIsNotInOutgoingRequest() throws Exception { // given final BidRequest bidRequest = BidRequest.builder() - .imp(singletonList(Imp.builder().id("imp-1").banner(Banner.builder().build()).build())) + .imp(asList(givenImp(imp -> imp.id("imp-1")), givenImp(imp -> imp.id("imp-2")))) .build(); - final BidResponse bidResponse = givenBidResponse(Bid.builder().impid("no-such-imp").build()); - final BidderCall httpCall = givenHttpCall(bidRequest, mapper.writeValueAsString(bidResponse)); + final BidRequest outgoingRequest = bidRequest.toBuilder() + .imp(singletonList(bidRequest.getImp().getFirst())) + .build(); + final BidResponse bidResponse = BidResponse.builder() + .cur("USD") + .seatbid(singletonList(SeatBid.builder() + .bid(asList( + Bid.builder().impid("imp-1").mtype(1).build(), + Bid.builder().impid("imp-2").mtype(1).build())) + .build())) + .build(); + final BidderCall httpCall = givenHttpCall(outgoingRequest, mapper.writeValueAsString(bidResponse)); // when final Result> result = target.makeBids(httpCall, bidRequest); // then - assertThat(result.getValue()).isEmpty(); - assertThat(result.getErrors()).hasSize(1) - .containsOnly(BidderError.badServerResponse( - "unable to find impression no-such-imp for bid")); + assertThat(result.getValue()) + .extracting(BidderBid::getBid) + .extracting(Bid::getImpid) + .containsExactly("imp-1"); + assertThat(result.getErrors()).containsExactly( + BidderError.badServerResponse("unable to find impression imp-2 for bid")); } private static BidRequest givenBidRequest(UnaryOperator impCustomizer) {