Skip to content

Commit d390d05

Browse files
GumGum: Collect the ad unit name for reporting (#3912)
1 parent 91e7db7 commit d390d05

File tree

2 files changed

+148
-8
lines changed

2 files changed

+148
-8
lines changed

src/main/java/org/prebid/server/bidder/gumgum/GumgumBidder.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.prebid.server.json.DecodeException;
2626
import org.prebid.server.json.JacksonMapper;
2727
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
28+
import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebid;
2829
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgum;
2930
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgumBanner;
3031
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgumVideo;
@@ -40,12 +41,13 @@
4041
import java.util.Comparator;
4142
import java.util.List;
4243
import java.util.Objects;
44+
import java.util.Optional;
4345

4446
public class GumgumBidder implements Bidder<BidRequest> {
4547

4648
private static final String REQUEST_EXT_PRODUCT = "product";
4749

48-
private static final TypeReference<ExtPrebid<?, ExtImpGumgum>> GUMGUM_EXT_TYPE_REFERENCE =
50+
private static final TypeReference<ExtPrebid<ExtImpPrebid, ExtImpGumgum>> GUMGUM_EXT_TYPE_REFERENCE =
4951
new TypeReference<>() {
5052
};
5153

@@ -80,17 +82,24 @@ private BidRequest createBidRequest(BidRequest bidRequest, List<BidderError> err
8082

8183
for (Imp imp : bidRequest.getImp()) {
8284
try {
83-
final ExtImpGumgum extImp = parseImpExt(imp);
84-
modifiedImps.add(modifyImp(imp, extImp));
85+
final ExtPrebid<ExtImpPrebid, ExtImpGumgum> extImp = parseImpExt(imp);
86+
final ExtImpGumgum extImpGumgum = extImp.getBidder();
87+
final String adUnitCode = Optional.ofNullable(extImp.getPrebid())
88+
.map(ExtImpPrebid::getAdUnitCode)
89+
.orElse(null);
8590

86-
final String extZone = extImp.getZone();
91+
modifiedImps.add(modifyImp(imp, extImpGumgum, adUnitCode));
92+
93+
final String extZone = extImpGumgum.getZone();
8794
if (StringUtils.isNotEmpty(extZone)) {
8895
zone = extZone;
8996
}
90-
final BigInteger extPubId = extImp.getPubId();
97+
98+
final BigInteger extPubId = extImpGumgum.getPubId();
9199
if (extPubId != null && !extPubId.equals(BigInteger.ZERO)) {
92100
pubId = extPubId;
93101
}
102+
94103
} catch (PreBidException e) {
95104
errors.add(BidderError.badInput(e.getMessage()));
96105
}
@@ -106,15 +115,15 @@ private BidRequest createBidRequest(BidRequest bidRequest, List<BidderError> err
106115
.build();
107116
}
108117

109-
private ExtImpGumgum parseImpExt(Imp imp) {
118+
private ExtPrebid<ExtImpPrebid, ExtImpGumgum> parseImpExt(Imp imp) {
110119
try {
111-
return mapper.mapper().convertValue(imp.getExt(), GUMGUM_EXT_TYPE_REFERENCE).getBidder();
120+
return mapper.mapper().convertValue(imp.getExt(), GUMGUM_EXT_TYPE_REFERENCE);
112121
} catch (IllegalArgumentException e) {
113122
throw new PreBidException(e.getMessage());
114123
}
115124
}
116125

117-
private Imp modifyImp(Imp imp, ExtImpGumgum extImp) {
126+
private Imp modifyImp(Imp imp, ExtImpGumgum extImp, String adUnitCode) {
118127
final Imp.ImpBuilder impBuilder = imp.toBuilder();
119128

120129
final String product = extImp.getProduct();
@@ -123,6 +132,10 @@ private Imp modifyImp(Imp imp, ExtImpGumgum extImp) {
123132
impBuilder.ext(productExt);
124133
}
125134

135+
if (StringUtils.isNotEmpty(adUnitCode)) {
136+
impBuilder.tagid(adUnitCode);
137+
}
138+
126139
final Banner banner = imp.getBanner();
127140
if (banner != null) {
128141
final Banner resolvedBanner = resolveBanner(banner, extImp);
@@ -139,6 +152,7 @@ private Imp modifyImp(Imp imp, ExtImpGumgum extImp) {
139152
impBuilder.video(resolvedVideo);
140153
}
141154
}
155+
142156
return impBuilder.build();
143157
}
144158

src/test/java/org/prebid/server/bidder/gumgum/GumgumBidderTest.java

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@
2121
import org.prebid.server.bidder.model.HttpResponse;
2222
import org.prebid.server.bidder.model.Result;
2323
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
24+
import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebid;
2425
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgum;
2526
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgumBanner;
2627
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgumVideo;
2728

29+
import java.io.IOException;
2830
import java.math.BigDecimal;
2931
import java.math.BigInteger;
32+
import java.util.Collections;
3033
import java.util.List;
3134
import java.util.function.Function;
3235

@@ -36,6 +39,10 @@
3639
import static org.assertj.core.api.Assertions.assertThat;
3740
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
3841
import static org.assertj.core.api.Assertions.tuple;
42+
import static org.junit.Assert.assertEquals;
43+
import static org.junit.Assert.assertFalse;
44+
import static org.junit.Assert.assertNotNull;
45+
import static org.junit.Assert.assertNull;
3946
import static org.prebid.server.proto.openrtb.ext.response.BidType.banner;
4047
import static org.prebid.server.proto.openrtb.ext.response.BidType.video;
4148

@@ -45,6 +52,124 @@ public class GumgumBidderTest extends VertxTest {
4552

4653
private final GumgumBidder target = new GumgumBidder(ENDPOINT_URL, jacksonMapper);
4754

55+
@Test
56+
public void makeHttpRequestsShouldReturnErrorIfImpExtCouldNotBeParsed() {
57+
// given
58+
final BidRequest bidRequest = givenBidRequest(impBuilder ->
59+
impBuilder.ext(mapper.valueToTree(ExtPrebid.of(null, mapper.createArrayNode()))));
60+
61+
// when
62+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
63+
64+
// then
65+
assertThat(result.getErrors()).hasSize(2)
66+
.anySatisfy(error -> {
67+
assertThat(error.getType()).isEqualTo(BidderError.Type.bad_input);
68+
assertThat(error.getMessage()).startsWith("Cannot deserialize value");
69+
});
70+
}
71+
72+
@Test
73+
public void makeHttpRequestsShouldModifyImpressionsWhenValidInput() {
74+
// given
75+
final ObjectNode extImp = mapper.valueToTree(ExtPrebid.of(
76+
ExtImpPrebid.builder().adUnitCode("adUnit123").build(),
77+
ExtImpGumgum.of("zone", BigInteger.TEN, "irisId", null, "product")));
78+
79+
final BidRequest bidRequest = givenBidRequest(impBuilder ->
80+
impBuilder.ext(extImp));
81+
82+
// when
83+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
84+
85+
// then
86+
assertThat(result.getValue())
87+
.extracting(HttpRequest::getPayload)
88+
.flatExtracting(BidRequest::getImp)
89+
.extracting(Imp::getTagid)
90+
.containsExactly("adUnit123");
91+
}
92+
93+
@Test
94+
public void testMakeHttpRequestsShouldNotSetTagIdFromZoneWhenAdUnitIdIsMissing() throws IOException {
95+
// given
96+
final ObjectNode extImp = mapper.valueToTree(ExtPrebid.of(null,
97+
ExtImpGumgum.of("zone123", BigInteger.TEN, "productA", null, "zone123")));
98+
99+
final Imp imp = Imp.builder()
100+
.id("imp1")
101+
.banner(Banner.builder().w(300).h(250).build())
102+
.ext(extImp)
103+
.build();
104+
105+
final BidRequest bidRequest = BidRequest.builder()
106+
.id("test-bid-request")
107+
.imp(Collections.singletonList(imp))
108+
.site(Site.builder().id("test-site").build())
109+
.build();
110+
111+
// when
112+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
113+
114+
// then
115+
assertNotNull(result);
116+
assertFalse(result.getValue().isEmpty());
117+
118+
final byte[] requestBody = result.getValue().get(0).getBody();
119+
final BidRequest modifiedRequest = mapper.readValue(requestBody, BidRequest.class);
120+
121+
assertFalse(modifiedRequest.getImp().isEmpty());
122+
123+
final Imp modifiedImp = modifiedRequest.getImp().get(0);
124+
125+
assertNull(modifiedImp.getTagid());
126+
assertEquals("test-site", modifiedRequest.getSite().getId(), "zone123");
127+
}
128+
129+
@Test
130+
public void makeHttpRequestsShouldReturnModifiedBidRequestWhenValidInput() {
131+
// given
132+
final ObjectNode extImp = mapper.valueToTree(ExtPrebid.of(
133+
ExtImpPrebid.builder().adUnitCode("adUnit123").build(),
134+
ExtImpGumgum.of("zone", BigInteger.TEN, "irisId", null, "product")));
135+
136+
final BidRequest bidRequest = givenBidRequest(impBuilder -> impBuilder.ext(extImp));
137+
138+
// when
139+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
140+
141+
// then
142+
assertThat(result.getErrors()).isEmpty();
143+
144+
assertThat(result.getValue())
145+
.extracting(HttpRequest::getPayload)
146+
.flatExtracting(BidRequest::getImp)
147+
.extracting(Imp::getTagid)
148+
.containsExactly("adUnit123");
149+
}
150+
151+
@Test
152+
public void makeHttpRequestsShouldExtractAdUnitIdWhenPresent() {
153+
// given
154+
final ObjectNode extImp = mapper.valueToTree(ExtPrebid.of(
155+
ExtImpPrebid.builder().adUnitCode("adUnit123").build(),
156+
ExtImpGumgum.of("zone", BigInteger.TEN, "irisId", null, "product")));
157+
158+
final BidRequest bidRequest = givenBidRequest(impBuilder -> impBuilder.ext(extImp));
159+
160+
// when
161+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
162+
163+
// then
164+
assertThat(result.getErrors()).isEmpty();
165+
166+
assertThat(result.getValue())
167+
.extracting(HttpRequest::getPayload)
168+
.flatExtracting(BidRequest::getImp)
169+
.extracting(Imp::getTagid)
170+
.containsExactly("adUnit123");
171+
}
172+
48173
@Test
49174
public void creationShouldFailOnInvalidEndpointUrl() {
50175
assertThatIllegalArgumentException().isThrownBy(() -> new GumgumBidder("invalid_url", jacksonMapper));
@@ -422,4 +547,5 @@ private static BidderCall<BidRequest> givenHttpCall(BidRequest bidRequest, Strin
422547
HttpResponse.of(200, null, body),
423548
null);
424549
}
550+
425551
}

0 commit comments

Comments
 (0)