Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import com.iab.openrtb.request.BidRequest;
import com.iab.openrtb.request.Eid;
import lombok.Builder;
import lombok.Value;

import java.math.BigDecimal;
import java.util.List;

@Value
@Builder(toBuilder = true)
Expand All @@ -16,6 +18,11 @@ public class MissenaAdRequest {

String currency;

Boolean debug;

@JsonProperty("userEids")
List<Eid> userEids;

BigDecimal floor;

String floorCurrency;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.iab.openrtb.request.BidRequest;
import com.iab.openrtb.request.Device;
import com.iab.openrtb.request.Eid;
import com.iab.openrtb.request.Imp;
import com.iab.openrtb.request.Site;
import com.iab.openrtb.request.User;
import com.iab.openrtb.response.Bid;
import io.vertx.core.MultiMap;
import io.vertx.core.http.HttpMethod;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.prebid.server.bidder.Bidder;
import org.prebid.server.bidder.model.BidderBid;
Expand All @@ -21,6 +24,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.ExtUser;
import org.prebid.server.proto.openrtb.ext.request.missena.ExtImpMissena;
import org.prebid.server.proto.openrtb.ext.response.BidType;
import org.prebid.server.util.BidderUtil;
Expand Down Expand Up @@ -91,15 +95,18 @@ private HttpRequest<MissenaAdRequest> makeHttpRequest(BidRequest request, Imp im
final Price floorInfo = resolveBidFloor(imp, request, requestCurrency);

final MissenaUserParams userParams = MissenaUserParams.builder()
.apiKey(extImp.getApiKey())
.formats(extImp.getFormats())
.placement(extImp.getPlacement())
.testMode(extImp.getTestMode())
.sample(extImp.getSample())
.settings(extImp.getSettings())
.build();

final MissenaAdRequest missenaAdRequest = MissenaAdRequest.builder()
.adUnit(imp.getId())
.currency(requestCurrency)
.debug(Objects.equals(request.getTest(), 1) ? Boolean.TRUE : null)
.userEids(resolveUserEids(request.getUser()))
.floor(floorInfo.getValue())
.floorCurrency(floorInfo.getCurrency())
.idempotencyKey(request.getId())
Expand All @@ -120,6 +127,12 @@ private HttpRequest<MissenaAdRequest> makeHttpRequest(BidRequest request, Imp im
.build();
}

private static List<Eid> resolveUserEids(User user) {
final ExtUser extUser = user != null ? user.getExt() : null;
final List<Eid> eids = extUser != null ? extUser.getEids() : null;
return CollectionUtils.isNotEmpty(eids) ? eids : null;
}

private Price resolveBidFloor(Imp imp, BidRequest bidRequest, String targetCurrency) {
final Price initialBidFloorPrice = Price.of(imp.getBidfloorcur(), imp.getBidfloor());
return BidderUtil.isValidPrice(initialBidFloorPrice)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.prebid.server.bidder.missena;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.node.ObjectNode; // Changed import
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.Builder;
import lombok.Value;

Expand All @@ -11,13 +11,14 @@
@Value
public class MissenaUserParams {

@JsonProperty("apiKey")
String apiKey;

List<String> formats;

String placement;

@JsonProperty("test")
String testMode;
String sample;

ObjectNode settings;
}

Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ public class ExtImpMissena {

String placement;

@JsonProperty("test")
String testMode;
String sample;

ObjectNode settings;
}
6 changes: 3 additions & 3 deletions src/main/resources/static/bidder-params/missena.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
"type": "string",
"description": "Placement Type (Sticky, Header, ...)"
},
"test": {
"type": "string",
"description": "Test Mode"
"sample": {
"type": ["string", "null"],
"description": "Sample"
},
"formats": {
"type": "array",
Expand Down
147 changes: 140 additions & 7 deletions src/test/java/org/prebid/server/bidder/missena/MissenaBidderTest.java

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add separate test to check new passthrough logic

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CTMBNara Done !

Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package org.prebid.server.bidder.missena;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.iab.openrtb.request.BidRequest;
import com.iab.openrtb.request.Device;
import com.iab.openrtb.request.Eid;
import com.iab.openrtb.request.Imp;
import com.iab.openrtb.request.Regs;
import com.iab.openrtb.request.Site;
import com.iab.openrtb.request.Source;
import com.iab.openrtb.request.SupplyChain;
import com.iab.openrtb.request.Uid;
import com.iab.openrtb.request.User;
import com.iab.openrtb.response.Bid;
import org.junit.jupiter.api.BeforeEach;
Expand All @@ -32,6 +35,7 @@
import org.prebid.server.util.HttpUtil;
import org.prebid.server.version.PrebidVersionProvider;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
Expand Down Expand Up @@ -95,23 +99,29 @@ public void makeHttpRequestsShouldReturnErrorIfImpExtCouldNotBeParsed() {
}

@Test
public void makeHttpRequestsShouldMakeRequestForFirstValidImp() {
public void makeHttpRequestsShouldMakeRequestForFirstValidImp() throws IOException {
// given
final ObjectNode settingsNode = mapper.createObjectNode().put("settingKey", "settingValue");
final List<Eid> userEids = List.of(Eid.builder()
.source("id-source")
.uids(List.of(Uid.builder().id("uid").atype(1).build()))
.build());

final BidRequest bidRequest = BidRequest.builder()
.id("requestId")
.test(1)
.tmax(500L)
.cur(singletonList("USD"))
.imp(List.of(
givenImp(imp -> imp.id("impId1")
.ext(givenImpExt("apiKey1", "placementId1", "1", List.of("banner"), settingsNode))),
.ext(givenImpExt("apiKey1", "placementId1", "sample1",
List.of("banner"), settingsNode))),
givenImp(imp -> imp.id("impId2")
.ext(givenImpExt("apiKey2", "placementId2", "0", null, null)))))
.ext(givenImpExt("apiKey2", "placementId2", "sample2", null, null)))))
.site(Site.builder().page("http://test.com/page").domain("test.com").build())
.regs(Regs.builder().ext(ExtRegs.of(1, null, null, null)).build())
.user(User.builder().buyeruid("buyer1")
.ext(ExtUser.builder().consent("consentStr").build()).build())
.ext(ExtUser.builder().consent("consentStr").eids(userEids).build()).build())
.source(Source.builder().schain(SupplyChain.of(1, null, null, null)).build())
.device(Device.builder().ua("test-ua").ip("123.123.123.123").build())
.build();
Expand All @@ -121,15 +131,18 @@ public void makeHttpRequestsShouldMakeRequestForFirstValidImp() {

// then
final MissenaUserParams expectedUserParams = MissenaUserParams.builder()
.apiKey("apiKey1")
.formats(List.of("banner"))
.placement("placementId1")
.testMode("1")
.sample("sample1")
.settings(settingsNode)
.build();

final MissenaAdRequest expectedPayload = MissenaAdRequest.builder()
.adUnit("impId1")
.currency("USD")
.debug(true)
.userEids(userEids)
.floor(BigDecimal.valueOf(0.1))
.floorCurrency("USD")
.idempotencyKey("requestId")
Expand All @@ -147,6 +160,126 @@ public void makeHttpRequestsShouldMakeRequestForFirstValidImp() {
assertThat(result.getValue())
.extracting(HttpRequest::getImpIds)
.containsExactly(Collections.singleton("impId1"));

final JsonNode body = mapper.readTree(result.getValue().getFirst().getBody());
assertThat(body.at("/params/apiKey").asText()).isEqualTo("apiKey1");
assertThat(body.at("/debug").asBoolean()).isTrue();
assertThat(body.at("/userEids/0/source").asText()).isEqualTo("id-source");
}

@Test
public void makeHttpRequestsShouldPassOriginalBidRequestAsOrtb2() {
// given
final BidRequest bidRequest = givenBidRequest(imp -> imp.ext(givenImpExt("apiKey")));

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

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1).first()
.extracting(HttpRequest::getPayload)
.extracting(MissenaAdRequest::getBidRequest)
.isEqualTo(bidRequest);
}

@Test
public void makeHttpRequestsShouldPassUserEidsWhenPresent() {
// given
final List<Eid> userEids = List.of(Eid.builder()
.source("id-source")
.uids(List.of(Uid.builder().id("uid").atype(1).build()))
.build());
final BidRequest bidRequest = givenBidRequest(imp -> imp.ext(givenImpExt("apiKey")))
.toBuilder()
.user(User.builder().ext(ExtUser.builder().eids(userEids).build()).build())
.build();

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

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1).first()
.extracting(HttpRequest::getPayload)
.extracting(MissenaAdRequest::getUserEids)
.isEqualTo(userEids);
}

