Skip to content

Commit 3755550

Browse files
committed
CR fix
1 parent 4e29346 commit 3755550

File tree

2 files changed

+134
-45
lines changed

2 files changed

+134
-45
lines changed

src/main/java/org/prebid/server/bidder/yandex/YandexBidder.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,30 @@ private static Imp modifyImp(Imp imp) {
117117
.displaymanager(DISPLAY_MANAGER)
118118
.displaymanagerver(DISPLAY_MANAGER_VERSION);
119119

120+
boolean hasValidFormat = false;
121+
120122
if (imp.getBanner() != null) {
121-
return impBuilder.banner(modifyBanner(imp.getBanner())).build();
123+
impBuilder.banner(modifyBanner(imp.getBanner()));
124+
hasValidFormat = true;
122125
}
126+
123127
if (imp.getVideo() != null) {
124-
return impBuilder.video(modifyVideo(imp.getVideo())).build();
128+
impBuilder.video(modifyVideo(imp.getVideo()));
129+
hasValidFormat = true;
125130
}
131+
132+
// Обрабатываем native формат
126133
if (imp.getXNative() != null) {
127-
return impBuilder.build();
134+
impBuilder.xNative(imp.getXNative());
135+
hasValidFormat = true;
128136
}
129-
throw new PreBidException("Yandex only supports banner, video, and native types. Ignoring imp id #%s"
130-
.formatted(imp.getId()));
137+
138+
if (!hasValidFormat) {
139+
throw new PreBidException("Imp #%s must contain at least one valid format (banner, video, or native)"
140+
.formatted(imp.getId()));
141+
}
142+
143+
return impBuilder.build();
131144
}
132145

