Skip to content
Merged
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 @@ -50,7 +50,7 @@ public class NextMillenniumBidder implements Bidder<BidRequest> {
new TypeReference<>() {
};

private static final String NM_ADAPTER_VERSION = "v1.0.0";
private static final String NM_ADAPTER_VERSION = "v1.0.1";

private final String endpointUrl;
private final JacksonMapper mapper;
Expand Down Expand Up @@ -101,15 +101,15 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) {
}

private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium extImp) {
final String soredRequestId = resolveStoredRequestId(bidRequest, extImp);
final String storedRequestId = resolveStoredRequestId(bidRequest, extImp);
final ExtRequestPrebidServer extRequestPrebidServer = Optional.ofNullable(bidRequest.getExt())
.map(ExtRequest::getPrebid)
.map(ExtRequestPrebid::getServer)
.orElse(null);

return bidRequest.toBuilder()
.imp(modifyFirstImp(bidRequest.getImp(), soredRequestId))
.ext(createExtRequest(soredRequestId, extRequestPrebidServer))
.imp(modifyFirstImp(bidRequest.getImp(), storedRequestId))
.ext(createExtRequest(storedRequestId, extRequestPrebidServer, extImp))
.build();
}

Expand Down Expand Up @@ -156,7 +156,7 @@ private List<Imp> modifyFirstImp(List<Imp> imps, String storedRequestId) {
.build();

final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of(
NextMillenniumExtBidder.of(nmmFlags, null, null));
NextMillenniumExtBidder.of(nmmFlags));

final ExtRequest extRequest = ExtRequest.of(extRequestPrebid);
mapper.fillExtension(extRequest, nextMillenniumExt);
Expand All @@ -169,14 +169,21 @@ private List<Imp> modifyFirstImp(List<Imp> imps, String storedRequestId) {
return modifiedImps;
}

private ExtRequest createExtRequest(String storedRequestId, ExtRequestPrebidServer extRequestPrebidServer) {
private ExtRequest createExtRequest(String storedRequestId,
ExtRequestPrebidServer extRequestPrebidServer,
ExtImpNextMillennium extImp) {
final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid.builder()
.storedrequest(ExtStoredRequest.of(storedRequestId))
.server(extRequestPrebidServer)
.build();

final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of(
NextMillenniumExtBidder.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord()));
NextMillenniumExtBidder.of(
nmmFlags,
extImp.getAdSlots(),
extImp.getAllowedAds(),
NM_ADAPTER_VERSION,
versionProvider.getNameVersionRecord()));

