From a3e89c0c448760b657b6526467da08af16f75219 Mon Sep 17 00:00:00 2001 From: Aleksander Sekowski Date: Fri, 16 Oct 2026 19:35:10 -0700 Subject: [PATCH] Bidder adapters: retain null bid-list guards while preserving original seats --- .../prebid/server/bidder/aax/AaxBidder.java | 1 + .../bidder/adelement/AdelementBidder.java | 1 + .../bidder/adkerneladn/AdkernelAdnBidder.java | 1 + .../server/bidder/adman/AdmanBidder.java | 1 + .../server/bidder/admatic/AdmaticBidder.java | 1 + .../prebid/server/bidder/adot/AdotBidder.java | 1 + .../server/bidder/adpone/AdponeBidder.java | 1 + .../server/bidder/adprime/AdprimeBidder.java | 1 + .../bidder/adtarget/AdtargetBidder.java | 1 + .../server/bidder/adtonos/AdtonosBidder.java | 1 + .../bidder/adtrgtme/AdtrgtmeBidder.java | 1 + .../bidder/aduptech/AduptechBidder.java | 1 + .../server/bidder/adverxo/AdverxoBidder.java | 1 + .../server/bidder/adview/AdviewBidder.java | 1 + .../server/bidder/adxcg/AdxcgBidder.java | 1 + .../bidder/adyoulike/AdyoulikeBidder.java | 1 + .../server/bidder/afront/AfrontBidder.java | 1 + .../prebid/server/bidder/aja/AjaBidder.java | 1 + .../server/bidder/akcelo/AkceloBidder.java | 1 + .../server/bidder/alkimi/AlkimiBidder.java | 1 + .../AllianceGravityBidder.java | 1 + .../server/bidder/apacdex/ApacdexBidder.java | 1 + .../server/bidder/appush/AppushBidder.java | 1 + .../prebid/server/bidder/aso/AsoBidder.java | 1 + .../AudienceNetworkBidder.java | 1 + .../prebid/server/bidder/axis/AxisBidder.java | 1 + .../server/bidder/axonix/AxonixBidder.java | 1 + .../server/bidder/beintoo/BeintooBidder.java | 1 + .../bematterfull/BematterfullBidder.java | 1 + .../prebid/server/bidder/beop/BeopBidder.java | 1 + .../server/bidder/between/BetweenBidder.java | 1 + .../bidder/beyondmedia/BeyondMediaBidder.java | 1 + .../bidder/bidmatic/BidmaticBidder.java | 1 + .../bidder/bidscube/BidscubeBidder.java | 1 + .../bidder/bidstack/BidstackBidder.java | 1 + .../bidder/bidtheatre/BidTheatreBidder.java | 1 + .../server/bidder/bigoad/BigoadBidder.java | 1 + .../server/bidder/bluesea/BlueSeaBidder.java | 1 + .../prebid/server/bidder/bmtm/BmtmBidder.java | 1 + .../server/bidder/boldwin/BoldwinBidder.java | 1 + .../boldwinrapid/BoldwinRapidBidder.java | 1 + .../server/bidder/brave/BraveBidder.java | 1 + .../prebid/server/bidder/bwx/BwxBidder.java | 1 + .../server/bidder/clydo/ClydoBidder.java | 1 + .../bidder/cointraffic/CointrafficBidder.java | 1 + .../bidder/coinzilla/CoinzillaBidder.java | 1 + .../bidder/colossus/ColossusBidder.java | 1 + .../server/bidder/compass/CompassBidder.java | 1 + .../server/bidder/concert/ConcertBidder.java | 1 + .../bidder/connectad/ConnectAdBidder.java | 1 + .../server/bidder/aax/AaxBidderTest.java | 39 +++++++++++++++++++ .../bidder/adelement/AdelementBidderTest.java | 39 +++++++++++++++++++ .../server/bidder/aja/AjaBidderTest.java | 39 +++++++++++++++++++ 53 files changed, 167 insertions(+) diff --git a/src/main/java/org/prebid/server/bidder/aax/AaxBidder.java b/src/main/java/org/prebid/server/bidder/aax/AaxBidder.java index 642850a4f9d..8f1d34dadaf 100644 --- a/src/main/java/org/prebid/server/bidder/aax/AaxBidder.java +++ b/src/main/java/org/prebid/server/bidder/aax/AaxBidder.java @@ -69,6 +69,7 @@ private List bidsFromResponse(BidRequest bidRequest, return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> resolveBidderBid(bid, bidRequest.getImp(), errorList, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/adelement/AdelementBidder.java b/src/main/java/org/prebid/server/bidder/adelement/AdelementBidder.java index a30843d6294..94aac64287a 100644 --- a/src/main/java/org/prebid/server/bidder/adelement/AdelementBidder.java +++ b/src/main/java/org/prebid/server/bidder/adelement/AdelementBidder.java @@ -89,6 +89,7 @@ private static List extractBids(BidResponse bidResponse) { private static List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, getBidType(bid.getMtype()), bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/adkerneladn/AdkernelAdnBidder.java b/src/main/java/org/prebid/server/bidder/adkerneladn/AdkernelAdnBidder.java index dc443f95bc0..d24187662d5 100644 --- a/src/main/java/org/prebid/server/bidder/adkerneladn/AdkernelAdnBidder.java +++ b/src/main/java/org/prebid/server/bidder/adkerneladn/AdkernelAdnBidder.java @@ -227,6 +227,7 @@ private static List extractBids(BidRequest bidRequest, BidResponse bi private static List bidsFromResponse(BidRequest bidRequest, BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/adman/AdmanBidder.java b/src/main/java/org/prebid/server/bidder/adman/AdmanBidder.java index 1b213214bbd..39342dac532 100644 --- a/src/main/java/org/prebid/server/bidder/adman/AdmanBidder.java +++ b/src/main/java/org/prebid/server/bidder/adman/AdmanBidder.java @@ -100,6 +100,7 @@ private List extractBids(BidResponse bidResponse, List e return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> resolveBidderBid(bidResponse.getCur(), imps, bid, errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/admatic/AdmaticBidder.java b/src/main/java/org/prebid/server/bidder/admatic/AdmaticBidder.java index 5fbe423d2e8..2bf5015d791 100644 --- a/src/main/java/org/prebid/server/bidder/admatic/AdmaticBidder.java +++ b/src/main/java/org/prebid/server/bidder/admatic/AdmaticBidder.java @@ -115,6 +115,7 @@ private static List extractBids(BidRequest bidRequest, return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, getBidType(bid, impMap), bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/adot/AdotBidder.java b/src/main/java/org/prebid/server/bidder/adot/AdotBidder.java index 9a2a667a3ff..5c01db9993f 100644 --- a/src/main/java/org/prebid/server/bidder/adot/AdotBidder.java +++ b/src/main/java/org/prebid/server/bidder/adot/AdotBidder.java @@ -97,6 +97,7 @@ private List extractBids(BidResponse bidResponse) { private List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> createBidderBid(bid, bidResponse, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/adpone/AdponeBidder.java b/src/main/java/org/prebid/server/bidder/adpone/AdponeBidder.java index f609fa33849..0bd1068a46f 100644 --- a/src/main/java/org/prebid/server/bidder/adpone/AdponeBidder.java +++ b/src/main/java/org/prebid/server/bidder/adpone/AdponeBidder.java @@ -72,6 +72,7 @@ private List extractBids(BidResponse bidResponse) { private List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, BidType.banner, bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/adprime/AdprimeBidder.java b/src/main/java/org/prebid/server/bidder/adprime/AdprimeBidder.java index 322514e4ab2..a876d5353d3 100644 --- a/src/main/java/org/prebid/server/bidder/adprime/AdprimeBidder.java +++ b/src/main/java/org/prebid/server/bidder/adprime/AdprimeBidder.java @@ -136,6 +136,7 @@ private static List extractBids(BidResponse bidResponse, List bidsFromResponse(BidResponse bidResponse, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> resolveBidderBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/adtarget/AdtargetBidder.java b/src/main/java/org/prebid/server/bidder/adtarget/AdtargetBidder.java index 618698e4c0f..2b486118b4c 100644 --- a/src/main/java/org/prebid/server/bidder/adtarget/AdtargetBidder.java +++ b/src/main/java/org/prebid/server/bidder/adtarget/AdtargetBidder.java @@ -141,6 +141,7 @@ private static List extractBids(BidResponse bidResponse, List im private static List createBiddersBid(BidResponse bidResponse, List imps, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> createBidderBid(bid, imps, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/adtonos/AdtonosBidder.java b/src/main/java/org/prebid/server/bidder/adtonos/AdtonosBidder.java index 6e2a9f77550..40f91838ee1 100644 --- a/src/main/java/org/prebid/server/bidder/adtonos/AdtonosBidder.java +++ b/src/main/java/org/prebid/server/bidder/adtonos/AdtonosBidder.java @@ -89,6 +89,7 @@ private static List extractBids(BidResponse bidResponse, return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> diff --git a/src/main/java/org/prebid/server/bidder/adtrgtme/AdtrgtmeBidder.java b/src/main/java/org/prebid/server/bidder/adtrgtme/AdtrgtmeBidder.java index 090f70b8337..2dde267f150 100644 --- a/src/main/java/org/prebid/server/bidder/adtrgtme/AdtrgtmeBidder.java +++ b/src/main/java/org/prebid/server/bidder/adtrgtme/AdtrgtmeBidder.java @@ -131,6 +131,7 @@ private List extractBids(BidResponse bidResponse, List e return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> resolveBidderBid(bidResponse.getCur(), imps, bid, errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/aduptech/AduptechBidder.java b/src/main/java/org/prebid/server/bidder/aduptech/AduptechBidder.java index 4ab5d89d027..13fc8f5a80b 100644 --- a/src/main/java/org/prebid/server/bidder/aduptech/AduptechBidder.java +++ b/src/main/java/org/prebid/server/bidder/aduptech/AduptechBidder.java @@ -142,6 +142,7 @@ private static List extractBids(BidResponse bidResponse, List bidsFromResponse(BidResponse bidResponse, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/adverxo/AdverxoBidder.java b/src/main/java/org/prebid/server/bidder/adverxo/AdverxoBidder.java index 80d58d64133..f2fb0358729 100644 --- a/src/main/java/org/prebid/server/bidder/adverxo/AdverxoBidder.java +++ b/src/main/java/org/prebid/server/bidder/adverxo/AdverxoBidder.java @@ -139,6 +139,7 @@ private List extractBids(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/adview/AdviewBidder.java b/src/main/java/org/prebid/server/bidder/adview/AdviewBidder.java index 0db809744f1..0c98fb9b6d5 100644 --- a/src/main/java/org/prebid/server/bidder/adview/AdviewBidder.java +++ b/src/main/java/org/prebid/server/bidder/adview/AdviewBidder.java @@ -153,6 +153,7 @@ private static List extractBids(BidResponse bidResponse, List bidsFromResponse(BidResponse bidResponse, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/adxcg/AdxcgBidder.java b/src/main/java/org/prebid/server/bidder/adxcg/AdxcgBidder.java index d634414f1a2..5cd0220f753 100644 --- a/src/main/java/org/prebid/server/bidder/adxcg/AdxcgBidder.java +++ b/src/main/java/org/prebid/server/bidder/adxcg/AdxcgBidder.java @@ -58,6 +58,7 @@ private static List extractBids(BidResponse bidResponse, List bidsFromResponse(BidResponse bidResponse, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/adyoulike/AdyoulikeBidder.java b/src/main/java/org/prebid/server/bidder/adyoulike/AdyoulikeBidder.java index 7fe804c3458..147c2b47ec4 100644 --- a/src/main/java/org/prebid/server/bidder/adyoulike/AdyoulikeBidder.java +++ b/src/main/java/org/prebid/server/bidder/adyoulike/AdyoulikeBidder.java @@ -149,6 +149,7 @@ private static List extractBids(BidRequest bidRequest, BidResponse bi private static List bidsFromResponse(BidRequest bidRequest, BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/afront/AfrontBidder.java b/src/main/java/org/prebid/server/bidder/afront/AfrontBidder.java index f9f5b060df4..5cd691a94f1 100644 --- a/src/main/java/org/prebid/server/bidder/afront/AfrontBidder.java +++ b/src/main/java/org/prebid/server/bidder/afront/AfrontBidder.java @@ -124,6 +124,7 @@ private static List bidsFromResponse(BidRequest bidRequest, BidRespon return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/aja/AjaBidder.java b/src/main/java/org/prebid/server/bidder/aja/AjaBidder.java index 4956506bedc..edb747831be 100644 --- a/src/main/java/org/prebid/server/bidder/aja/AjaBidder.java +++ b/src/main/java/org/prebid/server/bidder/aja/AjaBidder.java @@ -110,6 +110,7 @@ private Result> extractBids(BidRequest bidRequest, BidResponse b final List errors = new ArrayList<>(); final List bidderBids = bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> bidFromResponse(bidRequest.getImp(), bid, errors, bidResponse.getCur(), seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/akcelo/AkceloBidder.java b/src/main/java/org/prebid/server/bidder/akcelo/AkceloBidder.java index 21a9b41cd33..89ed1664768 100644 --- a/src/main/java/org/prebid/server/bidder/akcelo/AkceloBidder.java +++ b/src/main/java/org/prebid/server/bidder/akcelo/AkceloBidder.java @@ -124,6 +124,7 @@ private List extractBids(BidResponse bidResponse, List e return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/alkimi/AlkimiBidder.java b/src/main/java/org/prebid/server/bidder/alkimi/AlkimiBidder.java index 0bee70507fc..45fc5acadf6 100644 --- a/src/main/java/org/prebid/server/bidder/alkimi/AlkimiBidder.java +++ b/src/main/java/org/prebid/server/bidder/alkimi/AlkimiBidder.java @@ -106,6 +106,7 @@ private static List extractBids(BidRequest bidRequest, BidResponse bi private static List bidsFromResponse(BidRequest bidRequest, BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> resolveBidderBid(bidResponse.getCur(), bidRequest.getImp(), bid, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/alliancegravity/AllianceGravityBidder.java b/src/main/java/org/prebid/server/bidder/alliancegravity/AllianceGravityBidder.java index 550dbb3c4b4..977196936dd 100644 --- a/src/main/java/org/prebid/server/bidder/alliancegravity/AllianceGravityBidder.java +++ b/src/main/java/org/prebid/server/bidder/alliancegravity/AllianceGravityBidder.java @@ -135,6 +135,7 @@ private List extractBids(BidResponse bidResponse, List e return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> resolveBidderBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/apacdex/ApacdexBidder.java b/src/main/java/org/prebid/server/bidder/apacdex/ApacdexBidder.java index e3b0995b666..b52f8f567ed 100644 --- a/src/main/java/org/prebid/server/bidder/apacdex/ApacdexBidder.java +++ b/src/main/java/org/prebid/server/bidder/apacdex/ApacdexBidder.java @@ -110,6 +110,7 @@ private List extractBids(BidResponse bidResponse, List e return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> constructBidderBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/appush/AppushBidder.java b/src/main/java/org/prebid/server/bidder/appush/AppushBidder.java index 1e40f9132ca..4c0dcd48272 100644 --- a/src/main/java/org/prebid/server/bidder/appush/AppushBidder.java +++ b/src/main/java/org/prebid/server/bidder/appush/AppushBidder.java @@ -121,6 +121,7 @@ private static List extractBids(BidRequest bidRequest, BidResponse bi return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/aso/AsoBidder.java b/src/main/java/org/prebid/server/bidder/aso/AsoBidder.java index 76a6600e231..c6da72208a8 100644 --- a/src/main/java/org/prebid/server/bidder/aso/AsoBidder.java +++ b/src/main/java/org/prebid/server/bidder/aso/AsoBidder.java @@ -120,6 +120,7 @@ private List extractBids(BidResponse bidResponse, List e private List bidsFromResponse(BidResponse bidResponse, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/audiencenetwork/AudienceNetworkBidder.java b/src/main/java/org/prebid/server/bidder/audiencenetwork/AudienceNetworkBidder.java index 10dab25af6f..1dedb490e39 100644 --- a/src/main/java/org/prebid/server/bidder/audiencenetwork/AudienceNetworkBidder.java +++ b/src/main/java/org/prebid/server/bidder/audiencenetwork/AudienceNetworkBidder.java @@ -279,6 +279,7 @@ private Result> extractBids(BidResponse bidResponse, List i final List errors = new ArrayList<>(); final List bidderBids = bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> toBidderBid(bid, imps, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/axis/AxisBidder.java b/src/main/java/org/prebid/server/bidder/axis/AxisBidder.java index 8589316bc38..0a166f394b3 100644 --- a/src/main/java/org/prebid/server/bidder/axis/AxisBidder.java +++ b/src/main/java/org/prebid/server/bidder/axis/AxisBidder.java @@ -92,6 +92,7 @@ private List extractBids(BidResponse bidResponse, List e return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> resolveBidderBid(bidResponse.getCur(), imps, bid, errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/axonix/AxonixBidder.java b/src/main/java/org/prebid/server/bidder/axonix/AxonixBidder.java index ff4a4fd78cf..cc7f437de7a 100644 --- a/src/main/java/org/prebid/server/bidder/axonix/AxonixBidder.java +++ b/src/main/java/org/prebid/server/bidder/axonix/AxonixBidder.java @@ -85,6 +85,7 @@ private static List extractBids(BidRequest bidRequest, BidResponse bi return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/beintoo/BeintooBidder.java b/src/main/java/org/prebid/server/bidder/beintoo/BeintooBidder.java index 6587f2ef22f..aa72480f100 100644 --- a/src/main/java/org/prebid/server/bidder/beintoo/BeintooBidder.java +++ b/src/main/java/org/prebid/server/bidder/beintoo/BeintooBidder.java @@ -187,6 +187,7 @@ private static List extractBids(BidResponse bidResponse) { private static List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> bid.toBuilder().impid(bid.getId()).build()) diff --git a/src/main/java/org/prebid/server/bidder/bematterfull/BematterfullBidder.java b/src/main/java/org/prebid/server/bidder/bematterfull/BematterfullBidder.java index 364b8aea915..fe863a3771b 100644 --- a/src/main/java/org/prebid/server/bidder/bematterfull/BematterfullBidder.java +++ b/src/main/java/org/prebid/server/bidder/bematterfull/BematterfullBidder.java @@ -109,6 +109,7 @@ private List extractBids(BidResponse bidResponse, List e return bidResponse.getSeatbid() .stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/beop/BeopBidder.java b/src/main/java/org/prebid/server/bidder/beop/BeopBidder.java index 7ef9db38ed1..1127014a6df 100644 --- a/src/main/java/org/prebid/server/bidder/beop/BeopBidder.java +++ b/src/main/java/org/prebid/server/bidder/beop/BeopBidder.java @@ -97,6 +97,7 @@ public Result> makeBids(BidderCall httpCall, BidRequ private static List extractBids(BidResponse bidResponse, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBidderBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/between/BetweenBidder.java b/src/main/java/org/prebid/server/bidder/between/BetweenBidder.java index d6260497c88..2c07090f5c3 100644 --- a/src/main/java/org/prebid/server/bidder/between/BetweenBidder.java +++ b/src/main/java/org/prebid/server/bidder/between/BetweenBidder.java @@ -185,6 +185,7 @@ private static List extractBids(BidResponse bidResponse) { private static List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, BidType.banner, bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/beyondmedia/BeyondMediaBidder.java b/src/main/java/org/prebid/server/bidder/beyondmedia/BeyondMediaBidder.java index 808a9c127f6..72a1aee19f0 100644 --- a/src/main/java/org/prebid/server/bidder/beyondmedia/BeyondMediaBidder.java +++ b/src/main/java/org/prebid/server/bidder/beyondmedia/BeyondMediaBidder.java @@ -116,6 +116,7 @@ private static List extractBids(BidRequest bidRequest, BidResponse bi return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/bidmatic/BidmaticBidder.java b/src/main/java/org/prebid/server/bidder/bidmatic/BidmaticBidder.java index c6e67daeabe..51c9ecd3898 100644 --- a/src/main/java/org/prebid/server/bidder/bidmatic/BidmaticBidder.java +++ b/src/main/java/org/prebid/server/bidder/bidmatic/BidmaticBidder.java @@ -132,6 +132,7 @@ private static List extractBids(BidRequest bidRequest, return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, impMap, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/bidscube/BidscubeBidder.java b/src/main/java/org/prebid/server/bidder/bidscube/BidscubeBidder.java index ada17d2df1e..7591196833e 100644 --- a/src/main/java/org/prebid/server/bidder/bidscube/BidscubeBidder.java +++ b/src/main/java/org/prebid/server/bidder/bidscube/BidscubeBidder.java @@ -91,6 +91,7 @@ private List extractBids(BidResponse bidResponse, List e private List bidsFromResponse(BidResponse bidResponse, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> constructBidderBid(bid, bidResponse, errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/bidstack/BidstackBidder.java b/src/main/java/org/prebid/server/bidder/bidstack/BidstackBidder.java index bbdd4e8e883..aec5bd0dd87 100644 --- a/src/main/java/org/prebid/server/bidder/bidstack/BidstackBidder.java +++ b/src/main/java/org/prebid/server/bidder/bidstack/BidstackBidder.java @@ -155,6 +155,7 @@ private static List extractBids(BidResponse bidResponse) { private static List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, BidType.video, bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/bidtheatre/BidTheatreBidder.java b/src/main/java/org/prebid/server/bidder/bidtheatre/BidTheatreBidder.java index 1792647533a..1c739f38b11 100644 --- a/src/main/java/org/prebid/server/bidder/bidtheatre/BidTheatreBidder.java +++ b/src/main/java/org/prebid/server/bidder/bidtheatre/BidTheatreBidder.java @@ -70,6 +70,7 @@ private List extractBids(BidResponse bidResponse, List e private List bidsFromResponse(BidResponse bidResponse, List errors) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/bigoad/BigoadBidder.java b/src/main/java/org/prebid/server/bidder/bigoad/BigoadBidder.java index 0d4c0879c40..4f2ccecd279 100644 --- a/src/main/java/org/prebid/server/bidder/bigoad/BigoadBidder.java +++ b/src/main/java/org/prebid/server/bidder/bigoad/BigoadBidder.java @@ -116,6 +116,7 @@ private static List extractBids(BidResponse bidResponse, List seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/bluesea/BlueSeaBidder.java b/src/main/java/org/prebid/server/bidder/bluesea/BlueSeaBidder.java index eb1b1034098..caef6e1fd54 100644 --- a/src/main/java/org/prebid/server/bidder/bluesea/BlueSeaBidder.java +++ b/src/main/java/org/prebid/server/bidder/bluesea/BlueSeaBidder.java @@ -104,6 +104,7 @@ private static List extractBids(BidResponse bidResponse, return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBidderBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/bmtm/BmtmBidder.java b/src/main/java/org/prebid/server/bidder/bmtm/BmtmBidder.java index bf7977c392f..a86f17d4360 100644 --- a/src/main/java/org/prebid/server/bidder/bmtm/BmtmBidder.java +++ b/src/main/java/org/prebid/server/bidder/bmtm/BmtmBidder.java @@ -132,6 +132,7 @@ private static List bidsFromResponse(BidRequest bidRequest, BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/boldwin/BoldwinBidder.java b/src/main/java/org/prebid/server/bidder/boldwin/BoldwinBidder.java index 456c769516e..fefdc1448c4 100644 --- a/src/main/java/org/prebid/server/bidder/boldwin/BoldwinBidder.java +++ b/src/main/java/org/prebid/server/bidder/boldwin/BoldwinBidder.java @@ -118,6 +118,7 @@ private static List extractBids(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, getBidType(bid), bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/boldwinrapid/BoldwinRapidBidder.java b/src/main/java/org/prebid/server/bidder/boldwinrapid/BoldwinRapidBidder.java index d6b93565f27..23bbe671c8d 100644 --- a/src/main/java/org/prebid/server/bidder/boldwinrapid/BoldwinRapidBidder.java +++ b/src/main/java/org/prebid/server/bidder/boldwinrapid/BoldwinRapidBidder.java @@ -120,6 +120,7 @@ private static List extractBids(BidResponse bidResponse) { private static List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, getBidType(bid), bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/brave/BraveBidder.java b/src/main/java/org/prebid/server/bidder/brave/BraveBidder.java index 1ce1cbf2326..fe07ba89316 100644 --- a/src/main/java/org/prebid/server/bidder/brave/BraveBidder.java +++ b/src/main/java/org/prebid/server/bidder/brave/BraveBidder.java @@ -104,6 +104,7 @@ private static List bidsFromResponse(BidRequest bidRequest, BidRespon return bidResponse.getSeatbid().stream() .limit(1) .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/bwx/BwxBidder.java b/src/main/java/org/prebid/server/bidder/bwx/BwxBidder.java index 2814a55013f..ddb8c3ee3f3 100644 --- a/src/main/java/org/prebid/server/bidder/bwx/BwxBidder.java +++ b/src/main/java/org/prebid/server/bidder/bwx/BwxBidder.java @@ -109,6 +109,7 @@ private List extractBids(BidResponse bidResponse) { private List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, getBidType(bid), bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/clydo/ClydoBidder.java b/src/main/java/org/prebid/server/bidder/clydo/ClydoBidder.java index 86a93d27705..a7584fb0f9a 100644 --- a/src/main/java/org/prebid/server/bidder/clydo/ClydoBidder.java +++ b/src/main/java/org/prebid/server/bidder/clydo/ClydoBidder.java @@ -144,6 +144,7 @@ private List extractBids(BidRequest bidRequest, BidResponse bidRespon return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/cointraffic/CointrafficBidder.java b/src/main/java/org/prebid/server/bidder/cointraffic/CointrafficBidder.java index e2c5d686b17..bbf46fe62bf 100644 --- a/src/main/java/org/prebid/server/bidder/cointraffic/CointrafficBidder.java +++ b/src/main/java/org/prebid/server/bidder/cointraffic/CointrafficBidder.java @@ -58,6 +58,7 @@ private static List extractBids(BidResponse bidResponse) { private static List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, BidType.banner, bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/coinzilla/CoinzillaBidder.java b/src/main/java/org/prebid/server/bidder/coinzilla/CoinzillaBidder.java index 558856e5a8f..a4c0fff02d0 100644 --- a/src/main/java/org/prebid/server/bidder/coinzilla/CoinzillaBidder.java +++ b/src/main/java/org/prebid/server/bidder/coinzilla/CoinzillaBidder.java @@ -69,6 +69,7 @@ private List extractBids(BidResponse bidResponse) { private List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of(seatBid.getSeat(), bid, BidType.banner, bidResponse.getCur()))) diff --git a/src/main/java/org/prebid/server/bidder/colossus/ColossusBidder.java b/src/main/java/org/prebid/server/bidder/colossus/ColossusBidder.java index e5022d752c5..82c822e9f5f 100644 --- a/src/main/java/org/prebid/server/bidder/colossus/ColossusBidder.java +++ b/src/main/java/org/prebid/server/bidder/colossus/ColossusBidder.java @@ -101,6 +101,7 @@ private List extractBids(BidRequest bidRequest, BidResponse bidRespon return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBidderBid(bid, bidRequest.getImp(), bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/compass/CompassBidder.java b/src/main/java/org/prebid/server/bidder/compass/CompassBidder.java index 2e19d28151b..0b5cb1c2b2b 100644 --- a/src/main/java/org/prebid/server/bidder/compass/CompassBidder.java +++ b/src/main/java/org/prebid/server/bidder/compass/CompassBidder.java @@ -117,6 +117,7 @@ private static List extractBids(BidRequest bidRequest, BidResponse bi return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/main/java/org/prebid/server/bidder/concert/ConcertBidder.java b/src/main/java/org/prebid/server/bidder/concert/ConcertBidder.java index ef7385049e4..f8e8c688c55 100644 --- a/src/main/java/org/prebid/server/bidder/concert/ConcertBidder.java +++ b/src/main/java/org/prebid/server/bidder/concert/ConcertBidder.java @@ -119,6 +119,7 @@ private static List extractBids(BidResponse bidResponse, List seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> makeBid(bid, bidResponse.getCur(), errors, seatBid.getSeat()))) diff --git a/src/main/java/org/prebid/server/bidder/connectad/ConnectAdBidder.java b/src/main/java/org/prebid/server/bidder/connectad/ConnectAdBidder.java index 91883be5032..fa23ddbabf9 100644 --- a/src/main/java/org/prebid/server/bidder/connectad/ConnectAdBidder.java +++ b/src/main/java/org/prebid/server/bidder/connectad/ConnectAdBidder.java @@ -189,6 +189,7 @@ private List extractBids(BidResponse bidResponse, BidRequest bidReque return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) + .filter(seatBid -> seatBid.getBid() != null) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) .map(bid -> BidderBid.of( diff --git a/src/test/java/org/prebid/server/bidder/aax/AaxBidderTest.java b/src/test/java/org/prebid/server/bidder/aax/AaxBidderTest.java index 50c2bcb1781..8d2eb7025b5 100644 --- a/src/test/java/org/prebid/server/bidder/aax/AaxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/aax/AaxBidderTest.java @@ -255,6 +255,45 @@ public void makeBidsShouldReturnErrorIfRequestContainUnsupportedMediaType() thro BidderError.Type.bad_server_response)); } + @Test + public void makeBidsShouldKeepValidBidAndSeatWhenOtherSeatsHaveNoBids() { + // given + final BidRequest bidRequest = givenBidRequest(imp -> imp.banner(Banner.builder().build())); + final String body = """ + {"cur":"USD","seatbid":[ + {"seat":"missing-bids"}, + {"seat":"buyer","bid":[{"id":"valid-bid","impid":"123","mtype":1}]}, + {"seat":"null-bids","bid":null} + ]} + """; + final BidderCall httpCall = givenHttpCall(bidRequest, body); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).extracting(BidderBid::getBid) + .containsExactly(Bid.builder().id("valid-bid").impid("123").mtype(1).build()); + assertThat(result.getValue()).extracting(BidderBid::getOriginalSeat).containsExactly("buyer"); + } + + @Test + public void makeBidsShouldReturnNoBidsWhenEverySeatHasNoBids() { + // given + final String body = """ + {"seatbid":[null,{"seat":"missing-bids"},{"bid":null},{"bid":[]}]} + """; + final BidderCall httpCall = givenHttpCall(null, body); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).isEmpty(); + } + private static BidRequest givenBidRequest(UnaryOperator impCustomizer) { return givenBidRequest(identity(), impCustomizer); } diff --git a/src/test/java/org/prebid/server/bidder/adelement/AdelementBidderTest.java b/src/test/java/org/prebid/server/bidder/adelement/AdelementBidderTest.java index c3a9a89c343..d272f4179de 100644 --- a/src/test/java/org/prebid/server/bidder/adelement/AdelementBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/adelement/AdelementBidderTest.java @@ -3,6 +3,7 @@ import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; import com.iab.openrtb.request.Imp; +import com.iab.openrtb.response.Bid; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.prebid.server.VertxTest; @@ -82,6 +83,44 @@ public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() { .containsExactly(BidderError.badServerResponse("Bad Server Response")); } + @Test + public void makeBidsShouldKeepValidBidAndSeatWhenOtherSeatsHaveNoBids() { + // given + final String body = """ + {"cur":"USD","seatbid":[ + {"seat":"missing-bids"}, + {"seat":"buyer","bid":[{"id":"valid-bid","impid":"123","mtype":1}]}, + {"seat":"null-bids","bid":null} + ]} + """; + final BidderCall httpCall = givenHttpCall(body); + + // when + final Result> result = adelementBidder.makeBids(httpCall, null); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).extracting(BidderBid::getBid) + .containsExactly(Bid.builder().id("valid-bid").impid("123").mtype(1).build()); + assertThat(result.getValue()).extracting(BidderBid::getOriginalSeat).containsExactly("buyer"); + } + + @Test + public void makeBidsShouldReturnNoBidsWhenEverySeatHasNoBids() { + // given + final String body = """ + {"seatbid":[null,{"seat":"missing-bids"},{"bid":null},{"bid":[]}]} + """; + final BidderCall httpCall = givenHttpCall(body); + + // when + final Result> result = adelementBidder.makeBids(httpCall, null); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).isEmpty(); + } + private static BidRequest givenBidRequest(Function... impCustomizers) { return givenBidRequest(identity(), asList(impCustomizers)); } diff --git a/src/test/java/org/prebid/server/bidder/aja/AjaBidderTest.java b/src/test/java/org/prebid/server/bidder/aja/AjaBidderTest.java index 97d3485b977..d3eccd7e577 100644 --- a/src/test/java/org/prebid/server/bidder/aja/AjaBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/aja/AjaBidderTest.java @@ -154,6 +154,45 @@ public void makeBidsShouldReturnBannerBidIfBannerIsPresentInRequestImp() throws .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), banner, "USD")); } + @Test + public void makeBidsShouldKeepValidBidAndSeatWhenOtherSeatsHaveNoBids() { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final String body = """ + {"cur":"USD","seatbid":[ + {"seat":"missing-bids"}, + {"seat":"buyer","bid":[{"id":"valid-bid","impid":"123","mtype":1}]}, + {"seat":"null-bids","bid":null} + ]} + """; + final BidderCall httpCall = givenHttpCall(bidRequest, body); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).extracting(BidderBid::getBid) + .containsExactly(Bid.builder().id("valid-bid").impid("123").mtype(1).build()); + assertThat(result.getValue()).extracting(BidderBid::getOriginalSeat).containsExactly("buyer"); + } + + @Test + public void makeBidsShouldReturnNoBidsWhenEverySeatHasNoBids() { + // given + final String body = """ + {"seatbid":[null,{"seat":"missing-bids"},{"bid":null},{"bid":[]}]} + """; + final BidderCall httpCall = givenHttpCall(null, body); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).isEmpty(); + } + private static BidRequest givenBidRequest( Function bidRequestCustomizer, Function impCustomizer) {