Skip to content

Commit 41c57c2

Browse files
committed
Floxis: declare ortb-version 2.6 + multi-imp seat guard + IT downconversion guard
1 parent f6797a3 commit 41c57c2

6 files changed

Lines changed: 93 additions & 7 deletions

File tree

src/main/java/org/prebid/server/bidder/floxis/FloxisBidder.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
6363

6464
final ExtImpFloxis extImp;
6565
try {
66-
extImp = parseImpExt(request.getImp().getFirst());
66+
extImp = resolveCommonImpExt(request.getImp());
6767
} catch (PreBidException e) {
6868
return Result.withError(BidderError.badInput(e.getMessage()));
6969
}
@@ -79,6 +79,23 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
7979
.build());
8080
}
8181

82+
// A single request routes to one Floxis host/seat (the seat is the URL query key). All imps
83+
// must therefore share the same seat and region; a mismatch is a misconfigured request rather
84+
// than something to silently route on imp[0]'s key.
85+
private ExtImpFloxis resolveCommonImpExt(List<Imp> imps) {
86+
final ExtImpFloxis first = parseImpExt(imps.getFirst());
87+
for (Imp imp : imps.subList(1, imps.size())) {
88+
final ExtImpFloxis current = parseImpExt(imp);
89+
if (!Objects.equals(current.getSeat(), first.getSeat())
90+
|| !Objects.equals(current.getRegion(), first.getRegion())) {
91+
throw new PreBidException(
92+
"all impressions must target the same Floxis seat and region; imp %s differs from imp %s"
93+
.formatted(imp.getId(), imps.getFirst().getId()));
94+
}
95+
}
96+
return first;
97+
}
98+
8299
private ExtImpFloxis parseImpExt(Imp imp) {
83100
try {
84101
return mapper.mapper().convertValue(imp.getExt(), FLOXIS_EXT_TYPE_REFERENCE).getBidder();

src/main/resources/bidder-config/floxis.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
adapters:
22
floxis:
33
endpoint: https://{{Host}}/pbs?seat={{SeatId}}
4+
ortb-version: "2.6"
45
modifying-vast-xml-allowed: false
56
meta-info:
67
maintainer-email: prebid@floxis.tech

src/test/java/org/prebid/server/bidder/floxis/FloxisBidderTest.java

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,13 @@ public void makeHttpRequestsShouldDefaultToUseHostWhenRegionUnknown() {
154154
}
155155

156156
@Test
157-
public void makeHttpRequestsShouldRouteFromFirstImpAndForwardAllImps() {
157+
public void makeHttpRequestsShouldRouteOnceAndForwardAllImpsWhenSeatAndRegionMatch() {
158158
// given
159159
final BidRequest bidRequest = BidRequest.builder()
160160
.id("req-1")
161161
.imp(asList(
162162
givenImp(imp -> imp.id("imp-1").ext(givenImpExt("seat-eu", "eu"))),
163-
givenImp(imp -> imp.id("imp-2").ext(givenImpExt("seat-other", "apac")))))
163+
givenImp(imp -> imp.id("imp-2").ext(givenImpExt("seat-eu", "eu")))))
164164
.site(Site.builder().id("271").build())
165165
.build();
166166

@@ -179,6 +179,50 @@ public void makeHttpRequestsShouldRouteFromFirstImpAndForwardAllImps() {
179179
.containsExactly("imp-1", "imp-2");
180180
}
181181

182+
@Test
183+
public void makeHttpRequestsShouldReturnErrorWhenImpsTargetDifferentSeat() {
184+
// given
185+
final BidRequest bidRequest = BidRequest.builder()
186+
.id("req-1")
187+
.imp(asList(
188+
givenImp(imp -> imp.id("imp-1").ext(givenImpExt("seat-eu", "eu"))),
189+
givenImp(imp -> imp.id("imp-2").ext(givenImpExt("seat-other", "eu")))))
190+
.site(Site.builder().id("271").build())
191+
.build();
192+
193+
// when
194+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
195+
196+
// then
197+
assertThat(result.getValue()).isEmpty();
198+
assertThat(result.getErrors()).hasSize(1)
199+
.containsOnly(BidderError.badInput(
200+
"all impressions must target the same Floxis seat and region; "
201+
+ "imp imp-2 differs from imp imp-1"));
202+
}
203+
204+
@Test
205+
public void makeHttpRequestsShouldReturnErrorWhenImpsTargetDifferentRegion() {
206+
// given
207+
final BidRequest bidRequest = BidRequest.builder()
208+
.id("req-1")
209+
.imp(asList(
210+
givenImp(imp -> imp.id("imp-1").ext(givenImpExt("seat-eu", "eu"))),
211+
givenImp(imp -> imp.id("imp-2").ext(givenImpExt("seat-eu", "apac")))))
212+
.site(Site.builder().id("271").build())
213+
.build();
214+
215+
// when
216+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
217+
218+
// then
219+
assertThat(result.getValue()).isEmpty();
220+
assertThat(result.getErrors()).hasSize(1)
221+
.containsOnly(BidderError.badInput(
222+
"all impressions must target the same Floxis seat and region; "
223+
+ "imp imp-2 differs from imp imp-1"));
224+
}
225+
182226
@Test
183227
public void makeHttpRequestsShouldForwardRequestBodyUnchanged() {
184228
// given

src/test/java/org/prebid/server/it/FloxisTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.io.IOException;
99

1010
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
11+
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
1112
import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
1213
import static com.github.tomakehurst.wiremock.client.WireMock.post;
1314
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
@@ -19,6 +20,7 @@ public class FloxisTest extends IntegrationTest {
1920
public void openrtb2AuctionShouldRespondWithBidsFromFloxis() throws IOException, JSONException {
2021
// given
2122
WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/floxis-exchange"))
23+
.withQueryParam("seat", equalTo("pub-seat-1"))
2224
.withRequestBody(equalToJson(jsonFrom("openrtb2/floxis/test-floxis-bid-request.json")))
2325
.willReturn(aResponse().withBody(jsonFrom("openrtb2/floxis/test-floxis-bid-response.json"))));
2426

src/test/resources/org/prebid/server/it/openrtb2/floxis/test-auction-floxis-request.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@
1414
}
1515
}
1616
],
17+
"source": {
18+
"schain": {
19+
"complete": 1,
20+
"ver": "1.0",
21+
"nodes": [
22+
{
23+
"asi": "floxis.tech",
24+
"sid": "pub-seat-1",
25+
"hp": 1
26+
}
27+
]
28+
}
29+
},
1730
"regs": {
1831
"ext": {
1932
"gdpr": 0

src/test/resources/org/prebid/server/it/openrtb2/floxis/test-floxis-bid-request.json

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,18 @@
1717
}
1818
],
1919
"source": {
20-
"tid": "${json-unit.any-string}"
20+
"tid": "${json-unit.any-string}",
21+
"schain": {
22+
"complete": 1,
23+
"ver": "1.0",
24+
"nodes": [
25+
{
26+
"asi": "floxis.tech",
27+
"sid": "pub-seat-1",
28+
"hp": 1
29+
}
30+
]
31+
}
2132
},
2233
"site": {
2334
"domain": "www.example.com",
@@ -39,9 +50,7 @@
3950
"USD"
4051
],
4152
"regs": {
42-
"ext": {
43-
"gdpr": 0
44-
}
53+
"gdpr": 0
4554
},
4655
"ext": {
4756
"prebid": {

0 commit comments

Comments
 (0)