View Javadoc

1   package com.atlassian.marketplace.client.impl;
2   
3   import java.net.URI;
4   
5   import com.atlassian.fugue.Option;
6   import com.atlassian.marketplace.client.MpacException;
7   import com.atlassian.marketplace.client.api.AddonQuery;
8   import com.atlassian.marketplace.client.api.AddonQuery.View;
9   import com.atlassian.marketplace.client.api.Cost;
10  import com.atlassian.marketplace.client.api.HostingType;
11  import com.atlassian.marketplace.client.api.PageReader;
12  import com.atlassian.marketplace.client.api.PageReference;
13  import com.atlassian.marketplace.client.api.PricingType;
14  import com.atlassian.marketplace.client.api.QueryBounds;
15  import com.atlassian.marketplace.client.model.Addon;
16  import com.atlassian.marketplace.client.model.AddonPricing;
17  import com.atlassian.marketplace.client.model.AddonSummary;
18  import com.atlassian.marketplace.client.util.UriBuilder;
19  
20  import com.google.common.collect.ImmutableList;
21  
22  import org.junit.Test;
23  
24  import static com.atlassian.fugue.Option.some;
25  import static com.atlassian.marketplace.client.TestObjects.HOST_BASE;
26  import static com.atlassian.marketplace.client.TestObjects.LINK_NEXT_URI;
27  import static com.atlassian.marketplace.client.TestObjects.LINK_PREV_URI;
28  import static com.atlassian.marketplace.client.api.ApplicationKey.JIRA;
29  import static com.atlassian.marketplace.client.impl.ClientTester.FAKE_ADDONS_PATH;
30  import static com.atlassian.marketplace.client.model.TestModelBuilders.addon;
31  import static com.atlassian.marketplace.client.model.TestModelBuilders.addonPricing;
32  import static org.hamcrest.MatcherAssert.assertThat;
33  import static org.hamcrest.Matchers.contains;
34  import static org.hamcrest.Matchers.equalTo;
35  import static org.hamcrest.Matchers.not;
36  import static org.hamcrest.Matchers.nullValue;
37  import static org.hamcrest.Matchers.sameInstance;
38  import static org.mockito.Mockito.verify;
39  
40  public class AddonsImplTest extends AddonsImplTestBase<Addon>
41  {
42      @Test
43      public void addonsAccessorQueriesRootResource() throws Exception
44      {
45          tester.client.addons();
46          
47          verify(tester.httpTransport).get(tester.apiBase);
48      }
49      
50      @Test(expected=MpacException.class)
51      public void addonsAccessorThrowsExceptionIfRootResourceNotAvailable() throws Exception
52      {
53          tester.mockResourceError(tester.apiBase, 404);
54          tester.client.addons();
55      }
56  
57      @Test
58      public void addonsAccessorReturnsNonNullObject() throws Exception
59      {
60          assertThat(tester.client.addons(), not(nullValue()));
61      }
62  
63      @Test
64      public void getByKeyUsesAddonsResource() throws Exception
65      {
66          setupAddonByKeyResource(addonByKeyUri("x"));
67          tester.client.addons().getByKey("x", AddonQuery.any());
68          verify(tester.httpTransport).get(URI.create(HOST_BASE + FAKE_ADDONS_PATH + "?limit=0"));
69      }
70  
71      @Test
72      public void getByKeyUsesAddonByKeyResource() throws Exception
73      {
74          setupAddonByKeyResource(addonByKeyUri("x"));
75          assertThat(tester.client.addons().getByKey("x", AddonQuery.any()),
76                  contains(ADDON_REP));
77      }
78  
79      @Test
80      public void getByKeyPassesAppKeyInQueryString() throws Exception
81      {
82          setupAddonByKeyResource(addonByKeyUri("x").queryParam("application", "jira"));        
83          assertThat(tester.client.addons().getByKey("x", AddonQuery.builder().application(some(JIRA)).build()),
84                  contains(ADDON_REP));
85      }
86  
87      @Test
88      public void getByKeyPassesAccessTokenInQueryString() throws Exception
89      {
90          setupAddonByKeyResource(addonByKeyUri("x").queryParam("accessToken", "x"));        
91          assertThat(tester.client.addons().getByKey("x", AddonQuery.builder().accessToken(some("x")).build()),
92                  contains(ADDON_REP));
93      }
94  
95      @Test
96      public void findUsesAddonsResource() throws Exception
97      {
98          setupAddonsResource(addonsApi());
99          
100         assertThat(tester.client.addons().find(AddonQuery.builder().build()), contains(ADDON_SUMMARY_REP));
101     }
102 
103     @Test
104     public void findReturnsPageWithCorrectSize() throws Exception
105     {
106         setupAddonsResource(addonsApi());
107         
108         assertThat(tester.client.addons().find(AddonQuery.builder().build()).size(), equalTo(1));
109     }
110 
111     @Test
112     public void findReturnsPageWithCorrectTotalSize() throws Exception
113     {
114         setupAddonsResource(addonsApi());
115         
116         assertThat(tester.client.addons().find(AddonQuery.builder().build()).totalSize(), equalTo(2));
117     }
118 
119     @Test
120     public void findReturnsPageWithReference() throws Exception
121     {
122         QueryBounds b = QueryBounds.limit(some(5));
123         UriBuilder uri = addonsApi().queryParam("limit", 5);
124         setupAddonsResource(uri, ADDONS_REP);
125         
126         assertThat(tester.client.addons().find(AddonQuery.builder().bounds(b).build()).getReference(),
127                    equalTo(some(new PageReference<AddonSummary>(uri.build(), b, PageReader.<AddonSummary>stub()))));
128     }
129     
130     @Test
131     public void findReturnsPageWithNoNextReferenceIfNoNextLink() throws Exception
132     {
133         setupAddonsResource(addonsApi(), ADDONS_REP_WITH_PREV);
134         
135         assertThat(tester.client.addons().find(AddonQuery.builder().build()).getNext(),
136                    equalTo(Option.<PageReference<AddonSummary>>none()));
137     }
138 
139     @Test
140     public void findReturnsPageWithNextReferenceIfNextLink() throws Exception
141     {
142         QueryBounds b = QueryBounds.limit(some(5));
143         UriBuilder uri = addonsApi().queryParam("limit", 5);
144         setupAddonsResource(uri, ADDONS_REP_WITH_NEXT);
145         
146         assertThat(tester.client.addons().find(AddonQuery.builder().bounds(b).build()).getNext(),
147                    equalTo(some(new PageReference<AddonSummary>(LINK_NEXT_URI, b.withOffset(5), PageReader.<AddonSummary>stub()))));
148     }
149 
150     @Test
151     public void findReturnsPageWithNextReferenceUsingSizeAsLimitIfLimitOmitted() throws Exception
152     {
153         setupAddonsResource(addonsApi(), ADDONS_REP_WITH_NEXT);
154         
155         assertThat(tester.client.addons().find(AddonQuery.builder().build()).getNext(),
156                    equalTo(some(new PageReference<AddonSummary>(LINK_NEXT_URI, QueryBounds.offset(1).withLimit(some(1)),
157                        PageReader.<AddonSummary>stub()))));
158     }
159 
160     @Test
161     public void findReturnsPageWithNoPrevReferenceIfNoPrevLink() throws Exception
162     {
163         setupAddonsResource(addonsApi(), ADDONS_REP_WITH_NEXT);
164         
165         assertThat(tester.client.addons().find(AddonQuery.builder().build()).getPrevious(),
166                    equalTo(Option.<PageReference<AddonSummary>>none()));
167     }
168 
169     @Test
170     public void findReturnsPageWithPrevReferenceIfPrevLink() throws Exception
171     {
172         QueryBounds b = QueryBounds.offset(8).withLimit(some(5));
173         UriBuilder uri = addonsApi().queryParam("offset", 8).queryParam("limit", 5);
174         setupAddonsResource(uri, ADDONS_REP_WITH_PREV);
175         
176         assertThat(tester.client.addons().find(AddonQuery.builder().bounds(b).build()).getPrevious(),
177                    equalTo(some(new PageReference<AddonSummary>(LINK_PREV_URI, b.withOffset(3), PageReader.<AddonSummary>stub()))));
178     }
179 
180     private void testFindParams(UriBuilder uriWithParams, AddonQuery.Builder queryWithParams) throws Exception
181     {
182         setupAddonsResource(uriWithParams);
183         assertThat(tester.client.addons().find(queryWithParams.build()), contains(ADDON_SUMMARY_REP));
184     }
185 
186     @Test
187     public void findPassesOffsetInQueryString() throws Exception
188     {
189         testFindParams(addonsApi().queryParam("offset", "5"), AddonQuery.builder().bounds(QueryBounds.offset(5)));
190     }
191     
192     @Test
193     public void findPassesLimitInQueryString() throws Exception
194     {
195         testFindParams(addonsApi().queryParam("limit", "10"), AddonQuery.builder().bounds(QueryBounds.limit(some(10))));
196     }
197 
198     @Test
199     public void findPassesAppKeyInQueryString() throws Exception
200     {
201         testFindParams(addonsApi().queryParam("application", "jira"), AddonQuery.builder().application(some(JIRA)));
202     }
203 
204     @Test
205     public void findPassesAppBuildNumberInQueryString() throws Exception
206     {
207         testFindParams(addonsApi().queryParam("application", "jira").queryParam("applicationBuild", "123"),
208                 AddonQuery.builder().application(some(JIRA)).appBuildNumber(some(123)));
209     }
210 
211     @Test
212     public void findPassesCategoriesInQueryString() throws Exception
213     {
214         testFindParams(addonsApi().queryParam("category", "foo", "bar"),
215                 AddonQuery.builder().categoryNames(ImmutableList.of("foo", "bar")));
216     }
217     
218     @Test
219     public void findPassesCostInQueryString() throws Exception
220     {
221         testFindParams(addonsApi().queryParam("cost", "paid"),
222                 AddonQuery.builder().cost(some(Cost.ALL_PAID)));
223     }
224 
225     @Test
226     public void findPassesViewFilterInQueryString() throws Exception
227     {
228         testFindParams(addonsApi().queryParam("filter", "top-grossing"), AddonQuery.builder().view(some(View.TOP_GROSSING)));
229     }
230     
231     @Test
232     public void findPassesVersionFlagInQueryString() throws Exception
233     {
234         testFindParams(addonsApi().queryParam("withVersion", "true"), AddonQuery.builder().withVersion(true));
235     }
236 
237     @Test
238     public void findPassesForThisUserFlagInQueryString() throws Exception
239     {
240         testFindParams(addonsApi().queryParam("forThisUser", "true"), AddonQuery.builder().forThisUserOnly(true));
241     }
242     
243     @Test
244     public void findPassesHostingInQueryString() throws Exception
245     {
246         testFindParams(addonsApi().queryParam("hosting", "cloud"), AddonQuery.builder().hosting(some(HostingType.CLOUD)));
247     }
248 
249     @Test
250     public void findPassesIncludeHiddenInQueryString() throws Exception
251     {
252         testFindParams(addonsApi().queryParam("includeHidden", "all"), AddonQuery.builder().includeHidden(some(AddonQuery.IncludeHiddenType.ALL)));
253     }
254     
255     @Test
256     public void findPassesIncludePrivateFlagInQueryString() throws Exception
257     {
258         testFindParams(addonsApi().queryParam("includePrivate", "true"), AddonQuery.builder().includePrivate(true));
259     }
260     
261     @Test
262     public void getPricingUsesPricingUri() throws Exception
263     {
264         URI pricingUri = tester.apiBase.resolve(
265             FAKE_PRICING_TEMPLATE.replace("{cloudOrServer}", "server").replace("{liveOrPending}", "live"));
266         AddonPricing pricing = addonPricing().build();
267         setupAddonByKeyResource(addonByKeyUri("x"));
268         tester.mockResource(pricingUri, pricing);
269         assertThat(tester.client.addons().getPricing("x", PricingType.SERVER), contains(sameInstance(pricing)));
270     }
271     
272     @Test
273     public void findBannersUsesAddonsResource() throws Exception
274     {
275         setupAddonBannersResource(bannersApi());
276         
277         assertThat(tester.client.addons().findBanners(AddonQuery.any()), contains(ADDON_REF_REP));
278     }
279 
280     @Test
281     public void findBannersReturnsPageWithCorrectSize() throws Exception
282     {
283         setupAddonBannersResource(bannersApi());
284         
285         assertThat(tester.client.addons().findBanners(AddonQuery.any()).size(), equalTo(1));
286     }
287 
288     @Test
289     public void findBannersReturnsPageWithCorrectTotalSize() throws Exception
290     {
291         setupAddonBannersResource(bannersApi());
292         
293         assertThat(tester.client.addons().findBanners(AddonQuery.any()).totalSize(), equalTo(2));
294     }
295 
296     @Test
297     public void findRecommendationsReturnsAddons() throws Exception
298     {
299         setupRecommendationsResource("x", recommendationsUri());
300         
301         assertThat(tester.client.addons().findRecommendations("x", AddonQuery.any()),
302             contains(ADDON_REF_REP));
303     }
304 
305     @Test
306     public void findRecommendationsReturnsPageWithCorrectTotalSize() throws Exception
307     {
308         setupRecommendationsResource("x", recommendationsUri());
309         
310         assertThat(tester.client.addons().findRecommendations("x", AddonQuery.any()).totalSize(),
311             equalTo(2));
312     }
313 
314     @Test
315     public void findRecommendationsPassesQueryParameters() throws Exception
316     {
317         // Since we use the same code for encoding all AddonQuery parameters in general, we'll just verify that this
318         // resource can pass any of those parameters.
319         setupRecommendationsResource("x", recommendationsUri().queryParam("application", "jira"));
320         
321         assertThat(tester.client.addons().findRecommendations("x", AddonQuery.builder().application(some(JIRA)).build()),
322             contains(ADDON_REF_REP));
323     }
324     
325     @Test
326     public void claimAccessTokenReturnsTrueIfPostIsSuccessful() throws Exception
327     {
328         setupClaimTokenResource("x", "t", 204);
329         
330         assertThat(tester.client.addons().claimAccessToken("x", "t"), equalTo(true));
331     }
332 
333     @Test
334     public void claimAccessTokenReturnsFalseIfPostReturns400() throws Exception
335     {
336         setupClaimTokenResource("x", "t", 400);
337         
338         assertThat(tester.client.addons().claimAccessToken("x", "t"), equalTo(false));
339     }
340 
341     @Test
342     public void claimAccessTokenReturnsFalseIfPostReturns403() throws Exception
343     {
344         setupClaimTokenResource("x", "t", 403);
345         
346         assertThat(tester.client.addons().claimAccessToken("x", "t"), equalTo(false));
347     }
348 
349     @Test
350     public void claimAccessTokenReturnsFalseIfPostReturns404() throws Exception
351     {
352         setupClaimTokenResource("x", "t", 404);
353         
354         assertThat(tester.client.addons().claimAccessToken("x", "t"), equalTo(false));
355     }
356 
357     @Test(expected = MpacException.ServerError.class)
358     public void claimAccessTokenThrowsExceptionIfPostReturns500() throws Exception
359     {
360         setupClaimTokenResource("x", "t", 500);
361         tester.client.addons().claimAccessToken("x", "t");
362     }
363 
364     @Override
365     protected URI getCollectionUri()
366     {
367         return addonsApi().build();
368     }
369     
370     @Override
371     protected Addon makeEntityToCreate()
372     {
373         return addon().build();
374     }
375     
376     @Override
377     protected Addon makeEntityFromServer()
378     {
379         return addon().links(ADDON_LINKS).build();
380     }
381     
382     @Override
383     protected Addon makeEntityWithUpdates(Addon from)
384     {
385         return addon(from).build();
386     }
387     
388     @Override
389     protected Addon createEntity(Addon entity) throws MpacException
390     {
391         return tester.client.addons().createAddon(entity);
392     }
393     
394     @Override
395     protected Addon updateEntity(Addon original, Addon updated) throws MpacException
396     {
397         return tester.client.addons().updateAddon(original, updated);
398     }
399     
400     @Override
401     protected URI transformEntityUriAfterCreate(URI uri)
402     {
403         return UriBuilder.fromUri(uri).queryParam("withVersion", true).build();
404     }
405 }