1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.graph;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Set;
28
29 import org.apache.maven.MavenExecutionException;
30 import org.apache.maven.execution.MavenExecutionRequest;
31 import org.apache.maven.project.MavenProject;
32 import org.junit.jupiter.api.Test;
33 import org.junit.jupiter.api.io.TempDir;
34 import org.junit.jupiter.params.ParameterizedTest;
35 import org.junit.jupiter.params.provider.EmptySource;
36 import org.junit.jupiter.params.provider.ValueSource;
37
38 import static org.hamcrest.MatcherAssert.assertThat;
39 import static org.hamcrest.Matchers.contains;
40 import static org.hamcrest.Matchers.containsString;
41 import static org.hamcrest.Matchers.is;
42 import static org.hamcrest.Matchers.notNullValue;
43 import static org.hamcrest.Matchers.nullValue;
44 import static org.junit.jupiter.api.Assertions.assertThrows;
45 import static org.mockito.Mockito.mock;
46 import static org.mockito.Mockito.when;
47
48 class ProjectSelectorTest {
49 private final ProjectSelector sut = new ProjectSelector();
50 private final MavenExecutionRequest mavenExecutionRequest = mock(MavenExecutionRequest.class);
51
52 @Test
53 void getBaseDirectoryFromRequestWhenDirectoryIsNullReturnNull() {
54 when(mavenExecutionRequest.getBaseDirectory()).thenReturn(null);
55
56 final File baseDirectoryFromRequest = sut.getBaseDirectoryFromRequest(mavenExecutionRequest);
57
58 assertThat(baseDirectoryFromRequest, nullValue());
59 }
60
61 @Test
62 void getBaseDirectoryFromRequestWhenDirectoryIsValidReturnFile() {
63 when(mavenExecutionRequest.getBaseDirectory()).thenReturn("path/to/file");
64
65 final File baseDirectoryFromRequest = sut.getBaseDirectoryFromRequest(mavenExecutionRequest);
66
67 assertThat(baseDirectoryFromRequest, notNullValue());
68 assertThat(baseDirectoryFromRequest.getPath(), is(new File("path/to/file").getPath()));
69 }
70
71 @ParameterizedTest
72 @ValueSource(strings = {":wrong-selector", "wrong-selector"})
73 @EmptySource
74 void isMatchingProjectNoMatchOnSelectorReturnsFalse(String selector) {
75 final boolean result = sut.isMatchingProject(createMavenProject("maven-core"), selector, null);
76 assertThat(result, is(false));
77 }
78
79 @ParameterizedTest
80 @ValueSource(strings = {":maven-core", "org.apache.maven:maven-core"})
81 void isMatchingProjectMatchOnSelectorReturnsTrue(String selector) {
82 final boolean result = sut.isMatchingProject(createMavenProject("maven-core"), selector, null);
83 assertThat(result, is(true));
84 }
85
86 @Test
87 void isMatchingProjectMatchOnFileReturnsTrue() throws IOException {
88 final File tempFile = File.createTempFile("maven-core-unit-test-pom", ".xml");
89 final String selector = tempFile.getName();
90 final MavenProject mavenProject = createMavenProject("maven-core");
91 mavenProject.setFile(tempFile);
92
93 final boolean result = sut.isMatchingProject(mavenProject, selector, tempFile.getParentFile());
94
95 tempFile.delete();
96 assertThat(result, is(true));
97 }
98
99 @Test
100 void isMatchingProjectMatchOnDirectoryReturnsTrue(@TempDir File tempDir) {
101 String selector = "maven-core";
102 final File tempProjectDir = new File(tempDir, "maven-core");
103 tempProjectDir.mkdir();
104 final MavenProject mavenProject = createMavenProject("maven-core");
105 mavenProject.setFile(new File(tempProjectDir, "some-file.xml"));
106
107 final boolean result = sut.isMatchingProject(mavenProject, selector, tempDir);
108
109 tempProjectDir.delete();
110 assertThat(result, is(true));
111 }
112
113 @Test
114 void getOptionalProjectsBySelectorsReturnsMatches() {
115 final HashSet<String> selectors = new HashSet<>();
116 selectors.add(":maven-core");
117 selectors.add(":optional");
118
119 final MavenProject mavenProject = createMavenProject("maven-core");
120 final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
121
122 final Set<MavenProject> optionalProjectsBySelectors =
123 sut.getOptionalProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
124
125 assertThat(optionalProjectsBySelectors.size(), is(1));
126 assertThat(optionalProjectsBySelectors, contains(mavenProject));
127 }
128
129 @Test
130 void getRequiredProjectsBySelectorsThrowsMavenExecutionException() {
131 final HashSet<String> selectors = new HashSet<>();
132 selectors.add(":maven-core");
133 selectors.add(":required");
134
135 final MavenProject mavenProject = createMavenProject("maven-core");
136 final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
137
138 final MavenExecutionException exception = assertThrows(
139 MavenExecutionException.class,
140 () -> sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors));
141 assertThat(exception.getMessage(), containsString("Could not find"));
142 assertThat(exception.getMessage(), containsString(":required"));
143 }
144
145 @Test
146 void getRequiredProjectsBySelectorsReturnsProject() throws MavenExecutionException {
147 final HashSet<String> selectors = new HashSet<>();
148 selectors.add(":maven-core");
149
150 final MavenProject mavenProject = createMavenProject("maven-core");
151 final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
152
153 final Set<MavenProject> requiredProjectsBySelectors =
154 sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
155
156 assertThat(requiredProjectsBySelectors.size(), is(1));
157 assertThat(requiredProjectsBySelectors, contains(mavenProject));
158 }
159
160 @Test
161 void getRequiredProjectsBySelectorsReturnsProjectWithChildProjects() throws MavenExecutionException {
162 when(mavenExecutionRequest.isRecursive()).thenReturn(true);
163
164 final HashSet<String> selectors = new HashSet<>();
165 selectors.add(":maven-core");
166
167 final MavenProject mavenProject = createMavenProject("maven-core");
168 final MavenProject child = createMavenProject("maven-core-child");
169 mavenProject.setCollectedProjects(Collections.singletonList(child));
170 final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
171
172 final Set<MavenProject> requiredProjectsBySelectors =
173 sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
174
175 assertThat(requiredProjectsBySelectors.size(), is(2));
176 assertThat(requiredProjectsBySelectors, contains(mavenProject, child));
177 }
178
179 @Test
180 void getOptionalProjectsBySelectorsReturnsProjectWithChildProjects() {
181 when(mavenExecutionRequest.isRecursive()).thenReturn(true);
182
183 final HashSet<String> selectors = new HashSet<>();
184 selectors.add(":maven-core");
185
186 final MavenProject mavenProject = createMavenProject("maven-core");
187 final MavenProject child = createMavenProject("maven-core-child");
188 mavenProject.setCollectedProjects(Collections.singletonList(child));
189 final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
190
191 final Set<MavenProject> optionalProjectsBySelectors =
192 sut.getOptionalProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
193
194 assertThat(optionalProjectsBySelectors.size(), is(2));
195 assertThat(optionalProjectsBySelectors, contains(mavenProject, child));
196 }
197
198 private MavenProject createMavenProject(String artifactId) {
199 MavenProject mavenProject = new MavenProject();
200 mavenProject.setGroupId("org.apache.maven");
201 mavenProject.setArtifactId(artifactId);
202 mavenProject.setVersion("1.0");
203 mavenProject.setFile(new File(artifactId, "some-dir"));
204 mavenProject.setCollectedProjects(new ArrayList<>());
205 return mavenProject;
206 }
207 }