From ee6d8f2bbb82b49b39cb053087a0bcb048147860 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 12:31:24 +0100 Subject: [PATCH 01/18] add basic native support for openx bidder --- .../server/bidder/openx/OpenxBidder.java | 42 ++++++++++++++++--- .../bidder/openx/model/OpenxImpType.java | 2 +- .../server/bidder/openx/OpenxBidderTest.java | 27 ++---------- 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index 2ef79d3bfd4..63ef19531d5 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -72,9 +72,12 @@ public Result>> makeHttpRequests(BidRequest bidRequ .collect(Collectors.groupingBy(OpenxBidder::resolveImpType)); final List processingErrors = new ArrayList<>(); - final List outgoingRequests = makeRequests(bidRequest, + final List outgoingRequests = makeRequests( + bidRequest, differentiatedImps.get(OpenxImpType.banner), - differentiatedImps.get(OpenxImpType.video), processingErrors); + differentiatedImps.get(OpenxImpType.video), + differentiatedImps.get(OpenxImpType.xNative), + processingErrors); final List errors = errors(differentiatedImps.get(OpenxImpType.other), processingErrors); @@ -101,8 +104,12 @@ public Result> makeBids(BidderCall httpCall, BidRequ return Result.withError(BidderError.generic("Deprecated adapter method invoked")); } - private List makeRequests(BidRequest bidRequest, List bannerImps, List videoImps, - List errors) { + private List makeRequests( + BidRequest bidRequest, + List bannerImps, + List videoImps, + List nativeImps, + List errors) { final List bidRequests = new ArrayList<>(); // single request for all banner imps final BidRequest bannerRequest = createSingleRequest(bannerImps, bidRequest, errors); @@ -118,6 +125,12 @@ private List makeRequests(BidRequest bidRequest, List bannerImp .filter(Objects::nonNull) .toList()); } + + // single request for all native imps + final BidRequest nativeRequest = createSingleRequest(nativeImps, bidRequest, errors); + if (nativeRequest != null) { + bidRequests.add(nativeRequest); + } return bidRequests; } @@ -128,16 +141,33 @@ private static OpenxImpType resolveImpType(Imp imp) { if (imp.getVideo() != null) { return OpenxImpType.video; } + if (imp.getXNative() != null) { + return OpenxImpType.xNative; + } return OpenxImpType.other; } + private static BidType resolveBidType(Imp imp) { + if (imp.getBanner() != null) { + return BidType.banner; + } + if (imp.getVideo() != null) { + return BidType.video; + } + if (imp.getXNative() != null) { + return BidType.xNative; + } + return BidType.banner; + } + private List errors(List notSupportedImps, List processingErrors) { final List errors = new ArrayList<>(); // add errors for imps with unsupported media types if (CollectionUtils.isNotEmpty(notSupportedImps)) { errors.addAll( notSupportedImps.stream() - .map(imp -> "OpenX only supports banner and video imps. Ignoring imp id=" + imp.getId()) + .map(imp -> + "OpenX only supports banner, video and native imps. Ignoring imp id=" + imp.getId()) .map(BidderError::badInput) .toList()); } @@ -276,7 +306,7 @@ private static ExtBidPrebidVideo getVideoInfo(Bid bid) { private static Map impIdToBidType(BidRequest bidRequest) { return bidRequest.getImp().stream() - .collect(Collectors.toMap(Imp::getId, imp -> imp.getBanner() != null ? BidType.banner : BidType.video)); + .collect(Collectors.toMap(Imp::getId, OpenxBidder::resolveBidType)); } private static BidType getBidType(Bid bid, Map impIdToBidType) { diff --git a/src/main/java/org/prebid/server/bidder/openx/model/OpenxImpType.java b/src/main/java/org/prebid/server/bidder/openx/model/OpenxImpType.java index 7d9dfb4e5d5..c872e7f97e6 100644 --- a/src/main/java/org/prebid/server/bidder/openx/model/OpenxImpType.java +++ b/src/main/java/org/prebid/server/bidder/openx/model/OpenxImpType.java @@ -3,7 +3,7 @@ public enum OpenxImpType { // supported - banner, video, + banner, video, xNative, // not supported other } diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 1f218984f91..a8fbd140391 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -7,7 +7,6 @@ import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; -import com.iab.openrtb.request.Native; import com.iab.openrtb.request.Regs; import com.iab.openrtb.request.User; import com.iab.openrtb.request.Video; @@ -91,30 +90,10 @@ public void makeHttpRequestsShouldReturnResultWithErrorWhenAudioImpsPresent() { assertThat(result.getValue()).isEmpty(); assertThat(result.getErrors()).hasSize(2) .containsExactly( - BidderError.badInput("OpenX only supports banner and video imps. Ignoring imp id=impId1"), BidderError.badInput( - "OpenX only supports banner and video imps. Ignoring imp id=impId2")); - } - - @Test - public void makeHttpRequestsShouldReturnResultWithErrorWhenNativeImpsPresent() { - // given - final BidRequest bidRequest = BidRequest.builder() - .imp(asList( - Imp.builder().id("impId1").xNative(Native.builder().build()).build(), - Imp.builder().id("impId2").xNative(Native.builder().build()).build())) - .build(); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getValue()).isEmpty(); - assertThat(result.getErrors()).hasSize(2) - .containsExactly( - BidderError.badInput("OpenX only supports banner and video imps. Ignoring imp id=impId1"), + "OpenX only supports banner, video and native imps. Ignoring imp id=impId1"), BidderError.badInput( - "OpenX only supports banner and video imps. Ignoring imp id=impId2")); + "OpenX only supports banner, video and native imps. Ignoring imp id=impId2")); } @Test @@ -254,7 +233,7 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { // then assertThat(result.getErrors()).hasSize(1) .containsExactly(BidderError.badInput( - "OpenX only supports banner and video imps. Ignoring imp id=impId1")); + "OpenX only supports banner, video and native imps. Ignoring imp id=impId1")); assertThat(result.getValue()).hasSize(3) .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) From 55cbecfa7abe923038018e759ef46c5c5072a34e Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 12:41:46 +0100 Subject: [PATCH 02/18] test change --- .../java/org/prebid/server/bidder/openx/OpenxBidderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index a8fbd140391..71f13094c61 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -230,7 +230,7 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { // when final Result>> result = target.makeHttpRequests(bidRequest); - // then + // then 2 assertThat(result.getErrors()).hasSize(1) .containsExactly(BidderError.badInput( "OpenX only supports banner, video and native imps. Ignoring imp id=impId1")); From b8355a25842ed5d02eb028096cfe92b957e59cc6 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 13:35:56 +0100 Subject: [PATCH 03/18] extend makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() with native imps --- .../server/bidder/openx/OpenxBidderTest.java | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 71f13094c61..b652bfbc1a9 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -7,6 +7,7 @@ import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; +import com.iab.openrtb.request.Native; import com.iab.openrtb.request.Regs; import com.iab.openrtb.request.User; import com.iab.openrtb.request.Video; @@ -221,6 +222,24 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { .customParams(givenCustomParams("foo4", "bar4")) .platform("PLATFORM") .unit("555555").build()))).build(), + Imp.builder() + .id("impId5") + .xNative(Native.builder().build()) + .ext(mapper.valueToTree( + ExtPrebid.of(null, + ExtImpOpenx.builder() + .customParams(givenCustomParams("foo5", "bar5")) + .delDomain("se-demo-d.openx.net") + .unit("5").build()))).build(), + Imp.builder() + .id("impId6") + .xNative(Native.builder().build()) + .ext(mapper.valueToTree( + ExtPrebid.of(null, + ExtImpOpenx.builder() + .customParams(givenCustomParams("foo6", "bar6")) + .delDomain("se-demo-d.openx.net") + .unit("6").build()))).build(), Imp.builder().id("impId1").audio(Audio.builder().build()).build())) .user(User.builder().ext(ExtUser.builder().consent("consent").build()).build()) @@ -235,7 +254,7 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { .containsExactly(BidderError.badInput( "OpenX only supports banner, video and native imps. Ignoring imp id=impId1")); - assertThat(result.getValue()).hasSize(3) + assertThat(result.getValue()).hasSize(4) .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) .containsExactly( // check if all banner imps are part of single bidRequest @@ -320,6 +339,38 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { .ext(ExtUser.builder().consent("consent").build()) .build()) .regs(Regs.builder().coppa(0).ext(ExtRegs.of(1, null, null, null)).build()) + .build(), + // check if all native imps are part of single bidRequest + BidRequest.builder() + .id("bidRequestId") + .imp(asList( + Imp.builder() + .id("impId5") + .tagid("5") + .xNative(Native.builder().build()) + .ext(mapper.valueToTree( + ExtImpOpenx.builder() + .customParams( + givenCustomParams("foo5", "bar5")) + .build())) + .build(), + Imp.builder() + .id("impId6") + .tagid("6") + .xNative(Native.builder().build()) + .ext(mapper.valueToTree( + ExtImpOpenx.builder() + .customParams( + givenCustomParams("foo6", "bar6")) + .build())) + .build())) + .ext(jacksonMapper.fillExtension( + ExtRequest.empty(), + OpenxRequestExt.of("se-demo-d.openx.net", null, "hb_pbs_1.0.0"))) + .user(User.builder() + .ext(ExtUser.builder().consent("consent").build()) + .build()) + .regs(Regs.builder().coppa(0).ext(ExtRegs.of(1, null, null, null)).build()) .build()); } From 64a5771cf7aa65831b8a5b699a92bed8e17782be Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 13:37:09 +0100 Subject: [PATCH 04/18] extend makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() with native imps 2 --- .../java/org/prebid/server/bidder/openx/OpenxBidderTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index b652bfbc1a9..40e46a2ca7d 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -224,7 +224,7 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { .unit("555555").build()))).build(), Imp.builder() .id("impId5") - .xNative(Native.builder().build()) + .xNative(Native.builder().request("{\"testreq\":1}").build()) .ext(mapper.valueToTree( ExtPrebid.of(null, ExtImpOpenx.builder() @@ -347,7 +347,7 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { Imp.builder() .id("impId5") .tagid("5") - .xNative(Native.builder().build()) + .xNative(Native.builder().request("{\"testreq\":1}").build()) .ext(mapper.valueToTree( ExtImpOpenx.builder() .customParams( From 73c19ca8b0203437ab748c07e42e9b022e5cfeb1 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 13:39:15 +0100 Subject: [PATCH 05/18] add native to the list of supported media types --- src/main/resources/bidder-config/openx.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/bidder-config/openx.yaml b/src/main/resources/bidder-config/openx.yaml index 9e8454131d4..a504fcdf8fd 100644 --- a/src/main/resources/bidder-config/openx.yaml +++ b/src/main/resources/bidder-config/openx.yaml @@ -8,9 +8,11 @@ adapters: app-media-types: - banner - video + - native site-media-types: - banner - video + - native supported-vendors: vendor-id: 69 usersync: From 36c67604c1e6ea4b99be7fc6d6e43fea840c5035 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 15:36:34 +0100 Subject: [PATCH 06/18] add makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultipleNativeImps() --- .../server/bidder/openx/OpenxBidderTest.java | 63 ++++++++++++------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 40e46a2ca7d..9d3ccda3ed8 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -222,24 +222,6 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { .customParams(givenCustomParams("foo4", "bar4")) .platform("PLATFORM") .unit("555555").build()))).build(), - Imp.builder() - .id("impId5") - .xNative(Native.builder().request("{\"testreq\":1}").build()) - .ext(mapper.valueToTree( - ExtPrebid.of(null, - ExtImpOpenx.builder() - .customParams(givenCustomParams("foo5", "bar5")) - .delDomain("se-demo-d.openx.net") - .unit("5").build()))).build(), - Imp.builder() - .id("impId6") - .xNative(Native.builder().build()) - .ext(mapper.valueToTree( - ExtPrebid.of(null, - ExtImpOpenx.builder() - .customParams(givenCustomParams("foo6", "bar6")) - .delDomain("se-demo-d.openx.net") - .unit("6").build()))).build(), Imp.builder().id("impId1").audio(Audio.builder().build()).build())) .user(User.builder().ext(ExtUser.builder().consent("consent").build()).build()) @@ -249,12 +231,12 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { // when final Result>> result = target.makeHttpRequests(bidRequest); - // then 2 + // then assertThat(result.getErrors()).hasSize(1) .containsExactly(BidderError.badInput( "OpenX only supports banner, video and native imps. Ignoring imp id=impId1")); - assertThat(result.getValue()).hasSize(4) + assertThat(result.getValue()).hasSize(3) .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) .containsExactly( // check if all banner imps are part of single bidRequest @@ -339,7 +321,46 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { .ext(ExtUser.builder().consent("consent").build()) .build()) .regs(Regs.builder().coppa(0).ext(ExtRegs.of(1, null, null, null)).build()) - .build(), + .build()); + } + + @Test + public void makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultipleNativeImps() { + // given + final BidRequest bidRequest = BidRequest.builder() + .id("bidRequestId") + .imp(asList( + Imp.builder() + .id("impId5") + .xNative(Native.builder().request("{\"testreq\":1}").build()) + .ext(mapper.valueToTree( + ExtPrebid.of(null, + ExtImpOpenx.builder() + .customParams(givenCustomParams("foo5", "bar5")) + .delDomain("se-demo-d.openx.net") + .unit("5").build()))).build(), + Imp.builder() + .id("impId6") + .xNative(Native.builder().build()) + .ext(mapper.valueToTree( + ExtPrebid.of(null, + ExtImpOpenx.builder() + .customParams(givenCustomParams("foo6", "bar6")) + .delDomain("se-demo-d.openx.net") + .unit("6").build()))).build())) + .user(User.builder().ext(ExtUser.builder().consent("consent").build()).build()) + .regs(Regs.builder().coppa(0).ext(ExtRegs.of(1, null, null, null)).build()) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + + assertThat(result.getValue()).hasSize(1) + .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) + .containsExactly( // check if all native imps are part of single bidRequest BidRequest.builder() .id("bidRequestId") From 5feebf41b2429a351e415aa0e1a9381da3d04c33 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 16:09:36 +0100 Subject: [PATCH 07/18] create a single bidrequest for multiple banner & native imps --- .../server/bidder/openx/OpenxBidder.java | 19 ++++++++--------- .../server/bidder/openx/OpenxBidderTest.java | 21 ++++++++++++++++++- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index 63ef19531d5..ef2ef9e02a5 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -44,6 +44,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; public class OpenxBidder implements Bidder { @@ -111,10 +112,14 @@ private List makeRequests( List nativeImps, List errors) { final List bidRequests = new ArrayList<>(); - // single request for all banner imps - final BidRequest bannerRequest = createSingleRequest(bannerImps, bidRequest, errors); - if (bannerRequest != null) { - bidRequests.add(bannerRequest); + // single request for all banner and native imps + var bannerAndNativeImps = Stream.of(bannerImps, nativeImps) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .toList(); + final BidRequest bannerAndNativeImpsRequest = createSingleRequest(bannerAndNativeImps, bidRequest, errors); + if (bannerAndNativeImpsRequest != null) { + bidRequests.add(bannerAndNativeImpsRequest); } if (CollectionUtils.isNotEmpty(videoImps)) { @@ -125,12 +130,6 @@ private List makeRequests( .filter(Objects::nonNull) .toList()); } - - // single request for all native imps - final BidRequest nativeRequest = createSingleRequest(nativeImps, bidRequest, errors); - if (nativeRequest != null) { - bidRequests.add(nativeRequest); - } return bidRequests; } diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 9d3ccda3ed8..0be20a9e0d1 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -325,11 +325,20 @@ public void makeHttpRequestsShouldReturnResultWithExpectedFieldsSet() { } @Test - public void makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultipleNativeImps() { + public void makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultipleBannerAndNativeImps() { // given final BidRequest bidRequest = BidRequest.builder() .id("bidRequestId") .imp(asList( + Imp.builder() + .id("impId4") + .banner(Banner.builder().build()) + .ext(mapper.valueToTree( + ExtPrebid.of(null, + ExtImpOpenx.builder() + .customParams(givenCustomParams("foo4", "bar4")) + .delDomain("se-demo-d.openx.net") + .unit("4").build()))).build(), Imp.builder() .id("impId5") .xNative(Native.builder().request("{\"testreq\":1}").build()) @@ -365,6 +374,16 @@ public void makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultipleNat BidRequest.builder() .id("bidRequestId") .imp(asList( + Imp.builder() + .id("impId4") + .tagid("4") + .banner(Banner.builder().build()) + .ext(mapper.valueToTree( + ExtImpOpenx.builder() + .customParams( + givenCustomParams("foo4", "bar4")) + .build())) + .build(), Imp.builder() .id("impId5") .tagid("5") From 4955517eecd8271f8168cdb528be4124e85134a7 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 16:15:05 +0100 Subject: [PATCH 08/18] fix linter --- src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index ef2ef9e02a5..7830536ef25 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -113,7 +113,7 @@ private List makeRequests( List errors) { final List bidRequests = new ArrayList<>(); // single request for all banner and native imps - var bannerAndNativeImps = Stream.of(bannerImps, nativeImps) + final var bannerAndNativeImps = Stream.of(bannerImps, nativeImps) .filter(Objects::nonNull) .flatMap(Collection::stream) .toList(); From 39e4183d9ce3f24b4503724dcb547cfa4344314a Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 23 Dec 2024 16:19:10 +0100 Subject: [PATCH 09/18] fix comment --- .../java/org/prebid/server/bidder/openx/OpenxBidderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 0be20a9e0d1..e578834f869 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -370,7 +370,7 @@ public void makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultipleBan assertThat(result.getValue()).hasSize(1) .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) .containsExactly( - // check if all native imps are part of single bidRequest + // check if all native and banner imps are part of single bidRequest BidRequest.builder() .id("bidRequestId") .imp(asList( From 24f755f5ad9c7af7f77ad45972ae1a43bd11ff19 Mon Sep 17 00:00:00 2001 From: KarolSzawlisOpenx Date: Fri, 27 Dec 2024 10:32:56 +0100 Subject: [PATCH 10/18] add it test for native --- .../java/org/prebid/server/it/OpenxTest.java | 8 ++--- .../openrtb2/openx/test-native-request.json | 31 +++++++++++++++++++ .../openrtb2/openx/test-native-response.json | 23 ++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-request.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-response.json diff --git a/src/test/java/org/prebid/server/it/OpenxTest.java b/src/test/java/org/prebid/server/it/OpenxTest.java index 473bc5c296b..c157e355b18 100644 --- a/src/test/java/org/prebid/server/it/OpenxTest.java +++ b/src/test/java/org/prebid/server/it/OpenxTest.java @@ -19,14 +19,14 @@ public class OpenxTest extends IntegrationTest { public void openrtb2AuctionShouldRespondWithBidsFromOpenx() throws IOException, JSONException { // given WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/openx-exchange")) - .withRequestBody(equalToJson(jsonFrom("openrtb2/openx/test-openx-bid-request.json"))) - .willReturn(aResponse().withBody(jsonFrom("openrtb2/openx/test-openx-bid-response.json")))); + .withRequestBody(equalToJson(jsonFrom("openrtb2/openx/test-native-request.json"))) + .willReturn(aResponse().withBody(jsonFrom("openrtb2/openx/test-native-response.json")))); // when - final Response response = responseFor("openrtb2/openx/test-auction-openx-request.json", + final Response response = responseFor("openrtb2/openx/test-native-response.json", Endpoint.openrtb2_auction); // then - assertJsonEquals("openrtb2/openx/test-auction-openx-response.json", response, singletonList("openx")); + assertJsonEquals("openrtb2/openx/test-native-response.json", response, singletonList("openx")); } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-request.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-request.json new file mode 100644 index 00000000000..a019adffee1 --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-request.json @@ -0,0 +1,31 @@ +{ + "id": "bidRequestId", + "imp": [ + { + "id": "impId1", + "native": { + "request": "{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200}}]}" + }, + "ext": { + "bidder": { + "customParams": { + "foo": "bar" + }, + "unit": "123456", + "delDomain": "se-demo-d.openx.net" + } + } + } + ], + "user": { + "ext": { + "consent": "consentString" + } + }, + "regs": { + "coppa": 0, + "ext": { + "gdpr": 1 + } + } +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-response.json new file mode 100644 index 00000000000..8292b1504d7 --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-response.json @@ -0,0 +1,23 @@ +{ + "id": "bidRequestId", + "seatbid": [ + { + "bid": [ + { + "id": "bidId1", + "impid": "impId1", + "price": 1.5, + "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"url\":\"https://example.com/image.jpg\",\"w\":200,\"h\":200}}],\"link\":{\"url\":\"https://example.com/click\"},\"imptrackers\":[\"https://example.com/impression\"]}}", + "adomain": ["example.com"], + "iurl": "https://example.com/image.jpg", + "cid": "campaignId1", + "crid": "creativeId1", + "dealid": "dealId1", + "w": 200, + "h": 200 + } + ] + } + ], + "cur": "USD" +} From c97618ba08a67964584399365e767fdc8238740e Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Fri, 27 Dec 2024 11:20:41 +0100 Subject: [PATCH 11/18] add openrtb2AuctionWithNativeShouldRespondWithBidsFromOpenx() --- .../java/org/prebid/server/it/OpenxTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/prebid/server/it/OpenxTest.java b/src/test/java/org/prebid/server/it/OpenxTest.java index c157e355b18..acbb6015bef 100644 --- a/src/test/java/org/prebid/server/it/OpenxTest.java +++ b/src/test/java/org/prebid/server/it/OpenxTest.java @@ -17,13 +17,28 @@ public class OpenxTest extends IntegrationTest { @Test public void openrtb2AuctionShouldRespondWithBidsFromOpenx() throws IOException, JSONException { + // given + WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/openx-exchange")) + .withRequestBody(equalToJson(jsonFrom("openrtb2/openx/test-openx-bid-request.json"))) + .willReturn(aResponse().withBody(jsonFrom("openrtb2/openx/test-openx-bid-response.json")))); + + // when + final Response response = responseFor("openrtb2/openx/test-auction-openx-request.json", + Endpoint.openrtb2_auction); + + // then + assertJsonEquals("openrtb2/openx/test-auction-openx-response.json", response, singletonList("openx")); + } + + @Test + public void openrtb2AuctionWithNativeShouldRespondWithBidsFromOpenx() throws IOException, JSONException { // given WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/openx-exchange")) .withRequestBody(equalToJson(jsonFrom("openrtb2/openx/test-native-request.json"))) .willReturn(aResponse().withBody(jsonFrom("openrtb2/openx/test-native-response.json")))); // when - final Response response = responseFor("openrtb2/openx/test-native-response.json", + final Response response = responseFor("openrtb2/openx/test-native-request.json", Endpoint.openrtb2_auction); // then From 1819cc5ef4262aa1a309d3f8d043bd1242e5655a Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Fri, 27 Dec 2024 12:06:22 +0100 Subject: [PATCH 12/18] create dedicated request/response stubs --- .../java/org/prebid/server/it/OpenxTest.java | 8 +-- .../test-auction-openx-native-request.json | 31 +++++++++++ .../test-auction-openx-native-response.json | 38 +++++++++++++ .../openrtb2/openx/test-native-request.json | 31 ----------- .../openx/test-openx-native-request.json | 53 +++++++++++++++++++ ...e.json => test-openx-native-response.json} | 25 ++++----- 6 files changed, 137 insertions(+), 49 deletions(-) create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-request.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-request.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-request.json rename src/test/resources/org/prebid/server/it/openrtb2/openx/{test-native-response.json => test-openx-native-response.json} (50%) diff --git a/src/test/java/org/prebid/server/it/OpenxTest.java b/src/test/java/org/prebid/server/it/OpenxTest.java index acbb6015bef..562c70e0cb9 100644 --- a/src/test/java/org/prebid/server/it/OpenxTest.java +++ b/src/test/java/org/prebid/server/it/OpenxTest.java @@ -34,14 +34,14 @@ public void openrtb2AuctionShouldRespondWithBidsFromOpenx() throws IOException, public void openrtb2AuctionWithNativeShouldRespondWithBidsFromOpenx() throws IOException, JSONException { // given WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/openx-exchange")) - .withRequestBody(equalToJson(jsonFrom("openrtb2/openx/test-native-request.json"))) - .willReturn(aResponse().withBody(jsonFrom("openrtb2/openx/test-native-response.json")))); + .withRequestBody(equalToJson(jsonFrom("openrtb2/openx/test-openx-native-request.json"))) + .willReturn(aResponse().withBody(jsonFrom("openrtb2/openx/test-openx-native-response.json")))); // when - final Response response = responseFor("openrtb2/openx/test-native-request.json", + final Response response = responseFor("openrtb2/openx/test-auction-openx-native-request.json", Endpoint.openrtb2_auction); // then - assertJsonEquals("openrtb2/openx/test-native-response.json", response, singletonList("openx")); + assertJsonEquals("openrtb2/openx/test-auction-openx-native-response.json", response, singletonList("openx")); } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-request.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-request.json new file mode 100644 index 00000000000..fd54d6cfd9c --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-request.json @@ -0,0 +1,31 @@ +{ + "id": "request_id", + "imp": [ + { + "id": "imp_id", + "native": { + "request": "{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200}}]}" + }, + "ext": { + "openx": { + "unit": "539439964", + "delDomain": "se-demo-d.openx.net", + "customFloor": "0.5", + "customParams": { + "foo": "bar", + "multifoo": [ + "bar1", + "bar2" + ] + } + } + } + } + ], + "tmax": 5000, + "regs": { + "ext": { + "gdpr": 0 + } + } +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json new file mode 100644 index 00000000000..ec05e20c07d --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json @@ -0,0 +1,38 @@ +{ + "id": "request_id", + "seatbid": [ + { + "bid": [ + { + "id": "bid_id", + "impid": "imp_id", + "exp": 300, + "price": 5.78, + "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"url\":\"https://example.com/image.jpg\",\"w\":200,\"h\":200}}],\"link\":{\"url\":\"https://example.com/click\"},\"imptrackers\":[\"https://example.com/impression\"]}}", + "crid": "crid00", + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "native" + }, + "origbidcpm": 5.78, + "origbidcur": "USD" + } + } + ], + "seat": "openx", + "group": 0 + } + ], + "cur": "USD", + "ext": { + "responsetimemillis": { + "openx": "{{ openx.response_time_ms }}" + }, + "prebid": { + "auctiontimestamp": 0 + }, + "tmaxrequest": 5000 + } +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-request.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-request.json deleted file mode 100644 index a019adffee1..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-request.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "id": "bidRequestId", - "imp": [ - { - "id": "impId1", - "native": { - "request": "{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200}}]}" - }, - "ext": { - "bidder": { - "customParams": { - "foo": "bar" - }, - "unit": "123456", - "delDomain": "se-demo-d.openx.net" - } - } - } - ], - "user": { - "ext": { - "consent": "consentString" - } - }, - "regs": { - "coppa": 0, - "ext": { - "gdpr": 1 - } - } -} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-request.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-request.json new file mode 100644 index 00000000000..5026b82c24c --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-request.json @@ -0,0 +1,53 @@ +{ + "id": "request_id", + "imp": [ + { + "id": "imp_id", + "secure": 1, + "native": { + "request": "{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200}}]}" + }, + "tagid": "539439964", + "bidfloor": 0.5, + "ext": { + "customParams": { + "foo": "bar", + "multifoo": [ + "bar1", + "bar2" + ] + }, + "tid" : "${json-unit.any-string}" + } + } + ], + "source": { + "tid": "${json-unit.any-string}" + }, + "site": { + "domain": "www.example.com", + "page": "http://www.example.com", + "publisher": { + "domain": "example.com" + }, + "ext": { + "amp": 0 + } + }, + "device": { + "ua": "userAgent", + "ip": "193.168.244.1" + }, + "at": 1, + "tmax": "${json-unit.any-number}", + "cur": [ + "USD" + ], + "regs": { + "gdpr": 0 + }, + "ext": { + "delDomain": "se-demo-d.openx.net", + "bc": "hb_pbs_1.0.0" + } +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json similarity index 50% rename from src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-response.json rename to src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json index 8292b1504d7..7dea140f71e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-native-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json @@ -1,23 +1,20 @@ { - "id": "bidRequestId", + "id": "request_id", "seatbid": [ { "bid": [ { - "id": "bidId1", - "impid": "impId1", - "price": 1.5, + "id": "bid_id", + "impid": "imp_id", + "price": 5.78, "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"url\":\"https://example.com/image.jpg\",\"w\":200,\"h\":200}}],\"link\":{\"url\":\"https://example.com/click\"},\"imptrackers\":[\"https://example.com/impression\"]}}", - "adomain": ["example.com"], - "iurl": "https://example.com/image.jpg", - "cid": "campaignId1", - "crid": "creativeId1", - "dealid": "dealId1", - "w": 200, - "h": 200 + "crid": "crid00", + "w": 300, + "h": 250 } - ] + ], + "seat": "seatId00", + "group": 0 } - ], - "cur": "USD" + ] } From cb3080e348362050b71120dced40f1d23ac54f44 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Fri, 27 Dec 2024 12:23:03 +0100 Subject: [PATCH 13/18] remove "native" item from native json --- .../it/openrtb2/openx/test-auction-openx-native-response.json | 2 +- .../server/it/openrtb2/openx/test-openx-native-response.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json index ec05e20c07d..0bf69db5163 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json @@ -8,7 +8,7 @@ "impid": "imp_id", "exp": 300, "price": 5.78, - "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"url\":\"https://example.com/image.jpg\",\"w\":200,\"h\":200}}],\"link\":{\"url\":\"https://example.com/click\"},\"imptrackers\":[\"https://example.com/impression\"]}}", + "adm" : "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"type\":3,\"url\":\"https://example.com/image.jpg\",\"w\":200,\"h\":200}}],\"link\":{\"url\":\"https://example.com/click\"},\"imptrackers\":[\"https://example.com/impression\"]}", "crid": "crid00", "w": 300, "h": 250, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json index 7dea140f71e..ce02e7ad0a4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json @@ -7,7 +7,7 @@ "id": "bid_id", "impid": "imp_id", "price": 5.78, - "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"url\":\"https://example.com/image.jpg\",\"w\":200,\"h\":200}}],\"link\":{\"url\":\"https://example.com/click\"},\"imptrackers\":[\"https://example.com/impression\"]}}", + "adm": "{\n \"ver\": \"1.2\",\n \"assets\": [\n {\n \"id\": 1,\n \"title\": {\n \"text\": \"Native Ad Title\"\n }\n },\n {\n \"id\": 2,\n \"img\": {\n \"url\": \"https://example.com/image.jpg\",\n \"w\": 200,\n \"h\": 200\n }\n }\n ],\n \"link\": {\n \"url\": \"https://example.com/click\"\n },\n \"imptrackers\": [\n \"https://example.com/impression\"\n ]\n}", "crid": "crid00", "w": 300, "h": 250 From c262f34dc2286e51a3a2d1af2423b03fb6c50bfd Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Fri, 27 Dec 2024 15:04:31 +0100 Subject: [PATCH 14/18] remove openrtb2AuctionWithNativeShouldRespondWithBidsFromOpenx() IT test --- .../java/org/prebid/server/it/OpenxTest.java | 15 ------ .../test-auction-openx-native-request.json | 31 ----------- .../test-auction-openx-native-response.json | 38 ------------- .../openx/test-openx-native-request.json | 53 ------------------- .../openx/test-openx-native-response.json | 20 ------- 5 files changed, 157 deletions(-) delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-request.json delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-request.json delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json diff --git a/src/test/java/org/prebid/server/it/OpenxTest.java b/src/test/java/org/prebid/server/it/OpenxTest.java index 562c70e0cb9..473bc5c296b 100644 --- a/src/test/java/org/prebid/server/it/OpenxTest.java +++ b/src/test/java/org/prebid/server/it/OpenxTest.java @@ -29,19 +29,4 @@ public void openrtb2AuctionShouldRespondWithBidsFromOpenx() throws IOException, // then assertJsonEquals("openrtb2/openx/test-auction-openx-response.json", response, singletonList("openx")); } - - @Test - public void openrtb2AuctionWithNativeShouldRespondWithBidsFromOpenx() throws IOException, JSONException { - // given - WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/openx-exchange")) - .withRequestBody(equalToJson(jsonFrom("openrtb2/openx/test-openx-native-request.json"))) - .willReturn(aResponse().withBody(jsonFrom("openrtb2/openx/test-openx-native-response.json")))); - - // when - final Response response = responseFor("openrtb2/openx/test-auction-openx-native-request.json", - Endpoint.openrtb2_auction); - - // then - assertJsonEquals("openrtb2/openx/test-auction-openx-native-response.json", response, singletonList("openx")); - } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-request.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-request.json deleted file mode 100644 index fd54d6cfd9c..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-request.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "id": "request_id", - "imp": [ - { - "id": "imp_id", - "native": { - "request": "{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200}}]}" - }, - "ext": { - "openx": { - "unit": "539439964", - "delDomain": "se-demo-d.openx.net", - "customFloor": "0.5", - "customParams": { - "foo": "bar", - "multifoo": [ - "bar1", - "bar2" - ] - } - } - } - } - ], - "tmax": 5000, - "regs": { - "ext": { - "gdpr": 0 - } - } -} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json deleted file mode 100644 index 0bf69db5163..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-native-response.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "id": "request_id", - "seatbid": [ - { - "bid": [ - { - "id": "bid_id", - "impid": "imp_id", - "exp": 300, - "price": 5.78, - "adm" : "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"type\":3,\"url\":\"https://example.com/image.jpg\",\"w\":200,\"h\":200}}],\"link\":{\"url\":\"https://example.com/click\"},\"imptrackers\":[\"https://example.com/impression\"]}", - "crid": "crid00", - "w": 300, - "h": 250, - "ext": { - "prebid": { - "type": "native" - }, - "origbidcpm": 5.78, - "origbidcur": "USD" - } - } - ], - "seat": "openx", - "group": 0 - } - ], - "cur": "USD", - "ext": { - "responsetimemillis": { - "openx": "{{ openx.response_time_ms }}" - }, - "prebid": { - "auctiontimestamp": 0 - }, - "tmaxrequest": 5000 - } -} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-request.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-request.json deleted file mode 100644 index 5026b82c24c..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-request.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "id": "request_id", - "imp": [ - { - "id": "imp_id", - "secure": 1, - "native": { - "request": "{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200}}]}" - }, - "tagid": "539439964", - "bidfloor": 0.5, - "ext": { - "customParams": { - "foo": "bar", - "multifoo": [ - "bar1", - "bar2" - ] - }, - "tid" : "${json-unit.any-string}" - } - } - ], - "source": { - "tid": "${json-unit.any-string}" - }, - "site": { - "domain": "www.example.com", - "page": "http://www.example.com", - "publisher": { - "domain": "example.com" - }, - "ext": { - "amp": 0 - } - }, - "device": { - "ua": "userAgent", - "ip": "193.168.244.1" - }, - "at": 1, - "tmax": "${json-unit.any-number}", - "cur": [ - "USD" - ], - "regs": { - "gdpr": 0 - }, - "ext": { - "delDomain": "se-demo-d.openx.net", - "bc": "hb_pbs_1.0.0" - } -} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json deleted file mode 100644 index ce02e7ad0a4..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-openx-native-response.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "id": "request_id", - "seatbid": [ - { - "bid": [ - { - "id": "bid_id", - "impid": "imp_id", - "price": 5.78, - "adm": "{\n \"ver\": \"1.2\",\n \"assets\": [\n {\n \"id\": 1,\n \"title\": {\n \"text\": \"Native Ad Title\"\n }\n },\n {\n \"id\": 2,\n \"img\": {\n \"url\": \"https://example.com/image.jpg\",\n \"w\": 200,\n \"h\": 200\n }\n }\n ],\n \"link\": {\n \"url\": \"https://example.com/click\"\n },\n \"imptrackers\": [\n \"https://example.com/impression\"\n ]\n}", - "crid": "crid00", - "w": 300, - "h": 250 - } - ], - "seat": "seatId00", - "group": 0 - } - ] -} From 2521ed9da7a1b1766dcc93fee780f6e857d51e19 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Fri, 27 Dec 2024 15:08:06 +0100 Subject: [PATCH 15/18] use var type --- src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java index 7830536ef25..6cdae97b5cb 100644 --- a/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java +++ b/src/main/java/org/prebid/server/bidder/openx/OpenxBidder.java @@ -113,7 +113,7 @@ private List makeRequests( List errors) { final List bidRequests = new ArrayList<>(); // single request for all banner and native imps - final var bannerAndNativeImps = Stream.of(bannerImps, nativeImps) + final List bannerAndNativeImps = Stream.of(bannerImps, nativeImps) .filter(Objects::nonNull) .flatMap(Collection::stream) .toList(); From 19a7345f9dbe304473d5b91372307c0b7acc50a2 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Fri, 27 Dec 2024 15:18:07 +0100 Subject: [PATCH 16/18] add makeBidsShouldReturnResultForNativeBidsWithExpectedFields() --- .../server/bidder/openx/OpenxBidderTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index e578834f869..7a5319feade 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -593,6 +593,49 @@ public void makeBidsShouldReturnResultWithExpectedFields() throws JsonProcessing .build()); } + + @Test + public void makeBidsShouldReturnResultForNativeBidsWithExpectedFields() throws JsonProcessingException { + // given + final BidderCall httpCall = givenHttpCall(mapper.writeValueAsString(OpenxBidResponse.builder() + .seatbid(singletonList(SeatBid.builder() + .bid(singletonList(Bid.builder() + .w(200) + .h(150) + .price(BigDecimal.ONE) + .impid("impId1") + .adm("{\"ver\":\"1.2\"}") + .build())) + .build())) + .cur("UAH") + .ext(OpenxBidResponseExt.of(Map.of("impId1", mapper.createObjectNode().put("somevalue", 1)))) + .build())); + + final BidRequest bidRequest = BidRequest.builder() + .id("bidRequestId") + .imp(singletonList(Imp.builder() + .id("impId1") + .xNative(Native.builder().request("{\"ver\":\"1.2\",\"plcmttype\":3}").build()) + .build())) + .build(); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()).hasSize(1) + .containsOnly(BidderBid.of( + Bid.builder() + .impid("impId1") + .price(BigDecimal.ONE) + .w(200) + .h(150) + .adm("{\"ver\":\"1.2\"}") + .build(), + BidType.xNative, "UAH")); + } + @Test public void makeBidsShouldReturnVideoInfoWhenAvailable() throws JsonProcessingException { // given From f2119e7c966b41e41048f8459c238931d27c0023 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Fri, 27 Dec 2024 15:22:20 +0100 Subject: [PATCH 17/18] fix linter --- .../java/org/prebid/server/bidder/openx/OpenxBidderTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index 7a5319feade..f38a8d34b19 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -593,7 +593,6 @@ public void makeBidsShouldReturnResultWithExpectedFields() throws JsonProcessing .build()); } - @Test public void makeBidsShouldReturnResultForNativeBidsWithExpectedFields() throws JsonProcessingException { // given From 2c4e117223f7e79b6c63aac424280ff1defb9967 Mon Sep 17 00:00:00 2001 From: Serhii Nesprava Date: Mon, 30 Dec 2024 12:28:37 +0100 Subject: [PATCH 18/18] add makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultiFormatImps --- .../server/bidder/openx/OpenxBidderTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java index f38a8d34b19..cbe1e22c7ca 100644 --- a/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/openx/OpenxBidderTest.java @@ -414,6 +414,68 @@ public void makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultipleBan .build()); } + @Test + public void makeHttpRequestsShouldReturnResultWithSingleBidRequestForMultiFormatImps() { + // given + final BidRequest bidRequest = BidRequest.builder() + .id("bidRequestId") + .imp(asList( + Imp.builder() + .id("impId1") + .banner(Banner.builder().w(320).h(200).build()) + .video(Video.builder().maxduration(10).build()) + .ext(mapper.valueToTree( + ExtPrebid.of(null, ExtImpOpenx.builder().unit("1").build()))) + .build(), + Imp.builder() + .id("impId2") + .banner(Banner.builder().w(300).h(150).build()) + .xNative(Native.builder().request("{\"version\":1}").build()) + .ext(mapper.valueToTree( + ExtPrebid.of(null, ExtImpOpenx.builder().unit("2").build()))) + .build())) + .user(User.builder().ext(ExtUser.builder().consent("consent").build()).build()) + .regs(Regs.builder().coppa(0).ext(ExtRegs.of(1, null, null, null)).build()) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + + assertThat(result.getValue()).hasSize(1) + .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) + .containsExactly( + // check if all native and banner imps are part of single bidRequest + BidRequest.builder() + .id("bidRequestId") + .imp(asList( + // verify banner and video media types are preserved in a single imp + Imp.builder() + .id("impId1") + .tagid("1") + .banner(Banner.builder().w(320).h(200).build()) + .video(Video.builder().maxduration(10).build()) + .ext(mapper.valueToTree(ExtImpOpenx.builder().build())).build(), + // verify banner and native media types are preserved in a single imp + Imp.builder() + .id("impId2") + .tagid("2") + .banner(Banner.builder().w(300).h(150).build()) + .xNative(Native.builder().request("{\"version\":1}").build()) + .ext(mapper.valueToTree(ExtImpOpenx.builder().build())) + .build())) + .ext(jacksonMapper.fillExtension( + ExtRequest.empty(), + OpenxRequestExt.of(null, null, "hb_pbs_1.0.0"))) + .user(User.builder() + .ext(ExtUser.builder().consent("consent").build()) + .build()) + .regs(Regs.builder().coppa(0).ext(ExtRegs.of(1, null, null, null)).build()) + .build()); + } + @Test public void makeHttpRequestsShouldPassThroughImpExt() { // given