diff --git a/src/main/java/org/prebid/server/bidder/vungle/VungleBidder.java b/src/main/java/org/prebid/server/bidder/vungle/VungleBidder.java index f10a2dcc453..1f6788c800f 100644 --- a/src/main/java/org/prebid/server/bidder/vungle/VungleBidder.java +++ b/src/main/java/org/prebid/server/bidder/vungle/VungleBidder.java @@ -59,11 +59,16 @@ public Result>> makeHttpRequests(BidRequest bidRequ final List errors = new ArrayList<>(); final List> httpRequests = new ArrayList<>(); + final String buyerId = ObjectUtil.getIfNotNull(bidRequest.getUser(), User::getBuyeruid); + if (StringUtils.isBlank(buyerId)) { + return Result.withError(BidderError.badInput("missing bidder token in user.buyeruid")); + } + for (Imp imp : bidRequest.getImp()) { try { final Price price = resolveBidFloor(imp, bidRequest); final VungleImpressionExt impExt = parseImpExt(imp); - final VungleImpressionExt modifiedImpExt = modifyImpExt(impExt, bidRequest); + final VungleImpressionExt modifiedImpExt = modifyImpExt(impExt, buyerId); final Imp modifiedImp = modifyImp(imp, modifiedImpExt, price); final BidRequest modifiedRequest = modifyBidRequest( bidRequest, @@ -95,9 +100,8 @@ private VungleImpressionExt parseImpExt(Imp imp) { return mapper.mapper().convertValue(imp.getExt(), VungleImpressionExt.class); } - private static VungleImpressionExt modifyImpExt(VungleImpressionExt impExt, BidRequest bidRequest) { + private static VungleImpressionExt modifyImpExt(VungleImpressionExt impExt, String buyerId) { final ExtImpVungle bidder = impExt.getBidder(); - final String buyerId = ObjectUtil.getIfNotNull(bidRequest.getUser(), User::getBuyeruid); final ExtImpVungle vungle = ExtImpVungle.of( buyerId, bidder.getAppStoreId(), diff --git a/src/test/java/org/prebid/server/bidder/vungle/VungleBidderTest.java b/src/test/java/org/prebid/server/bidder/vungle/VungleBidderTest.java index 31967ae4523..5306ef7da2e 100644 --- a/src/test/java/org/prebid/server/bidder/vungle/VungleBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/vungle/VungleBidderTest.java @@ -175,6 +175,54 @@ public void makeHttpRequestsShouldThrowErrorWhenCurrencyConvertCannotConvertInAn .containsExactly("Unable to convert from currency UAH to desired ad server currency USD"); } + @Test + public void makeHttpRequestsShouldReturnErrorWhenUserIsNull() { + // given + final BidRequest bidRequest = givenBidRequest( + bidRequestBuilder -> bidRequestBuilder.user(null), identity()); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getValue()).isEmpty(); + assertThat(result.getErrors()) + .extracting(BidderError::getMessage) + .containsExactly("missing bidder token in user.buyeruid"); + } + + @Test + public void makeHttpRequestsShouldReturnErrorWhenUserBuyeruidIsNull() { + // given + final BidRequest bidRequest = givenBidRequest( + bidRequestBuilder -> bidRequestBuilder.user(User.builder().buyeruid(null).build()), identity()); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getValue()).isEmpty(); + assertThat(result.getErrors()) + .extracting(BidderError::getMessage) + .containsExactly("missing bidder token in user.buyeruid"); + } + + @Test + public void makeHttpRequestsShouldReturnErrorWhenUserBuyeruidIsBlank() { + // given + final BidRequest bidRequest = givenBidRequest( + bidRequestBuilder -> bidRequestBuilder.user(User.builder().buyeruid(" ").build()), identity()); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getValue()).isEmpty(); + assertThat(result.getErrors()) + .extracting(BidderError::getMessage) + .containsExactly("missing bidder token in user.buyeruid"); + } + @Test public void makeHttpRequestShouldUpdateExtImpVungleWhenUserBuyeruidPresent() { // given @@ -380,12 +428,14 @@ public void makeBidsShouldReturnVideoBidIfBaneerIsPresentInRequestImp() throws J .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), video, "seat", null)); } + @SafeVarargs private static BidRequest givenBidRequest( UnaryOperator bidRequestCustomizer, UnaryOperator... impCustomizer) { return bidRequestCustomizer.apply(BidRequest.builder() .app(App.builder().build()) + .user(User.builder().buyeruid("buyeruid").build()) .imp(Arrays.stream(impCustomizer).map(VungleBidderTest::givenImp).toList())) .build(); } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-auction-liftoff-request.json b/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-auction-liftoff-request.json index a10f5c85f11..d80279a635d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-auction-liftoff-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-auction-liftoff-request.json @@ -12,13 +12,15 @@ }, "ext": { "liftoff": { - "bid_token": "bid_token", "app_store_id": "app_store_id", "placement_reference_id": "placement_reference_id" } } } ], + "user": { + "buyeruid": "bid_token" + }, "tmax": 5000, "regs": { "ext": { diff --git a/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-liftoff-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-liftoff-bid-request.json index 9348868846c..ef277198b76 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-liftoff-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-liftoff-bid-request.json @@ -14,17 +14,20 @@ }, "ext": { "bidder": { - "bid_token": "bid_token", "app_store_id": "app_store_id", "placement_reference_id": "placement_reference_id" }, "vungle": { + "bid_token": "bid_token", "app_store_id": "app_store_id", "placement_reference_id": "placement_reference_id" } } } ], + "user": { + "buyeruid": "bid_token" + }, "source": { "tid": "${json-unit.any-string}" }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-auction-vungle-request.json b/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-auction-vungle-request.json index d4a33b89ed4..50010c7e41a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-auction-vungle-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-auction-vungle-request.json @@ -12,13 +12,15 @@ }, "ext": { "vungle": { - "bid_token": "bid_token", "app_store_id": "app_store_id", "placement_reference_id": "placement_reference_id" } } } ], + "user": { + "buyeruid": "bid_token" + }, "tmax": 5000, "regs": { "ext": { diff --git a/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-vungle-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-vungle-bid-request.json index 9348868846c..ef277198b76 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-vungle-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-vungle-bid-request.json @@ -14,17 +14,20 @@ }, "ext": { "bidder": { - "bid_token": "bid_token", "app_store_id": "app_store_id", "placement_reference_id": "placement_reference_id" }, "vungle": { + "bid_token": "bid_token", "app_store_id": "app_store_id", "placement_reference_id": "placement_reference_id" } } } ], + "user": { + "buyeruid": "bid_token" + }, "source": { "tid": "${json-unit.any-string}" },