From 80fbe06ad2c9fd6f300663729011a269876d39b6 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Thu, 27 Mar 2025 17:40:58 -0300 Subject: [PATCH 01/11] gets optimal endpoint url --- .../bidder/connatix/ConnatixBidder.java | 66 +++++++++++++++++-- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java index 1ed572e0c7c..85c467ac40e 100644 --- a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java +++ b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java @@ -7,6 +7,7 @@ import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; +import com.iab.openrtb.request.User; import com.iab.openrtb.request.Format; import com.iab.openrtb.request.Imp; import com.iab.openrtb.response.Bid; @@ -16,6 +17,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.utils.URIBuilder; import org.prebid.server.bidder.Bidder; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; @@ -35,6 +37,7 @@ import org.prebid.server.util.HttpUtil; import java.math.BigDecimal; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -74,18 +77,28 @@ public Result>> makeHttpRequests(BidRequest request return Result.withError(BidderError.badInput("Device IP is required")); } + final List errors = new ArrayList<>(); + + final String optimalEndpointUrl; + try { + optimalEndpointUrl = getOptimalEndpointUrl(request); + } catch (PreBidException e) { + errors.add(BidderError.badInput(e.getMessage())); + return Result.withErrors(errors); + } + + final String displayManagerVer = buildDisplayManagerVersion(request); final MultiMap headers = resolveHeaders(device); final List> httpRequests = new ArrayList<>(); - final List errors = new ArrayList<>(); for (Imp imp : request.getImp()) { try { final ExtImpConnatix extImpConnatix = parseExtImp(imp); final Imp modifiedImp = modifyImp(imp, extImpConnatix, displayManagerVer, request); - httpRequests.add(makeHttpRequest(request, modifiedImp, headers)); + httpRequests.add(makeHttpRequest(request, modifiedImp, headers, optimalEndpointUrl)); } catch (PreBidException e) { errors.add(BidderError.badInput(e.getMessage())); } @@ -94,6 +107,51 @@ public Result>> makeHttpRequests(BidRequest request return Result.of(httpRequests, errors); } + private String getOptimalEndpointUrl(BidRequest request) { + final String userId = getUserId(request); + if (userId == null) { + return endpointUrl; + } + + final String dataCenterCode = getDataCenterCode(userId); + if (dataCenterCode == null) { + return endpointUrl; + } + + try { + final URIBuilder uriBuilder = new URIBuilder(endpointUrl); + return uriBuilder.addParameter("dc", dataCenterCode).build().toString(); + } catch (URISyntaxException e) { + throw new PreBidException(e.getMessage()); + } + } + + private String getUserId(BidRequest request) { + final User user = request.getUser(); + if (user == null) { + return null; + } + + final String buyerUid = user.getBuyeruid(); + if (buyerUid == null || buyerUid.isEmpty()) { + return null; + } + + return buyerUid.trim(); + } + + private String getDataCenterCode(String usedId) { + if (usedId.startsWith("1-")) { + return "us-east-2"; + } else if (usedId.startsWith("2-")) { + return "us-west-2"; + } else if (usedId.startsWith("3-")) { + return "eu-west-1"; + } + + return null; + } + private static String buildDisplayManagerVersion(BidRequest request) { return Optional.ofNullable(request.getApp()) .map(App::getExt) @@ -171,12 +229,12 @@ private Banner modifyImpBanner(Banner banner) { return banner; } - private HttpRequest makeHttpRequest(BidRequest request, Imp imp, MultiMap headers) { + private HttpRequest makeHttpRequest(BidRequest request, Imp imp, MultiMap headers, String optimalEndpointUrl) { final BidRequest outgoingRequest = request.toBuilder() .imp(List.of(imp)) .build(); - return BidderUtil.defaultRequest(outgoingRequest, headers, endpointUrl, mapper); + return BidderUtil.defaultRequest(outgoingRequest, headers, optimalEndpointUrl, mapper); } @Override From c59752171a48be85a8dcb004865ee64d297a56d5 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Thu, 27 Mar 2025 17:52:08 -0300 Subject: [PATCH 02/11] adds test requests --- .../connatix/bid-request-eu-user.json | 176 ++++++++++++++++++ .../connatix/bid-request-no-user.json | 170 +++++++++++++++++ .../connatix/bid-request-us-east-user.json | 176 ++++++++++++++++++ .../connatix/bid-request-us-west-user.json | 176 ++++++++++++++++++ 4 files changed, 698 insertions(+) create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-eu-user.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-no-user.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-east-user.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-west-user.json diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-eu-user.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-eu-user.json new file mode 100644 index 00000000000..89da3041383 --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-eu-user.json @@ -0,0 +1,176 @@ +{ + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "language": "en", + "dnt": 0 + }, + "tmax": 500, + "user": { + "buyeruid": "3-some-user" + }, + "app": { + "publisher": { + "id": "123456789" + }, + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789", + "ext": { + "prebid": { + "source": "test", + "version": "1.0.0" + } + } + }, + "imp": [ + { + "id": "some-imp-id", + "tagid": "some-tag-id", + "banner": { + "format":[ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "placementId": "some-placement-id", + "viewabilityPercentage": 0.6 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com?dc=eu-west-1", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-imp-id", + "tagid": "some-tag-id", + "banner": { + "w": 320, + "h": 50, + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "displaymanagerver": "test-1.0.0", + "ext": { + "connatix": { + "placementId": "some-placement-id", + "viewabilityPercentage": 0.6 + } + } + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + }, + "ext": { + "prebid": { + "source": "test", + "version": "1.0.0" + } + } + }, + "user": { + "buyeruid": "3-some-user" + }, + "tmax": 500 + }, + "impIDs": [ + "some-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-response-id", + "seatbid": [ + { + "bid": [ + { + "id": "some-bid-id", + "impid": "some-imp-id", + "price": 0.52, + "adm": "some-test-ad", + "adomain": [ + "test.com" + ], + "crid": "112233", + "w": 320, + "h": 50, + "ext": { + "connatix": { + "mediaType": "banner" + } + } + } + ], + "seat": "connatix", + "group": 0 + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "some-bid-id", + "impid": "some-imp-id", + "price": 0.52, + "adm": "some-test-ad", + "crid": "112233", + "adomain": [ + "test.com" + ], + "w": 320, + "h": 50, + "ext": { + "connatix": { + "mediaType": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] + } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-no-user.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-no-user.json new file mode 100644 index 00000000000..4341d0ffab1 --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-no-user.json @@ -0,0 +1,170 @@ +{ + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "language": "en", + "dnt": 0 + }, + "tmax": 500, + "app": { + "publisher": { + "id": "123456789" + }, + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789", + "ext": { + "prebid": { + "source": "test", + "version": "1.0.0" + } + } + }, + "imp": [ + { + "id": "some-imp-id", + "tagid": "some-tag-id", + "banner": { + "format":[ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "placementId": "some-placement-id", + "viewabilityPercentage": 0.6 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-imp-id", + "tagid": "some-tag-id", + "banner": { + "w": 320, + "h": 50, + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "displaymanagerver": "test-1.0.0", + "ext": { + "connatix": { + "placementId": "some-placement-id", + "viewabilityPercentage": 0.6 + } + } + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + }, + "ext": { + "prebid": { + "source": "test", + "version": "1.0.0" + } + } + }, + "tmax": 500 + }, + "impIDs": [ + "some-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-response-id", + "seatbid": [ + { + "bid": [ + { + "id": "some-bid-id", + "impid": "some-imp-id", + "price": 0.52, + "adm": "some-test-ad", + "adomain": [ + "test.com" + ], + "crid": "112233", + "w": 320, + "h": 50, + "ext": { + "connatix": { + "mediaType": "banner" + } + } + } + ], + "seat": "connatix", + "group": 0 + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "some-bid-id", + "impid": "some-imp-id", + "price": 0.52, + "adm": "some-test-ad", + "crid": "112233", + "adomain": [ + "test.com" + ], + "w": 320, + "h": 50, + "ext": { + "connatix": { + "mediaType": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] + } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-east-user.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-east-user.json new file mode 100644 index 00000000000..4a02c810cea --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-east-user.json @@ -0,0 +1,176 @@ +{ + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "language": "en", + "dnt": 0 + }, + "tmax": 500, + "user": { + "buyeruid": "1-some-user" + }, + "app": { + "publisher": { + "id": "123456789" + }, + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789", + "ext": { + "prebid": { + "source": "test", + "version": "1.0.0" + } + } + }, + "imp": [ + { + "id": "some-imp-id", + "tagid": "some-tag-id", + "banner": { + "format":[ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "placementId": "some-placement-id", + "viewabilityPercentage": 0.6 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com?dc=us-east-2", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-imp-id", + "tagid": "some-tag-id", + "banner": { + "w": 320, + "h": 50, + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "displaymanagerver": "test-1.0.0", + "ext": { + "connatix": { + "placementId": "some-placement-id", + "viewabilityPercentage": 0.6 + } + } + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + }, + "ext": { + "prebid": { + "source": "test", + "version": "1.0.0" + } + } + }, + "user": { + "buyeruid": "1-some-user" + }, + "tmax": 500 + }, + "impIDs": [ + "some-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-response-id", + "seatbid": [ + { + "bid": [ + { + "id": "some-bid-id", + "impid": "some-imp-id", + "price": 0.52, + "adm": "some-test-ad", + "adomain": [ + "test.com" + ], + "crid": "112233", + "w": 320, + "h": 50, + "ext": { + "connatix": { + "mediaType": "banner" + } + } + } + ], + "seat": "connatix", + "group": 0 + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "some-bid-id", + "impid": "some-imp-id", + "price": 0.52, + "adm": "some-test-ad", + "crid": "112233", + "adomain": [ + "test.com" + ], + "w": 320, + "h": 50, + "ext": { + "connatix": { + "mediaType": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] + } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-west-user.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-west-user.json new file mode 100644 index 00000000000..b5c27c2f6d0 --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-west-user.json @@ -0,0 +1,176 @@ +{ + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "language": "en", + "dnt": 0 + }, + "tmax": 500, + "user": { + "buyeruid": "2-some-user" + }, + "app": { + "publisher": { + "id": "123456789" + }, + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789", + "ext": { + "prebid": { + "source": "test", + "version": "1.0.0" + } + } + }, + "imp": [ + { + "id": "some-imp-id", + "tagid": "some-tag-id", + "banner": { + "format":[ + { + "w": 320, + "h": 50 + } + ] + }, + "ext": { + "bidder": { + "placementId": "some-placement-id", + "viewabilityPercentage": 0.6 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com?dc=us-west-2", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-imp-id", + "tagid": "some-tag-id", + "banner": { + "w": 320, + "h": 50, + "format": [ + { + "w": 320, + "h": 50 + } + ] + }, + "displaymanagerver": "test-1.0.0", + "ext": { + "connatix": { + "placementId": "some-placement-id", + "viewabilityPercentage": 0.6 + } + } + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + }, + "ext": { + "prebid": { + "source": "test", + "version": "1.0.0" + } + } + }, + "user": { + "buyeruid": "2-some-user" + }, + "tmax": 500 + }, + "impIDs": [ + "some-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-response-id", + "seatbid": [ + { + "bid": [ + { + "id": "some-bid-id", + "impid": "some-imp-id", + "price": 0.52, + "adm": "some-test-ad", + "adomain": [ + "test.com" + ], + "crid": "112233", + "w": 320, + "h": 50, + "ext": { + "connatix": { + "mediaType": "banner" + } + } + } + ], + "seat": "connatix", + "group": 0 + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "some-bid-id", + "impid": "some-imp-id", + "price": 0.52, + "adm": "some-test-ad", + "crid": "112233", + "adomain": [ + "test.com" + ], + "w": 320, + "h": 50, + "ext": { + "connatix": { + "mediaType": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] +} From 5874cc4c05fd38abfa3c9e819fcc6fce8df2d79a Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Fri, 28 Mar 2025 12:08:34 -0300 Subject: [PATCH 03/11] adds unit tests --- .../bidder/connatix/ConnatixBidderTest.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java b/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java index 82b3d1faad8..a5da4a7fc5f 100644 --- a/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java @@ -8,6 +8,7 @@ import com.iab.openrtb.request.Device; import com.iab.openrtb.request.Format; import com.iab.openrtb.request.Imp; +import com.iab.openrtb.request.User; import com.iab.openrtb.response.Bid; import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; @@ -268,6 +269,101 @@ public void makeHttpRequestsShouldIncludeResolvedHttpHeadersFromDevice() { tuple(HttpUtil.ACCEPT_HEADER.toString(), HttpHeaderValues.APPLICATION_JSON.toString())); } + @Test + public void makeHttpRequestsShouldUseDataCenterUsEast2WhenUserIdStartsWith1() { + // given + final BidRequest bidRequest = givenBidRequest( + request -> request.user(User.builder().buyeruid("1-UserId").build()), + givenImp(impBuilder -> impBuilder + .ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null))))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + List> httpRequests = result.getValue(); + httpRequests.forEach(request -> { + assertThat(request.getUri().contains("dc=us-east-2")); + }); + } + + @Test + public void makeHttpRequestsShouldUseDataCenterUsWest2WhenUserIdStartsWith2() { + // given + final BidRequest bidRequest = givenBidRequest( + request -> request.user(User.builder().buyeruid("2-UserId").build()), + givenImp(impBuilder -> impBuilder + .ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null))))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + List> httpRequests = result.getValue(); + httpRequests.forEach(request -> { + assertThat(request.getUri().contains("dc=us-west-2")); + }); + } + + @Test + public void makeHttpRequestsShouldUseDataCenterEuWest1WhenUserIdStartsWith3() { + // given + final BidRequest bidRequest = givenBidRequest( + request -> request.user(User.builder().buyeruid("3-UserId").build()), + givenImp(impBuilder -> impBuilder + .ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null))))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + List> httpRequests = result.getValue(); + httpRequests.forEach(request -> { + assertThat(request.getUri().contains("dc=eu-west-1")); + }); + } + + @Test + public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdPrefixDoesNotMatch() { + // given + final BidRequest bidRequest = givenBidRequest( + request -> request.user(User.builder().buyeruid("4-UserId").build()), + givenImp(impBuilder -> impBuilder + .ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null))))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + List> httpRequests = result.getValue(); + httpRequests.forEach(request -> { + assertThat(request.getUri() == CONNATIX_ENDPOINT); + }); + } + + @Test + public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdIsMissing() { + // given + final BidRequest bidRequest = givenBidRequest( + UnaryOperator.identity(), + givenImp(impBuilder -> impBuilder + .ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null))))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + List> httpRequests = result.getValue(); + httpRequests.forEach(request -> { + assertThat(request.getUri() == CONNATIX_ENDPOINT); + }); + } + @Test public void makeBidsShouldErrorIfResponseBodyCannotBeParsed() { // given From 32ab341ab1de2b96e39c346f4a3d2f83b3fb25d9 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Fri, 28 Mar 2025 15:05:10 -0300 Subject: [PATCH 04/11] linter error fixes --- .../prebid/server/bidder/connatix/ConnatixBidder.java | 4 ++-- .../server/bidder/connatix/ConnatixBidderTest.java | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java index 85c467ac40e..11841188836 100644 --- a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java +++ b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java @@ -87,7 +87,6 @@ public Result>> makeHttpRequests(BidRequest request return Result.withErrors(errors); } - final String displayManagerVer = buildDisplayManagerVersion(request); final MultiMap headers = resolveHeaders(device); @@ -229,7 +228,8 @@ private Banner modifyImpBanner(Banner banner) { return banner; } - private HttpRequest makeHttpRequest(BidRequest request, Imp imp, MultiMap headers, String optimalEndpointUrl) { + private HttpRequest makeHttpRequest(BidRequest request, Imp imp, MultiMap headers, + String optimalEndpointUrl) { final BidRequest outgoingRequest = request.toBuilder() .imp(List.of(imp)) .build(); diff --git a/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java b/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java index a5da4a7fc5f..db3971a03a5 100644 --- a/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java @@ -282,7 +282,7 @@ public void makeHttpRequestsShouldUseDataCenterUsEast2WhenUserIdStartsWith1() { // then assertThat(result.getErrors()).isEmpty(); - List> httpRequests = result.getValue(); + final List> httpRequests = result.getValue(); httpRequests.forEach(request -> { assertThat(request.getUri().contains("dc=us-east-2")); }); @@ -301,7 +301,7 @@ public void makeHttpRequestsShouldUseDataCenterUsWest2WhenUserIdStartsWith2() { // then assertThat(result.getErrors()).isEmpty(); - List> httpRequests = result.getValue(); + final List> httpRequests = result.getValue(); httpRequests.forEach(request -> { assertThat(request.getUri().contains("dc=us-west-2")); }); @@ -320,7 +320,7 @@ public void makeHttpRequestsShouldUseDataCenterEuWest1WhenUserIdStartsWith3() { // then assertThat(result.getErrors()).isEmpty(); - List> httpRequests = result.getValue(); + final List> httpRequests = result.getValue(); httpRequests.forEach(request -> { assertThat(request.getUri().contains("dc=eu-west-1")); }); @@ -339,7 +339,7 @@ public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdPrefixDoesNotMatch( // then assertThat(result.getErrors()).isEmpty(); - List> httpRequests = result.getValue(); + final List> httpRequests = result.getValue(); httpRequests.forEach(request -> { assertThat(request.getUri() == CONNATIX_ENDPOINT); }); @@ -358,7 +358,7 @@ public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdIsMissing() { // then assertThat(result.getErrors()).isEmpty(); - List> httpRequests = result.getValue(); + final List> httpRequests = result.getValue(); httpRequests.forEach(request -> { assertThat(request.getUri() == CONNATIX_ENDPOINT); }); From e947e81b7adb50bcd5e3960fca9b954811f340f4 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Tue, 1 Apr 2025 16:00:44 -0300 Subject: [PATCH 05/11] resolves pr comments --- .../bidder/connatix/ConnatixBidder.java | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java index 11841188836..a73b8653d08 100644 --- a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java +++ b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java @@ -83,8 +83,7 @@ public Result>> makeHttpRequests(BidRequest request try { optimalEndpointUrl = getOptimalEndpointUrl(request); } catch (PreBidException e) { - errors.add(BidderError.badInput(e.getMessage())); - return Result.withErrors(errors); + return Result.withError(BidderError.badInput(e.getMessage())); } final String displayManagerVer = buildDisplayManagerVersion(request); @@ -107,36 +106,24 @@ public Result>> makeHttpRequests(BidRequest request } private String getOptimalEndpointUrl(BidRequest request) { - final String userId = getUserId(request); - if (userId == null) { - return endpointUrl; - } - - final String dataCenterCode = getDataCenterCode(userId); - if (dataCenterCode == null) { - return endpointUrl; - } - try { final URIBuilder uriBuilder = new URIBuilder(endpointUrl); - return uriBuilder.addParameter("dc", dataCenterCode).build().toString(); + return getUserId(request) + .map(this::getDataCenterCode) + .map(dataCenterCode -> uriBuilder.addParameter("dc", dataCenterCode)) + .orElse(uriBuilder) + .build() + .toString(); } catch (URISyntaxException e) { throw new PreBidException(e.getMessage()); } } - private String getUserId(BidRequest request) { - final User user = request.getUser(); - if (user == null) { - return null; - } - - final String buyerUid = user.getBuyeruid(); - if (buyerUid == null || buyerUid.isEmpty()) { - return null; - } - - return buyerUid.trim(); + private Optional getUserId(BidRequest request) { + return Optional.ofNullable(request.getUser()) + .map(User::getBuyeruid) + .filter(StringUtils::isNotBlank) + .map(String::trim); } private String getDataCenterCode(String usedId) { From 0d3068988849a0766cd2825587f182a13a2b13ab Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Fri, 11 Apr 2025 12:28:31 -0300 Subject: [PATCH 06/11] deletes added test resources --- .../connatix/bid-request-eu-user.json | 176 ------------------ .../connatix/bid-request-no-user.json | 170 ----------------- .../connatix/bid-request-us-east-user.json | 176 ------------------ .../connatix/bid-request-us-west-user.json | 176 ------------------ 4 files changed, 698 deletions(-) delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-eu-user.json delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-no-user.json delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-east-user.json delete mode 100644 src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-west-user.json diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-eu-user.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-eu-user.json deleted file mode 100644 index 89da3041383..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-eu-user.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "mockBidRequest": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "language": "en", - "dnt": 0 - }, - "tmax": 500, - "user": { - "buyeruid": "3-some-user" - }, - "app": { - "publisher": { - "id": "123456789" - }, - "cat": [ - "IAB22-1" - ], - "bundle": "com.app.awesome", - "name": "Awesome App", - "domain": "awesomeapp.com", - "id": "123456789", - "ext": { - "prebid": { - "source": "test", - "version": "1.0.0" - } - } - }, - "imp": [ - { - "id": "some-imp-id", - "tagid": "some-tag-id", - "banner": { - "format":[ - { - "w": 320, - "h": 50 - } - ] - }, - "ext": { - "bidder": { - "placementId": "some-placement-id", - "viewabilityPercentage": 0.6 - } - } - } - ] - }, - "httpCalls": [ - { - "expectedRequest": { - "uri": "http://example.com?dc=eu-west-1", - "body": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "language": "en", - "dnt": 0 - }, - "imp": [ - { - "id": "some-imp-id", - "tagid": "some-tag-id", - "banner": { - "w": 320, - "h": 50, - "format": [ - { - "w": 320, - "h": 50 - } - ] - }, - "displaymanagerver": "test-1.0.0", - "ext": { - "connatix": { - "placementId": "some-placement-id", - "viewabilityPercentage": 0.6 - } - } - } - ], - "app": { - "id": "123456789", - "name": "Awesome App", - "bundle": "com.app.awesome", - "domain": "awesomeapp.com", - "cat": [ - "IAB22-1" - ], - "publisher": { - "id": "123456789" - }, - "ext": { - "prebid": { - "source": "test", - "version": "1.0.0" - } - } - }, - "user": { - "buyeruid": "3-some-user" - }, - "tmax": 500 - }, - "impIDs": [ - "some-imp-id" - ] - }, - "mockResponse": { - "status": 200, - "body": { - "id": "test-response-id", - "seatbid": [ - { - "bid": [ - { - "id": "some-bid-id", - "impid": "some-imp-id", - "price": 0.52, - "adm": "some-test-ad", - "adomain": [ - "test.com" - ], - "crid": "112233", - "w": 320, - "h": 50, - "ext": { - "connatix": { - "mediaType": "banner" - } - } - } - ], - "seat": "connatix", - "group": 0 - } - ], - "cur": "USD" - } - } - } - ], - "expectedBidResponses": [ - { - "currency": "USD", - "bids": [ - { - "bid": { - "id": "some-bid-id", - "impid": "some-imp-id", - "price": 0.52, - "adm": "some-test-ad", - "crid": "112233", - "adomain": [ - "test.com" - ], - "w": 320, - "h": 50, - "ext": { - "connatix": { - "mediaType": "banner" - } - } - }, - "type": "banner" - } - ] - } - ] - } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-no-user.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-no-user.json deleted file mode 100644 index 4341d0ffab1..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-no-user.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "mockBidRequest": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "language": "en", - "dnt": 0 - }, - "tmax": 500, - "app": { - "publisher": { - "id": "123456789" - }, - "cat": [ - "IAB22-1" - ], - "bundle": "com.app.awesome", - "name": "Awesome App", - "domain": "awesomeapp.com", - "id": "123456789", - "ext": { - "prebid": { - "source": "test", - "version": "1.0.0" - } - } - }, - "imp": [ - { - "id": "some-imp-id", - "tagid": "some-tag-id", - "banner": { - "format":[ - { - "w": 320, - "h": 50 - } - ] - }, - "ext": { - "bidder": { - "placementId": "some-placement-id", - "viewabilityPercentage": 0.6 - } - } - } - ] - }, - "httpCalls": [ - { - "expectedRequest": { - "uri": "http://example.com", - "body": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "language": "en", - "dnt": 0 - }, - "imp": [ - { - "id": "some-imp-id", - "tagid": "some-tag-id", - "banner": { - "w": 320, - "h": 50, - "format": [ - { - "w": 320, - "h": 50 - } - ] - }, - "displaymanagerver": "test-1.0.0", - "ext": { - "connatix": { - "placementId": "some-placement-id", - "viewabilityPercentage": 0.6 - } - } - } - ], - "app": { - "id": "123456789", - "name": "Awesome App", - "bundle": "com.app.awesome", - "domain": "awesomeapp.com", - "cat": [ - "IAB22-1" - ], - "publisher": { - "id": "123456789" - }, - "ext": { - "prebid": { - "source": "test", - "version": "1.0.0" - } - } - }, - "tmax": 500 - }, - "impIDs": [ - "some-imp-id" - ] - }, - "mockResponse": { - "status": 200, - "body": { - "id": "test-response-id", - "seatbid": [ - { - "bid": [ - { - "id": "some-bid-id", - "impid": "some-imp-id", - "price": 0.52, - "adm": "some-test-ad", - "adomain": [ - "test.com" - ], - "crid": "112233", - "w": 320, - "h": 50, - "ext": { - "connatix": { - "mediaType": "banner" - } - } - } - ], - "seat": "connatix", - "group": 0 - } - ], - "cur": "USD" - } - } - } - ], - "expectedBidResponses": [ - { - "currency": "USD", - "bids": [ - { - "bid": { - "id": "some-bid-id", - "impid": "some-imp-id", - "price": 0.52, - "adm": "some-test-ad", - "crid": "112233", - "adomain": [ - "test.com" - ], - "w": 320, - "h": 50, - "ext": { - "connatix": { - "mediaType": "banner" - } - } - }, - "type": "banner" - } - ] - } - ] - } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-east-user.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-east-user.json deleted file mode 100644 index 4a02c810cea..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-east-user.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "mockBidRequest": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "language": "en", - "dnt": 0 - }, - "tmax": 500, - "user": { - "buyeruid": "1-some-user" - }, - "app": { - "publisher": { - "id": "123456789" - }, - "cat": [ - "IAB22-1" - ], - "bundle": "com.app.awesome", - "name": "Awesome App", - "domain": "awesomeapp.com", - "id": "123456789", - "ext": { - "prebid": { - "source": "test", - "version": "1.0.0" - } - } - }, - "imp": [ - { - "id": "some-imp-id", - "tagid": "some-tag-id", - "banner": { - "format":[ - { - "w": 320, - "h": 50 - } - ] - }, - "ext": { - "bidder": { - "placementId": "some-placement-id", - "viewabilityPercentage": 0.6 - } - } - } - ] - }, - "httpCalls": [ - { - "expectedRequest": { - "uri": "http://example.com?dc=us-east-2", - "body": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "language": "en", - "dnt": 0 - }, - "imp": [ - { - "id": "some-imp-id", - "tagid": "some-tag-id", - "banner": { - "w": 320, - "h": 50, - "format": [ - { - "w": 320, - "h": 50 - } - ] - }, - "displaymanagerver": "test-1.0.0", - "ext": { - "connatix": { - "placementId": "some-placement-id", - "viewabilityPercentage": 0.6 - } - } - } - ], - "app": { - "id": "123456789", - "name": "Awesome App", - "bundle": "com.app.awesome", - "domain": "awesomeapp.com", - "cat": [ - "IAB22-1" - ], - "publisher": { - "id": "123456789" - }, - "ext": { - "prebid": { - "source": "test", - "version": "1.0.0" - } - } - }, - "user": { - "buyeruid": "1-some-user" - }, - "tmax": 500 - }, - "impIDs": [ - "some-imp-id" - ] - }, - "mockResponse": { - "status": 200, - "body": { - "id": "test-response-id", - "seatbid": [ - { - "bid": [ - { - "id": "some-bid-id", - "impid": "some-imp-id", - "price": 0.52, - "adm": "some-test-ad", - "adomain": [ - "test.com" - ], - "crid": "112233", - "w": 320, - "h": 50, - "ext": { - "connatix": { - "mediaType": "banner" - } - } - } - ], - "seat": "connatix", - "group": 0 - } - ], - "cur": "USD" - } - } - } - ], - "expectedBidResponses": [ - { - "currency": "USD", - "bids": [ - { - "bid": { - "id": "some-bid-id", - "impid": "some-imp-id", - "price": 0.52, - "adm": "some-test-ad", - "crid": "112233", - "adomain": [ - "test.com" - ], - "w": 320, - "h": 50, - "ext": { - "connatix": { - "mediaType": "banner" - } - } - }, - "type": "banner" - } - ] - } - ] - } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-west-user.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-west-user.json deleted file mode 100644 index b5c27c2f6d0..00000000000 --- a/src/test/resources/org/prebid/server/it/openrtb2/connatix/bid-request-us-west-user.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "mockBidRequest": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "language": "en", - "dnt": 0 - }, - "tmax": 500, - "user": { - "buyeruid": "2-some-user" - }, - "app": { - "publisher": { - "id": "123456789" - }, - "cat": [ - "IAB22-1" - ], - "bundle": "com.app.awesome", - "name": "Awesome App", - "domain": "awesomeapp.com", - "id": "123456789", - "ext": { - "prebid": { - "source": "test", - "version": "1.0.0" - } - } - }, - "imp": [ - { - "id": "some-imp-id", - "tagid": "some-tag-id", - "banner": { - "format":[ - { - "w": 320, - "h": 50 - } - ] - }, - "ext": { - "bidder": { - "placementId": "some-placement-id", - "viewabilityPercentage": 0.6 - } - } - } - ] - }, - "httpCalls": [ - { - "expectedRequest": { - "uri": "http://example.com?dc=us-west-2", - "body": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "language": "en", - "dnt": 0 - }, - "imp": [ - { - "id": "some-imp-id", - "tagid": "some-tag-id", - "banner": { - "w": 320, - "h": 50, - "format": [ - { - "w": 320, - "h": 50 - } - ] - }, - "displaymanagerver": "test-1.0.0", - "ext": { - "connatix": { - "placementId": "some-placement-id", - "viewabilityPercentage": 0.6 - } - } - } - ], - "app": { - "id": "123456789", - "name": "Awesome App", - "bundle": "com.app.awesome", - "domain": "awesomeapp.com", - "cat": [ - "IAB22-1" - ], - "publisher": { - "id": "123456789" - }, - "ext": { - "prebid": { - "source": "test", - "version": "1.0.0" - } - } - }, - "user": { - "buyeruid": "2-some-user" - }, - "tmax": 500 - }, - "impIDs": [ - "some-imp-id" - ] - }, - "mockResponse": { - "status": 200, - "body": { - "id": "test-response-id", - "seatbid": [ - { - "bid": [ - { - "id": "some-bid-id", - "impid": "some-imp-id", - "price": 0.52, - "adm": "some-test-ad", - "adomain": [ - "test.com" - ], - "crid": "112233", - "w": 320, - "h": 50, - "ext": { - "connatix": { - "mediaType": "banner" - } - } - } - ], - "seat": "connatix", - "group": 0 - } - ], - "cur": "USD" - } - } - } - ], - "expectedBidResponses": [ - { - "currency": "USD", - "bids": [ - { - "bid": { - "id": "some-bid-id", - "impid": "some-imp-id", - "price": 0.52, - "adm": "some-test-ad", - "crid": "112233", - "adomain": [ - "test.com" - ], - "w": 320, - "h": 50, - "ext": { - "connatix": { - "mediaType": "banner" - } - } - }, - "type": "banner" - } - ] - } - ] -} From 30c656a97f2c6afc4d6d4ecec8a27d6f6aa313c6 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Fri, 11 Apr 2025 15:34:11 -0300 Subject: [PATCH 07/11] resolves pr review --- .../bidder/connatix/ConnatixBidder.java | 15 ++++++----- .../bidder/connatix/ConnatixBidderTest.java | 25 ++++--------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java index a73b8653d08..8ac1d416e05 100644 --- a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java +++ b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java @@ -77,8 +77,6 @@ public Result>> makeHttpRequests(BidRequest request return Result.withError(BidderError.badInput("Device IP is required")); } - final List errors = new ArrayList<>(); - final String optimalEndpointUrl; try { optimalEndpointUrl = getOptimalEndpointUrl(request); @@ -90,6 +88,7 @@ public Result>> makeHttpRequests(BidRequest request final MultiMap headers = resolveHeaders(device); final List> httpRequests = new ArrayList<>(); + final List errors = new ArrayList<>(); for (Imp imp : request.getImp()) { try { @@ -119,14 +118,14 @@ private String getOptimalEndpointUrl(BidRequest request) { } } - private Optional getUserId(BidRequest request) { + private static Optional getUserId(BidRequest request) { return Optional.ofNullable(request.getUser()) .map(User::getBuyeruid) .filter(StringUtils::isNotBlank) .map(String::trim); } - private String getDataCenterCode(String usedId) { + private static String getDataCenterCode(String usedId) { if (usedId.startsWith("1-")) { return "us-east-2"; } else if (usedId.startsWith("2-")) { @@ -215,12 +214,12 @@ private Banner modifyImpBanner(Banner banner) { return banner; } - private HttpRequest makeHttpRequest(BidRequest request, Imp imp, MultiMap headers, + private HttpRequest makeHttpRequest(BidRequest request, + Imp imp, + MultiMap headers, String optimalEndpointUrl) { - final BidRequest outgoingRequest = request.toBuilder() - .imp(List.of(imp)) - .build(); + final BidRequest outgoingRequest = request.toBuilder().imp(List.of(imp)).build(); return BidderUtil.defaultRequest(outgoingRequest, headers, optimalEndpointUrl, mapper); } diff --git a/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java b/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java index db3971a03a5..5ae6fdb273b 100644 --- a/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java @@ -282,10 +282,7 @@ public void makeHttpRequestsShouldUseDataCenterUsEast2WhenUserIdStartsWith1() { // then assertThat(result.getErrors()).isEmpty(); - final List> httpRequests = result.getValue(); - httpRequests.forEach(request -> { - assertThat(request.getUri().contains("dc=us-east-2")); - }); + assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("dc=us-east-2"); } @Test @@ -301,10 +298,7 @@ public void makeHttpRequestsShouldUseDataCenterUsWest2WhenUserIdStartsWith2() { // then assertThat(result.getErrors()).isEmpty(); - final List> httpRequests = result.getValue(); - httpRequests.forEach(request -> { - assertThat(request.getUri().contains("dc=us-west-2")); - }); + assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("dc=us-west-2"); } @Test @@ -320,10 +314,7 @@ public void makeHttpRequestsShouldUseDataCenterEuWest1WhenUserIdStartsWith3() { // then assertThat(result.getErrors()).isEmpty(); - final List> httpRequests = result.getValue(); - httpRequests.forEach(request -> { - assertThat(request.getUri().contains("dc=eu-west-1")); - }); + assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("dc=eu-west-1"); } @Test @@ -339,10 +330,7 @@ public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdPrefixDoesNotMatch( // then assertThat(result.getErrors()).isEmpty(); - final List> httpRequests = result.getValue(); - httpRequests.forEach(request -> { - assertThat(request.getUri() == CONNATIX_ENDPOINT); - }); + assertThat(result.getValue()).extracting(HttpRequest::getUri).isEqualTo(CONNATIX_ENDPOINT); } @Test @@ -358,10 +346,7 @@ public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdIsMissing() { // then assertThat(result.getErrors()).isEmpty(); - final List> httpRequests = result.getValue(); - httpRequests.forEach(request -> { - assertThat(request.getUri() == CONNATIX_ENDPOINT); - }); + assertThat(result.getValue()).extracting(HttpRequest::getUri).isEqualTo(CONNATIX_ENDPOINT); } @Test From f2fc140d3fdbf6872c000bd77d82bb662939ea60 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Fri, 11 Apr 2025 15:40:17 -0300 Subject: [PATCH 08/11] resolves build error --- .../java/org/prebid/server/bidder/connatix/ConnatixBidder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java index 8ac1d416e05..12a1172f3c0 100644 --- a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java +++ b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java @@ -108,7 +108,7 @@ private String getOptimalEndpointUrl(BidRequest request) { try { final URIBuilder uriBuilder = new URIBuilder(endpointUrl); return getUserId(request) - .map(this::getDataCenterCode) + .map(userId -> getDataCenterCode(userId)) .map(dataCenterCode -> uriBuilder.addParameter("dc", dataCenterCode)) .orElse(uriBuilder) .build() From 81c2fff287ce0fca4d7e80b9b2243b0763282382 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Fri, 11 Apr 2025 15:54:25 -0300 Subject: [PATCH 09/11] fixes unit tests --- .../server/bidder/connatix/ConnatixBidderTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java b/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java index 5ae6fdb273b..7dfc8bdcd12 100644 --- a/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java @@ -282,7 +282,7 @@ public void makeHttpRequestsShouldUseDataCenterUsEast2WhenUserIdStartsWith1() { // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("dc=us-east-2"); + assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("https://test-url.com/?dc=us-east-2"); } @Test @@ -298,7 +298,7 @@ public void makeHttpRequestsShouldUseDataCenterUsWest2WhenUserIdStartsWith2() { // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("dc=us-west-2"); + assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("https://test-url.com/?dc=us-west-2"); } @Test @@ -314,7 +314,7 @@ public void makeHttpRequestsShouldUseDataCenterEuWest1WhenUserIdStartsWith3() { // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("dc=eu-west-1"); + assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("https://test-url.com/?dc=eu-west-1"); } @Test @@ -330,7 +330,7 @@ public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdPrefixDoesNotMatch( // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).extracting(HttpRequest::getUri).isEqualTo(CONNATIX_ENDPOINT); + assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly(CONNATIX_ENDPOINT); } @Test @@ -346,7 +346,7 @@ public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdIsMissing() { // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).extracting(HttpRequest::getUri).isEqualTo(CONNATIX_ENDPOINT); + assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly(CONNATIX_ENDPOINT); } @Test From 0a510071715e90b77e7cdf9f4473d2efcf2415f9 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Wed, 23 Apr 2025 10:38:23 -0300 Subject: [PATCH 10/11] refactors getOptimalEndpointUrl --- .../server/bidder/connatix/ConnatixBidder.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java index 12a1172f3c0..d47e57f478d 100644 --- a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java +++ b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java @@ -103,14 +103,16 @@ public Result>> makeHttpRequests(BidRequest request return Result.of(httpRequests, errors); } - private String getOptimalEndpointUrl(BidRequest request) { + final Optional dataCenterCode = getUserId(request).map(ConnatixBidder::getDataCenterCode); + + if (dataCenterCode.isEmpty()) { + return endpointUrl; + } + try { - final URIBuilder uriBuilder = new URIBuilder(endpointUrl); - return getUserId(request) - .map(userId -> getDataCenterCode(userId)) - .map(dataCenterCode -> uriBuilder.addParameter("dc", dataCenterCode)) - .orElse(uriBuilder) + return new URIBuilder(endpointUrl) + .addParameter("dc", dataCenterCode.get()) .build() .toString(); } catch (URISyntaxException e) { From 03c14dd43dc5b0de2f2d6ad48aa375c86239e978 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Wed, 23 Apr 2025 10:45:07 -0300 Subject: [PATCH 11/11] linter error --- .../java/org/prebid/server/bidder/connatix/ConnatixBidder.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java index d47e57f478d..f6adfff4867 100644 --- a/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java +++ b/src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java @@ -103,6 +103,7 @@ public Result>> makeHttpRequests(BidRequest request return Result.of(httpRequests, errors); } + private String getOptimalEndpointUrl(BidRequest request) { final Optional dataCenterCode = getUserId(request).map(ConnatixBidder::getDataCenterCode);