1010import com .iab .openrtb .response .Bid ;
1111import com .iab .openrtb .response .BidResponse ;
1212import com .iab .openrtb .response .SeatBid ;
13- import io .netty .handler .codec .http .HttpHeaderValues ;
1413import io .vertx .core .MultiMap ;
1514import org .junit .jupiter .api .Test ;
1615import org .prebid .server .VertxTest ;
2221import org .prebid .server .bidder .model .HttpResponse ;
2322import org .prebid .server .bidder .model .Result ;
2423import org .prebid .server .proto .openrtb .ext .response .BidType ;
25- import org .prebid .server .util .HttpUtil ;
2624
2725import java .math .BigDecimal ;
2826import java .util .Arrays ;
3230import static org .assertj .core .api .Assertions .assertThat ;
3331import static org .assertj .core .api .Assertions .assertThatIllegalArgumentException ;
3432import static org .assertj .core .api .Assertions .tuple ;
33+ import static org .prebid .server .util .HttpUtil .ACCEPT_HEADER ;
34+ import static org .prebid .server .util .HttpUtil .APPLICATION_JSON_CONTENT_TYPE ;
35+ import static org .prebid .server .util .HttpUtil .CONTENT_TYPE_HEADER ;
36+ import static org .springframework .util .MimeTypeUtils .APPLICATION_JSON_VALUE ;
3537
3638public class AlvadsBidderTest extends VertxTest {
3739
@@ -83,23 +85,20 @@ public void makeHttpRequestsShouldBuildValidHttpRequestsUrl() {
8385 @ Test
8486 public void makeHttpRequestsShouldBuildValidHttpRequestsHeaders () {
8587 // given
86- final BidRequest bidRequest = createBidRequestWithBannerAndVideo ();
88+ final Imp bannerImp = createImp ("imp-banner" , "pub-1" , 300 , 250 );
89+ final BidRequest bidRequest = createBidRequest (List .of (bannerImp ));
8790
8891 // when
8992 final Result <List <HttpRequest <AlvadsRequestOrtb >>> result = target .makeHttpRequests (bidRequest );
9093
9194 // then
9295 assertThat (result .getErrors ()).isEmpty ();
93- assertThat (result .getValue ())
96+ assertThat (result .getValue ()). hasSize ( 1 ). first ()
9497 .extracting (HttpRequest ::getHeaders )
95- .flatExtracting (MultiMap ::entries )
96- .extracting (Map .Entry ::getKey , Map .Entry ::getValue )
97- .containsExactlyInAnyOrder (
98- tuple (HttpUtil .CONTENT_TYPE_HEADER .toString (), HttpUtil .APPLICATION_JSON_CONTENT_TYPE ),
99- tuple (HttpUtil .ACCEPT_HEADER .toString (), HttpHeaderValues .APPLICATION_JSON .toString ()),
100-
101- tuple (HttpUtil .CONTENT_TYPE_HEADER .toString (), HttpUtil .APPLICATION_JSON_CONTENT_TYPE ),
102- tuple (HttpUtil .ACCEPT_HEADER .toString (), HttpHeaderValues .APPLICATION_JSON .toString ()));
98+ .satisfies (headers -> assertThat (headers .get (CONTENT_TYPE_HEADER ))
99+ .isEqualTo (APPLICATION_JSON_CONTENT_TYPE ))
100+ .satisfies (headers -> assertThat (headers .get (ACCEPT_HEADER ))
101+ .isEqualTo (APPLICATION_JSON_VALUE ));
103102 }
104103
105104 @ Test
@@ -127,45 +126,69 @@ public void makeHttpRequestsShouldBuildValidHttpRequestsImpContent() {
127126 final HttpRequest <AlvadsRequestOrtb > req1 = result .getValue ().get (0 );
128127 final HttpRequest <AlvadsRequestOrtb > req2 = result .getValue ().get (1 );
129128
130- assertThat (req1 .getPayload ().getImp ().get (0 ).getBanner ()).isNotNull ();
131- assertThat (req1 .getPayload ().getImp ().get (0 ).getVideo ()).isNull ();
129+ assertThat (req1 .getPayload ().getImp ())
130+ .hasSize (1 )
131+ .extracting ("id" , "banner" , "video" )
132+ .containsExactly (tuple ("imp-1" , Map .of ("w" , 300 , "h" , 250 ), null ));
132133
133- assertThat (req2 .getPayload ().getImp ().get (0 ).getVideo ()).isNotNull ();
134- assertThat (req2 .getPayload ().getImp ().get (0 ).getBanner ()).isNull ();
134+ assertThat (req2 .getPayload ().getImp ())
135+ .hasSize (1 )
136+ .extracting ("id" , "banner" , "video" )
137+ .containsExactly (tuple ("imp-2" , null , Map .of ("w" , 640 , "h" , 480 )));
135138 }
136139
137140 @ Test
138- public void makeHttpRequestsShouldBuildValidHttpRequestsSiteAndOtherFields () {
141+ public void makeHttpRequestsShouldBuildValidHttpRequestsFromInput () {
139142 // given
140143 final BidRequest bidRequest = createBidRequestWithBannerAndVideo ();
141144
142145 // when
143146 final Result <List <HttpRequest <AlvadsRequestOrtb >>> result = target .makeHttpRequests (bidRequest );
144147
145148 // then
146- assertThat (result .getValue ().get (0 ).getPayload ().getId ()).isEqualTo ("req-123" );
147- assertThat (result .getValue ().get (1 ).getPayload ().getId ()).isEqualTo ("req-123" );
149+ final HttpRequest <AlvadsRequestOrtb > req1 = result .getValue ().get (0 );
150+ final HttpRequest <AlvadsRequestOrtb > req2 = result .getValue ().get (1 );
151+
152+ // --- Validate Request ID ---
153+ assertThat (req1 .getPayload ().getId ()).isEqualTo ("req-123" );
154+ assertThat (req2 .getPayload ().getId ()).isEqualTo ("req-123" );
155+
156+ // --- Validate Site content ---
157+ assertThat (req1 .getPayload ().getSite ().getPage ())
158+ .isEqualTo ("https://example.com" );
159+ assertThat (req2 .getPayload ().getSite ().getPage ())
160+ .isEqualTo ("https://example.com" );
161+
162+ // --- Validate Device presence (or specific fields if populated) ---
163+ assertThat (req1 .getPayload ().getDevice ()).isNotNull ();
164+ assertThat (req2 .getPayload ().getDevice ()).isNotNull ();
165+
166+ // --- Validate Imp content for req1 (banner) ---
167+ assertThat (req1 .getPayload ().getImp ())
168+ .hasSize (1 )
169+ .extracting ("id" , "banner" , "video" )
170+ .containsExactly (
171+ tuple ("imp-1" ,
172+ Map .of ("w" , 300 , "h" , 250 ),
173+ null ));
174+
175+ assertThat (req2 .getPayload ().getImp ())
176+ .hasSize (1 )
177+ .extracting ("id" , "banner" , "video" )
178+ .containsExactly (
179+ tuple ("imp-2" ,
180+ null ,
181+ Map .of ("w" , 640 , "h" , 480 )));
148182
149- assertThat (result .getValue ().get (0 ).getPayload ().getSite ()).isNotNull ();
150- assertThat (result .getValue ().get (1 ).getPayload ().getSite ()).isNotNull ();
151183 }
152184
153185 @ Test
154186 public void makeBidsShouldReturnEmptyListForEmptyResponse () {
155187 // given
156- final BidResponse bidResponse = BidResponse .builder ().build ();
157- final HttpResponse response = HttpResponse .of (
158- 200 ,
159- MultiMap .caseInsensitiveMultiMap (),
160- jacksonMapper .encodeToString (bidResponse ));
161-
162- final BidderCall <AlvadsRequestOrtb > call = BidderCall .succeededHttp (
163- HttpRequest .<AlvadsRequestOrtb >builder ().payload (null ).build (),
164- response ,
165- null );
188+ final BidderCall <AlvadsRequestOrtb > call = buildBidderCall (List .of (), List .of (), "USD" );
166189
167190 // when
168- final Result <List <BidderBid >> result = target .makeBids (call , BidRequest . builder (). build ( ));
191+ final Result <List <BidderBid >> result = target .makeBids (call , createBidRequest ( List . of () ));
169192
170193 // then
171194 assertThat (result .getValue ()).isEmpty ();
@@ -179,32 +202,17 @@ public void makeBidsShouldReturnBannerBidderBid() {
179202
180203 final Bid bannerBid = createBid ("bid-banner" , "imp-banner" , 1.5 );
181204 final SeatBid seatBid = createSeatBid (bannerBid );
182- final BidResponse bidResponse = createBidResponse (List .of (seatBid ), "USD" );
183-
184- final HttpResponse httpResponse = HttpResponse .of (
185- 200 ,
186- MultiMap .caseInsensitiveMultiMap (),
187- jacksonMapper .encodeToString (bidResponse ));
188205
189- final HttpRequest <AlvadsRequestOrtb > request = HttpRequest .<AlvadsRequestOrtb >builder ()
190- .payload (AlvadsRequestOrtb .builder ()
191- .imp (List .of (createAlvadsRequestImp ("imp-banner" , 300 , 250 )))
192- .build ())
193- .build ();
206+ final BidderCall <AlvadsRequestOrtb > call = buildBidderCall (
207+ List .of (createAlvadsRequestImp ("imp-banner" , 300 , 250 )),
208+ List .of (seatBid ),
209+ "USD" );
194210
195211 // when
196- final Result <List <BidderBid >> result = target .makeBids (
197- BidderCall .succeededHttp (request , httpResponse , null ),
198- bidRequest
199- );
212+ final Result <List <BidderBid >> result = target .makeBids (call , bidRequest );
200213
201214 // then
202- final BidderBid expected = BidderBid .of (
203- bannerBid ,
204- BidType .banner ,
205- "USD"
206- );
207- assertThat (result .getValue ()).containsExactly (expected );
215+ assertThat (result .getValue ()).containsExactly (BidderBid .of (bannerBid , BidType .banner , "USD" ));
208216 }
209217
210218 @ Test
@@ -215,60 +223,32 @@ public void makeBidsShouldReturnVideoBidderBid() {
215223
216224 final Bid videoBid = createBid ("bid-video" , "imp-video" , 2.5 );
217225 final SeatBid seatBid = createSeatBid (videoBid );
218- final BidResponse bidResponse = createBidResponse (List .of (seatBid ), "USD" );
219-
220- final HttpResponse httpResponse = HttpResponse .of (
221- 200 ,
222- MultiMap .caseInsensitiveMultiMap (),
223- jacksonMapper .encodeToString (bidResponse ));
224226
225- final HttpRequest <AlvadsRequestOrtb > request = HttpRequest .<AlvadsRequestOrtb >builder ()
226- .payload (AlvadsRequestOrtb .builder ()
227- .imp (List .of (createAlvadsRequestImp ("imp-video" , 640 , 480 )))
228- .build ())
229- .build ();
227+ final BidderCall <AlvadsRequestOrtb > call = buildBidderCall (
228+ List .of (createAlvadsRequestImp ("imp-video" , 640 , 480 )),
229+ List .of (seatBid ),
230+ "USD" );
230231
231232 // when
232- final Result <List <BidderBid >> result = target .makeBids (
233- BidderCall .succeededHttp (request , httpResponse , null ),
234- bidRequest
235- );
233+ final Result <List <BidderBid >> result = target .makeBids (call , bidRequest );
236234
237235 // then
238- final BidderBid expected = BidderBid .of (
239- videoBid ,
240- BidType .video ,
241- "USD"
242- );
243- assertThat (result .getValue ()).containsExactly (expected );
236+ assertThat (result .getValue ()).containsExactly (BidderBid .of (videoBid , BidType .video , "USD" ));
244237 }
245238
246239 @ Test
247240 public void makeBidsShouldIgnoreUnsupportedBidType () {
248241 // given
249- final Imp imp = createImp ("imp-unknown" , "pub-3" , 100 , 100 );
250- final BidRequest bidRequest = createBidRequest (List .of (imp ));
242+ final Imp unknownImp = createImp ("imp-unknown" , "pub-3" , 100 , 100 );
243+ final BidRequest bidRequest = createBidRequest (List .of (unknownImp ));
251244
252245 final Bid unknownBid = createBid ("bid-unknown" , "imp-unknown" , 1.0 );
253246 final SeatBid seatBid = createSeatBid (unknownBid );
254- final BidResponse bidResponse = createBidResponse (List .of (seatBid ), "USD" );
255247
256- final HttpResponse httpResponse = HttpResponse .of (
257- 200 ,
258- MultiMap .caseInsensitiveMultiMap (),
259- jacksonMapper .encodeToString (bidResponse ));
260-
261- final HttpRequest <AlvadsRequestOrtb > request = HttpRequest .<AlvadsRequestOrtb >builder ()
262- .payload (AlvadsRequestOrtb .builder ()
263- .imp (List .of ())
264- .build ())
265- .build ();
248+ final BidderCall <AlvadsRequestOrtb > call = buildBidderCall (List .of (), List .of (seatBid ), "USD" );
266249
267250 // when
268- final Result <List <BidderBid >> result = target .makeBids (
269- BidderCall .succeededHttp (request , httpResponse , null ),
270- bidRequest
271- );
251+ final Result <List <BidderBid >> result = target .makeBids (call , bidRequest );
272252
273253 // then
274254 assertThat (result .getValue ()).isEmpty ();
@@ -333,14 +313,16 @@ private static BidResponse createBidResponse(List<SeatBid> seatBids, String curr
333313 }
334314
335315 private static Imp createImp (String id , String publisherId , int width , int height ) {
336- final ObjectNode extNode = jacksonMapper .mapper ().createObjectNode ()
337- .putObject ("bidder" )
316+ final ObjectNode bidderNode = jacksonMapper .mapper ().createObjectNode ()
338317 .put ("publisherUniqueId" , publisherId );
339318
319+ final ObjectNode extNode = jacksonMapper .mapper ().createObjectNode ();
320+ extNode .set ("bidder" , bidderNode );
321+
340322 return Imp .builder ()
341323 .id (id )
342324 .banner (Banner .builder ().w (width ).h (height ).build ())
343- .video (height > 250 ? com . iab . openrtb . request . Video .builder ().w (width ).h (height ).build () : null )
325+ .video (height > 250 ? Video .builder ().w (width ).h (height ).build () : null )
344326 .ext (extNode )
345327 .build ();
346328 }
@@ -360,4 +342,26 @@ private static AlvaAdsImp createAlvadsRequestImp(String impId, int width, int he
360342 .build ();
361343 }
362344
345+ private static BidderCall <AlvadsRequestOrtb > buildBidderCall (
346+ List <AlvaAdsImp > imps ,
347+ List <SeatBid > seatBids ,
348+ String currency ) {
349+
350+ final BidResponse bidResponse = createBidResponse (seatBids , currency );
351+
352+ final HttpResponse httpResponse = HttpResponse .of (
353+ 200 ,
354+ MultiMap .caseInsensitiveMultiMap (),
355+ jacksonMapper .encodeToString (bidResponse )
356+ );
357+
358+ final HttpRequest <AlvadsRequestOrtb > request = HttpRequest .<AlvadsRequestOrtb >builder ()
359+ .payload (AlvadsRequestOrtb .builder ()
360+ .imp (imps )
361+ .build ())
362+ .build ();
363+
364+ return BidderCall .succeededHttp (request , httpResponse , null );
365+ }
366+
363367}
0 commit comments