1 package com.atlassian.plugin.util;
2
3 import com.atlassian.fugue.Option;
4 import com.atlassian.plugin.InstallationMode;
5 import com.google.common.base.Function;
6 import com.google.common.collect.Iterables;
7 import org.dom4j.Element;
8 import org.junit.Test;
9 import org.junit.runner.RunWith;
10 import org.mockito.Mock;
11 import org.mockito.runners.MockitoJUnitRunner;
12
13 import java.util.List;
14
15 import static com.google.common.collect.Iterables.transform;
16 import static com.google.common.collect.Lists.newArrayList;
17 import static org.junit.Assert.assertEquals;
18 import static org.junit.Assert.assertTrue;
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.when;
21
22 @RunWith(MockitoJUnitRunner.class)
23 public final class TestModuleRestricts {
24 @Mock
25 private Element moduleElement;
26
27 @Test
28 public void parseModuleWithNoRestrictInformation() {
29 final ModuleRestricts restricts = ModuleRestricts.parse(moduleElement);
30 assertTrue(Iterables.isEmpty(restricts.restricts));
31 }
32
33 @Test
34 public void parseModuleWithApplicationAsAttribute() {
35 when(moduleElement.attributeValue("application")).thenReturn("my-app");
36 final ModuleRestricts restricts = ModuleRestricts.parse(moduleElement);
37
38 assertEquals(1, Iterables.size(restricts.restricts));
39 assertEquals("my-app", Iterables.get(restricts.restricts, 0).application);
40 }
41
42 @Test
43 public void parseModuleWithApplicationAsRestrictElement() {
44 final List<Element> restrictElements = mockRestrictElements("my-app");
45 when(moduleElement.elements("restrict")).thenReturn(restrictElements);
46
47
48 final ModuleRestricts restricts = ModuleRestricts.parse(moduleElement);
49
50 assertEquals(restrictElements.size(), Iterables.size(restricts.restricts));
51 assertEquals("my-app", Iterables.get(restricts.restricts, 0).application);
52 }
53
54 @Test
55 public void parseModuleWithMultipleApplicationAsRestrictElement() {
56 final List<Element> restrictElements = mockRestrictElements("my-app", "my-app2");
57 when(moduleElement.elements("restrict")).thenReturn(restrictElements);
58
59 final ModuleRestricts restricts = ModuleRestricts.parse(moduleElement);
60
61 assertEquals(restrictElements.size(), Iterables.size(restricts.restricts));
62 assertEquals("my-app", Iterables.get(restricts.restricts, 0).application);
63 assertEquals(Option.<InstallationMode>none(), Iterables.get(restricts.restricts, 0).mode);
64 assertEquals("my-app2", Iterables.get(restricts.restricts, 1).application);
65 assertEquals(Option.<InstallationMode>none(), Iterables.get(restricts.restricts, 1).mode);
66 }
67
68 @Test
69 public void parseModuleWithApplicationAsRestrictElementWithInstallationModeAttribute() {
70 final Element restrictElement = mockRestrictElement("my-app");
71 when(restrictElement.attributeValue("mode")).thenReturn("local");
72 final List<Element> restrictElements = newArrayList(restrictElement);
73
74 when(moduleElement.elements("restrict")).thenReturn(restrictElements);
75
76 final ModuleRestricts restricts = ModuleRestricts.parse(moduleElement);
77
78 assertEquals(restrictElements.size(), Iterables.size(restricts.restricts));
79 assertEquals("my-app", Iterables.get(restricts.restricts, 0).application);
80 assertEquals(Option.option(InstallationMode.LOCAL), Iterables.get(restricts.restricts, 0).mode);
81 }
82
83 @Test
84 public void parseModuleWithApplicationAsRestrictElementWithVersionRangeAttribute() {
85 final Element restrictElement = mockRestrictElement("my-app");
86 when(restrictElement.attributeValue("version")).thenReturn("[2.0]");
87 final List<Element> restrictElements = newArrayList(restrictElement);
88
89 when(moduleElement.elements("restrict")).thenReturn(restrictElements);
90
91 final ModuleRestricts restricts = ModuleRestricts.parse(moduleElement);
92
93 assertEquals(restrictElements.size(), Iterables.size(restricts.restricts));
94 assertEquals("my-app", Iterables.get(restricts.restricts, 0).application);
95 assertEquals(VersionRange.single("2.0"), Iterables.get(restricts.restricts, 0).version);
96 }
97
98 @Test
99 public void parseModuleWithApplicationAsRestrictElementWithVersionRangeElement() {
100 final Element restrictElement = mockRestrictElement("my-app");
101 final Element versionElement = mockVersionElement("[2.0]");
102 when(restrictElement.elements("version")).thenReturn(newArrayList(versionElement));
103 final List<Element> restrictElements = newArrayList(restrictElement);
104
105 when(moduleElement.elements("restrict")).thenReturn(restrictElements);
106
107 final ModuleRestricts restricts = ModuleRestricts.parse(moduleElement);
108
109 assertEquals(restrictElements.size(), Iterables.size(restricts.restricts));
110 assertEquals("my-app", Iterables.get(restricts.restricts, 0).application);
111 assertEquals(VersionRange.empty().or(VersionRange.single("2.0")), Iterables.get(restricts.restricts, 0).version);
112 }
113
114 @Test
115 public void parseModuleWithApplicationAsRestrictElementWithVersionRangeElements() {
116 final Element restrictElement = mockRestrictElement("my-app");
117 final Element versionElement = mockVersionElement("[2.0]");
118 final Element versionElement2 = mockVersionElement("[3.0,4.0)");
119 when(restrictElement.elements("version")).thenReturn(newArrayList(versionElement, versionElement2));
120 final List<Element> restrictElements = newArrayList(restrictElement);
121
122 when(moduleElement.elements("restrict")).thenReturn(restrictElements);
123
124 final ModuleRestricts restricts = ModuleRestricts.parse(moduleElement);
125
126 assertEquals(restrictElements.size(), Iterables.size(restricts.restricts));
127 assertEquals("my-app", Iterables.get(restricts.restricts, 0).application);
128 assertEquals(VersionRange.empty().or(VersionRange.single("2.0")).or(VersionRange.include("3.0").exclude("4.0")), Iterables.get(restricts.restricts, 0).version);
129 }
130
131 private List<Element> mockRestrictElements(String... appNames) {
132 return newArrayList(transform(newArrayList(appNames), new Function<String, Element>() {
133 @Override
134 public Element apply(String appName) {
135 return mockRestrictElement(appName);
136 }
137 }));
138 }
139
140 private Element mockRestrictElement(String appName) {
141 final Element restrictElement = mock(Element.class);
142 when(restrictElement.attributeValue("application")).thenReturn(appName);
143 return restrictElement;
144 }
145
146 private Element mockVersionElement(String range) {
147 final Element versionElement = mock(Element.class);
148 when(versionElement.getText()).thenReturn(range);
149 return versionElement;
150 }
151 }