Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions src/main/java/org/prebid/server/bidder/gumgum/GumgumBidder.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.prebid.server.json.DecodeException;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebid;
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgum;
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgumBanner;
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgumVideo;
Expand All @@ -42,6 +43,7 @@
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

public class GumgumBidder implements Bidder<BidRequest> {

Expand Down Expand Up @@ -83,16 +85,21 @@ private BidRequest createBidRequest(BidRequest bidRequest, List<BidderError> err
for (Imp imp : bidRequest.getImp()) {
try {
final ExtImpGumgum extImp = parseImpExt(imp);
modifiedImps.add(modifyImp(imp, extImp));

final String adUnitCode = extractAdUnitCode(imp);

modifiedImps.add(modifyImp(imp, extImp, adUnitCode));

final String extZone = extImp.getZone();
if (StringUtils.isNotEmpty(extZone)) {
zone = extZone;
}

final BigInteger extPubId = extImp.getPubId();
if (extPubId != null && !extPubId.equals(BigInteger.ZERO)) {
pubId = extPubId;
}

} catch (PreBidException e) {
errors.add(BidderError.badInput(e.getMessage()));
}
Expand All @@ -108,6 +115,16 @@ private BidRequest createBidRequest(BidRequest bidRequest, List<BidderError> err
.build();
}

private String extractAdUnitCode(Imp imp) {
final ExtPrebid<?, ExtImpGumgum> extPrebid = mapper.mapper()
.convertValue(imp.getExt(), GUMGUM_EXT_TYPE_REFERENCE);

return Optional.ofNullable(extPrebid.getPrebid())
.map(prebid -> mapper.mapper().convertValue(prebid, ExtImpPrebid.class))
.map(ExtImpPrebid::getAdUnitCode)
.orElse(null);
}
Comment thread
ShayanK16GumGum marked this conversation as resolved.
Outdated

private ExtImpGumgum parseImpExt(Imp imp) {
try {
return mapper.mapper().convertValue(imp.getExt(), GUMGUM_EXT_TYPE_REFERENCE).getBidder();
Expand All @@ -116,7 +133,7 @@ private ExtImpGumgum parseImpExt(Imp imp) {
}
}

private Imp modifyImp(Imp imp, ExtImpGumgum extImp) {
private Imp modifyImp(Imp imp, ExtImpGumgum extImp, String adUnitCode) {
final Imp.ImpBuilder impBuilder = imp.toBuilder();

final String product = extImp.getProduct();
Expand All @@ -125,6 +142,10 @@ private Imp modifyImp(Imp imp, ExtImpGumgum extImp) {
impBuilder.ext(productExt);
}

if (StringUtils.isNotEmpty(adUnitCode)) {
impBuilder.tagid(adUnitCode);
}

final Banner banner = imp.getBanner();
if (banner != null) {
final Banner resolvedBanner = resolveBanner(banner, extImp);
Expand All @@ -141,6 +162,7 @@ private Imp modifyImp(Imp imp, ExtImpGumgum extImp) {
impBuilder.video(resolvedVideo);
}
}

return impBuilder.build();
}

Expand Down
132 changes: 132 additions & 0 deletions src/test/java/org/prebid/server/bidder/gumgum/GumgumBidderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgumBanner;
import org.prebid.server.proto.openrtb.ext.request.gumgum.ExtImpGumgumVideo;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;

Expand All @@ -36,6 +38,10 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.assertj.core.api.Assertions.tuple;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.prebid.server.proto.openrtb.ext.response.BidType.banner;
import static org.prebid.server.proto.openrtb.ext.response.BidType.video;

Expand All @@ -45,6 +51,131 @@ public class GumgumBidderTest extends VertxTest {

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

@Test
public void makeHttpRequestsShouldReturnErrorIfImpExtCouldNotBeParsed() {
//given
final BidRequest bidRequest = givenBidRequest(impBuilder ->
impBuilder.ext(mapper.valueToTree(ExtPrebid.of(null, mapper.createArrayNode()))));

//when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);

//then
Comment thread
ShayanK16GumGum marked this conversation as resolved.
Outdated
assertThat(result.getErrors()).hasSize(2)
.anySatisfy(error -> {
assertThat(error.getType()).isEqualTo(BidderError.Type.bad_input);
assertThat(error.getMessage()).startsWith("Cannot deserialize value");
});
}

@Test
public void makeHttpRequestsShouldModifyImpressionsWhenValidInput() throws IOException {
//given
final ObjectNode extImp = mapper.valueToTree(ExtPrebid.of(null,
ExtImpGumgum.of("zone", BigInteger.TEN, "irisId", null, "product")));
extImp.with("prebid").put("adunitcode", "adUnit123");

final BidRequest bidRequest = givenBidRequest(impBuilder ->
impBuilder.ext(extImp)); //pass the modified extImp with adunitid

//when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);

//deserialize byte[] body into BidRequest
Comment thread
ShayanK16GumGum marked this conversation as resolved.
Outdated
final byte[] requestBody = result.getValue().get(0).getBody();
final BidRequest modifiedRequest = mapper.readValue(requestBody, BidRequest.class);

//then
assertThat(modifiedRequest.getImp()).hasSize(1);
assertThat(modifiedRequest.getImp())
.extracting(Imp::getTagid)
.containsExactly("adUnit123");
Comment thread
ShayanK16GumGum marked this conversation as resolved.
Outdated
}

@Test
public void testMakeHttpRequestsShouldNotSetTagIdFromZoneWhenAdUnitIdIsMissing() throws IOException {
//given:Imp without adUnitId but with zone
Comment thread
ShayanK16GumGum marked this conversation as resolved.
Outdated
final ObjectNode extImp = mapper.valueToTree(ExtPrebid.of(null,
ExtImpGumgum.of("zone123", BigInteger.TEN, "productA", null, "zone123")));

final Imp imp = Imp.builder()
.id("imp1")
.banner(Banner.builder().w(300).h(250).build())
.ext(extImp)
.build();

final BidRequest bidRequest = BidRequest.builder()
.id("test-bid-request")
.imp(Collections.singletonList(imp))
.site(Site.builder().id("test-site").build())
.build();

//when: Calling makeHttpRequests
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);

//then: Validate the request was modified correctly
assertNotNull(result);
assertFalse(result.getValue().isEmpty());

//deserialize byte[] body into BidRequest
final byte[] requestBody = result.getValue().get(0).getBody();
final BidRequest modifiedRequest = mapper.readValue(requestBody, BidRequest.class);

assertFalse(modifiedRequest.getImp().isEmpty());

final Imp modifiedImp = modifiedRequest.getImp().get(0);

assertNull(modifiedImp.getTagid());
assertEquals("test-site", modifiedRequest.getSite().getId(), "zone123");
}

@Test
public void makeHttpRequestsShouldReturnModifiedBidRequestWhenValidInput() throws IOException {
// given
final ObjectNode extImp = mapper.valueToTree(ExtPrebid.of(null,
ExtImpGumgum.of("zone", BigInteger.TEN, "irisId", null, "product")));
extImp.with("prebid").put("adunitcode", "adUnit123");

final BidRequest bidRequest = givenBidRequest(impBuilder -> impBuilder.ext(extImp));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);

// deserialize the modified request
final byte[] requestBody = result.getValue().get(0).getBody();
final BidRequest modifiedRequest = mapper.readValue(requestBody, BidRequest.class);

// then
assertThat(result.getErrors()).isEmpty();
assertThat(modifiedRequest.getImp()).hasSize(1);
assertThat(modifiedRequest.getImp())
.extracting(Imp::getTagid)
.containsExactly("adUnit123"); // Validate that tagid is set to adUnit123
}

@Test
public void makeHttpRequestsShouldExtractAdUnitIdWhenPresent() throws IOException {
// given
final ObjectNode extImp = mapper.valueToTree(ExtPrebid.of(null,
ExtImpGumgum.of("zone", BigInteger.TEN, "irisId", null, "product")));
extImp.with("prebid").put("adunitcode", "adUnit123");

final BidRequest bidRequest = givenBidRequest(impBuilder -> impBuilder.ext(extImp));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);

// deserialize the modified request
final byte[] requestBody = result.getValue().get(0).getBody();
final BidRequest modifiedRequest = mapper.readValue(requestBody, BidRequest.class);

// then
assertThat(result.getErrors()).isEmpty();
assertThat(modifiedRequest.getImp())
.extracting(Imp::getTagid)
.containsExactly("adUnit123");
}

@Test
public void creationShouldFailOnInvalidEndpointUrl() {
assertThatIllegalArgumentException().isThrownBy(() -> new GumgumBidder("invalid_url", jacksonMapper));
Expand Down Expand Up @@ -422,4 +553,5 @@ private static BidderCall<BidRequest> givenHttpCall(BidRequest bidRequest, Strin
HttpResponse.of(200, null, body),
null);
}

}
Loading