77import com .iab .openrtb .request .Imp ;
88import com .iab .openrtb .request .Site ;
99import com .iab .openrtb .request .Video ;
10+ import com .iab .openrtb .request .Source ;
1011import com .iab .openrtb .response .Bid ;
1112import com .iab .openrtb .response .BidResponse ;
1213import com .iab .openrtb .response .SeatBid ;
14+ import org .junit .jupiter .api .BeforeEach ;
1315import org .junit .jupiter .api .Test ;
16+ import org .junit .jupiter .api .extension .ExtendWith ;
17+ import org .mockito .Mock ;
18+ import org .mockito .junit .jupiter .MockitoExtension ;
1419import org .prebid .server .VertxTest ;
1520import org .prebid .server .bidder .model .BidderBid ;
1621import org .prebid .server .bidder .model .BidderCall ;
1722import org .prebid .server .bidder .model .BidderError ;
1823import org .prebid .server .bidder .model .HttpRequest ;
1924import org .prebid .server .bidder .model .HttpResponse ;
2025import org .prebid .server .bidder .model .Result ;
26+ import org .prebid .server .currency .CurrencyConversionService ;
2127import org .prebid .server .proto .openrtb .ext .ExtPrebid ;
2228import org .prebid .server .proto .openrtb .ext .request .showheroes .ExtImpShowheroes ;
29+ import org .prebid .server .version .PrebidVersionProvider ;
2330
2431import java .math .BigDecimal ;
2532import java .util .List ;
2633import java .util .Map ;
2734import java .util .function .Function ;
2835
36+ import static org .mockito .ArgumentMatchers .any ;
37+ import static org .mockito .ArgumentMatchers .anyString ;
38+ import static org .mockito .ArgumentMatchers .eq ;
39+ import static org .mockito .Mock .Strictness .LENIENT ;
40+ import static org .mockito .Mockito .never ;
41+ import static org .mockito .Mockito .verify ;
42+ import static org .mockito .BDDMockito .given ;
2943import static java .util .Collections .singletonList ;
3044import static java .util .function .Function .identity ;
3145import static org .assertj .core .api .Assertions .assertThat ;
3448import static org .prebid .server .proto .openrtb .ext .response .BidType .banner ;
3549import static org .prebid .server .proto .openrtb .ext .response .BidType .video ;
3650
51+ @ ExtendWith (MockitoExtension .class )
3752public class ShowheroesBidderTest extends VertxTest {
3853
3954 private static final String ENDPOINT_URL = "https://ads.showheroes.com/" ;
4055
41- private final ShowheroesBidder target = new ShowheroesBidder (ENDPOINT_URL , jacksonMapper );
56+ private ShowheroesBidder target ;
57+
58+ @ Mock (strictness = LENIENT )
59+ private CurrencyConversionService currencyConversionService ;
60+
61+ @ Mock (strictness = LENIENT )
62+ private PrebidVersionProvider prebidVersionProvider ;
63+
64+ @ BeforeEach
65+ public void setUp () {
66+ // set always 'test_version' as Prebid version for testing
67+ given (prebidVersionProvider .getNameVersionRecord ()).willReturn ("test_version" );
68+ target = new ShowheroesBidder (ENDPOINT_URL , currencyConversionService , prebidVersionProvider , jacksonMapper );
69+ }
4270
4371 @ Test
4472 public void creationShouldFailOnInvalidEndpointUrl () {
45- assertThatIllegalArgumentException ().isThrownBy (() -> new ShowheroesBidder ("invalid_url" , jacksonMapper ));
73+ assertThatIllegalArgumentException ().isThrownBy (() -> new ShowheroesBidder ("invalid_url" ,
74+ currencyConversionService , prebidVersionProvider , jacksonMapper ));
4675 }
4776
4877 @ Test
@@ -74,26 +103,39 @@ public void makeHttpRequestsShouldReturnErrorWhenUnitIdIsEmpty() {
74103 // then
75104 assertThat (result .getErrors ()).hasSize (1 )
76105 .extracting (BidderError ::getMessage )
77- .containsExactly ("unitId parameter is required" );
106+ .containsExactly ("unitId is required" );
78107 assertThat (result .getValue ()).isEmpty ();
79108 }
80109
81110 @ Test
82- public void makeHttpRequestsShouldReturnErrorWhenSitePageAndAppBundleAreEmpty () {
111+ public void makeHttpRequestsShouldReturnErrorWhenSitePageIsEmpty () {
83112 // given
84113 final BidRequest bidRequest = BidRequest .builder ()
85114 .imp (singletonList (givenImp (identity ())))
86- .site (Site .builder ().page ("" ).build ())
87- .app (App .builder ().bundle ("" ).build ())
115+ .site (Site .builder ().build ())
88116 .build ();
89117
90118 // when
91119 final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
92120
93121 // then
94- assertThat (result .getErrors ()).hasSize (1 )
95- .extracting (BidderError ::getMessage )
96- .containsExactly ("site.page or app.bundle is required" );
122+ assertThat (result .getErrors ()).hasSize (1 );
123+ assertThat (result .getValue ()).isEmpty ();
124+ }
125+
126+ @ Test
127+ public void makeHttpRequestsShouldReturnErrorWhenAppBundleIsEmpty () {
128+ // given
129+ final BidRequest bidRequest = BidRequest .builder ()
130+ .imp (singletonList (givenImp (identity ())))
131+ .app (App .builder ().build ())
132+ .build ();
133+
134+ // when
135+ final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
136+
137+ // then
138+ assertThat (result .getErrors ()).hasSize (1 );
97139 assertThat (result .getValue ()).isEmpty ();
98140 }
99141
@@ -112,19 +154,68 @@ public void makeHttpRequestsShouldCreateCorrectURL() {
112154 }
113155
114156 @ Test
115- public void makeHttpRequestsShouldConvertCurrencyFromUsdToEur () {
116- // given
157+ public void makeHttpRequestsShouldReturnPbsVersion () {
117158 final BidRequest bidRequest = givenBidRequest (identity ());
118159
119160 // when
120161 final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
121162
122163 // then
123164 assertThat (result .getErrors ()).isEmpty ();
124- assertThat (result .getValue ()).hasSize (1 );
165+ assertThat (result .getValue ())
166+ .extracting (HttpRequest ::getPayload )
167+ .extracting (BidRequest ::getSource )
168+ .extracting (Source ::getExt )
169+ .extracting (ext -> ext .getProperty ("pbs" ))
170+ .containsExactly (mapper .createObjectNode ()
171+ .put ("pbsv" , "test_version" )
172+ .put ("pbsp" , "java" ));
173+ }
125174
126- final BidRequest outgoingRequest = result .getValue ().get (0 ).getPayload ();
127- assertThat (outgoingRequest .getCur ()).containsExactly ("EUR" );
175+ @ Test
176+ public void makeHttpRequestsShouldConvertCurrencyFromUsdToEur () {
177+ final BidRequest bidRequest = BidRequest .builder ()
178+ .imp (List .of (givenImp (impBuilder -> impBuilder .bidfloor (BigDecimal .ONE ).bidfloorcur ("USD" ))))
179+ .app (App .builder ().bundle ("test_bundle" ).build ())
180+ .build ();
181+
182+ given (currencyConversionService .convertCurrency (any (), any (), anyString (), anyString ()))
183+ .willReturn (BigDecimal .TEN );
184+
185+ // when
186+ final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
187+
188+ // then
189+ assertThat (result .getErrors ()).isEmpty ();
190+ verify (currencyConversionService ).convertCurrency (eq (BigDecimal .ONE ), any (), eq ("USD" ), eq ("EUR" ));
191+ assertThat (result .getValue ()).hasSize (1 ).doesNotContainNull ()
192+ .extracting (httpRequest -> mapper .readValue (httpRequest .getBody (), BidRequest .class ))
193+ .flatExtracting (BidRequest ::getImp ).doesNotContainNull ()
194+ .extracting (Imp ::getBidfloor , Imp ::getBidfloorcur )
195+ .containsOnly (tuple (BigDecimal .TEN , "EUR" ));
196+ }
197+
198+ @ Test
199+ public void makeHttpRequestsShouldNotConvertCurrencyEur () {
200+ final BidRequest bidRequest = BidRequest .builder ()
201+ .imp (List .of (givenImp (impBuilder -> impBuilder .bidfloor (BigDecimal .ONE ).bidfloorcur ("EUR" ))))
202+ .app (App .builder ().bundle ("test_bundle" ).build ())
203+ .build ();
204+
205+ given (currencyConversionService .convertCurrency (any (), any (), anyString (), anyString ()))
206+ .willReturn (BigDecimal .TEN );
207+
208+ // when
209+ final Result <List <HttpRequest <BidRequest >>> result = target .makeHttpRequests (bidRequest );
210+
211+ // then
212+ assertThat (result .getErrors ()).isEmpty ();
213+ verify (currencyConversionService , never ()).convertCurrency (any (), any (), anyString (), anyString ());
214+ assertThat (result .getValue ()).hasSize (1 ).doesNotContainNull ()
215+ .extracting (httpRequest -> mapper .readValue (httpRequest .getBody (), BidRequest .class ))
216+ .flatExtracting (BidRequest ::getImp ).doesNotContainNull ()
217+ .extracting (Imp ::getBidfloor , Imp ::getBidfloorcur )
218+ .containsOnly (tuple (BigDecimal .ONE , "EUR" ));
128219 }
129220
130221 @ Test
@@ -162,7 +253,8 @@ public void makeHttpRequestsShouldSetCorrectHeaders() {
162253 assertThat (result .getErrors ()).isEmpty ();
163254 assertThat (result .getValue ()).hasSize (1 );
164255
165- final Map <String , String > headers = result .getValue ().get (0 ).getHeaders ();
256+ final Map <String , String > headers = result .getValue ().get (0 ).getHeaders ().entries ().stream ()
257+ .collect (java .util .stream .Collectors .toMap (Map .Entry ::getKey , Map .Entry ::getValue ));
166258 assertThat (headers ).containsEntry ("Content-Type" , "application/json;charset=utf-8" )
167259 .containsEntry ("Accept" , "application/json" );
168260 }
0 commit comments