133146
private static Banner modifyBanner(Banner banner) {
@@ -201,6 +214,10 @@ private HttpRequest<BidRequest> buildHttpRequest(BidRequest outgoingRequest, Str
201214

202215
private static MultiMap headers(BidRequest bidRequest) {
203216
final MultiMap headers = HttpUtil.headers();
217+
218+
headers.add(HttpUtil.X_OPENRTB_VERSION_HEADER, "2.5");
219+
HttpUtil.addHeaderIfValueIsNotEmpty(headers, "Referer", getReferer(bidRequest));
220+
204221
final Device device = bidRequest.getDevice();
205222
if (device != null) {
206223
HttpUtil.addHeaderIfValueIsNotEmpty(headers, HttpUtil.ACCEPT_LANGUAGE_HEADER, device.getLanguage());
@@ -251,17 +268,14 @@ private static BidType getBidType(String bidImpId, List<Imp> imps) {
251268
}
252269

253270
private static BidType resolveImpType(Imp imp) {
254-
if (imp.getBanner() != null) {
255-
return BidType.banner;
256-
}
257271
if (imp.getVideo() != null) {
258272
return BidType.video;
259273
}
260274
if (imp.getXNative() != null) {
261275
return BidType.xNative;
262276
}
263-
if (imp.getAudio() != null) {
264-
return BidType.audio;
277+
if (imp.getBanner() != null) {
278+
return BidType.banner;
265279
}
266280
throw new PreBidException("Processing an invalid impression; cannot resolve impression type for imp #%s"
267281
.formatted(imp.getId()));

src/test/java/org/prebid/server/bidder/yandex/YandexBidderTest.java

Lines changed: 110 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.node.ObjectNode;
5-
import com.iab.openrtb.request.Audio;
65
import com.iab.openrtb.request.Banner;
76
import com.iab.openrtb.request.BidRequest;
87
import com.iab.openrtb.request.Device;
@@ -36,7 +35,6 @@
3635
import static org.assertj.core.api.Assertions.assertThat;
3736
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
3837
import static org.assertj.core.api.Assertions.tuple;
39-
import static org.prebid.server.proto.openrtb.ext.response.BidType.audio;
4038
import static org.prebid.server.proto.openrtb.ext.response.BidType.banner;
4139
import static org.prebid.server.proto.openrtb.ext.response.BidType.video;
4240
import static org.prebid.server.proto.openrtb.ext.response.BidType.xNative;
@@ -144,7 +142,7 @@ public void makeHttpRequestsShouldCreateARequestForEachImpAndSkipImpsWithNoBanne
144142
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
145143
// then
146144
assertThat(result.getErrors()).containsExactly(
147-
BidderError.badInput("Yandex only supports banner, video, and native types. Ignoring imp id #blockA")
145+
BidderError.badInput("Imp #blockA must contain at least one valid format (banner, video, or native)")
148146
);
149147
}
150148

@@ -345,44 +343,20 @@ public void makeBidsShouldReturnErrorWhenBidImpIdIsNotPresent() throws JsonProce
345343
}
346344

347345
@Test
348-
public void makeBidsShouldReturnBannerAndNative() throws JsonProcessingException {
349-
// given
350-
final BidderCall<BidRequest> bidderCall = givenBidderCall(
351-
BidRequest.builder()
352-
.imp(asList(Imp.builder().id("blockA").xNative(Native.builder().build()).build(),
353-
Imp.builder().id("blockB").banner(Banner.builder().build()).build()))
354-
.build(),
355-
mapper.writeValueAsString(BidResponse.builder()
356-
.cur("USD")
357-
.seatbid(singletonList(SeatBid.builder()
358-
.bid(asList(Bid.builder().impid("blockA").build(),
359-
Bid.builder().impid("blockB").build()))
360-
.build()))
361-
.build()));
362-
363-
// when
364-
final Result<List<BidderBid>> result = target.makeBids(bidderCall, null);
365-
366-
// then
367-
assertThat(result.getErrors()).isEmpty();
368-
assertThat(result.getValue())
369-
.containsOnly(BidderBid.of(Bid.builder().impid("blockA").build(), xNative, "USD"),
370-
BidderBid.of(Bid.builder().impid("blockB").build(), banner, "USD"));
371-
}
372-
373-
@Test
374-
public void makeBidsShouldReturnVideoAndAudio() throws JsonProcessingException {
346+
public void makeBidsShouldReturnAllSupportedTypes() throws JsonProcessingException {
375347
// given
376348
final BidderCall<BidRequest> bidderCall = givenBidderCall(
377349
BidRequest.builder()
378350
.imp(asList(Imp.builder().id("blockA").video(Video.builder().build()).build(),
379-
Imp.builder().id("blockB").audio(Audio.builder().build()).build()))
351+
Imp.builder().id("blockB").banner(Banner.builder().build()).build(),
352+
Imp.builder().id("blockC").xNative(Native.builder().build()).build()))
380353
.build(),
381354
mapper.writeValueAsString(BidResponse.builder()
382355
.cur("USD")
383356
.seatbid(singletonList(SeatBid.builder()
384357
.bid(asList(Bid.builder().impid("blockA").build(),
385-
Bid.builder().impid("blockB").build()))
358+
Bid.builder().impid("blockB").build(),
359+
Bid.builder().impid("blockC").build()))
386360
.build()))
387361
.build()));
388362

@@ -393,7 +367,8 @@ public void makeBidsShouldReturnVideoAndAudio() throws JsonProcessingException {
393367
assertThat(result.getErrors()).isEmpty();
394368
assertThat(result.getValue())
395369
.containsOnly(BidderBid.of(Bid.builder().impid("blockA").build(), video, "USD"),
396-
BidderBid.of(Bid.builder().impid("blockB").build(), audio, "USD"));
370+
BidderBid.of(Bid.builder().impid("blockB").build(), banner, "USD"),
371+
BidderBid.of(Bid.builder().impid("blockC").build(), xNative, "USD"));
397372
}
398373

399374
@Test
@@ -424,7 +399,7 @@ public void makeBidsShouldReturnError() throws JsonProcessingException {
424399
public void makeHttpRequestsShouldSetExpectedHeaders() {
425400
// given
426401
final BidRequest bidRequest = givenBidRequest(identity(),
427-
requestBuilder -> requestBuilder.site(null)
402+
requestBuilder -> requestBuilder.site(Site.builder().id("1").page("https://example.com").build())
428403
.device(Device.builder().ua("UA").language("EN").ip("127.0.0.1").build()));
429404

430405
// when
@@ -439,7 +414,9 @@ public void makeHttpRequestsShouldSetExpectedHeaders() {
439414
tuple("X-Forwarded-For", "127.0.0.1"),
440415
tuple("X-Real-Ip", "127.0.0.1"),
441416
tuple("Content-Type", "application/json;charset=utf-8"),
442-
tuple("Accept", "application/json"));
417+
tuple("Accept", "application/json"),
418+
tuple("x-openrtb-version", "2.5"),
419+
tuple("Referer", "https://example.com"));
443420
}
444421

445422
@Test
@@ -496,6 +473,104 @@ private static BidderCall<BidRequest> givenBidderCall(BidRequest bidRequest, Str
496473
null);
497474
}
498475

