From 577be6175888532e4857b2e4f0a3803a64642db1 Mon Sep 17 00:00:00 2001 From: Piotr Jaworski Date: Wed, 8 Oct 2025 15:43:05 +0200 Subject: [PATCH 1/7] RTBHouse: removed imp[].pmp object and publisherId parameter copied to site.publisher.id --- .../bidder/rtbhouse/RtbhouseBidder.java | 35 +- .../bidder/rtbhouse/RtbhouseBidderTest.java | 318 ++++++++++++++++++ .../rtbhouse/test-rtbhouse-bid-request.json | 1 + 3 files changed, 352 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java b/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java index 39c269b163b..82c6db78212 100644 --- a/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java +++ b/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java @@ -5,6 +5,9 @@ import com.fasterxml.jackson.databind.JsonNode; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; +import com.iab.openrtb.request.Site; +import com.iab.openrtb.request.Publisher; +import com.iab.openrtb.request.Publisher.PublisherBuilder; import com.iab.openrtb.response.Bid; import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; @@ -60,6 +63,7 @@ public Result>> makeHttpRequests(BidRequest bidRequ final List modifiedImps = new ArrayList<>(); final List errors = new ArrayList<>(); + String publisherId = null; for (Imp imp : bidRequest.getImp()) { try { @@ -67,6 +71,10 @@ public Result>> makeHttpRequests(BidRequest bidRequ final Price bidFloorPrice = resolveBidFloor(imp, impExt, bidRequest); modifiedImps.add(modifyImp(imp, bidFloorPrice)); + // Get publisherId from first valid impExt + if (publisherId == null && impExt.getPublisherId() != null) { + publisherId = impExt.getPublisherId(); + } } catch (PreBidException e) { errors.add(BidderError.badInput(e.getMessage())); } @@ -76,11 +84,13 @@ public Result>> makeHttpRequests(BidRequest bidRequ return Result.withErrors(errors); } - final BidRequest outgoingRequest = bidRequest.toBuilder() + BidRequest outgoingRequest = bidRequest.toBuilder() .cur(Collections.singletonList(BIDDER_CURRENCY)) .imp(modifiedImps) .build(); + outgoingRequest = updateSitePublisherId(outgoingRequest, publisherId); + return Result.withValue(BidderUtil.defaultRequest(outgoingRequest, endpointUrl, mapper)); } @@ -175,10 +185,10 @@ private ExtImpRtbhouse parseImpExt(Imp imp) { } private static Imp modifyImp(Imp imp, Price bidFloorPrice) { - return imp.toBuilder() .bidfloorcur(ObjectUtil.getIfNotNull(bidFloorPrice, Price::getCurrency)) .bidfloor(ObjectUtil.getIfNotNull(bidFloorPrice, Price::getValue)) + .pmp(null) .build(); } @@ -223,4 +233,25 @@ private static Bid resolveMacros(Bid bid) { .build(); } + static BidRequest updateSitePublisherId(BidRequest bidRequest, String publisherId) { + if (bidRequest == null || publisherId == null) { + return bidRequest; + } + + final Site site = bidRequest.getSite(); + Publisher publisher = (site != null) ? site.getPublisher() : null; + + final PublisherBuilder publisherBuilder = (publisher != null) + ? publisher.toBuilder() + : Publisher.builder(); + + publisherBuilder.id(publisherId); + publisher = publisherBuilder.build(); + + final Site updatedSite = (site != null) + ? site.toBuilder().publisher(publisher).build() + : Site.builder().publisher(publisher).build(); + + return bidRequest.toBuilder().site(updatedSite).build(); + } } diff --git a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java index e6429a971d1..4a0383e6c7b 100644 --- a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java @@ -4,8 +4,12 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; +import com.iab.openrtb.request.Deal; import com.iab.openrtb.request.Imp; import com.iab.openrtb.request.Native; +import com.iab.openrtb.request.Pmp; +import com.iab.openrtb.request.Publisher; +import com.iab.openrtb.request.Site; import com.iab.openrtb.request.Video; import com.iab.openrtb.response.Bid; import com.iab.openrtb.response.BidResponse; @@ -28,6 +32,7 @@ import org.prebid.server.proto.openrtb.ext.request.rtbhouse.ExtImpRtbhouse; import java.math.BigDecimal; +import java.util.Collections; import java.util.List; import java.util.function.Function; @@ -321,6 +326,319 @@ public void makeBidsShouldReturnBidWithResolvedMacros() throws JsonProcessingExc .containsExactly(tuple("nurl:12.34", "adm:12.34")); } + @Test + public void updateSitePublisherIdShouldReturnOriginalRequestWhenPublisherIdIsNull() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(Site.builder().id("site_id").build()), + identity(), + identity()); + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, null); + + // then + assertThat(result).isSameAs(bidRequest); + } + + @Test + public void updateSitePublisherIdShouldReturnNullWhenBidRequestIsNull() { + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(null, "publisherId"); + + // then + assertThat(result).isNull(); + } + + @Test + public void updateSitePublisherIdShouldReturnOriginalRequestWhenBothParametersAreNull() { + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(null, null); + + // then + assertThat(result).isNull(); + } + + @Test + public void updateSitePublisherIdShouldCreateSiteAndPublisherWhenBidRequestHasNoSite() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(null), + identity(), + identity()); + final String publisherId = "test_publisher_id"; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result.getId()).isEqualTo("request_id"); + assertThat(result.getSite()).isNotNull(); + assertThat(result.getSite().getPublisher()).isNotNull(); + assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + } + + @Test + public void updateSitePublisherIdShouldAddPublisherToExistingSiteWhenNoPublisher() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(Site.builder() + .id("site_id") + .name("site_name") + .domain("example.com") + .page("https://example.com/page") + .publisher(null) + .build()), + identity(), + identity()); + final String publisherId = "test_publisher_id"; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result.getSite().getId()).isEqualTo("site_id"); + assertThat(result.getSite().getName()).isEqualTo("site_name"); + assertThat(result.getSite().getDomain()).isEqualTo("example.com"); + assertThat(result.getSite().getPage()).isEqualTo("https://example.com/page"); + assertThat(result.getSite().getPublisher()).isNotNull(); + assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + } + + @Test + public void updateSitePublisherIdShouldUpdateExistingPublisherId() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(Site.builder() + .id("site_id") + .publisher(Publisher.builder() + .id("old_publisher_id") + .build()) + .build()), + identity(), + identity()); + final String publisherId = "new_publisher_id"; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result.getSite().getId()).isEqualTo("site_id"); + assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + } + + @Test + public void updateSitePublisherIdShouldPreserveOtherPublisherFieldsWhenUpdatingId() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(Site.builder() + .id("site_id") + .publisher(Publisher.builder() + .id("old_publisher_id") + .name("publisher_name") + .domain("publisher.com") + .build()) + .build()), + identity(), + identity()); + final String publisherId = "new_publisher_id"; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + assertThat(result.getSite().getPublisher().getName()).isEqualTo("publisher_name"); + assertThat(result.getSite().getPublisher().getDomain()).isEqualTo("publisher.com"); + } + + @Test + public void updateSitePublisherIdShouldPreserveOtherSiteFieldsWhenAddingPublisher() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(Site.builder() + .id("site_id") + .name("site_name") + .domain("site.com") + .page("https://site.com/page") + .ref("https://referrer.com") + .build()), + identity(), + identity()); + final String publisherId = "test_publisher_id"; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result.getSite().getId()).isEqualTo("site_id"); + assertThat(result.getSite().getName()).isEqualTo("site_name"); + assertThat(result.getSite().getDomain()).isEqualTo("site.com"); + assertThat(result.getSite().getPage()).isEqualTo("https://site.com/page"); + assertThat(result.getSite().getRef()).isEqualTo("https://referrer.com"); + assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + } + + @Test + public void updateSitePublisherIdShouldPreserveOtherBidRequestFields() { + // given + final List imps = List.of( + givenImp(imp -> imp.id("imp1"), identity()), + givenImp(imp -> imp.id("imp2"), identity()) + ); + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .test(1) + .tmax(2000L) + .imp(imps) + .cur(List.of("USD", "EUR")) + .site(Site.builder().id("site_id").build()), + identity(), + identity()); + final String publisherId = "test_publisher_id"; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result.getId()).isEqualTo("request_id"); + assertThat(result.getTest()).isEqualTo(1); + assertThat(result.getTmax()).isEqualTo(2000L); + assertThat(result.getImp()).hasSize(2); + assertThat(result.getImp().get(0).getId()).isEqualTo("imp1"); + assertThat(result.getImp().get(1).getId()).isEqualTo("imp2"); + assertThat(result.getCur()).containsExactly("USD", "EUR"); + assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + } + + @Test + public void updateSitePublisherIdShouldHandleEmptyPublisherId() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(Site.builder().id("site_id").build()), + identity(), + identity()); + final String publisherId = ""; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result.getSite().getPublisher().getId()).isEqualTo(""); + } + + @Test + public void updateSitePublisherIdShouldCreateNewBidRequestInstance() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(Site.builder().id("site_id").build()), + identity(), + identity()); + final String publisherId = "test_publisher_id"; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result).isNotSameAs(bidRequest); + assertThat(result.getSite()).isNotSameAs(bidRequest.getSite()); + } + + @Test + public void updateSitePublisherIdShouldHandleComplexPublisherObject() { + // given + final BidRequest bidRequest = givenBidRequest( + bidReq -> bidReq.id("request_id") + .site(Site.builder() + .id("site_id") + .publisher(Publisher.builder() + .id("old_id") + .name("Test Publisher") + .domain("testpub.com") + .build()) + .build()), + identity(), + identity()); + final String publisherId = "complex_publisher_id_123"; + + // when + final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + + // then + assertThat(result.getSite().getPublisher().getId()).isEqualTo("complex_publisher_id_123"); + assertThat(result.getSite().getPublisher().getName()).isEqualTo("Test Publisher"); + assertThat(result.getSite().getPublisher().getDomain()).isEqualTo("testpub.com"); + } + + @Test + public void makeHttpRequestsShouldAlwaysRemovePmpField() { + // given - test with PMP containing deals + final List deals = List.of( + Deal.builder().id("deal1").build(), + Deal.builder().id("deal2").build() + ); + final BidRequest bidRequestWithDeals = givenBidRequest( + bidReq -> bidReq.id("request_id"), + imp -> imp.id("123") + .pmp(Pmp.builder() + .privateAuction(1) + .deals(deals) + .build()), + identity()); + + // given - test with null PMP + final BidRequest bidRequestWithNullPmp = givenBidRequest( + bidReq -> bidReq.id("request_id"), + imp -> imp.id("123").pmp(null), + identity()); + + // given - test with empty PMP + final BidRequest bidRequestWithEmptyPmp = givenBidRequest( + bidReq -> bidReq.id("request_id"), + imp -> imp.id("123") + .pmp(Pmp.builder() + .privateAuction(0) + .deals(Collections.emptyList()) + .build()), + identity()); + + // when + final Result>> resultWithDeals = target.makeHttpRequests(bidRequestWithDeals); + final Result>> resultWithNullPmp = target.makeHttpRequests(bidRequestWithNullPmp); + final Result>> resultWithEmptyPmp = + target.makeHttpRequests(bidRequestWithEmptyPmp); + + // then - all should have PMP completely removed (null) + assertThat(resultWithDeals.getErrors()).isEmpty(); + assertThat(resultWithDeals.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getPmp) + .containsOnlyNulls(); + + assertThat(resultWithNullPmp.getErrors()).isEmpty(); + assertThat(resultWithNullPmp.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getPmp) + .containsOnlyNulls(); + + assertThat(resultWithEmptyPmp.getErrors()).isEmpty(); + assertThat(resultWithEmptyPmp.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getPmp) + .containsOnlyNulls(); + } + private static BidResponse givenBidResponse(Function bidCustomizer) { return BidResponse.builder() .cur("USD") diff --git a/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json index c4922bee672..9f474992565 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json @@ -23,6 +23,7 @@ "domain": "www.example.com", "page": "http://www.example.com", "publisher": { + "id": "publisherId", "domain": "example.com" }, "ext": { From 071f1e2ecc3e682786f6d165433968fa3ace32a7 Mon Sep 17 00:00:00 2001 From: Piotr Jaworski Date: Tue, 21 Oct 2025 19:31:41 +0200 Subject: [PATCH 2/7] RTBHouse: align with PR review comments --- .../bidder/rtbhouse/RtbhouseBidder.java | 47 +-- .../bidder/rtbhouse/RtbhouseBidderTest.java | 304 ++++++++---------- 2 files changed, 167 insertions(+), 184 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java b/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java index 82c6db78212..5a983ba90c1 100644 --- a/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java +++ b/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java @@ -3,11 +3,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; -import com.iab.openrtb.request.Site; import com.iab.openrtb.request.Publisher; -import com.iab.openrtb.request.Publisher.PublisherBuilder; +import com.iab.openrtb.request.Site; import com.iab.openrtb.response.Bid; import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; @@ -25,6 +25,7 @@ import org.prebid.server.json.DecodeException; import org.prebid.server.json.JacksonMapper; import org.prebid.server.proto.openrtb.ext.ExtPrebid; +import org.prebid.server.proto.openrtb.ext.request.ExtPublisher; import org.prebid.server.proto.openrtb.ext.request.rtbhouse.ExtImpRtbhouse; import org.prebid.server.proto.openrtb.ext.response.BidType; import org.prebid.server.util.BidderUtil; @@ -37,6 +38,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; public class RtbhouseBidder implements Bidder { @@ -71,8 +73,7 @@ public Result>> makeHttpRequests(BidRequest bidRequ final Price bidFloorPrice = resolveBidFloor(imp, impExt, bidRequest); modifiedImps.add(modifyImp(imp, bidFloorPrice)); - // Get publisherId from first valid impExt - if (publisherId == null && impExt.getPublisherId() != null) { + if (publisherId == null) { publisherId = impExt.getPublisherId(); } } catch (PreBidException e) { @@ -84,13 +85,12 @@ public Result>> makeHttpRequests(BidRequest bidRequ return Result.withErrors(errors); } - BidRequest outgoingRequest = bidRequest.toBuilder() + final BidRequest outgoingRequest = bidRequest.toBuilder() .cur(Collections.singletonList(BIDDER_CURRENCY)) + .site(modifySite(bidRequest.getSite(), publisherId)) .imp(modifiedImps) .build(); - outgoingRequest = updateSitePublisherId(outgoingRequest, publisherId); - return Result.withValue(BidderUtil.defaultRequest(outgoingRequest, endpointUrl, mapper)); } @@ -233,25 +233,26 @@ private static Bid resolveMacros(Bid bid) { .build(); } - static BidRequest updateSitePublisherId(BidRequest bidRequest, String publisherId) { - if (bidRequest == null || publisherId == null) { - return bidRequest; - } + private Site modifySite(Site site, String publisherId) { + final ObjectNode prebidNode = mapper.mapper().createObjectNode(); + prebidNode.put("publisherId", publisherId); - final Site site = bidRequest.getSite(); - Publisher publisher = (site != null) ? site.getPublisher() : null; + final ObjectNode publisherExtNode = mapper.mapper().createObjectNode(); + publisherExtNode.set("prebid", prebidNode); - final PublisherBuilder publisherBuilder = (publisher != null) - ? publisher.toBuilder() - : Publisher.builder(); + final ExtPublisher extPublisher = mapper.mapper().convertValue(publisherExtNode, ExtPublisher.class); - publisherBuilder.id(publisherId); - publisher = publisherBuilder.build(); - - final Site updatedSite = (site != null) - ? site.toBuilder().publisher(publisher).build() - : Site.builder().publisher(publisher).build(); + final Publisher publisher = Optional.ofNullable(site) + .map(Site::getPublisher) + .map(Publisher::toBuilder) + .orElseGet(Publisher::builder) + .ext(extPublisher) + .build(); - return bidRequest.toBuilder().site(updatedSite).build(); + return Optional.ofNullable(site) + .map(Site::toBuilder) + .orElseGet(Site::builder) + .publisher(publisher) + .build(); } } diff --git a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java index 4a0383e6c7b..03b5c3a69b7 100644 --- a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java @@ -1,6 +1,7 @@ package org.prebid.server.bidder.rtbhouse; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; @@ -327,166 +328,168 @@ public void makeBidsShouldReturnBidWithResolvedMacros() throws JsonProcessingExc } @Test - public void updateSitePublisherIdShouldReturnOriginalRequestWhenPublisherIdIsNull() { + public void makeHttpRequestsShouldCreateSiteAndPublisherWhenBidRequestHasNoSite() { // given final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.id("request_id") - .site(Site.builder().id("site_id").build()), + bidReq -> bidReq.site(null), identity(), identity()); // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, null); - - // then - assertThat(result).isSameAs(bidRequest); - } - - @Test - public void updateSitePublisherIdShouldReturnNullWhenBidRequestIsNull() { - // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(null, "publisherId"); + final Result>> result = target.makeHttpRequests(bidRequest); // then - assertThat(result).isNull(); - } - - @Test - public void updateSitePublisherIdShouldReturnOriginalRequestWhenBothParametersAreNull() { - // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(null, null); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .extracting(BidRequest::getSite) + .allSatisfy(site -> { + assertThat(site).isNotNull(); + assertThat(site.getPublisher()).isNotNull(); + assertThat(site.getPublisher().getExt()).isNotNull(); - // then - assertThat(result).isNull(); + // The ext is a FlexibleExtension, so we need to access the properties + final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); + assertThat(prebidNode).isNotNull(); + assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId"); + }); } @Test - public void updateSitePublisherIdShouldCreateSiteAndPublisherWhenBidRequestHasNoSite() { + public void makeHttpRequestsShouldAddPublisherToExistingSiteWhenNoPublisher() { // given final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.id("request_id") - .site(null), + bidReq -> bidReq.site(Site.builder() + .id("site_id") + .name("site_name") + .domain("example.com") + .page("https://example.com/page") + .publisher(null) + .build()), identity(), identity()); - final String publisherId = "test_publisher_id"; // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + final Result>> result = target.makeHttpRequests(bidRequest); // then - assertThat(result.getId()).isEqualTo("request_id"); - assertThat(result.getSite()).isNotNull(); - assertThat(result.getSite().getPublisher()).isNotNull(); - assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); - } - - @Test - public void updateSitePublisherIdShouldAddPublisherToExistingSiteWhenNoPublisher() { - // given - final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.id("request_id") - .site(Site.builder() - .id("site_id") - .name("site_name") - .domain("example.com") - .page("https://example.com/page") - .publisher(null) - .build()), - identity(), - identity()); - final String publisherId = "test_publisher_id"; - - // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .extracting(BidRequest::getSite) + .allSatisfy(site -> { + assertThat(site.getId()).isEqualTo("site_id"); + assertThat(site.getName()).isEqualTo("site_name"); + assertThat(site.getDomain()).isEqualTo("example.com"); + assertThat(site.getPage()).isEqualTo("https://example.com/page"); + assertThat(site.getPublisher()).isNotNull(); - // then - assertThat(result.getSite().getId()).isEqualTo("site_id"); - assertThat(result.getSite().getName()).isEqualTo("site_name"); - assertThat(result.getSite().getDomain()).isEqualTo("example.com"); - assertThat(result.getSite().getPage()).isEqualTo("https://example.com/page"); - assertThat(result.getSite().getPublisher()).isNotNull(); - assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); + assertThat(prebidNode).isNotNull(); + assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId"); + }); } @Test - public void updateSitePublisherIdShouldUpdateExistingPublisherId() { + public void makeHttpRequestsShouldUpdateExistingPublisherId() { // given final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.id("request_id") - .site(Site.builder() - .id("site_id") - .publisher(Publisher.builder() - .id("old_publisher_id") - .build()) - .build()), + bidReq -> bidReq.site(Site.builder() + .id("site_id") + .publisher(Publisher.builder() + .id("old_publisher_id") + .build()) + .build()), identity(), identity()); - final String publisherId = "new_publisher_id"; // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + final Result>> result = target.makeHttpRequests(bidRequest); // then - assertThat(result.getSite().getId()).isEqualTo("site_id"); - assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .extracting(BidRequest::getSite) + .allSatisfy(site -> { + assertThat(site.getId()).isEqualTo("site_id"); + + final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); + assertThat(prebidNode).isNotNull(); + assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId"); + }); } @Test - public void updateSitePublisherIdShouldPreserveOtherPublisherFieldsWhenUpdatingId() { + public void makeHttpRequestsShouldPreserveOtherPublisherFieldsWhenUpdatingId() { // given final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.id("request_id") - .site(Site.builder() - .id("site_id") - .publisher(Publisher.builder() - .id("old_publisher_id") - .name("publisher_name") - .domain("publisher.com") - .build()) - .build()), + bidReq -> bidReq.site(Site.builder() + .id("site_id") + .publisher(Publisher.builder() + .id("old_publisher_id") + .name("publisher_name") + .domain("publisher.com") + .build()) + .build()), identity(), identity()); - final String publisherId = "new_publisher_id"; // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + final Result>> result = target.makeHttpRequests(bidRequest); // then - assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); - assertThat(result.getSite().getPublisher().getName()).isEqualTo("publisher_name"); - assertThat(result.getSite().getPublisher().getDomain()).isEqualTo("publisher.com"); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .extracting(BidRequest::getSite) + .allSatisfy(site -> { + final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); + assertThat(prebidNode).isNotNull(); + assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId"); + assertThat(site.getPublisher().getId()).isEqualTo("old_publisher_id"); + assertThat(site.getPublisher().getName()).isEqualTo("publisher_name"); + assertThat(site.getPublisher().getDomain()).isEqualTo("publisher.com"); + }); } @Test - public void updateSitePublisherIdShouldPreserveOtherSiteFieldsWhenAddingPublisher() { + public void makeHttpRequestsShouldPreserveOtherSiteFieldsWhenAddingPublisher() { // given final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.id("request_id") - .site(Site.builder() - .id("site_id") - .name("site_name") - .domain("site.com") - .page("https://site.com/page") - .ref("https://referrer.com") - .build()), + bidReq -> bidReq.site(Site.builder() + .id("site_id") + .name("site_name") + .domain("site.com") + .page("https://site.com/page") + .ref("https://referrer.com") + .build()), identity(), identity()); - final String publisherId = "test_publisher_id"; // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + final Result>> result = target.makeHttpRequests(bidRequest); // then - assertThat(result.getSite().getId()).isEqualTo("site_id"); - assertThat(result.getSite().getName()).isEqualTo("site_name"); - assertThat(result.getSite().getDomain()).isEqualTo("site.com"); - assertThat(result.getSite().getPage()).isEqualTo("https://site.com/page"); - assertThat(result.getSite().getRef()).isEqualTo("https://referrer.com"); - assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .extracting(BidRequest::getSite) + .allSatisfy(site -> { + assertThat(site.getId()).isEqualTo("site_id"); + assertThat(site.getName()).isEqualTo("site_name"); + assertThat(site.getDomain()).isEqualTo("site.com"); + assertThat(site.getPage()).isEqualTo("https://site.com/page"); + assertThat(site.getRef()).isEqualTo("https://referrer.com"); + + final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); + assertThat(prebidNode).isNotNull(); + assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId"); + }); } @Test - public void updateSitePublisherIdShouldPreserveOtherBidRequestFields() { + public void makeHttpRequestsShouldPreserveOtherBidRequestFields() { // given final List imps = List.of( givenImp(imp -> imp.id("imp1"), identity()), @@ -501,81 +504,60 @@ public void updateSitePublisherIdShouldPreserveOtherBidRequestFields() { .site(Site.builder().id("site_id").build()), identity(), identity()); - final String publisherId = "test_publisher_id"; // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); - - // then - assertThat(result.getId()).isEqualTo("request_id"); - assertThat(result.getTest()).isEqualTo(1); - assertThat(result.getTmax()).isEqualTo(2000L); - assertThat(result.getImp()).hasSize(2); - assertThat(result.getImp().get(0).getId()).isEqualTo("imp1"); - assertThat(result.getImp().get(1).getId()).isEqualTo("imp2"); - assertThat(result.getCur()).containsExactly("USD", "EUR"); - assertThat(result.getSite().getPublisher().getId()).isEqualTo(publisherId); - } - - @Test - public void updateSitePublisherIdShouldHandleEmptyPublisherId() { - // given - final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.id("request_id") - .site(Site.builder().id("site_id").build()), - identity(), - identity()); - final String publisherId = ""; - - // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + final Result>> result = target.makeHttpRequests(bidRequest); // then - assertThat(result.getSite().getPublisher().getId()).isEqualTo(""); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .allSatisfy(request -> { + assertThat(request.getId()).isEqualTo("request_id"); + assertThat(request.getTest()).isEqualTo(1); + assertThat(request.getTmax()).isEqualTo(2000L); + assertThat(request.getImp()).hasSize(2); + assertThat(request.getImp().get(0).getId()).isEqualTo("imp1"); + assertThat(request.getImp().get(1).getId()).isEqualTo("imp2"); + assertThat(request.getCur()).containsExactly("USD"); + + final JsonNode prebidNode = request.getSite().getPublisher().getExt() + .getProperty("prebid"); + assertThat(prebidNode).isNotNull(); + assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId"); + }); } @Test - public void updateSitePublisherIdShouldCreateNewBidRequestInstance() { + public void makeHttpRequestsShouldUsePublisherIdFromFirstImp() { // given + final List imps = List.of( + givenImp(imp -> imp.id("imp1"), + ext -> ext.publisherId("first_publisher_id")), + givenImp(imp -> imp.id("imp2"), + ext -> ext.publisherId("second_publisher_id")) + ); final BidRequest bidRequest = givenBidRequest( bidReq -> bidReq.id("request_id") + .imp(imps) .site(Site.builder().id("site_id").build()), identity(), identity()); - final String publisherId = "test_publisher_id"; - - // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); - - // then - assertThat(result).isNotSameAs(bidRequest); - assertThat(result.getSite()).isNotSameAs(bidRequest.getSite()); - } - - @Test - public void updateSitePublisherIdShouldHandleComplexPublisherObject() { - // given - final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.id("request_id") - .site(Site.builder() - .id("site_id") - .publisher(Publisher.builder() - .id("old_id") - .name("Test Publisher") - .domain("testpub.com") - .build()) - .build()), - identity(), - identity()); - final String publisherId = "complex_publisher_id_123"; // when - final BidRequest result = RtbhouseBidder.updateSitePublisherId(bidRequest, publisherId); + final Result>> result = target.makeHttpRequests(bidRequest); // then - assertThat(result.getSite().getPublisher().getId()).isEqualTo("complex_publisher_id_123"); - assertThat(result.getSite().getPublisher().getName()).isEqualTo("Test Publisher"); - assertThat(result.getSite().getPublisher().getDomain()).isEqualTo("testpub.com"); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .extracting(BidRequest::getSite) + .allSatisfy(site -> { + final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); + assertThat(prebidNode).isNotNull(); + assertThat(prebidNode.get("publisherId").asText()) + .isEqualTo("first_publisher_id"); + }); } @Test From 7f546cf1fc49c092df14a7fbc038aff1b18c2261 Mon Sep 17 00:00:00 2001 From: Piotr Jaworski Date: Tue, 21 Oct 2025 19:47:52 +0200 Subject: [PATCH 3/7] RTBHouse: Fix publisher extension property assignment --- .../org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java b/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java index 5a983ba90c1..f2228778feb 100644 --- a/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java +++ b/src/main/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidder.java @@ -237,10 +237,8 @@ private Site modifySite(Site site, String publisherId) { final ObjectNode prebidNode = mapper.mapper().createObjectNode(); prebidNode.put("publisherId", publisherId); - final ObjectNode publisherExtNode = mapper.mapper().createObjectNode(); - publisherExtNode.set("prebid", prebidNode); - - final ExtPublisher extPublisher = mapper.mapper().convertValue(publisherExtNode, ExtPublisher.class); + final ExtPublisher extPublisher = ExtPublisher.empty(); + extPublisher.addProperty("prebid", prebidNode); final Publisher publisher = Optional.ofNullable(site) .map(Site::getPublisher) From eff67507db2ef0b23609dc092f84c467c3eb03ac Mon Sep 17 00:00:00 2001 From: Piotr Jaworski Date: Tue, 21 Oct 2025 20:01:09 +0200 Subject: [PATCH 4/7] RTBHouse: fixed a test bid request file to align with recent updates --- .../it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json index 9f474992565..e63afde3937 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-rtbhouse-bid-request.json @@ -23,8 +23,12 @@ "domain": "www.example.com", "page": "http://www.example.com", "publisher": { - "id": "publisherId", - "domain": "example.com" + "domain": "example.com", + "ext": { + "prebid": { + "publisherId": "publisherId" + } + } }, "ext": { "amp": 0 From 847aca23fc01b4c8aaccc19722d747b2380d9d00 Mon Sep 17 00:00:00 2001 From: Piotr Jaworski Date: Mon, 27 Oct 2025 15:29:10 +0100 Subject: [PATCH 5/7] RTBHouse: removed obsolete tests and fixed minor bugs --- .../bidder/rtbhouse/RtbhouseBidderTest.java | 119 ++---------------- 1 file changed, 9 insertions(+), 110 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java index 03b5c3a69b7..b10d6a27b25 100644 --- a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java @@ -390,36 +390,6 @@ public void makeHttpRequestsShouldAddPublisherToExistingSiteWhenNoPublisher() { }); } - @Test - public void makeHttpRequestsShouldUpdateExistingPublisherId() { - // given - final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.site(Site.builder() - .id("site_id") - .publisher(Publisher.builder() - .id("old_publisher_id") - .build()) - .build()), - identity(), - identity()); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1) - .extracting(HttpRequest::getPayload) - .extracting(BidRequest::getSite) - .allSatisfy(site -> { - assertThat(site.getId()).isEqualTo("site_id"); - - final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); - assertThat(prebidNode).isNotNull(); - assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId"); - }); - } - @Test public void makeHttpRequestsShouldPreserveOtherPublisherFieldsWhenUpdatingId() { // given @@ -453,48 +423,12 @@ public void makeHttpRequestsShouldPreserveOtherPublisherFieldsWhenUpdatingId() { }); } - @Test - public void makeHttpRequestsShouldPreserveOtherSiteFieldsWhenAddingPublisher() { - // given - final BidRequest bidRequest = givenBidRequest( - bidReq -> bidReq.site(Site.builder() - .id("site_id") - .name("site_name") - .domain("site.com") - .page("https://site.com/page") - .ref("https://referrer.com") - .build()), - identity(), - identity()); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).hasSize(1) - .extracting(HttpRequest::getPayload) - .extracting(BidRequest::getSite) - .allSatisfy(site -> { - assertThat(site.getId()).isEqualTo("site_id"); - assertThat(site.getName()).isEqualTo("site_name"); - assertThat(site.getDomain()).isEqualTo("site.com"); - assertThat(site.getPage()).isEqualTo("https://site.com/page"); - assertThat(site.getRef()).isEqualTo("https://referrer.com"); - - final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); - assertThat(prebidNode).isNotNull(); - assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId"); - }); - } - @Test public void makeHttpRequestsShouldPreserveOtherBidRequestFields() { // given final List imps = List.of( givenImp(imp -> imp.id("imp1"), identity()), - givenImp(imp -> imp.id("imp2"), identity()) - ); + givenImp(imp -> imp.id("imp2"), identity())); final BidRequest bidRequest = givenBidRequest( bidReq -> bidReq.id("request_id") .test(1) @@ -535,8 +469,7 @@ public void makeHttpRequestsShouldUsePublisherIdFromFirstImp() { givenImp(imp -> imp.id("imp1"), ext -> ext.publisherId("first_publisher_id")), givenImp(imp -> imp.id("imp2"), - ext -> ext.publisherId("second_publisher_id")) - ); + ext -> ext.publisherId("second_publisher_id"))); final BidRequest bidRequest = givenBidRequest( bidReq -> bidReq.id("request_id") .imp(imps) @@ -562,12 +495,11 @@ public void makeHttpRequestsShouldUsePublisherIdFromFirstImp() { @Test public void makeHttpRequestsShouldAlwaysRemovePmpField() { - // given - test with PMP containing deals + // given final List deals = List.of( Deal.builder().id("deal1").build(), - Deal.builder().id("deal2").build() - ); - final BidRequest bidRequestWithDeals = givenBidRequest( + Deal.builder().id("deal2").build()); + final BidRequest bidRequest = givenBidRequest( bidReq -> bidReq.id("request_id"), imp -> imp.id("123") .pmp(Pmp.builder() @@ -576,45 +508,12 @@ public void makeHttpRequestsShouldAlwaysRemovePmpField() { .build()), identity()); - // given - test with null PMP - final BidRequest bidRequestWithNullPmp = givenBidRequest( - bidReq -> bidReq.id("request_id"), - imp -> imp.id("123").pmp(null), - identity()); - - // given - test with empty PMP - final BidRequest bidRequestWithEmptyPmp = givenBidRequest( - bidReq -> bidReq.id("request_id"), - imp -> imp.id("123") - .pmp(Pmp.builder() - .privateAuction(0) - .deals(Collections.emptyList()) - .build()), - identity()); - // when - final Result>> resultWithDeals = target.makeHttpRequests(bidRequestWithDeals); - final Result>> resultWithNullPmp = target.makeHttpRequests(bidRequestWithNullPmp); - final Result>> resultWithEmptyPmp = - target.makeHttpRequests(bidRequestWithEmptyPmp); - - // then - all should have PMP completely removed (null) - assertThat(resultWithDeals.getErrors()).isEmpty(); - assertThat(resultWithDeals.getValue()).hasSize(1) - .extracting(HttpRequest::getPayload) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getPmp) - .containsOnlyNulls(); - - assertThat(resultWithNullPmp.getErrors()).isEmpty(); - assertThat(resultWithNullPmp.getValue()).hasSize(1) - .extracting(HttpRequest::getPayload) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getPmp) - .containsOnlyNulls(); + final Result>> result = target.makeHttpRequests(bidRequest); - assertThat(resultWithEmptyPmp.getErrors()).isEmpty(); - assertThat(resultWithEmptyPmp.getValue()).hasSize(1) + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1) .extracting(HttpRequest::getPayload) .flatExtracting(BidRequest::getImp) .extracting(Imp::getPmp) From 1b46b41421b539c33517b7d7f1aa9946bce5f766 Mon Sep 17 00:00:00 2001 From: Piotr Jaworski Date: Mon, 27 Oct 2025 15:32:06 +0100 Subject: [PATCH 6/7] RTBHouse: unused import removed --- .../org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java index b10d6a27b25..664eb3fe934 100644 --- a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java @@ -33,7 +33,6 @@ import org.prebid.server.proto.openrtb.ext.request.rtbhouse.ExtImpRtbhouse; import java.math.BigDecimal; -import java.util.Collections; import java.util.List; import java.util.function.Function; From 4fa9815eeb5638fce906ca614f3ae02b6092e7d9 Mon Sep 17 00:00:00 2001 From: Piotr Jaworski Date: Mon, 27 Oct 2025 15:35:23 +0100 Subject: [PATCH 7/7] RTBHouse: comment removed --- .../org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java index 664eb3fe934..fe10dad45e3 100644 --- a/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/rtbhouse/RtbhouseBidderTest.java @@ -347,7 +347,6 @@ public void makeHttpRequestsShouldCreateSiteAndPublisherWhenBidRequestHasNoSite( assertThat(site.getPublisher()).isNotNull(); assertThat(site.getPublisher().getExt()).isNotNull(); - // The ext is a FlexibleExtension, so we need to access the properties final JsonNode prebidNode = site.getPublisher().getExt().getProperty("prebid"); assertThat(prebidNode).isNotNull(); assertThat(prebidNode.get("publisherId").asText()).isEqualTo("publisherId");