From aa72a579a7f00914e72524682ce87f1b53ac3c97 Mon Sep 17 00:00:00 2001 From: floxis-admin Date: Sat, 17 Oct 2026 11:50:34 +0300 Subject: [PATCH 1/3] Floxis: validate bids against the outbound request --- .../server/bidder/floxis/FloxisBidder.java | 15 ++-- .../bidder/floxis/FloxisBidderTest.java | 74 +++++++++++++++++++ 2 files changed, 82 insertions(+), 7 deletions(-) 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..e97c246bf6d 100644 --- a/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java @@ -555,6 +555,80 @@ public void makeBidsShouldReturnErrorWhenBidImpIdNotFound() throws Exception { "unable to find impression no-such-imp for bid")); } + @Test + public void makeBidsShouldRejectUnknownImpWhenMTypePresent() throws Exception { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidResponse bidResponse = givenBidResponse(Bid.builder().impid("unknown").mtype(1).build()); + final BidderCall httpCall = givenHttpCall(bidRequest, mapper.writeValueAsString(bidResponse)); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getValue()).isEmpty(); + assertThat(result.getErrors()).containsExactly( + BidderError.badServerResponse("unable to find impression unknown for bid")); + } + + @Test + public void makeBidsShouldRejectUnknownImpWhenMTypeZero() throws Exception { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidResponse bidResponse = givenBidResponse(Bid.builder().impid("unknown").mtype(0).build()); + final BidderCall httpCall = givenHttpCall(bidRequest, mapper.writeValueAsString(bidResponse)); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getValue()).isEmpty(); + assertThat(result.getErrors()).containsExactly( + BidderError.badServerResponse("unable to find impression unknown for bid")); + } + + @Test + public void makeBidsShouldRejectOtherSeatImpWhenMTypePresent() throws Exception { + assertBidsMatchOutboundRequest(1); + } + + @Test + public void makeBidsShouldRejectOtherSeatImpWhenMTypeZero() throws Exception { + assertBidsMatchOutboundRequest(0); + } + + private void assertBidsMatchOutboundRequest(int mtype) throws Exception { + // given + final BidRequest bidRequest = BidRequest.builder() + .imp(asList( + givenImp(imp -> imp.id("imp-1").ext(givenImpExt("seat-1", "eu"))), + givenImp(imp -> imp.id("imp-2").ext(givenImpExt("seat-2", "eu"))))) + .build(); + final List> httpRequests = target.makeHttpRequests(bidRequest).getValue(); + assertThat(httpRequests).hasSize(2); + assertThat(httpRequests.getFirst().getPayload().getImp()).extracting(Imp::getId) + .containsExactly("imp-1"); + final BidResponse bidResponse = BidResponse.builder() + .cur("USD") + .seatbid(singletonList(SeatBid.builder() + .bid(asList( + Bid.builder().impid("imp-1").mtype(mtype).build(), + Bid.builder().impid("imp-2").mtype(mtype).build())) + .build())) + .build(); + final BidderCall httpCall = BidderCall.succeededHttp( + httpRequests.getFirst(), HttpResponse.of(200, null, mapper.writeValueAsString(bidResponse)), null); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getValue()).extracting(bidderBid -> bidderBid.getBid().getImpid()) + .containsExactly("imp-1"); + assertThat(result.getErrors()).containsExactly( + BidderError.badServerResponse("unable to find impression imp-2 for bid")); + } + private static BidRequest givenBidRequest(UnaryOperator impCustomizer) { return BidRequest.builder() .id("req-1") From 5b437976340011a4f6a8147b3aa48cad81ada80d Mon Sep 17 00:00:00 2001 From: floxis-admin Date: Sun, 25 Oct 2026 19:32:24 +0200 Subject: [PATCH 2/3] Floxis: simplify outgoing request bid tests --- .../bidder/floxis/FloxisBidderTest.java | 51 ++++--------------- 1 file changed, 11 insertions(+), 40 deletions(-) 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 e97c246bf6d..be8f2bd9b7a 100644 --- a/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java @@ -556,10 +556,10 @@ public void makeBidsShouldReturnErrorWhenBidImpIdNotFound() throws Exception { } @Test - public void makeBidsShouldRejectUnknownImpWhenMTypePresent() throws Exception { + public void makeBidsShouldReturnErrorWhenBidImpIdNotFoundAndMTypePresent() throws Exception { // given final BidRequest bidRequest = givenBidRequest(identity()); - final BidResponse bidResponse = givenBidResponse(Bid.builder().impid("unknown").mtype(1).build()); + final BidResponse bidResponse = givenBidResponse(Bid.builder().impid("no-such-imp").mtype(1).build()); final BidderCall httpCall = givenHttpCall(bidRequest, mapper.writeValueAsString(bidResponse)); // when @@ -568,56 +568,27 @@ public void makeBidsShouldRejectUnknownImpWhenMTypePresent() throws Exception { // then assertThat(result.getValue()).isEmpty(); assertThat(result.getErrors()).containsExactly( - BidderError.badServerResponse("unable to find impression unknown for bid")); + BidderError.badServerResponse("unable to find impression no-such-imp for bid")); } @Test - public void makeBidsShouldRejectUnknownImpWhenMTypeZero() throws Exception { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidResponse bidResponse = givenBidResponse(Bid.builder().impid("unknown").mtype(0).build()); - final BidderCall httpCall = givenHttpCall(bidRequest, mapper.writeValueAsString(bidResponse)); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getValue()).isEmpty(); - assertThat(result.getErrors()).containsExactly( - BidderError.badServerResponse("unable to find impression unknown for bid")); - } - - @Test - public void makeBidsShouldRejectOtherSeatImpWhenMTypePresent() throws Exception { - assertBidsMatchOutboundRequest(1); - } - - @Test - public void makeBidsShouldRejectOtherSeatImpWhenMTypeZero() throws Exception { - assertBidsMatchOutboundRequest(0); - } - - private void assertBidsMatchOutboundRequest(int mtype) throws Exception { + public void makeBidsShouldReturnErrorWhenBidImpIdIsNotInOutgoingRequest() throws Exception { // given final BidRequest bidRequest = BidRequest.builder() - .imp(asList( - givenImp(imp -> imp.id("imp-1").ext(givenImpExt("seat-1", "eu"))), - givenImp(imp -> imp.id("imp-2").ext(givenImpExt("seat-2", "eu"))))) + .imp(asList(givenImp(imp -> imp.id("imp-1")), givenImp(imp -> imp.id("imp-2")))) + .build(); + final BidRequest outgoingRequest = bidRequest.toBuilder() + .imp(singletonList(bidRequest.getImp().getFirst())) .build(); - final List> httpRequests = target.makeHttpRequests(bidRequest).getValue(); - assertThat(httpRequests).hasSize(2); - assertThat(httpRequests.getFirst().getPayload().getImp()).extracting(Imp::getId) - .containsExactly("imp-1"); final BidResponse bidResponse = BidResponse.builder() .cur("USD") .seatbid(singletonList(SeatBid.builder() .bid(asList( - Bid.builder().impid("imp-1").mtype(mtype).build(), - Bid.builder().impid("imp-2").mtype(mtype).build())) + Bid.builder().impid("imp-1").mtype(1).build(), + Bid.builder().impid("imp-2").mtype(1).build())) .build())) .build(); - final BidderCall httpCall = BidderCall.succeededHttp( - httpRequests.getFirst(), HttpResponse.of(200, null, mapper.writeValueAsString(bidResponse)), null); + final BidderCall httpCall = givenHttpCall(outgoingRequest, mapper.writeValueAsString(bidResponse)); // when final Result> result = target.makeBids(httpCall, bidRequest); From 527a79db080c54497a0095d085bd77f356e24589 Mon Sep 17 00:00:00 2001 From: floxis-admin Date: Mon, 26 Oct 2026 21:37:46 +0200 Subject: [PATCH 3/3] Floxis: keep a single outgoing request bid test --- .../bidder/floxis/FloxisBidderTest.java | 39 ++----------------- 1 file changed, 3 insertions(+), 36 deletions(-) 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 be8f2bd9b7a..54ade32ad46 100644 --- a/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java @@ -536,41 +536,6 @@ public void makeBidsShouldReturnErrorForImpWithoutFormatAndWithoutMType() throws "unable to resolve a single media type for impression imp-1; set bid.mtype")); } - @Test - public void makeBidsShouldReturnErrorWhenBidImpIdNotFound() throws Exception { - // given - final BidRequest bidRequest = BidRequest.builder() - .imp(singletonList(Imp.builder().id("imp-1").banner(Banner.builder().build()).build())) - .build(); - final BidResponse bidResponse = givenBidResponse(Bid.builder().impid("no-such-imp").build()); - final BidderCall httpCall = givenHttpCall(bidRequest, 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")); - } - - @Test - public void makeBidsShouldReturnErrorWhenBidImpIdNotFoundAndMTypePresent() throws Exception { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidResponse bidResponse = givenBidResponse(Bid.builder().impid("no-such-imp").mtype(1).build()); - final BidderCall httpCall = givenHttpCall(bidRequest, mapper.writeValueAsString(bidResponse)); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getValue()).isEmpty(); - assertThat(result.getErrors()).containsExactly( - BidderError.badServerResponse("unable to find impression no-such-imp for bid")); - } - @Test public void makeBidsShouldReturnErrorWhenBidImpIdIsNotInOutgoingRequest() throws Exception { // given @@ -594,7 +559,9 @@ public void makeBidsShouldReturnErrorWhenBidImpIdIsNotInOutgoingRequest() throws final Result> result = target.makeBids(httpCall, bidRequest); // then - assertThat(result.getValue()).extracting(bidderBid -> bidderBid.getBid().getImpid()) + 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"));