View Javadoc

1   package com.atlassian.marketplace.client.model;
2   
3   import java.net.URI;
4   
5   import com.atlassian.fugue.Option;
6   import com.atlassian.marketplace.client.api.AddonCategoryId;
7   import com.atlassian.marketplace.client.api.AddonExternalLinkType;
8   import com.atlassian.marketplace.client.api.AddonVersionExternalLinkType;
9   import com.atlassian.marketplace.client.api.ArtifactId;
10  import com.atlassian.marketplace.client.api.ImageId;
11  import com.atlassian.marketplace.client.api.LicenseTypeId;
12  import com.atlassian.marketplace.client.api.VendorExternalLinkType;
13  
14  import com.google.common.collect.ImmutableList;
15  
16  import org.junit.Test;
17  
18  import static com.atlassian.fugue.Option.some;
19  import static com.atlassian.marketplace.client.TestObjects.VENDOR_ID;
20  import static com.atlassian.marketplace.client.api.AddonExternalLinkType.ISSUE_TRACKER;
21  import static com.atlassian.marketplace.client.api.ApplicationKey.JIRA;
22  import static com.atlassian.marketplace.client.model.HtmlString.html;
23  import static com.atlassian.marketplace.client.model.ModelBuilders.addon;
24  import static com.atlassian.marketplace.client.model.ModelBuilders.addonVersion;
25  import static com.atlassian.marketplace.client.model.ModelBuilders.address;
26  import static com.atlassian.marketplace.client.model.ModelBuilders.applicationVersion;
27  import static com.atlassian.marketplace.client.model.ModelBuilders.highlight;
28  import static com.atlassian.marketplace.client.model.ModelBuilders.links;
29  import static com.atlassian.marketplace.client.model.ModelBuilders.screenshot;
30  import static com.atlassian.marketplace.client.model.ModelBuilders.vendor;
31  import static com.atlassian.marketplace.client.model.ModelBuilders.versionCompatibilityForServer;
32  import static com.atlassian.marketplace.client.model.PaymentModel.FREE;
33  import static com.atlassian.marketplace.client.model.TestModelBuilders.DEFAULT_LOCAL_DATE;
34  import static org.hamcrest.MatcherAssert.assertThat;
35  import static org.hamcrest.Matchers.contains;
36  import static org.hamcrest.Matchers.equalTo;
37  
38  public class ModelBuildersTest
39  {
40      public static final ImageId DEFAULT_IMAGE = ImageId.fromUri(URI.create("/image"));
41      public static final URI TEST_URI = URI.create("xyz");
42      
43      private static ModelBuilders.AddonBuilder minimalAddon()
44      {
45          return addon().key("key").name("name").status(AddonStatus.PUBLIC).vendor(VENDOR_ID);
46      }
47      
48      private static ModelBuilders.AddonVersionBuilder minimalAddonVersion()
49      {
50          return addonVersion().buildNumber(1).paymentModel(PaymentModel.FREE)
51                  .releaseDate(DEFAULT_LOCAL_DATE)
52                  .status(AddonVersionStatus.PUBLIC);
53      }
54  
55      private static ModelBuilders.ApplicationVersionBuilder minimalApplicationVersion()
56      {
57          return applicationVersion().name("1.0").buildNumber(1).releaseDate(DEFAULT_LOCAL_DATE).status(ApplicationVersionStatus.PUBLISHED);
58      }
59  
60      private static ModelBuilders.VendorBuilder minimalVendor()
61      {
62          return vendor().name("name").email("email");
63      }
64      
65      // The following tests verify that the defaults provided by these builders don't
66      // violate any preconditions in the model object constructors which would throw an
67      // IllegalArgumentException or NullPointerException - and that the builders for objects
68      // we can send to the server do *not* provide defaults for required properties.
69  
70      @Test(expected = ModelBuilders.InvalidModelException.class)
71      public void addonRequiresKey() throws Exception
72      {
73          ModelBuilders.addon()
74              .name("name")
75              .status(AddonStatus.PUBLIC)
76              .vendor(VENDOR_ID)
77              .build();
78      }
79  
80      @Test(expected = ModelBuilders.InvalidModelException.class)
81      public void addonRequiresName() throws Exception
82      {
83          ModelBuilders.addon()
84              .key("key")
85              .status(AddonStatus.PUBLIC)
86              .vendor(VENDOR_ID)
87              .build();
88      }
89  
90      @Test(expected = ModelBuilders.InvalidModelException.class)
91      public void addonRequiresStatus() throws Exception
92      {
93          ModelBuilders.addon()
94              .key("key")
95              .name("name")
96              .vendor(VENDOR_ID)
97              .build();
98      }
99  
100     @Test(expected = ModelBuilders.InvalidModelException.class)
101     public void addonRequiresVendor() throws Exception
102     {
103         ModelBuilders.addon()
104             .key("key")
105             .name("name")
106             .status(AddonStatus.PUBLIC)
107             .build();
108     }
109     
110     @Test
111     public void canSetAddonBanner() throws Exception
112     {
113         Addon a = minimalAddon().banner(some(DEFAULT_IMAGE)).build();
114         assertThat(a.getLinks().getUri("banner"), equalTo(some(DEFAULT_IMAGE.getUri())));
115     }
116 
117     @Test
118     public void canSetAddonCategories() throws Exception
119     {
120         AddonCategoryId c1 = AddonCategoryId.fromUri(URI.create("/c1"));
121         AddonCategoryId c2 = AddonCategoryId.fromUri(URI.create("/c2"));
122         Addon a = minimalAddon().categories(ImmutableList.of(c1, c2)).build();
123         assertThat(a.getCategoryIds(), contains(c1, c2));
124     }
125     
126     @Test
127     public void canSetAddonEnableAtlassianAnswers() throws Exception
128     {
129         Addon a = minimalAddon().enableAtlassianAnswers(false).build();
130         assertThat(a.isEnableAtlassianAnswers(), equalTo(some(false)));
131     }
132     
133     @SuppressWarnings("deprecation")
134     @Test
135     public void canSetAddonExternalLinks() throws Exception
136     {
137         ImmutableList.Builder<URI> uris = ImmutableList.builder();
138         ImmutableList.Builder<AddonExternalLinkType> notAllowedTypes = ImmutableList.builder();
139         ModelBuilders.AddonBuilder ab = minimalAddon();
140         for (AddonExternalLinkType type: AddonExternalLinkType.values())
141         {
142             try
143             {
144                 URI uri = URI.create("/link-" + type.getKey());
145                 ab.externalLinkUri(type, some(uri));
146                 uris.add(uri);
147             }
148             catch (IllegalArgumentException e)
149             {
150                 notAllowedTypes.add(type);
151             }
152         }
153         Addon a = ab.build();
154         ImmutableList.Builder<URI> uris1 = ImmutableList.builder();
155         for (AddonExternalLinkType type: AddonExternalLinkType.values())
156         {
157             uris1.addAll(a.getExternalLinkUri(type));
158         }
159         assertThat(uris1.build(), equalTo(uris.build()));
160         assertThat(notAllowedTypes.build(),
161                 contains(AddonExternalLinkType.BUILDS, AddonExternalLinkType.SOURCE, AddonExternalLinkType.WIKI));
162     }
163 
164     @Test
165     public void canSetAddonKey() throws Exception
166     {
167         Addon a = minimalAddon().key("abc").build();
168         assertThat(a.getKey(), equalTo("abc"));
169     }
170     
171     @Test
172     public void canSetAddonLinkForIssueTracker() throws Exception
173     {
174         Addon a = minimalAddon().externalLinkUri(ISSUE_TRACKER, some(TEST_URI)).build();
175         assertThat(a.getExternalLinkUri(ISSUE_TRACKER), equalTo(some(TEST_URI)));
176     }
177     
178     @Test
179     public void canSetAddonLogo() throws Exception
180     {
181         Addon a = minimalAddon().logo(some(DEFAULT_IMAGE)).build();
182         assertThat(a.getLinks().getUri("logo"), equalTo(some(DEFAULT_IMAGE.getUri())));
183     }
184 
185     @Test
186     public void canSetAddonName() throws Exception
187     {
188         Addon a = minimalAddon().name("abc").build();
189         assertThat(a.getName(), equalTo("abc"));
190     }
191 
192     @Test
193     public void canSetAddonStatus() throws Exception
194     {
195         Addon a = minimalAddon().status(AddonStatus.PUBLIC).build();
196         assertThat(a.getStatus(), equalTo(AddonStatus.PUBLIC));
197     }
198     
199     @Test
200     public void canSetAddonSummary() throws Exception
201     {
202         Addon a = minimalAddon().summary(some("abc")).build();
203         assertThat(a.getSummary(), equalTo(some("abc")));
204     }
205     
206     @Test
207     public void canSetAddonVersion() throws Exception
208     {
209         AddonVersion v = minimalAddonVersion().build();
210         Addon a = minimalAddon().version(some(v)).build();
211         assertThat(a.getVersion(), equalTo(some(v)));
212     }
213     
214     @Test(expected = ModelBuilders.InvalidModelException.class)
215     public void addonVersionRequiresBuildNumber() throws Exception
216     {
217         addonVersion().paymentModel(FREE).releaseDate(DEFAULT_LOCAL_DATE).status(AddonVersionStatus.PRIVATE).build();
218     }
219 
220     @Test(expected = ModelBuilders.InvalidModelException.class)
221     public void addonVersionRequiresPaymentModel() throws Exception
222     {
223         addonVersion().buildNumber(1).releaseDate(DEFAULT_LOCAL_DATE).status(AddonVersionStatus.PRIVATE).build();
224     }
225 
226     @Test(expected = ModelBuilders.InvalidModelException.class)
227     public void addonVersionRequiresReleaseDate() throws Exception
228     {
229         addonVersion().buildNumber(1).paymentModel(FREE).status(AddonVersionStatus.PRIVATE).build();
230     }
231 
232     @Test(expected = ModelBuilders.InvalidModelException.class)
233     public void addonVersionRequiresStatus() throws Exception
234     {
235         addonVersion().buildNumber(1).paymentModel(FREE).releaseDate(DEFAULT_LOCAL_DATE).build();
236     }
237 
238     @Test
239     public void canSetAddonVersionArtifact() throws Exception
240     {
241         AddonVersion v = minimalAddonVersion().artifact(some(ArtifactId.fromUri(TEST_URI))).build();
242         assertThat(v.getLinks().getUri("artifact"), equalTo(some(TEST_URI)));
243     }
244     
245     @Test
246     public void canSetAddonVersionBeta() throws Exception
247     {
248         assertThat(minimalAddonVersion().beta(true).build().isBeta(), equalTo(true));
249     }
250     
251     @Test
252     public void canSetAddonVersionBuildNumber() throws Exception
253     {
254         AddonVersion v = minimalAddonVersion().buildNumber(1000).build();
255         assertThat(v.getBuildNumber(), equalTo(1000));
256     }
257 
258     @Test
259     public void canSetAddonVersionCompatibilities() throws Exception
260     {
261         VersionCompatibility vc = versionCompatibilityForServer(JIRA, 1, 2);
262         AddonVersion v = minimalAddonVersion().compatibilities(ImmutableList.of(vc)).build();
263         assertThat(v.getCompatibilities(), contains(vc));
264     }
265     
266     @Test
267     public void addonVersionCompatibilitiesCompletelyOmittedIfNotSet() throws Exception
268     {
269         AddonVersion v = minimalAddonVersion().build();
270         assertThat(v.getCompatibilitiesIfSpecified(), equalTo(Option.<Iterable<VersionCompatibility>>none()));
271     }
272     
273     @Test
274     public void canSetAddonVersionDeployable() throws Exception
275     {
276         AddonVersion v = minimalAddonVersion().deployable(true).build();
277         assertThat(v.isDeployable(), equalTo(true));
278     }
279 
280     @SuppressWarnings("deprecation")
281     @Test
282     public void canSetAddonVersionExternalLinks() throws Exception
283     {
284         ImmutableList.Builder<URI> uris = ImmutableList.builder();
285         ImmutableList.Builder<AddonVersionExternalLinkType> notAllowedTypes = ImmutableList.builder();
286         ModelBuilders.AddonVersionBuilder vb = minimalAddonVersion();
287         for (AddonVersionExternalLinkType type: AddonVersionExternalLinkType.values())
288         {
289             try
290             {
291                 URI uri = URI.create("/link-" + type.getKey());
292                 vb.externalLinkUri(type, some(uri));
293                 uris.add(uri);
294             }
295             catch (IllegalArgumentException e)
296             {
297                 notAllowedTypes.add(type);
298             }
299         }
300         AddonVersion v = vb.build();
301         ImmutableList.Builder<URI> uris1 = ImmutableList.builder();
302         for (AddonVersionExternalLinkType type: AddonVersionExternalLinkType.values())
303         {
304             uris1.addAll(v.getExternalLinkUri(type));
305         }
306         assertThat(uris1.build(), equalTo(uris.build()));
307         assertThat(notAllowedTypes.build(),
308                 contains(AddonVersionExternalLinkType.DONATE, AddonVersionExternalLinkType.EVALUATION_LICENSE,
309                         AddonVersionExternalLinkType.JAVADOC, AddonVersionExternalLinkType.SOURCE));
310     }
311 
312     @Test
313     public void canSetAddonVersionHighlights() throws Exception
314     {
315         Highlight h1 = highlight().fullImage(DEFAULT_IMAGE).thumbnailImage(DEFAULT_IMAGE).title("h1").body(html("b1")).build();
316         Highlight h2 = highlight().fullImage(DEFAULT_IMAGE).thumbnailImage(DEFAULT_IMAGE).title("h2").body(html("b2")).build();
317         AddonVersion v = minimalAddonVersion().highlights(ImmutableList.of(h1, h2)).build();
318         assertThat(v.getHighlights(), contains(h1, h2));
319     }
320 
321     @Test
322     public void addonVersionHighlightsCompletelyOmittedIfNotSet() throws Exception
323     {
324         AddonVersion v = minimalAddonVersion().build();
325         assertThat(v.getHighlightsIfSpecified(), equalTo(Option.<Iterable<Highlight>>none()));
326     }
327 
328     @Test
329     public void canSetAddonVersionLicenseTypeId() throws Exception
330     {
331         AddonVersion v = minimalAddonVersion().licenseTypeId(some(LicenseTypeId.fromUri(TEST_URI))).build();
332         assertThat(v.getLicenseTypeId(), equalTo(some(LicenseTypeId.fromUri(TEST_URI))));
333     }
334     
335     @Test
336     public void canSetAddonVersionMoreDetails() throws Exception
337     {
338         AddonVersion v = minimalAddonVersion().moreDetails(some(html("x"))).build();
339         assertThat(v.getMoreDetails(), equalTo(some(html("x"))));
340     }
341     
342     @Test
343     public void canSetAddonVersionName() throws Exception
344     {
345         AddonVersion v = minimalAddonVersion().name("1.0").build();
346         assertThat(v.getName(), equalTo(some("1.0")));
347     }
348 
349     @Test
350     public void canSetAddonVersionReleaseDate() throws Exception
351     {
352         assertThat(minimalAddonVersion().releaseDate(DEFAULT_LOCAL_DATE).build().getReleaseDate(), equalTo(DEFAULT_LOCAL_DATE));
353     }
354 
355     @Test
356     public void canSetAddonVersionReleasedBy() throws Exception
357     {
358         assertThat(minimalAddonVersion().releasedBy(some("x")).build().getReleasedBy(),
359                 equalTo(some("x")));
360     }
361     
362     @Test
363     public void canSetAddonVersionReleaseNotes() throws Exception
364     {
365         AddonVersion v = minimalAddonVersion().releaseNotes(some(html("x"))).build();
366         assertThat(v.getReleaseNotes(), equalTo(some(html("x"))));
367     }
368 
369     @Test
370     public void canSetAddonVersionReleaseSummary() throws Exception
371     {
372         AddonVersion v = minimalAddonVersion().releaseSummary(some("x")).build();
373         assertThat(v.getReleaseSummary(), equalTo(some("x")));
374     }
375 
376     @Test
377     public void canSetAddonVersionScreenshots() throws Exception
378     {
379         Screenshot s1 = screenshot().image(DEFAULT_IMAGE).build();
380         Screenshot s2 = screenshot().image(DEFAULT_IMAGE).build();
381         AddonVersion v = minimalAddonVersion().screenshots(ImmutableList.of(s1, s2)).build();
382         assertThat(v.getScreenshots(), contains(s1, s2));
383     }
384 
385     @Test
386     public void addonVersionScreenshotsCompletelyOmittedIfNotSet() throws Exception
387     {
388         AddonVersion v = minimalAddonVersion().build();
389         assertThat(v.getScreenshotsIfSpecified(), equalTo(Option.<Iterable<Screenshot>>none()));
390     }
391     
392     @Test
393     public void canSetAddonVersionStatus() throws Exception
394     {
395         AddonVersion v = minimalAddonVersion().status(AddonVersionStatus.PUBLIC).build();
396         assertThat(v.getStatus(), equalTo(AddonVersionStatus.PUBLIC));
397     }
398 
399     @Test
400     public void canSetAddonVersionSupported() throws Exception
401     {
402         assertThat(minimalAddonVersion().supported(true).build().isSupported(), equalTo(true));
403     }
404     
405     @Test
406     public void canSetAddonVersionYoutubeId() throws Exception
407     {
408         AddonVersion v = minimalAddonVersion().youtubeId(some("x")).build();
409         assertThat(v.getYoutubeId(), equalTo(some("x")));
410     }
411     
412     @Test(expected = ModelBuilders.InvalidModelException.class)
413     public void applicationVersionRequiresName() throws Exception
414     {
415         applicationVersion().buildNumber(1).releaseDate(DEFAULT_LOCAL_DATE).status(ApplicationVersionStatus.PUBLISHED).build();
416     }
417 
418     @Test(expected = ModelBuilders.InvalidModelException.class)
419     public void applicationVersionRequiresBuildNumber() throws Exception
420     {
421         applicationVersion().name("1.0").releaseDate(DEFAULT_LOCAL_DATE).status(ApplicationVersionStatus.PUBLISHED).build();
422     }
423 
424     @Test(expected = ModelBuilders.InvalidModelException.class)
425     public void applicationVersionRequiresReleaseDate() throws Exception
426     {
427         applicationVersion().name("1.0").buildNumber(1).status(ApplicationVersionStatus.PUBLISHED).build();
428     }
429 
430     @Test(expected = ModelBuilders.InvalidModelException.class)
431     public void applicationVersionRequiresStatus() throws Exception
432     {
433         applicationVersion().name("1.0").buildNumber(1).releaseDate(DEFAULT_LOCAL_DATE).build();
434     }
435     
436     @Test
437     public void canSetApplicationVersionBuildNumber() throws Exception
438     {
439         assertThat(minimalApplicationVersion().buildNumber(2).build().getBuildNumber(), equalTo(2));
440     }
441 
442     @Test
443     public void canSetApplicationVersionName() throws Exception
444     {
445         assertThat(minimalApplicationVersion().name("x").build().getName(), equalTo("x"));
446     }
447 
448     @Test
449     public void canSetApplicationVersionReleaseDate() throws Exception
450     {
451         assertThat(minimalApplicationVersion().releaseDate(DEFAULT_LOCAL_DATE).build().getReleaseDate(), equalTo(DEFAULT_LOCAL_DATE));
452     }
453 
454     @Test
455     public void canSetApplicationVersionStatus() throws Exception
456     {
457         assertThat(minimalApplicationVersion().status(ApplicationVersionStatus.PUBLISHED).build().getStatus(),
458                 equalTo(ApplicationVersionStatus.PUBLISHED));
459     }
460 
461     @Test(expected = ModelBuilders.InvalidModelException.class)
462     public void highlightRequiresTitle() throws Exception
463     {
464         highlight().body(html("b")).fullImage(DEFAULT_IMAGE).thumbnailImage(DEFAULT_IMAGE).build();
465     }
466 
467     @Test(expected = ModelBuilders.InvalidModelException.class)
468     public void highlightRequiresBody() throws Exception
469     {
470         highlight().title("t").fullImage(DEFAULT_IMAGE).thumbnailImage(DEFAULT_IMAGE).build();
471     }
472 
473     @Test(expected = ModelBuilders.InvalidModelException.class)
474     public void highlightRequiresFullImage() throws Exception
475     {
476         highlight().title("t").body(html("b")).thumbnailImage(DEFAULT_IMAGE).build();
477     }
478 
479     @Test(expected = ModelBuilders.InvalidModelException.class)
480     public void highlightRequiresThumbnailImage() throws Exception
481     {
482         highlight().title("t").body(html("b")).fullImage(DEFAULT_IMAGE).build();
483     }
484 
485     @Test
486     public void canBuildHighlightWithAllRequiredProperties() throws Exception
487     {
488         highlight().title("t").body(html("b")).fullImage(DEFAULT_IMAGE).thumbnailImage(DEFAULT_IMAGE).build();
489     }
490 
491     @Test
492     public void canBuildLinksWithDefaults()
493     {
494         assertThat(links().build().getItems().size(), equalTo(0));
495     }
496 
497     @Test(expected = ModelBuilders.InvalidModelException.class)
498     public void screenshotRequiresImage() throws Exception
499     {
500         screenshot().build();
501     }
502     
503     @Test
504     public void canBuildScreenshotWithAllRequiredProperties() throws Exception
505     {
506         screenshot().image(DEFAULT_IMAGE).build();
507     }
508 
509     @Test(expected = ModelBuilders.InvalidModelException.class)
510     public void vendorRequiresEmail() throws Exception
511     {
512         vendor().name("name").build();
513     }
514     
515     @Test(expected = ModelBuilders.InvalidModelException.class)
516     public void vendorRequiresName() throws Exception
517     {
518         vendor().email("test@example.com").build();
519     }
520 
521     @Test
522     public void canSetVendorAddress() throws Exception
523     {
524         Address a = address().line1("x").build();
525         assertThat(minimalVendor().address(some(a)).build().getAddress(), equalTo(some(a)));
526     }
527     
528     @Test
529     public void canSetVendorDescription() throws Exception
530     {
531         assertThat(minimalVendor().description(some("x")).build().getDescription(), equalTo(some("x")));
532     }
533 
534     @Test
535     public void canSetVendorEmail() throws Exception
536     {
537         assertThat(minimalVendor().email("x").build().getEmail(), equalTo("x"));
538     }
539 
540     @Test
541     public void canSetVendorLogo() throws Exception
542     {
543         assertThat(minimalVendor().logo(some(DEFAULT_IMAGE)).build().getLinks().getUri("logo"), equalTo(some(DEFAULT_IMAGE.getUri())));
544     }
545 
546     @Test
547     public void canSetVendorName() throws Exception
548     {
549         assertThat(minimalVendor().name("x").build().getName(), equalTo("x"));
550     }
551 
552     @Test
553     public void canSetVendorOtherContactDetails() throws Exception
554     {
555         assertThat(minimalVendor().otherContactDetails(some("x")).build().getOtherContactDetails(), equalTo(some("x")));
556     }
557 
558     @Test
559     public void canSetVendorPhone() throws Exception
560     {
561         assertThat(minimalVendor().phone(some("x")).build().getPhone(), equalTo(some("x")));
562     }
563 
564     @Test
565     public void canSetVendorExternalLinks() throws Exception
566     {
567         ImmutableList.Builder<URI> uris = ImmutableList.builder();
568         ModelBuilders.VendorBuilder vb = minimalVendor();
569         for (VendorExternalLinkType type: VendorExternalLinkType.values())
570         {
571             URI uri = URI.create("/link-" + type.getKey());
572             vb.externalLinkUri(type, some(uri));
573             uris.add(uri);
574         }
575         Vendor v = vb.build();
576         ImmutableList.Builder<URI> uris1 = ImmutableList.builder();
577         for (VendorExternalLinkType type: VendorExternalLinkType.values())
578         {
579             uris1.addAll(v.getExternalLinkUri(type));
580         }
581         assertThat(uris1.build(), equalTo(uris.build()));
582     }
583 }