From 351cb012cfe47bdfd8931a5b09fcb526acfca7fc Mon Sep 17 00:00:00 2001 From: Pier-Lionel 'PL' Sgard Date: Thu, 24 Sep 2026 20:40:50 +0200 Subject: [PATCH 1/3] Smartadserver: forward placementuuid as plcmtuuid Accept a new `placementuuid` bidder param (the publisher-facing name shared with the Equativ prebid.js adapter and smart.js) and forward it to Equativ as `imp.ext.bidder.plcmtuuid` (`imp.ext.smartadserver.plcmtuuid` on the programmatic-guaranteed path). The legacy siteId/pageId/formatId ids are still passed through unchanged so Equativ arbitrates when both are present, and the schema keeps the value a plain string so a malformed uuid degrades server-side instead of rejecting the impression. The input name is deliberately the only accepted one (no @JsonAlias on the wire name); the getter is NON_EMPTY so an absent or empty value is omitted, keeping legacy-only output byte-identical. Co-Authored-By: Claude Fable 5.1 --- .../smartadserver/ExtImpSmartadserver.java | 10 + .../static/bidder-params/smartadserver.json | 4 + .../SmartadserverBidderTest.java | 231 +++++++++++++++++- .../test-auction-smartadserver-request.json | 1 + .../test-smartadserver-bid-request.json | 3 +- 5 files changed, 247 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/smartadserver/ExtImpSmartadserver.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/smartadserver/ExtImpSmartadserver.java index efc8de91a5f..fddb476993b 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/smartadserver/ExtImpSmartadserver.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/smartadserver/ExtImpSmartadserver.java @@ -1,5 +1,6 @@ package org.prebid.server.proto.openrtb.ext.request.smartadserver; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Value; @@ -20,4 +21,13 @@ public class ExtImpSmartadserver { @JsonProperty(value = "programmaticGuaranteed", access = JsonProperty.Access.WRITE_ONLY) boolean programmaticGuaranteed; + + @JsonProperty(value = "placementuuid", access = JsonProperty.Access.WRITE_ONLY) + String placementUuid; + + @JsonProperty(value = "plcmtuuid", access = JsonProperty.Access.READ_ONLY) + @JsonInclude(JsonInclude.Include.NON_EMPTY) + public String getPlcmtuuid() { + return placementUuid; + } } diff --git a/src/main/resources/static/bidder-params/smartadserver.json b/src/main/resources/static/bidder-params/smartadserver.json index b9b28c7588b..42a0449bdcc 100644 --- a/src/main/resources/static/bidder-params/smartadserver.json +++ b/src/main/resources/static/bidder-params/smartadserver.json @@ -23,6 +23,10 @@ "type": "integer", "description": "The network id.", "minimum": 1 + }, + "placementuuid": { + "type": "string", + "description": "The placement UUID (new inventory structure). Preferred over siteId/pageId/formatId; forwarded to Equativ as plcmtuuid." } }, "dependencies": { diff --git a/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java b/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java index c91a8e28ea1..a57d43b727f 100644 --- a/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java @@ -39,6 +39,7 @@ public class SmartadserverBidderTest extends VertxTest { private static final String ENDPOINT_URL = "https://test.endpoint.com/path/api/bid?testParam=testVal"; private static final String SECONDARY_URL = "https://test.endpoint2.com/path/ortb?testParam=testVal"; + private static final String PLACEMENT_UUID = "0ac7b8e4-8f35-4d1b-9a3c-2b7c0f7d9e11"; private final SmartadserverBidder target = new SmartadserverBidder(ENDPOINT_URL, SECONDARY_URL, jacksonMapper); @@ -251,6 +252,230 @@ public void makeHttpRequestsShouldModifyImpWhenProgrammaticGuaranteedIsTrueAtLea .containsExactly(expectedImpExt1, expectedImpExt2); } + @Test + public void makeHttpRequestsShouldForwardPlacementUuidAsPlcmtuuid() { + // given + final ObjectNode givenImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73) + .put("placementuuid", PLACEMENT_UUID)); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1); + assertThat(result.getValue().getFirst().getUri()) + .isEqualTo("https://test.endpoint.com/path/api/bid?testParam=testVal&callerId=5"); + + final ObjectNode bidderExt = (ObjectNode) singleImpExt(result).get("bidder"); + assertThat(bidderExt.path("plcmtuuid").asText()).isEqualTo(PLACEMENT_UUID); + assertThat(bidderExt.path("networkId").asInt()).isEqualTo(73); + assertThat(bidderExt.has("placementuuid")).isFalse(); + } + + @Test + public void makeHttpRequestsShouldForwardPlacementUuidAndLegacyIdsWhenBothPresent() { + // given + final ObjectNode givenImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("siteId", 1) + .put("pageId", 2) + .put("formatId", 3) + .put("networkId", 73) + .put("placementuuid", PLACEMENT_UUID)); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + final ObjectNode expectedImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("siteId", 1) + .put("pageId", 2) + .put("formatId", 3) + .put("networkId", 73) + .put("plcmtuuid", PLACEMENT_UUID)); + + assertThat(result.getErrors()).isEmpty(); + assertThat(singleImpExt(result)).isEqualTo(expectedImpExt); + } + + @Test + public void makeHttpRequestsShouldNotEmitPlcmtuuidWhenPlacementUuidIsAbsent() { + // given + final ObjectNode givenImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("siteId", 1) + .put("pageId", 2) + .put("formatId", 3) + .put("networkId", 73)); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + final ObjectNode expectedImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("siteId", 1) + .put("pageId", 2) + .put("formatId", 3) + .put("networkId", 73)); + + assertThat(result.getErrors()).isEmpty(); + assertThat(singleImpExt(result)).isEqualTo(expectedImpExt); + } + + @Test + public void makeHttpRequestsShouldForwardMalformedPlacementUuidVerbatim() { + // given + final ObjectNode givenImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73) + .put("placementuuid", "not-a-uuid")); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(singleImpExt(result).path("bidder").path("plcmtuuid").asText()).isEqualTo("not-a-uuid"); + } + + @Test + public void makeHttpRequestsShouldPutPlcmtuuidUnderSmartadserverKeyWhenProgrammaticGuaranteed() { + // given + final ObjectNode givenImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73) + .put("placementuuid", PLACEMENT_UUID) + .put("programmaticGuaranteed", true)); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1); + assertThat(result.getValue().getFirst().getUri()) + .isEqualTo("https://test.endpoint2.com/path/ortb?testParam=testVal"); + + final ObjectNode impExt = singleImpExt(result); + assertThat(impExt.has("bidder")).isFalse(); + assertThat(impExt.path("smartadserver").path("plcmtuuid").asText()).isEqualTo(PLACEMENT_UUID); + } + + @Test + public void makeHttpRequestsShouldKeepPlacementUuidPerImp() { + // given + final ObjectNode givenImpExt1 = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("siteId", 1) + .put("pageId", 2) + .put("formatId", 3) + .put("networkId", 73)); + final ObjectNode givenImpExt2 = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73) + .put("placementuuid", PLACEMENT_UUID)); + + final BidRequest bidRequest = BidRequest.builder() + .imp(List.of( + givenImp(imp -> imp.id("impId1").ext(givenImpExt1)), + givenImp(imp -> imp.id("impId2").ext(givenImpExt2)))) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + final ObjectNode expectedImpExt1 = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("siteId", 1) + .put("pageId", 2) + .put("formatId", 3) + .put("networkId", 73)); + final ObjectNode expectedImpExt2 = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73) + .put("plcmtuuid", PLACEMENT_UUID)); + + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1); + assertThat(result.getValue()) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getExt) + .containsExactly(expectedImpExt1, expectedImpExt2); + } + + @Test + public void makeHttpRequestsShouldOmitPlcmtuuidWhenPlacementUuidIsEmpty() { + // given + final ObjectNode givenImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73) + .put("placementuuid", "")); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1); + assertThat(singleImpExt(result).path("bidder").has("plcmtuuid")).isFalse(); + } + + @Test + public void makeHttpRequestsShouldIgnoreInboundPlcmtuuid() { + // given + final ObjectNode givenImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73) + .put("plcmtuuid", PLACEMENT_UUID)); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + final ObjectNode expectedImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73)); + + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1); + assertThat(singleImpExt(result)).isEqualTo(expectedImpExt); + } + @Test public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() { // given @@ -403,10 +628,14 @@ private static Imp givenImp(Function impCustomiz .video(Video.builder().build()) .ext(mapper.valueToTree(ExtPrebid.of( null, - ExtImpSmartadserver.of(1, 2, 3, 4, false))))) + ExtImpSmartadserver.of(1, 2, 3, 4, false, null))))) .build(); } + private static ObjectNode singleImpExt(Result>> result) { + return result.getValue().getFirst().getPayload().getImp().getFirst().getExt(); + } + private static BidResponse givenBidResponse(Function bidCustomizer) { return BidResponse.builder() .cur("EUR") diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-auction-smartadserver-request.json b/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-auction-smartadserver-request.json index b02d4d0a642..67e6448b192 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-auction-smartadserver-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-auction-smartadserver-request.json @@ -15,6 +15,7 @@ "pageId": 2, "formatId": 3, "networkId": 73, + "placementuuid": "0ac7b8e4-8f35-4d1b-9a3c-2b7c0f7d9e11", "programmaticGuaranteed": true } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-smartadserver-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-smartadserver-bid-request.json index 3c429761287..0dae2002548 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-smartadserver-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-smartadserver-bid-request.json @@ -14,7 +14,8 @@ "siteId": 1, "pageId": 2, "formatId": 3, - "networkId": 73 + "networkId": 73, + "plcmtuuid": "0ac7b8e4-8f35-4d1b-9a3c-2b7c0f7d9e11" } } } From a626fbc01af4a964cba1152bb98dae473a0114ea Mon Sep 17 00:00:00 2001 From: Pier-Lionel 'PL' Sgard Date: Wed, 30 Sep 2026 16:00:20 +0200 Subject: [PATCH 2/3] Smartadserver: keep only adapter-logic tests for placementuuid Per review: drop the tests that exercised Jackson serialization rather than adapter behaviour (absent, empty and malformed values, per-imp independence) and cover the programmatic-guaranteed case in the existing PG test instead of a new one. Co-Authored-By: Claude Fable 5.1 --- .../SmartadserverBidderTest.java | 147 +----------------- 1 file changed, 4 insertions(+), 143 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java b/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java index a57d43b727f..347be0880fa 100644 --- a/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java @@ -218,7 +218,8 @@ public void makeHttpRequestsShouldModifyImpWhenProgrammaticGuaranteedIsTrueAtLea .put("networkId", 5) .put("siteId", 6) .put("formatId", 7) - .put("pageId", 8)); + .put("pageId", 8) + .put("placementuuid", PLACEMENT_UUID)); final BidRequest bidRequest = BidRequest.builder() .imp(List.of( @@ -241,7 +242,8 @@ public void makeHttpRequestsShouldModifyImpWhenProgrammaticGuaranteedIsTrueAtLea .put("networkId", 5) .put("siteId", 6) .put("formatId", 7) - .put("pageId", 8)); + .put("pageId", 8) + .put("plcmtuuid", PLACEMENT_UUID)); assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()).hasSize(1); @@ -310,147 +312,6 @@ public void makeHttpRequestsShouldForwardPlacementUuidAndLegacyIdsWhenBothPresen assertThat(singleImpExt(result)).isEqualTo(expectedImpExt); } - @Test - public void makeHttpRequestsShouldNotEmitPlcmtuuidWhenPlacementUuidIsAbsent() { - // given - final ObjectNode givenImpExt = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("siteId", 1) - .put("pageId", 2) - .put("formatId", 3) - .put("networkId", 73)); - - final BidRequest bidRequest = BidRequest.builder() - .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) - .build(); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - final ObjectNode expectedImpExt = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("siteId", 1) - .put("pageId", 2) - .put("formatId", 3) - .put("networkId", 73)); - - assertThat(result.getErrors()).isEmpty(); - assertThat(singleImpExt(result)).isEqualTo(expectedImpExt); - } - - @Test - public void makeHttpRequestsShouldForwardMalformedPlacementUuidVerbatim() { - // given - final ObjectNode givenImpExt = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("networkId", 73) - .put("placementuuid", "not-a-uuid")); - - final BidRequest bidRequest = BidRequest.builder() - .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) - .build(); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(singleImpExt(result).path("bidder").path("plcmtuuid").asText()).isEqualTo("not-a-uuid"); - } - - @Test - public void makeHttpRequestsShouldPutPlcmtuuidUnderSmartadserverKeyWhenProgrammaticGuaranteed() { - // given - final ObjectNode givenImpExt = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("networkId", 73) - .put("placementuuid", PLACEMENT_UUID) - .put("programmaticGuaranteed", true)); - - final BidRequest bidRequest = BidRequest.builder() - .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) - .build(); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1); - assertThat(result.getValue().getFirst().getUri()) - .isEqualTo("https://test.endpoint2.com/path/ortb?testParam=testVal"); - - final ObjectNode impExt = singleImpExt(result); - assertThat(impExt.has("bidder")).isFalse(); - assertThat(impExt.path("smartadserver").path("plcmtuuid").asText()).isEqualTo(PLACEMENT_UUID); - } - - @Test - public void makeHttpRequestsShouldKeepPlacementUuidPerImp() { - // given - final ObjectNode givenImpExt1 = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("siteId", 1) - .put("pageId", 2) - .put("formatId", 3) - .put("networkId", 73)); - final ObjectNode givenImpExt2 = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("networkId", 73) - .put("placementuuid", PLACEMENT_UUID)); - - final BidRequest bidRequest = BidRequest.builder() - .imp(List.of( - givenImp(imp -> imp.id("impId1").ext(givenImpExt1)), - givenImp(imp -> imp.id("impId2").ext(givenImpExt2)))) - .build(); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - final ObjectNode expectedImpExt1 = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("siteId", 1) - .put("pageId", 2) - .put("formatId", 3) - .put("networkId", 73)); - final ObjectNode expectedImpExt2 = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("networkId", 73) - .put("plcmtuuid", PLACEMENT_UUID)); - - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1); - assertThat(result.getValue()) - .extracting(HttpRequest::getPayload) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getExt) - .containsExactly(expectedImpExt1, expectedImpExt2); - } - - @Test - public void makeHttpRequestsShouldOmitPlcmtuuidWhenPlacementUuidIsEmpty() { - // given - final ObjectNode givenImpExt = mapper.createObjectNode() - .set("bidder", mapper.createObjectNode() - .put("networkId", 73) - .put("placementuuid", "")); - - final BidRequest bidRequest = BidRequest.builder() - .imp(singletonList(givenImp(imp -> imp.ext(givenImpExt)))) - .build(); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1); - assertThat(singleImpExt(result).path("bidder").has("plcmtuuid")).isFalse(); - } - @Test public void makeHttpRequestsShouldIgnoreInboundPlcmtuuid() { // given From b38bec3582088ad64844ec4d417419ec14b7d129 Mon Sep 17 00:00:00 2001 From: Pier-Lionel 'PL' Sgard Date: Thu, 1 Oct 2026 15:40:36 +0200 Subject: [PATCH 3/3] Smartadserver: assert placementuuid tests with the extracting chain Per review: drop the singleImpExt helper and the redundant URI assertion, and compare the whole outbound imp.ext through the same extracting(...).containsExactly(...) chain as the existing tests. Co-Authored-By: Claude Fable 5.1 --- .../SmartadserverBidderTest.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java b/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java index 347be0880fa..45807450a3b 100644 --- a/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java @@ -270,15 +270,17 @@ public void makeHttpRequestsShouldForwardPlacementUuidAsPlcmtuuid() { final Result>> result = target.makeHttpRequests(bidRequest); // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1); - assertThat(result.getValue().getFirst().getUri()) - .isEqualTo("https://test.endpoint.com/path/api/bid?testParam=testVal&callerId=5"); + final ObjectNode expectedImpExt = mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .put("networkId", 73) + .put("plcmtuuid", PLACEMENT_UUID)); - final ObjectNode bidderExt = (ObjectNode) singleImpExt(result).get("bidder"); - assertThat(bidderExt.path("plcmtuuid").asText()).isEqualTo(PLACEMENT_UUID); - assertThat(bidderExt.path("networkId").asInt()).isEqualTo(73); - assertThat(bidderExt.has("placementuuid")).isFalse(); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getExt) + .containsExactly(expectedImpExt); } @Test @@ -309,7 +311,11 @@ public void makeHttpRequestsShouldForwardPlacementUuidAndLegacyIdsWhenBothPresen .put("plcmtuuid", PLACEMENT_UUID)); assertThat(result.getErrors()).isEmpty(); - assertThat(singleImpExt(result)).isEqualTo(expectedImpExt); + assertThat(result.getValue()) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getExt) + .containsExactly(expectedImpExt); } @Test @@ -333,8 +339,11 @@ public void makeHttpRequestsShouldIgnoreInboundPlcmtuuid() { .put("networkId", 73)); assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1); - assertThat(singleImpExt(result)).isEqualTo(expectedImpExt); + assertThat(result.getValue()) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getExt) + .containsExactly(expectedImpExt); } @Test @@ -493,10 +502,6 @@ private static Imp givenImp(Function impCustomiz .build(); } - private static ObjectNode singleImpExt(Result>> result) { - return result.getValue().getFirst().getPayload().getImp().getFirst().getExt(); - } - private static BidResponse givenBidResponse(Function bidCustomizer) { return BidResponse.builder() .cur("EUR")