22
33import com .fasterxml .jackson .core .JsonProcessingException ;
44import com .fasterxml .jackson .databind .node .ObjectNode ;
5- import com .iab .openrtb .request .Audio ;
65import com .iab .openrtb .request .Banner ;
76import com .iab .openrtb .request .BidRequest ;
87import com .iab .openrtb .request .Device ;
3635import static org .assertj .core .api .Assertions .assertThat ;
3736import static org .assertj .core .api .Assertions .assertThatIllegalArgumentException ;
3837import static org .assertj .core .api .Assertions .tuple ;
39- import static org .prebid .server .proto .openrtb .ext .response .BidType .audio ;
4038import static org .prebid .server .proto .openrtb .ext .response .BidType .banner ;
4139import static org .prebid .server .proto .openrtb .ext .response .BidType .video ;
4240import 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