final ExtRequest extRequest = ExtRequest.of(extRequestPrebid);
mapper.fillExtension(extRequest, nextMillenniumExt);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,17 @@ public class NextMillenniumExtBidder {
@JsonProperty("nmmFlags")
List<String> nmmFlags;

@JsonProperty("adSlots")
List<String> adSlots;

@JsonProperty("allowedAds")
List<String> allowedAds;

String nmVersion;

String serverVersion;

public static NextMillenniumExtBidder of(List<String> nmmFlags) {
return of(nmmFlags, null, null, null, null);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package org.prebid.server.proto.openrtb.ext.request.nextmillennium;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Value;

import java.util.List;

@Value(staticConstructor = "of")
public class ExtImpNextMillennium {

String placementId;

String groupId;

@JsonProperty("adSlots")
List<String> adSlots;

@JsonProperty("allowedAds")
List<String> allowedAds;
}
15 changes: 15 additions & 0 deletions src/main/resources/static/bidder-params/nextmillennium.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,21 @@
"type": "string",
"minLength": 1,
"description": "An id used to identify NextMillennium placement group"
},
"adSlots": {
"type": "array",
"minItems": 1,
"description": "IDs which identifies the ad slots",
"items": {
"type": "string"
}
},
"allowedAds": {
"type": "array",
"description": "List of allowed ads",
"items": {
"type": "string"
}
}
},
"anyOf": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import org.prebid.server.bidder.model.HttpRequest;
import org.prebid.server.bidder.model.HttpResponse;
import org.prebid.server.bidder.model.Result;
import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExt;
import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExtBidder;
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
Expand Down Expand Up @@ -78,8 +80,8 @@ public void makeHttpRequestsShouldUseBidRequestIdForAllRequests() {
// given
final BidRequest bidRequest = givenBidRequest(
request -> request.id("id"),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null)),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null)));
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null, null, null)),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null, null, null)));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
Expand All @@ -97,8 +99,8 @@ public void makeHttpRequestsShouldUseBidRequestTestForAllRequests() {
// given
final BidRequest bidRequest = givenBidRequest(
request -> request.test(1),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null)),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null)));
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null, null, null)),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null, null, null)));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
Expand All @@ -116,8 +118,8 @@ public void makeHttpRequestsShouldUseImpExtBidderPlacementIdForStoredRequestId()
// given
final BidRequest bidRequest = givenBidRequest(
identity(),
givenImpWithExt(identity(), ExtImpNextMillennium.of("placement1", null)),
givenImpWithExt(identity(), ExtImpNextMillennium.of("placement2", null)));
givenImpWithExt(identity(), givenExtImpWithPlacementId("placement1")),
givenImpWithExt(identity(), givenExtImpWithPlacementId("placement2")));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
Expand All @@ -138,8 +140,8 @@ public void makeHttpRequestsShouldUseImpExtBidderGroupIdForStoredRequestId() {
// given
final BidRequest bidRequest = givenBidRequest(
identity(),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, "group1")),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, "group2")));
givenImpWithExt(identity(), givenExtImpWithGroupId("group1")),
givenImpWithExt(identity(), givenExtImpWithGroupId("group2")));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
Expand Down Expand Up @@ -168,10 +170,10 @@ public void makeHttpRequestsShouldUseFirstImpBannerFirstFormatForStoredRequestId
.w(5)
.h(6)
.build()),
ExtImpNextMillennium.of(null, "group1")),
givenExtImpWithGroupId("group1")),
givenImpWithExt(
imp -> imp.banner(Banner.builder().w(7).h(8).build()),
ExtImpNextMillennium.of(null, "group2")));
givenExtImpWithGroupId("group2")));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
Expand All @@ -187,19 +189,61 @@ public void makeHttpRequestsShouldUseFirstImpBannerFirstFormatForStoredRequestId
.containsExactly("ggroup1;1x2;", "ggroup2;1x2;");
}

@Test
public void makeHttpRequestsShouldIncludeAdSlotsAndAllowedAdsOnlyInRequestExt() {
// given
final List<String> adSlots = List.of("slot1", "slot2");
final List<String> allowedAds = List.of("ad1", "ad2");

final ExtImpNextMillennium extImp = ExtImpNextMillennium.of("placement123", null, adSlots, allowedAds);

final BidRequest bidRequest = givenBidRequest(
identity(),
givenImpWithExt(identity(), extImp));

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

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1);

final BidRequest actualRequest = result.getValue().getFirst().getPayload();

final NextMillenniumExtBidder requestExt = jacksonMapper.mapper()
.convertValue(
jacksonMapper.mapper().convertValue(actualRequest
.getExt(), NextMillenniumExt.class).getNextMillennium(),
NextMillenniumExtBidder.class);

final NextMillenniumExtBidder impExt = jacksonMapper.mapper()
.convertValue(
jacksonMapper.mapper().convertValue(actualRequest
.getImp().getFirst().getExt(), NextMillenniumExt.class).getNextMillennium(),
NextMillenniumExtBidder.class);

assertThat(requestExt)
.extracting(NextMillenniumExtBidder::getAdSlots, NextMillenniumExtBidder::getAllowedAds)
.containsExactly(adSlots, allowedAds);

assertThat(impExt.getAdSlots()).isNull();
assertThat(impExt.getAllowedAds()).isNull();
assertThat(impExt.getNmmFlags()).containsExactly("valueOne", "valueTwo");
}

