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
66
67
68
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 }