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
318
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 }