@@ -90,7 +90,7 @@ public void makeHttpRequestsShouldUrlEscapeSeatAndUseEuHost() {
9090 assertThat (result .getErrors ()).isEmpty ();
9191 assertThat (result .getValue ()).hasSize (1 )
9292 .extracting (HttpRequest ::getUri )
93- .containsExactly ("https://rtb- eu.floxis.tech/pbs?seat=a+b%26c" );
93+ .containsExactly ("https://eu.floxis.tech/pbs?seat=a+b%26c" );
9494 }
9595
9696 @ Test
@@ -105,7 +105,7 @@ public void makeHttpRequestsShouldUseApacHost() {
105105 assertThat (result .getErrors ()).isEmpty ();
106106 assertThat (result .getValue ()).hasSize (1 )
107107 .extracting (HttpRequest ::getUri )
108- .containsExactly ("https://rtb- apac.floxis.tech/pbs?seat=seat-apac" );
108+ .containsExactly ("https://apac.floxis.tech/pbs?seat=seat-apac" );
109109 }
110110
111111 @ Test
@@ -120,7 +120,7 @@ public void makeHttpRequestsShouldUseUseHostForExplicitUsE() {
120120 assertThat (result .getErrors ()).isEmpty ();
121121 assertThat (result .getValue ()).hasSize (1 )
122122 .extracting (HttpRequest ::getUri )
123- .containsExactly ("https://rtb- us-e.floxis.tech/pbs?seat=abc" );
123+ .containsExactly ("https://us-e.floxis.tech/pbs?seat=abc" );
124124 }
125125
126126 @ Test
@@ -135,11 +135,11 @@ public void makeHttpRequestsShouldDefaultToUseHostWhenRegionMissing() {
135135 assertThat (result .getErrors ()).isEmpty ();
136136 assertThat (result .getValue ()).hasSize (1 )
137137 .extracting (HttpRequest ::getUri )
138- .containsExactly ("https://rtb- us-e.floxis.tech/pbs?seat=abc" );
138+ .containsExactly ("https://us-e.floxis.tech/pbs?seat=abc" );
139139 }
140140
141141 @ Test
142- public void makeHttpRequestsShouldDefaultToUseHostWhenRegionUnknown () {
142+ public void makeHttpRequestsShouldUseArbitraryValidRegionLabelAsSubdomain () {
143143 // given
144144 final BidRequest bidRequest = givenBidRequest (imp -> imp .ext (givenImpExt ("abc" , "mars" )));
145145
@@ -150,7 +150,50 @@ public void makeHttpRequestsShouldDefaultToUseHostWhenRegionUnknown() {
150150 assertThat (result .getErrors ()).isEmpty ();
151151 assertThat (result .getValue ()).hasSize (1 )
152152 .extracting (HttpRequest ::getUri )
153- .containsExactly ("https://rtb-us-e.floxis.tech/pbs?seat=abc" );
153+ .containsExactly ("https://mars.floxis.tech/pbs?seat=abc" );
154+ }
155+
156+ @ Test
157+ public void makeHttpRequestsShouldReturnBadInputWhenRegionIsNotAValidHostLabel () {
158+ // given
159+ final BidRequest bidRequest = givenBidRequest (imp -> imp .ext (givenImpExt ("abc" , "evil.com/x?" )));
160+
161+ // when
162+ final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
163+
164+ // then
165+ assertThat (result .getValue ()).isEmpty ();
166+ assertThat (result .getErrors ()).hasSize (1 )
167+ .allSatisfy (error -> assertThat (error .getType ()).isEqualTo (BidderError .Type .bad_input ));
168+ }
169+
170+ @ Test
171+ public void makeHttpRequestsShouldUsePartnerPrefixedHostWhenPartnerProvided () {
172+ // given
173+ final BidRequest bidRequest = givenBidRequest (imp -> imp .ext (givenImpExt ("abc" , "us-e" , "acme" )));
174+
175+ // when
176+ final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
177+
178+ // then
179+ assertThat (result .getErrors ()).isEmpty ();
180+ assertThat (result .getValue ()).hasSize (1 )
181+ .extracting (HttpRequest ::getUri )
182+ .containsExactly ("https://acme-us-e.floxis.tech/pbs?seat=abc" );
183+ }
184+
185+ @ Test
186+ public void makeHttpRequestsShouldReturnBadInputWhenPartnerIsNotAValidHostLabel () {
187+ // given
188+ final BidRequest bidRequest = givenBidRequest (imp -> imp .ext (givenImpExt ("abc" , "us-e" , "evil.com/x?" )));
189+
190+ // when
191+ final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
192+
193+ // then
194+ assertThat (result .getValue ()).isEmpty ();
195+ assertThat (result .getErrors ()).hasSize (1 )
196+ .allSatisfy (error -> assertThat (error .getType ()).isEqualTo (BidderError .Type .bad_input ));
154197 }
155198
156199 @ Test
@@ -171,7 +214,7 @@ public void makeHttpRequestsShouldRouteOnceAndForwardAllImpsWhenSeatAndRegionMat
171214 assertThat (result .getErrors ()).isEmpty ();
172215 assertThat (result .getValue ()).hasSize (1 )
173216 .extracting (HttpRequest ::getUri )
174- .containsExactly ("https://rtb- eu.floxis.tech/pbs?seat=seat-eu" );
217+ .containsExactly ("https://eu.floxis.tech/pbs?seat=seat-eu" );
175218 assertThat (result .getValue ())
176219 .extracting (HttpRequest ::getPayload )
177220 .flatExtracting (BidRequest ::getImp )
@@ -197,7 +240,7 @@ public void makeHttpRequestsShouldReturnErrorWhenImpsTargetDifferentSeat() {
197240 assertThat (result .getValue ()).isEmpty ();
198241 assertThat (result .getErrors ()).hasSize (1 )
199242 .containsOnly (BidderError .badInput (
200- "all impressions must target the same Floxis seat and region ; "
243+ "all impressions must target the same Floxis seat, region and partner ; "
201244 + "imp imp-2 differs from imp imp-1" ));
202245 }
203246
@@ -219,7 +262,29 @@ public void makeHttpRequestsShouldReturnErrorWhenImpsTargetDifferentRegion() {
219262 assertThat (result .getValue ()).isEmpty ();
220263 assertThat (result .getErrors ()).hasSize (1 )
221264 .containsOnly (BidderError .badInput (
222- "all impressions must target the same Floxis seat and region; "
265+ "all impressions must target the same Floxis seat, region and partner; "
266+ + "imp imp-2 differs from imp imp-1" ));
267+ }
268+
269+ @ Test
270+ public void makeHttpRequestsShouldReturnErrorWhenImpsTargetDifferentPartner () {
271+ // given
272+ final BidRequest bidRequest = BidRequest .builder ()
273+ .id ("req-1" )
274+ .imp (asList (
275+ givenImp (imp -> imp .id ("imp-1" ).ext (givenImpExt ("seat-eu" , "eu" , "acme" ))),
276+ givenImp (imp -> imp .id ("imp-2" ).ext (givenImpExt ("seat-eu" , "eu" , "other" )))))
277+ .site (Site .builder ().id ("271" ).build ())
278+ .build ();
279+
280+ // when
281+ final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
282+
283+ // then
284+ assertThat (result .getValue ()).isEmpty ();
285+ assertThat (result .getErrors ()).hasSize (1 )
286+ .containsOnly (BidderError .badInput (
287+ "all impressions must target the same Floxis seat, region and partner; "
223288 + "imp imp-2 differs from imp imp-1" ));
224289 }
225290
@@ -448,7 +513,12 @@ private static Imp givenImp(UnaryOperator<Imp.ImpBuilder> impCustomizer) {
448513 }
449514
450515 private static com .fasterxml .jackson .databind .node .ObjectNode givenImpExt (String seat , String region ) {
451- return mapper .valueToTree (ExtPrebid .of (null , ExtImpFloxis .of (seat , region )));
516+ return givenImpExt (seat , region , null );
517+ }
518+
519+ private static com .fasterxml .jackson .databind .node .ObjectNode givenImpExt (String seat , String region ,
520+ String partner ) {
521+ return mapper .valueToTree (ExtPrebid .of (null , ExtImpFloxis .of (seat , region , partner )));
452522 }
453523
454524 private static BidResponse givenBidResponse (Bid bid ) {
0 commit comments