Skip to content

Commit cb01d5c

Browse files
author
Samuel Alejandro Maldonado Garcia
committed
fixes
1 parent 1e6638e commit cb01d5c

2 files changed

Lines changed: 106 additions & 100 deletions

File tree

src/main/java/org/prebid/server/bidder/alvads/AlvadsBidder.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.iab.openrtb.request.Video;
99
import com.iab.openrtb.response.Bid;
1010
import com.iab.openrtb.response.BidResponse;
11+
import com.iab.openrtb.response.SeatBid;
1112
import io.vertx.core.http.HttpMethod;
1213
import org.apache.commons.collections4.CollectionUtils;
1314
import org.prebid.server.bidder.Bidder;
@@ -28,8 +29,8 @@
2829
import org.prebid.server.util.HttpUtil;
2930

3031
import java.util.ArrayList;
32+
import java.util.Collection;
3133
import java.util.Collections;
32-
import java.util.HashMap;
3334
import java.util.List;
3435
import java.util.Map;
3536
import java.util.Objects;
@@ -115,10 +116,7 @@ private static Map<String, Object> sizes(Integer w, Integer h) {
115116
if (w == null || h == null) {
116117
return null;
117118
}
118-
final Map<String, Object> map = new HashMap<>();
119-
map.put("w", w);
120-
map.put("h", h);
121-
return map;
119+
return Map.of("w", w, "h", h);
122120
}
123121

124122
private static AlvaAdsSite makeSite(Site site, String publisherUniqueId) {
@@ -149,7 +147,11 @@ private List<BidderBid> extractBids(BidResponse bidResponse, AlvadsRequestOrtb r
149147

150148
private List<BidderBid> bidsFromResponse(BidResponse bidResponse, AlvadsRequestOrtb request) {
151149
return bidResponse.getSeatbid().stream()
152-
.flatMap(sb -> sb.getBid().stream())
150+
.filter(Objects::nonNull)
151+
.map(SeatBid::getBid)
152+
.filter(Objects::nonNull)
153+
.flatMap(Collection::stream)
154+
.filter(Objects::nonNull)
153155
.map(bid -> makeBid(bid, request, bidResponse.getCur()))
154156
.filter(Objects::nonNull)
155157
.toList();

src/test/java/org/prebid/server/bidder/alvads/AlvadsBidderTest.java

Lines changed: 98 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.iab.openrtb.response.Bid;
1111
import com.iab.openrtb.response.BidResponse;
1212
import com.iab.openrtb.response.SeatBid;
13-
import io.netty.handler.codec.http.HttpHeaderValues;
1413
import io.vertx.core.MultiMap;
1514
import org.junit.jupiter.api.Test;
1615
import org.prebid.server.VertxTest;
@@ -22,7 +21,6 @@
2221
import org.prebid.server.bidder.model.HttpResponse;
2322
import org.prebid.server.bidder.model.Result;
2423
import org.prebid.server.proto.openrtb.ext.response.BidType;
25-
import org.prebid.server.util.HttpUtil;
2624

2725
import java.math.BigDecimal;
2826
import java.util.Arrays;
@@ -32,6 +30,10 @@
3230
import static org.assertj.core.api.Assertions.assertThat;
3331
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
3432
import 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

3638
public 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

Comments
 (0)