From 51e89425fe7a58b190fbe2f7c8c5b58bde8de136 Mon Sep 17 00:00:00 2001 From: antonbabak Date: Tue, 22 Jul 2025 10:51:40 +0200 Subject: [PATCH 1/2] Stroeercore Adapter: Add adomain to bids --- .../bidder/stroeercore/StroeerCoreBidder.java | 116 +++------ .../stroeercore/model/StroeerCoreBid.java | 7 +- .../bidder/StroeerCoreConfiguration.java | 4 +- .../static/bidder-params/stroeerCore.json | 4 +- .../stroeercore/StroeerCoreBidderTest.java | 229 +++++------------- .../test-auction-stroeercore-response.json | 2 + .../test-stroeercore-bid-response.json | 6 +- 7 files changed, 108 insertions(+), 260 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java b/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java index a3d02f5250d..5f8e68efb4c 100644 --- a/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java +++ b/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java @@ -6,17 +6,15 @@ import com.iab.openrtb.request.Imp; import com.iab.openrtb.response.Bid; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.prebid.server.bidder.Bidder; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; import org.prebid.server.bidder.model.BidderError; import org.prebid.server.bidder.model.HttpRequest; -import org.prebid.server.bidder.model.Price; import org.prebid.server.bidder.model.Result; import org.prebid.server.bidder.stroeercore.model.StroeerCoreBid; import org.prebid.server.bidder.stroeercore.model.StroeerCoreBidResponse; -import org.prebid.server.currency.CurrencyConversionService; import org.prebid.server.exception.PreBidException; import org.prebid.server.json.DecodeException; import org.prebid.server.json.JacksonMapper; @@ -26,7 +24,6 @@ import org.prebid.server.util.BidderUtil; import org.prebid.server.util.HttpUtil; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -41,14 +38,10 @@ public class StroeerCoreBidder implements Bidder { private final String endpointUrl; private final JacksonMapper mapper; - private final CurrencyConversionService currencyConversionService; - public StroeerCoreBidder(String endpointUrl, - JacksonMapper mapper, - CurrencyConversionService currencyConversionService) { + public StroeerCoreBidder(String endpointUrl, JacksonMapper mapper) { this.endpointUrl = HttpUtil.validateUrl(endpointUrl); this.mapper = Objects.requireNonNull(mapper); - this.currencyConversionService = Objects.requireNonNull(currencyConversionService); } @Override @@ -57,22 +50,12 @@ public Result>> makeHttpRequests(BidRequest bidRequ final List errors = new ArrayList<>(); for (Imp imp : bidRequest.getImp()) { - final ExtImpStroeerCore impExt; - final Price price; - try { - validateImp(imp); - - impExt = parseImpExt(imp); - validateImpExt(impExt); - - price = convertBidFloor(bidRequest, imp); + final ExtImpStroeerCore impExt = parseImpExt(imp); + modifiedImps.add(imp.toBuilder().tagid(impExt.getSlotId()).build()); } catch (PreBidException e) { errors.add(BidderError.badInput("%s. Ignore imp id = %s.".formatted(e.getMessage(), imp.getId()))); - continue; } - - modifiedImps.add(modifyImp(imp, impExt, price)); } if (modifiedImps.isEmpty()) { @@ -80,14 +63,7 @@ public Result>> makeHttpRequests(BidRequest bidRequ } final BidRequest outgoingRequest = bidRequest.toBuilder().imp(modifiedImps).build(); - - return createHttpRequests(errors, outgoingRequest); - } - - private static void validateImp(Imp imp) { - if (imp.getBanner() == null && imp.getVideo() == null) { - throw new PreBidException("Expected banner or video impression"); - } + return Result.withValue(BidderUtil.defaultRequest(outgoingRequest, endpointUrl, mapper)); } private ExtImpStroeerCore parseImpExt(Imp imp) { @@ -98,65 +74,47 @@ private ExtImpStroeerCore parseImpExt(Imp imp) { } } - private static void validateImpExt(ExtImpStroeerCore impExt) { - if (StringUtils.isBlank(impExt.getSlotId())) { - throw new PreBidException("Custom param slot id (sid) is empty"); - } - } - - private Price convertBidFloor(BidRequest bidRequest, Imp imp) { - final BigDecimal bidFloor = imp.getBidfloor(); - final String bidFloorCurrency = imp.getBidfloorcur(); - - if (!shouldConvertBidFloor(bidFloor, bidFloorCurrency)) { - return Price.of(bidFloorCurrency, bidFloor); - } - - final BigDecimal convertedBidFloor = currencyConversionService.convertCurrency( - bidFloor, bidRequest, bidFloorCurrency, BIDDER_CURRENCY); - - return Price.of(BIDDER_CURRENCY, convertedBidFloor); - } - - private Result>> createHttpRequests(List errors, BidRequest bidRequest) { - return Result.of(Collections.singletonList(BidderUtil.defaultRequest(bidRequest, endpointUrl, mapper)), errors); - } - - private static boolean shouldConvertBidFloor(BigDecimal bidFloor, String bidFloorCurrency) { - return BidderUtil.isValidPrice(bidFloor) && !StringUtils.equalsIgnoreCase(bidFloorCurrency, BIDDER_CURRENCY); - } - - private static Imp modifyImp(Imp imp, ExtImpStroeerCore impExt, Price price) { - return imp.toBuilder() - .bidfloorcur(price.getCurrency()) - .bidfloor(price.getValue()) - .tagid(impExt.getSlotId()) - .build(); - } - @Override public Result> makeBids(BidderCall httpCall, BidRequest bidRequest) { try { final String body = httpCall.getResponse().getBody(); + final List errors = new ArrayList<>(); final StroeerCoreBidResponse bidResponse = mapper.decodeValue(body, StroeerCoreBidResponse.class); - return Result.withValues(extractBids(httpCall.getRequest().getPayload(), bidResponse)); + return Result.of(extractBids(bidResponse, errors), errors); } catch (DecodeException e) { return Result.withError(BidderError.badServerResponse(e.getMessage())); } } - private List extractBids(BidRequest bidRequest, StroeerCoreBidResponse bidResponse) { + private static Pair getBidType(String mtype) { + return switch (mtype) { + case "banner" -> Pair.of(BidType.banner, 1); + case "video" -> Pair.of(BidType.video, 2); + default -> null; + }; + } + + private List extractBids(StroeerCoreBidResponse bidResponse, List errors) { if (bidResponse == null || CollectionUtils.isEmpty(bidResponse.getBids())) { return Collections.emptyList(); } return bidResponse.getBids().stream() .filter(Objects::nonNull) - .map(stroeerCoreBid -> toBidderBid(bidRequest, stroeerCoreBid)) + .map(stroeerCoreBid -> toBidderBid(stroeerCoreBid, errors)) + .filter(Objects::nonNull) .toList(); } - private BidderBid toBidderBid(BidRequest bidRequest, StroeerCoreBid stroeercoreBid) { + private BidderBid toBidderBid(StroeerCoreBid stroeercoreBid, List errors) { + final Pair bidType = getBidType(stroeercoreBid.getMtype()); + if (bidType == null) { + errors.add(BidderError.badServerResponse( + "Bid media type error: unable to determine media type for bid with id \"%s\"" + .formatted(stroeercoreBid.getBidId()))); + return null; + } + final ObjectNode bidExt = stroeercoreBid.getDsa() != null ? mapper.mapper().createObjectNode().set("dsa", stroeercoreBid.getDsa()) : null; @@ -164,29 +122,17 @@ private BidderBid toBidderBid(BidRequest bidRequest, StroeerCoreBid stroeercoreB return BidderBid.of( Bid.builder() .id(stroeercoreBid.getId()) - .impid(stroeercoreBid.getImpId()) + .impid(stroeercoreBid.getBidId()) .w(stroeercoreBid.getWidth()) .h(stroeercoreBid.getHeight()) .price(stroeercoreBid.getCpm()) .adm(stroeercoreBid.getAdMarkup()) .crid(stroeercoreBid.getCreativeId()) + .adomain(stroeercoreBid.getAdomain()) + .mtype(bidType.getRight()) .ext(bidExt) .build(), - getBidType(stroeercoreBid.getImpId(), bidRequest.getImp()), + bidType.getLeft(), BIDDER_CURRENCY); } - - private static BidType getBidType(String impId, List imps) { - for (Imp imp : imps) { - if (imp.getId().equals(impId)) { - if (imp.getBanner() != null) { - return BidType.banner; - } else if (imp.getVideo() != null) { - return BidType.video; - } - } - } - - return BidType.banner; - } } diff --git a/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java b/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java index 84a875b2b80..2c665a27ce5 100644 --- a/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java +++ b/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java @@ -6,6 +6,7 @@ import lombok.Value; import java.math.BigDecimal; +import java.util.List; @Value @Builder @@ -14,7 +15,7 @@ public class StroeerCoreBid { String id; @JsonProperty("bidId") - String impId; + String bidId; BigDecimal cpm; @@ -29,4 +30,8 @@ public class StroeerCoreBid { String creativeId; ObjectNode dsa; + + String mtype; + + List adomain; } diff --git a/src/main/java/org/prebid/server/spring/config/bidder/StroeerCoreConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/StroeerCoreConfiguration.java index f33c72e5027..49369a2ddac 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/StroeerCoreConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/StroeerCoreConfiguration.java @@ -2,7 +2,6 @@ import org.prebid.server.bidder.BidderDeps; import org.prebid.server.bidder.stroeercore.StroeerCoreBidder; -import org.prebid.server.currency.CurrencyConversionService; import org.prebid.server.json.JacksonMapper; import org.prebid.server.spring.config.bidder.model.BidderConfigurationProperties; import org.prebid.server.spring.config.bidder.util.BidderDepsAssembler; @@ -31,13 +30,12 @@ BidderConfigurationProperties configurationProperties() { @Bean BidderDeps stroeercoreBidderDeps(BidderConfigurationProperties stroeercoreConfigurationProperties, @NotBlank @Value("${external-url}") String externalUrl, - CurrencyConversionService currencyConversionService, JacksonMapper mapper) { return BidderDepsAssembler.forBidder(BIDDER_NAME) .withConfig(stroeercoreConfigurationProperties) .usersyncerCreator(UsersyncerCreator.create(externalUrl)) - .bidderCreator(config -> new StroeerCoreBidder(config.getEndpoint(), mapper, currencyConversionService)) + .bidderCreator(config -> new StroeerCoreBidder(config.getEndpoint(), mapper)) .assemble(); } } diff --git a/src/main/resources/static/bidder-params/stroeerCore.json b/src/main/resources/static/bidder-params/stroeerCore.json index e693962fa97..a5a93df64b8 100644 --- a/src/main/resources/static/bidder-params/stroeerCore.json +++ b/src/main/resources/static/bidder-params/stroeerCore.json @@ -9,5 +9,7 @@ "description": "Slot Id" } }, - "required": ["sid"] + "required": [ + "sid" + ] } diff --git a/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java b/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java index 11e789e8a24..f6ddf4e544e 100644 --- a/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java @@ -2,19 +2,15 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.iab.openrtb.request.Audio; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; import com.iab.openrtb.request.Imp.ImpBuilder; import com.iab.openrtb.request.Regs; -import com.iab.openrtb.request.Video; import com.iab.openrtb.response.Bid; import io.vertx.core.http.HttpMethod; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; import org.prebid.server.bidder.model.BidderBid; @@ -25,8 +21,6 @@ import org.prebid.server.bidder.model.Result; import org.prebid.server.bidder.stroeercore.model.StroeerCoreBid; import org.prebid.server.bidder.stroeercore.model.StroeerCoreBidResponse; -import org.prebid.server.currency.CurrencyConversionService; -import org.prebid.server.exception.PreBidException; import org.prebid.server.proto.openrtb.ext.ExtPrebid; import org.prebid.server.proto.openrtb.ext.request.DsaTransparency; import org.prebid.server.proto.openrtb.ext.request.ExtRegs; @@ -46,25 +40,13 @@ import static java.util.function.UnaryOperator.identity; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class StroeerCoreBidderTest extends VertxTest { private static final String ENDPOINT_URL = "https://test.endpoint.com"; - @Mock - private CurrencyConversionService currencyConversionService; - - private StroeerCoreBidder target; - - @BeforeEach - public void setUp() { - target = new StroeerCoreBidder(ENDPOINT_URL, jacksonMapper, currencyConversionService); - } + private final StroeerCoreBidder target = new StroeerCoreBidder(ENDPOINT_URL, jacksonMapper); @Test public void makeHttpRequestsShouldReturnExpectedMethod() { @@ -171,146 +153,28 @@ public void makeHttpRequestsShouldReturnErrorIfImpExtCouldNotBeParsed() { } @Test - public void makeHttpRequestsShouldReturnErrorWhenImpHasNoBannerOrVideo() { - // given - final BidRequest invalidBidRequest = createBidRequest(createAudioImp("123", imp -> imp.id("2"))); - - // when - final Result>> result = target.makeHttpRequests(invalidBidRequest); - - // then - assertThat(result.getValue()).isEmpty(); - assertThat(result.getErrors()) - .containsExactly(BidderError.badInput("Expected banner or video impression. Ignore imp id = 2.")); - } - - @Test - public void makeHttpRequestsShouldReturnErrorIfSlotIdIsEmpty() { - // given - final BidRequest invalidBidRequest = createBidRequest(createBannerImp(" ", imp -> imp.id("1"))); - - // when - final Result>> result = target.makeHttpRequests(invalidBidRequest); - - // then - assertThat(result.getValue()).isEmpty(); - assertThat(result.getErrors()) - .containsExactly(BidderError.badInput("Custom param slot id (sid) is empty. Ignore imp id = 1.")); - } - - @Test - public void makeHttpRequestsShouldIgnoreInvalidImpressions() { - // given - final List imps = List.of( - createImpWithNonParsableImpExt("2"), - createBannerImp(" "), - createBannerImp("a"), - createBannerImp("b", imp -> imp.banner(null)), - createAudioImp("not-supported", identity()), - createVideoImp("c"), - createBannerImp("d"), - createBannerImp("e", imp -> imp.bidfloor(BigDecimal.ONE).bidfloorcur("GPB"))); - - when(currencyConversionService.convertCurrency(any(), any(), any(), any())) - .thenThrow(new PreBidException("no")); - - final BidRequest bidRequest = BidRequest.builder().imp(imps).build(); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).hasSize(5); - assertThat(result.getValue()) - .extracting(HttpRequest::getPayload) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getTagid) - .containsExactly("a", "c", "d"); - } - - @Test - public void makeHttpRequestsShouldConvertCurrencyToEuro() { - // given - final BigDecimal usdBidFloor = BigDecimal.valueOf(0.5); - final Imp usdImp = createBannerImp("200", imp -> imp.bidfloorcur("USD").bidfloor(usdBidFloor)); - final BidRequest bidRequest = createBidRequest(usdImp); - - final BigDecimal eurBidFloor = BigDecimal.valueOf(1.82); - when(currencyConversionService.convertCurrency(any(), any(), any(), any())).thenReturn(eurBidFloor); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - verify(currencyConversionService).convertCurrency(usdBidFloor, bidRequest, "USD", "EUR"); - verifyNoMoreInteractions(currencyConversionService); - - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()) - .extracting(HttpRequest::getPayload) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getBidfloor, Imp::getBidfloorcur) - .containsOnly(tuple(eurBidFloor, "EUR")); - } - - @Test - public void makeHttpRequestsShouldIgnoreBidIfCurrencyServiceThrowsException() { + public void makeBidsShouldReturnExpectedBannerBid() throws JsonProcessingException { // given - final BigDecimal usdBidFloor = BigDecimal.valueOf(0.5); - final Imp usdImp = createBannerImp("10", imp -> imp.id("1282").bidfloorcur("USD").bidfloor(usdBidFloor)); - final BidRequest bidRequest = createBidRequest(usdImp); - - when(currencyConversionService.convertCurrency(any(), any(), any(), any())) - .thenThrow(new PreBidException("no")); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - verify(currencyConversionService).convertCurrency(usdBidFloor, bidRequest, "USD", "EUR"); - verifyNoMoreInteractions(currencyConversionService); - - assertThat(result.getErrors()).allSatisfy(error -> { - assertThat(error.getType()).isEqualTo(BidderError.Type.bad_input); - assertThat(error.getMessage()).startsWith("no. Ignore imp id = 1282."); - }); - assertThat(result.getValue()).isEmpty(); - } - - @Test - public void makeBidsShouldReturnExpectedBidderBids() throws JsonProcessingException { - // given - final Imp bannerImp = createBannerImp("banner-slot-id", impBuilder -> impBuilder.id("banner-imp-id")); - final Imp videoImp = createVideoImp("video-slot-id", impBuilder -> impBuilder.id("video-imp-id")); - final BidRequest bidRequest = createBidRequest(bannerImp, videoImp); - final ObjectNode dsaResponse = createDsaResponse(); final StroeerCoreBid bannerBid = StroeerCoreBid.builder() .id("1") - .impId("banner-imp-id") + .bidId("banner-imp-id") .adMarkup("
") .cpm(BigDecimal.valueOf(0.3)) .creativeId("foo") .width(300) .height(600) + .mtype("banner") .dsa(dsaResponse.deepCopy()) + .adomain(List.of("domain1.com", "domain2.com")) .build(); - final StroeerCoreBid videoBid = StroeerCoreBid.builder() - .id("27") - .impId("video-imp-id") - .adMarkup("") - .cpm(BigDecimal.valueOf(1.58)) - .creativeId("vid") - .dsa(null) - .build(); - - final StroeerCoreBidResponse response = StroeerCoreBidResponse.of(List.of(bannerBid, videoBid)); - final BidderCall httpCall = createHttpCall(bidRequest, response); + final StroeerCoreBidResponse response = StroeerCoreBidResponse.of(List.of(bannerBid)); + final BidderCall httpCall = createHttpCall(response); // when - final Result> result = target.makeBids(httpCall, bidRequest); + final Result> result = target.makeBids(httpCall, null); // then final Bid expectedBannerBid = Bid.builder() @@ -321,21 +185,68 @@ public void makeBidsShouldReturnExpectedBidderBids() throws JsonProcessingExcept .crid("foo") .w(300) .h(600) + .adomain(List.of("domain1.com", "domain2.com")) + .mtype(1) .ext(mapper.createObjectNode().set("dsa", dsaResponse)) .build(); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).containsOnly(BidderBid.of(expectedBannerBid, BidType.banner, "EUR")); + } + + @Test + public void makeBidsShouldReturnExpectedBidderBids() throws JsonProcessingException { + // given + final StroeerCoreBid videoBid = StroeerCoreBid.builder() + .id("27") + .bidId("video-imp-id") + .adMarkup("") + .cpm(BigDecimal.valueOf(1.58)) + .creativeId("vid") + .mtype("video") + .dsa(null) + .build(); + + final StroeerCoreBidResponse response = StroeerCoreBidResponse.of(List.of(videoBid)); + final BidderCall httpCall = createHttpCall(response); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then final Bid expectedVideoBid = Bid.builder() .id("27") .impid("video-imp-id") .adm("") .price(BigDecimal.valueOf(1.58)) .crid("vid") + .mtype(2) .ext(null) .build(); assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).containsOnly(BidderBid.of(expectedBannerBid, BidType.banner, "EUR"), - BidderBid.of(expectedVideoBid, BidType.video, "EUR")); + assertThat(result.getValue()).containsOnly(BidderBid.of(expectedVideoBid, BidType.video, "EUR")); + } + + @Test + public void makeBidsShouldFailWhenBidTypeIsNotSupported() throws JsonProcessingException { + // given + final StroeerCoreBid audioBid = StroeerCoreBid.builder() + .id("27") + .bidId("audio-imp-id") + .mtype("audio") + .build(); + + final StroeerCoreBidResponse response = StroeerCoreBidResponse.of(List.of(audioBid)); + final BidderCall httpCall = createHttpCall(response); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + assertThat(result.getErrors()).containsOnly(BidderError.badServerResponse( + "Bid media type error: unable to determine media type for bid with id \"audio-imp-id\"")); + assertThat(result.getValue()).isEmpty(); } @Test @@ -357,8 +268,7 @@ public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() { @Test public void makeBidsShouldReturnEmptyListIfZeroBids() throws JsonProcessingException { // given - final BidderCall httpCall = createHttpCall(BidRequest.builder().build(), - StroeerCoreBidResponse.of(emptyList())); + final BidderCall httpCall = createHttpCall(StroeerCoreBidResponse.of(emptyList())); // when final Result> result = target.makeBids(httpCall, null); @@ -369,9 +279,7 @@ public void makeBidsShouldReturnEmptyListIfZeroBids() throws JsonProcessingExcep } private BidRequest createBidRequest(Imp... imps) { - return BidRequest.builder() - .imp(List.of(imps)) - .build(); + return BidRequest.builder().imp(List.of(imps)).build(); } private Imp createImpWithNonParsableImpExt(String impId) { @@ -388,20 +296,6 @@ private Imp createBannerImp(String slotId) { return createBannerImp(slotId, identity()); } - private Imp createVideoImp(String slotId, UnaryOperator impCustomizer) { - final UnaryOperator addVideo = imp -> imp.video(Video.builder().build()); - return createImp(slotId, addVideo.andThen(impCustomizer)); - } - - private Imp createVideoImp(String slotId) { - return createVideoImp(slotId, identity()); - } - - private Imp createAudioImp(String slotId, UnaryOperator impCustomizer) { - final UnaryOperator addAudio = imp -> imp.audio(Audio.builder().build()); - return createImp(slotId, addAudio.andThen(impCustomizer)); - } - private Imp createImp(String slotId, Function impCustomizer) { final ObjectNode impExtNode = mapper.valueToTree(ExtPrebid.of(null, ExtImpStroeerCore.of(slotId))); @@ -411,9 +305,8 @@ private Imp createImp(String slotId, Function impCustomi return addImpExt.andThen(impCustomizer).apply(impBuilder).build(); } - private BidderCall createHttpCall(BidRequest request, StroeerCoreBidResponse response) - throws JsonProcessingException { - return createHttpCall(HttpRequest.builder().payload(request).build(), + private BidderCall createHttpCall(StroeerCoreBidResponse response) throws JsonProcessingException { + return createHttpCall(HttpRequest.builder().build(), HttpResponse.of(200, null, mapper.writeValueAsString(response))); } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-auction-stroeercore-response.json b/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-auction-stroeercore-response.json index aab841a83de..7df441df2c4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-auction-stroeercore-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-auction-stroeercore-response.json @@ -12,6 +12,7 @@ "crid":"banner_creative_id", "w": 300, "h": 250, + "mtype": 1, "ext": { "origbidcpm": 6.77, "origbidcur": "EUR", @@ -30,6 +31,7 @@ "price": 6.494, "adm": "
video
", "crid":"video_creative_id", + "mtype": 2, "ext": { "origbidcpm": 5.7, "origbidcur": "EUR", diff --git a/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-stroeercore-bid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-stroeercore-bid-response.json index 074d4c2cbf1..fa6d5e0f7ca 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-stroeercore-bid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-stroeercore-bid-response.json @@ -7,14 +7,16 @@ "width": 300, "height": 250, "ad": "
foo
", - "crid": "banner_creative_id" + "crid": "banner_creative_id", + "mtype": "banner" }, { "id": "bid_id_2", "bidId": "imp_id_2", "cpm": 5.7, "ad": "
video
", - "crid": "video_creative_id" + "crid": "video_creative_id", + "mtype": "video" } ] } From 746e228ba8b0bb09bebcd36a7c5b2d0a49d5f700 Mon Sep 17 00:00:00 2001 From: antonbabak Date: Thu, 24 Jul 2025 15:46:39 +0200 Subject: [PATCH 2/2] fix comments --- .../bidder/stroeercore/StroeerCoreBidder.java | 23 +++++++++---------- .../stroeercore/StroeerCoreBidderTest.java | 3 --- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java b/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java index 5f8e68efb4c..cff5866d027 100644 --- a/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java +++ b/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java @@ -6,7 +6,6 @@ import com.iab.openrtb.request.Imp; import com.iab.openrtb.response.Bid; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.tuple.Pair; import org.prebid.server.bidder.Bidder; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; @@ -86,14 +85,6 @@ public Result> makeBids(BidderCall httpCall, BidRequ } } - private static Pair getBidType(String mtype) { - return switch (mtype) { - case "banner" -> Pair.of(BidType.banner, 1); - case "video" -> Pair.of(BidType.video, 2); - default -> null; - }; - } - private List extractBids(StroeerCoreBidResponse bidResponse, List errors) { if (bidResponse == null || CollectionUtils.isEmpty(bidResponse.getBids())) { return Collections.emptyList(); @@ -107,7 +98,7 @@ private List extractBids(StroeerCoreBidResponse bidResponse, List errors) { - final Pair bidType = getBidType(stroeercoreBid.getMtype()); + final BidType bidType = getBidType(stroeercoreBid.getMtype()); if (bidType == null) { errors.add(BidderError.badServerResponse( "Bid media type error: unable to determine media type for bid with id \"%s\"" @@ -129,10 +120,18 @@ private BidderBid toBidderBid(StroeerCoreBid stroeercoreBid, List e .adm(stroeercoreBid.getAdMarkup()) .crid(stroeercoreBid.getCreativeId()) .adomain(stroeercoreBid.getAdomain()) - .mtype(bidType.getRight()) + .mtype(bidType.ordinal() + 1) .ext(bidExt) .build(), - bidType.getLeft(), + bidType, BIDDER_CURRENCY); } + + private static BidType getBidType(String mtype) { + return switch (mtype) { + case "banner" -> BidType.banner; + case "video" -> BidType.video; + default -> null; + }; + } } diff --git a/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java b/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java index f6ddf4e544e..aa918224d29 100644 --- a/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java @@ -10,8 +10,6 @@ import com.iab.openrtb.response.Bid; import io.vertx.core.http.HttpMethod; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; @@ -41,7 +39,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; -@ExtendWith(MockitoExtension.class) public class StroeerCoreBidderTest extends VertxTest { private static final String ENDPOINT_URL = "https://test.endpoint.com";