View Javadoc
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 }