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