@Test
public void makeHttpRequestsShouldUseFirstImpBannerSizeForStoredRequestIds() {
// given
final BidRequest bidRequest = givenBidRequest(
identity(),
givenImpWithExt(
imp -> imp.banner(Banner.builder().w(7).h(8).build()),
ExtImpNextMillennium.of(null, "group1")),
givenExtImpWithGroupId("group1")),
givenImpWithExt(
imp -> imp.banner(Banner.builder()
.format(singletonList(Format.builder().w(1).h(2).build()))
.build()),
ExtImpNextMillennium.of(null, "group2")));
givenExtImpWithGroupId("group2")));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
Expand All @@ -220,8 +264,8 @@ public void makeHttpRequestsShouldUseAppDomainForStoredRequestId() {
// given
final BidRequest bidRequest = givenBidRequest(
request -> request.app(App.builder().domain("appDomain").build()),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, "group1")),
givenImpWithExt(identity(), ExtImpNextMillennium.of(null, "group2")));
givenImpWithExt(identity(), givenExtImpWithGroupId("group1")),
givenImpWithExt(identity(), givenExtImpWithGroupId("group2")));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
Expand All @@ -242,8 +286,8 @@ public void makeHttpRequestsShouldUseSiteDomainForStoredRequestId() {
// given
final BidRequest bidRequest = givenBidRequest(
request -> request.site(Site.builder().domain("siteDomain").build()),
givenImpWithExt(identity(), ExtImpNextMillennium.of("placement1", "group1")),
givenImpWithExt(identity(), ExtImpNextMillennium.of("placement2", "group2")));
givenImpWithExt(identity(), givenExtImpWithPlacementIdAndGroupId("placement1", "group1")),
givenImpWithExt(identity(), givenExtImpWithPlacementIdAndGroupId("placement2", "group2")));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
Expand Down Expand Up @@ -294,7 +338,7 @@ public void makeHttpRequestsImpExtComparison() {
.h(90)
.build()))
.build()),
ExtImpNextMillennium.of(placementId, null));
ExtImpNextMillennium.of(placementId, null, null, null));

final ExtRequest extRequest = ExtRequest.of(ExtRequestPrebid.builder()
.schains(emptyList())
Expand Down Expand Up @@ -346,7 +390,7 @@ public void makeHttpRequestsImpShouldBeIdenticalExceptExt() {
.tagid("custom_imp_tagid")
.secure(1)
.banner(banner),
ExtImpNextMillennium.of(placementId, null));
ExtImpNextMillennium.of(placementId, null, null, null));

final BidRequest bidRequest = givenBidRequest(b -> b
.id("c868fd0b-960c-4f49-a8d6-2b3e938b41f2")
Expand Down Expand Up @@ -386,7 +430,7 @@ public void makeHttpRequestsBidRequestShouldBeIdenticalExceptImpExt() {
.tagid("custom_imp_tagid")
.secure(1)
.banner(banner),
ExtImpNextMillennium.of(placementId, null));
ExtImpNextMillennium.of(placementId, null, null, null));

final ExtRequest extRequest = ExtRequest.of(ExtRequestPrebid.builder()
.schains(emptyList())
Expand Down Expand Up @@ -432,7 +476,7 @@ public void makeHttpRequestsShouldPreserveExtPrebidServer() {
.id("test-request")
.imp(singletonList(givenImpWithExt(
imp -> imp.banner(Banner.builder().w(300).h(250).build()),
ExtImpNextMillennium.of("placement_id", null))))
ExtImpNextMillennium.of("placement_id", null, null, null))))
.ext(extRequest)
.build();

Expand Down Expand Up @@ -603,4 +647,16 @@ private static Imp givenImpWithExt(UnaryOperator<Imp.ImpBuilder> impCustomizer,
return givenImp(impCustomizer.andThen(imp -> imp.ext(mapper.valueToTree(
ExtPrebid.of(null, extImpNextMillennium))))::apply);
}

private static ExtImpNextMillennium givenExtImpWithGroupId(String groupId) {
return ExtImpNextMillennium.of(null, groupId, null, null);
}

private static ExtImpNextMillennium givenExtImpWithPlacementId(String placementId) {
return ExtImpNextMillennium.of(placementId, null, null, null);
}

private static ExtImpNextMillennium givenExtImpWithPlacementIdAndGroupId(String placementId, String groupId) {
return ExtImpNextMillennium.of(placementId, groupId, null, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
},
"ext": {
"nextmillennium" : {
"placement_id": "placement_id"
"placement_id": "placement_id",
"adSlots": ["slot-1", "slot-2"],
"allowedAds": ["banner", "native"]
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@
},
"nextMillennium": {
"nmmFlags": [ "1" ],
"nm_version": "v1.0.0",
"adSlots": ["slot-1", "slot-2"],
"allowedAds": ["banner", "native"],
"nm_version": "v1.0.1",
"server_version": "${json-unit.any-string}"
}
}
Expand Down
Loading