476+
@Test
477+
public void makeHttpRequestsShouldSupportMultiFormatImpression() {
478+
// given
479+
final BidRequest bidRequest = BidRequest.builder()
480+
.site(Site.builder().id("1").build())
481+
.imp(singletonList(
482+
Imp.builder().id("multiFormatImp")
483+
.banner(Banner.builder().w(300).h(600).build())
484+
.video(Video.builder().w(300).h(600).build())
485+
.xNative(Native.builder().build())
486+
.ext(givenImpExt(1))
487+
.build()))
488+
.build();
489+
490+
// when
491+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
492+
493+
// then
494+
assertThat(result.getErrors()).isEmpty();
495+
assertThat(result.getValue()).hasSize(1);
496+
497+
final Imp modifiedImp = result.getValue().getFirst().getPayload().getImp().getFirst();
498+
assertThat(modifiedImp.getBanner()).isNotNull();
499+
assertThat(modifiedImp.getVideo()).isNotNull();
500+
assertThat(modifiedImp.getXNative()).isNotNull();
501+
assertThat(modifiedImp.getDisplaymanager()).isEqualTo("prebid.java");
502+
assertThat(modifiedImp.getDisplaymanagerver()).isEqualTo("1.1");
503+
}
504+
505+
@Test
506+
public void makeHttpRequestsShouldSupportMultiFormatImpressionWithPartialErrors() {
507+
// given
508+
final BidRequest bidRequest = BidRequest.builder()
509+
.site(Site.builder().id("1").build())
510+
.imp(singletonList(
511+
Imp.builder().id("multiFormatImpWithErrors")
512+
.banner(Banner.builder().w(0).h(0).build()) // Invalid banner
513+
.video(Video.builder().w(300).h(600).build()) // Valid video
514+
.xNative(Native.builder().build()) // Valid native
515+
.ext(givenImpExt(1))
516+
.build()))
517+
.build();
518+
519+
// when
520+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
521+
522+
// then
523+
assertThat(result.getErrors()).containsExactly(
524+
BidderError.badInput("Invalid sizes provided for Banner 0x0"));
525+
assertThat(result.getValue()).isEmpty();
526+
}
527+
528+
@Test
529+
public void makeHttpRequestsShouldReturnErrorWhenNoValidFormats() {
530+
// given
531+
final BidRequest bidRequest = BidRequest.builder()
532+
.site(Site.builder().id("1").build())
533+
.imp(singletonList(
534+
Imp.builder().id("noValidFormats")
535+
.banner(Banner.builder().w(0).h(0).build()) // Invalid banner
536+
.video(Video.builder().w(0).h(0).build()) // Invalid video
537+
.ext(givenImpExt(1))
538+
.build()))
539+
.build();
540+
541+
// when
542+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
543+
544+
// then
545+
assertThat(result.getErrors())
546+
.containsExactly(BidderError.badInput("Invalid sizes provided for Banner 0x0"));
547+
assertThat(result.getValue()).isEmpty();
548+
}
549+
550+
@Test
551+
public void makeBidsShouldReturnCorrectBidTypeForMultiFormatImpression() throws JsonProcessingException {
552+
// given
553+
final BidRequest bidRequest = BidRequest.builder()
554+
.imp(singletonList(
555+
Imp.builder().id("multiFormatImp")
556+
.banner(Banner.builder().w(300).h(600).build())
557+
.video(Video.builder().w(300).h(600).build())
558+
.xNative(Native.builder().build())
559+
.build()))
560+
.build();
561+
562+
final BidResponse bidResponse = givenBidResponse(bidBuilder -> bidBuilder.impid("multiFormatImp"));
563+
564+
// when
565+
final Result<List<BidderBid>> result = target.makeBids(
566+
givenBidderCall(bidRequest, mapper.writeValueAsString(bidResponse)), bidRequest);
567+
568+
// then
569+
assertThat(result.getErrors()).isEmpty();
570+
assertThat(result.getValue()).hasSize(1);
571+
assertThat(result.getValue().getFirst().getType()).isEqualTo(video); // Video has highest priority
572+
}
573+
499574
@Test
500575
public void makeHttpRequestsShouldSetDisplayManagerAndVersionForAllImpTypes() {
501576
// given

0 commit comments

Comments
 (0)