@Test
public void makeHttpRequestsShouldNotPassUserEidsWhenUserIsNull() {
// given
final BidRequest bidRequest = givenBidRequest(imp -> imp.ext(givenImpExt("apiKey")))
.toBuilder()
.user(null)
.build();

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

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1).first()
.extracting(HttpRequest::getPayload)
.extracting(MissenaAdRequest::getUserEids)
.isNull();
}

@Test
public void makeHttpRequestsShouldNotPassUserEidsWhenEidsAreEmpty() {
// given
final BidRequest bidRequest = givenBidRequest(imp -> imp.ext(givenImpExt("apiKey")))
.toBuilder()
.user(User.builder().ext(ExtUser.builder().eids(Collections.emptyList()).build()).build())
.build();

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

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1).first()
.extracting(HttpRequest::getPayload)
.extracting(MissenaAdRequest::getUserEids)
.isNull();
}

@Test
public void makeHttpRequestsShouldSetDebugWhenTestIsOne() {
// given
final BidRequest bidRequest = givenBidRequest(imp -> imp.ext(givenImpExt("apiKey")))
.toBuilder()
.test(1)
.build();

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

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1).first()
.extracting(HttpRequest::getPayload)
.extracting(MissenaAdRequest::getDebug)
.isEqualTo(true);
}

@Test
public void makeHttpRequestsShouldNotSetDebugWhenTestIsNotOne() {
// given
final BidRequest bidRequest = givenBidRequest(imp -> imp.ext(givenImpExt("apiKey")))
.toBuilder()
.test(0)
.build();

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

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1).first()
.extracting(HttpRequest::getPayload)
.extracting(MissenaAdRequest::getDebug)
.isNull();
}

@Test
Expand Down Expand Up @@ -326,14 +459,14 @@ private static ObjectNode givenImpExt(String apiKey) {

private static ObjectNode givenImpExt(String apiKey,
String placement,
String testMode,
String sample,
List<String> formats,
ObjectNode settings) {

final ExtImpMissena extImpMissena = ExtImpMissena.builder()
.apiKey(apiKey)
.placement(placement)
.testMode(testMode)
.sample(sample)
.formats(formats)
.settings(settings)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"missena": {
"apiKey": "apiKey",
"placement": "placement",
"test": "test"
"sample": "sample"
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
"request_id" : "request_id",
"timeout" : "${json-unit.any-number}",
"params" : {
"apiKey" : "apiKey",
"placement" : "placement",
"test" : "test"
"sample" : "sample"
},
"ortb2" : {
"id" : "request_id",
Expand All @@ -22,7 +23,7 @@
"bidder" : {
"apiKey" : "apiKey",
"placement" : "placement",
"test" : "test"
"sample" : "sample"
}
}
} ],
Expand Down