Skip to content

Commit d6166de

Browse files
committed
Flipp: use height value from server response
1 parent 9ec0b44 commit d6166de

File tree

3 files changed

+142
-21
lines changed

3 files changed

+142
-21
lines changed

src/main/java/org/prebid/server/bidder/flipp/FlippBidder.java

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ public class FlippBidder implements Bidder<CampaignRequestBody> {
7070
private static final Set<Integer> AD_TYPES = Set.of(4309, 641);
7171
private static final Set<Integer> DTX_TYPES = Set.of(5061);
7272
private static final String EXT_REQUEST_TRANSMIT_EIDS = "transmitEids";
73+
private static final int DEFAULT_STANDARD_HEIGHT = 2400;
74+
private static final int DEFAULT_COMPACT_HEIGHT = 600;
7375

7476
private final String endpointUrl;
7577
private final JacksonMapper mapper;
@@ -144,7 +146,7 @@ private static PrebidRequest createPrebidRequest(Imp imp, ExtImpFlipp extImp) {
144146
final Format format = Optional.ofNullable(imp.getBanner())
145147
.map(Banner::getFormat)
146148
.filter(CollectionUtils::isNotEmpty)
147-
.map(formats -> formats.getFirst())
149+
.map(List::getFirst)
148150
.orElse(null);
149151

150152
return PrebidRequest.builder()
@@ -272,32 +274,38 @@ public final Result<List<BidderBid>> makeBids(BidderCall<CampaignRequestBody> ht
272274
}
273275
}
274276

275-
private static List<BidderBid> extractBids(CampaignResponseBody campaignResponseBody, BidRequest bidRequest) {
277+
private List<BidderBid> extractBids(CampaignResponseBody campaignResponseBody, BidRequest bidRequest) {
276278
return Optional.ofNullable(campaignResponseBody)
277279
.map(CampaignResponseBody::getDecisions)
278280
.map(Decisions::getInline)
279281
.stream()
280282
.flatMap(Collection::stream)
281-
.filter(inline -> isInlineValid(bidRequest, inline))
282-
.map(inline -> BidderBid.of(constructBid(inline), BidType.banner, "USD"))
283+
.map(inline -> makeBid(inline, getCorrespondingImp(bidRequest, inline)))
284+
.filter(Objects::nonNull)
283285
.toList();
284286
}
285287

286-
private static boolean isInlineValid(BidRequest bidRequest, Inline inline) {
288+
private static Imp getCorrespondingImp(BidRequest bidRequest, Inline inline) {
287289
final String requestId = Optional.ofNullable(inline)
288290
.map(Inline::getPrebid)
289291
.map(Prebid::getRequestId)
290292
.orElse(null);
291293

292-
return requestId != null && bidRequest.getImp().stream()
293-
.map(Imp::getId)
294-
.anyMatch(impId -> impId.equals(requestId));
294+
return requestId != null
295+
? bidRequest.getImp().stream().filter(imp -> imp.getId().equals(requestId)).findFirst().orElse(null)
296+
: null;
295297
}
296298

297-
private static Bid constructBid(Inline inline) {
299+
private BidderBid makeBid(Inline inline, Imp imp) {
300+
return imp == null
301+
? null
302+
: BidderBid.of(constructBid(inline, parseImpExt(imp)), BidType.banner, "USD");
303+
}
304+
305+
private static Bid constructBid(Inline inline, ExtImpFlipp extImp) {
298306
final Prebid prebid = inline.getPrebid();
299307
final Data data = Optional.ofNullable(inline.getContents())
300-
.map(content -> content.getFirst())
308+
.map(List::getFirst)
301309
.map(Content::getData)
302310
.orElse(null);
303311

@@ -308,7 +316,20 @@ private static Bid constructBid(Inline inline) {
308316
.id(Integer.toString(inline.getAdId()))
309317
.impid(prebid.getRequestId())
310318
.w(data != null ? data.getWidth() : null)
311-
.h(data != null ? 0 : null)
319+
.h(resolveHeight(data, extImp))
312320
.build();
313321
}
322+
323+
private static Integer resolveHeight(Data data, ExtImpFlipp extImp) {
324+
final boolean startCompact = Optional.ofNullable(extImp)
325+
.map(ExtImpFlipp::getOptions)
326+
.map(ExtImpFlippOptions::getStartCompact)
327+
.orElse(false);
328+
329+
return Optional.ofNullable(data)
330+
.map(Data::getCustomData)
331+
.map(customData -> customData.get(startCompact ? "compactHeight" : "standardHeight"))
332+
.map(JsonNode::asInt)
333+
.orElse(startCompact ? DEFAULT_COMPACT_HEIGHT : DEFAULT_STANDARD_HEIGHT);
334+
}
314335
}

src/test/java/org/prebid/server/bidder/flipp/FlippBidderTest.java

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

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.node.BooleanNode;
5+
import com.fasterxml.jackson.databind.node.ObjectNode;
56
import com.iab.openrtb.request.Banner;
67
import com.iab.openrtb.request.BidRequest;
78
import com.iab.openrtb.request.Device;
@@ -917,15 +918,101 @@ public void makeBidsShouldPopulateBidWidthWithNullWhenInlineContentsDataWidthEmp
917918
}
918919

919920
@Test
920-
public void makeBidsShouldPopulateBidHeightWithZeroWhenInlineContentsIsPresent() throws JsonProcessingException {
921+
public void makeBidsShouldPopulateBidDefaultStandardHeightWhenInlineCustomDataIsAbsent()
922+
throws JsonProcessingException {
923+
921924
// given
922-
final BidRequest bidRequest = givenBidRequest(identity());
925+
final BidRequest bidRequest = givenBidRequest(givenImp(identity(), extImp -> extImp
926+
.options(ExtImpFlippOptions.of(false, null, null))));
927+
928+
final ObjectNode customData = mapper.createObjectNode()
929+
.put("compactHeight", 20)
930+
.put("standardHeight", 30);
923931

924-
// and
925932
final BidderCall<CampaignRequestBody> httpCall = givenHttpCall(CampaignRequestBody.builder().build(),
926-
mapper.writeValueAsString(givenCampaignResponseBody(inlineBuilder ->
927-
inlineBuilder.contents(singletonList(
928-
Content.of("any", "custom", Data.of(null, 10, 20), "type"))))));
933+
mapper.writeValueAsString(givenCampaignResponseBody(inlineBuilder -> inlineBuilder
934+
.contents(singletonList(Content.of(
935+
"any", "custom", Data.of(null, 10, 20), "type"))))));
936+
937+
// when
938+
final Result<List<BidderBid>> result = target.makeBids(httpCall, bidRequest);
939+
940+
// then
941+
assertThat(result.getErrors()).isEmpty();
942+
assertThat(result.getValue()).hasSize(1)
943+
.extracting(BidderBid::getBid)
944+
.extracting(Bid::getH)
945+
.containsExactly(2400);
946+
}
947+
948+
@Test
949+
public void makeBidsShouldPopulateBidDefaultCompactHeightWhenInlineCustomDataIsAbsent()
950+
throws JsonProcessingException {
951+
952+
// given
953+
final BidRequest bidRequest = givenBidRequest(givenImp(identity(), extImp -> extImp
954+
.options(ExtImpFlippOptions.of(true, null, null))));
955+
956+
final BidderCall<CampaignRequestBody> httpCall = givenHttpCall(CampaignRequestBody.builder().build(),
957+
mapper.writeValueAsString(givenCampaignResponseBody(inlineBuilder -> inlineBuilder
958+
.contents(singletonList(Content.of(
959+
"any", "custom", Data.of(null, 10, 20), "type"))))));
960+
961+
// when
962+
final Result<List<BidderBid>> result = target.makeBids(httpCall, bidRequest);
963+
964+
// then
965+
assertThat(result.getErrors()).isEmpty();
966+
assertThat(result.getValue()).hasSize(1)
967+
.extracting(BidderBid::getBid)
968+
.extracting(Bid::getH)
969+
.containsExactly(600);
970+
}
971+
972+
@Test
973+
public void makeBidsShouldPopulateBidCompactHeightFromCustomDataWhenStartCompactIsTrue()
974+
throws JsonProcessingException {
975+
976+
// given
977+
final BidRequest bidRequest = givenBidRequest(givenImp(identity(), extImp -> extImp
978+
.options(ExtImpFlippOptions.of(true, null, null))));
979+
980+
final ObjectNode customData = mapper.createObjectNode()
981+
.put("compactHeight", 20)
982+
.put("standardHeight", 30);
983+
984+
final BidderCall<CampaignRequestBody> httpCall = givenHttpCall(CampaignRequestBody.builder().build(),
985+
mapper.writeValueAsString(givenCampaignResponseBody(inlineBuilder -> inlineBuilder
986+
.contents(singletonList(Content.of(
987+
"any", "custom", Data.of(customData, 10, 20), "type"))))));
988+
989+
// when
990+
final Result<List<BidderBid>> result = target.makeBids(httpCall, bidRequest);
991+
992+
// then
993+
assertThat(result.getErrors()).isEmpty();
994+
assertThat(result.getValue()).hasSize(1)
995+
.extracting(BidderBid::getBid)
996+
.extracting(Bid::getH)
997+
.containsExactly(20);
998+
}
999+
1000+
@Test
1001+
public void makeBidsShouldPopulateBidStandardHeightFromCustomDataWhenStartCompactIsFalse()
1002+
throws JsonProcessingException {
1003+
1004+
// given
1005+
final BidRequest bidRequest = givenBidRequest(givenImp(identity(), extImp -> extImp
1006+
.options(ExtImpFlippOptions.of(false, null, null))));
1007+
1008+
final ObjectNode customData = mapper.createObjectNode()
1009+
.put("compactHeight", 20)
1010+
.put("standardHeight", 30);
1011+
1012+
final BidderCall<CampaignRequestBody> httpCall = givenHttpCall(CampaignRequestBody.builder().build(),
1013+
mapper.writeValueAsString(givenCampaignResponseBody(inlineBuilder -> inlineBuilder
1014+
.contents(singletonList(Content.of(
1015+
"any", "custom", Data.of(customData, 10, 20), "type"))))));
9291016

9301017
// when
9311018
final Result<List<BidderBid>> result = target.makeBids(httpCall, bidRequest);
@@ -935,7 +1022,7 @@ public void makeBidsShouldPopulateBidHeightWithZeroWhenInlineContentsIsPresent()
9351022
assertThat(result.getValue()).hasSize(1)
9361023
.extracting(BidderBid::getBid)
9371024
.extracting(Bid::getH)
938-
.containsExactly(0);
1025+
.containsExactly(30);
9391026
}
9401027

9411028
@Test
@@ -1011,14 +1098,27 @@ private static BidRequest givenBidRequest(UnaryOperator<Imp.ImpBuilder> impCusto
10111098
return givenBidRequest(identity(), impCustomizer);
10121099
}
10131100

1101+
private static BidRequest givenBidRequest(Imp givenImp) {
1102+
return BidRequest.builder()
1103+
.device(Device.builder().ip("anyId").build())
1104+
.imp(singletonList(givenImp))
1105+
.build();
1106+
}
1107+
10141108
private static Imp givenImp(UnaryOperator<Imp.ImpBuilder> impCustomizer) {
1109+
return givenImp(impCustomizer, identity());
1110+
}
1111+
1112+
private static Imp givenImp(UnaryOperator<Imp.ImpBuilder> impCustomizer,
1113+
UnaryOperator<ExtImpFlipp.ExtImpFlippBuilder> extImpBuilder) {
1114+
10151115
return impCustomizer.apply(Imp.builder()
10161116
.id("123")
10171117
.banner(Banner.builder().w(23).h(25).build())
1018-
.ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpFlipp.builder()
1118+
.ext(mapper.valueToTree(ExtPrebid.of(null, extImpBuilder.apply(ExtImpFlipp.builder()
10191119
.publisherNameIdentifier("publisherName")
10201120
.creativeType("Any")
1021-
.zoneIds(List.of(12))
1121+
.zoneIds(List.of(12)))
10221122
.build()))))
10231123
.build();
10241124
}

src/test/resources/org/prebid/server/it/openrtb2/flipp/test-auction-flipp-response.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"adm": "creativeContent",
1212
"crid": "81325690",
1313
"w": 300,
14-
"h": 0,
14+
"h": 600,
1515
"ext": {
1616
"origbidcpm": 12.34,
1717
"origbidcur": "USD",

0 commit comments

Comments
 (0)