1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.release;
20
21 import javax.inject.Inject;
22
23 import java.io.File;
24 import java.util.Arrays;
25 import java.util.Collections;
26
27 import org.apache.maven.api.di.Provides;
28 import org.apache.maven.api.plugin.testing.Basedir;
29 import org.apache.maven.api.plugin.testing.InjectMojo;
30 import org.apache.maven.api.plugin.testing.MojoTest;
31 import org.apache.maven.execution.DefaultMavenExecutionRequest;
32 import org.apache.maven.execution.MavenExecutionRequest;
33 import org.apache.maven.execution.MavenSession;
34 import org.apache.maven.plugin.MojoExecutionException;
35 import org.apache.maven.plugin.MojoFailureException;
36 import org.apache.maven.project.MavenProject;
37 import org.apache.maven.shared.release.ReleaseExecutionException;
38 import org.apache.maven.shared.release.ReleaseFailureException;
39 import org.apache.maven.shared.release.ReleaseManager;
40 import org.apache.maven.shared.release.ReleasePerformRequest;
41 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
42 import org.junit.jupiter.api.BeforeEach;
43 import org.junit.jupiter.api.Test;
44 import org.junit.jupiter.api.extension.ExtendWith;
45 import org.mockito.ArgumentCaptor;
46 import org.mockito.Mock;
47 import org.mockito.junit.jupiter.MockitoExtension;
48
49 import static org.junit.jupiter.api.Assertions.assertEquals;
50 import static org.junit.jupiter.api.Assertions.assertNotNull;
51 import static org.junit.jupiter.api.Assertions.assertTrue;
52 import static org.junit.jupiter.api.Assertions.fail;
53 import static org.mockito.ArgumentMatchers.isA;
54 import static org.mockito.Mockito.doThrow;
55 import static org.mockito.Mockito.mock;
56 import static org.mockito.Mockito.verify;
57 import static org.mockito.Mockito.verifyNoMoreInteractions;
58 import static org.mockito.Mockito.when;
59
60
61
62
63
64
65 @ExtendWith(MockitoExtension.class)
66 @MojoTest
67 class PerformReleaseMojoTest {
68
69 @Mock
70 private ReleaseManager releaseManagerMock;
71
72 @Inject
73 private MavenProject mavenProject;
74
75 @Inject
76 private MavenSession mavenSession;
77
78 @Provides
79 private ReleaseManager releaseManager() {
80 return releaseManagerMock;
81 }
82
83 @BeforeEach
84 void setup() {
85 when(mavenProject.getFile()).thenReturn(new File("pom.xml"));
86
87 when(mavenProject.getGroupId()).thenReturn("groupId");
88 when(mavenProject.getArtifactId()).thenReturn("artifactId");
89 when(mavenProject.getVersion()).thenReturn("1.0.0-SNAPSHOT");
90
91 when(mavenSession.getProjects()).thenReturn(Collections.singletonList(mavenProject));
92 when(mavenSession.getRequest()).thenReturn(new DefaultMavenExecutionRequest());
93 }
94
95 @Test
96 @Basedir("/mojos/perform")
97 @InjectMojo(goal = "perform", pom = "perform.xml")
98 void testPerform(PerformReleaseMojo mojo) throws Exception {
99
100 mojo.execute();
101
102
103 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
104 verify(releaseManagerMock).perform(argument.capture());
105 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
106 assertNotNull(argument.getValue().getReleaseEnvironment());
107 assertNotNull(argument.getValue().getReactorProjects());
108 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
109
110 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
111 argument.getValue().getReleaseDescriptorBuilder().build();
112 assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
113
114 verifyNoMoreInteractions(releaseManagerMock);
115 }
116
117 @Test
118 @Basedir("/mojos/perform")
119 @InjectMojo(goal = "perform", pom = "perform-with-flat-structure.xml")
120 void testPerformWithFlatStructure(PerformReleaseMojo mojo) throws Exception {
121
122 mojo.execute();
123
124
125 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
126 verify(releaseManagerMock).perform(argument.capture());
127 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
128 assertNotNull(argument.getValue().getReleaseEnvironment());
129 assertNotNull(argument.getValue().getReactorProjects());
130 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
131
132 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
133 argument.getValue().getReleaseDescriptorBuilder().build();
134 assertEquals("deploy", releaseDescriptor.getPerformGoals());
135 assertEquals(
136 "scm:svn:file://localhost/target/svnroot/flat-multi-module/trunk/root-project",
137 releaseDescriptor.getScmSourceUrl());
138
139 verifyNoMoreInteractions(releaseManagerMock);
140 }
141
142 @Test
143 @Basedir("/mojos/perform")
144 @InjectMojo(goal = "perform", pom = "perform-without-site.xml")
145 void testPerformWithoutSite(PerformReleaseMojo mojo) throws Exception {
146
147 mojo.execute();
148
149
150 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
151 verify(releaseManagerMock).perform(argument.capture());
152 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
153 assertNotNull(argument.getValue().getReleaseEnvironment());
154 assertNotNull(argument.getValue().getReactorProjects());
155 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
156 verifyNoMoreInteractions(releaseManagerMock);
157
158 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
159 argument.getValue().getReleaseDescriptorBuilder().build();
160 assertEquals("deploy", releaseDescriptor.getPerformGoals());
161 }
162
163 @Test
164 @Basedir("/mojos/perform")
165 @InjectMojo(goal = "perform", pom = "perform.xml")
166 void testPerformWithExecutionException(PerformReleaseMojo mojo) throws Exception {
167 doThrow(new ReleaseExecutionException("..."))
168 .when(releaseManagerMock)
169 .perform(isA(ReleasePerformRequest.class));
170
171
172 try {
173 mojo.execute();
174
175 fail("Should have thrown an exception");
176 } catch (MojoExecutionException e) {
177 assertEquals(ReleaseExecutionException.class, e.getCause().getClass(), "Check cause");
178 }
179
180
181 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
182 verify(releaseManagerMock).perform(argument.capture());
183 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
184 assertNotNull(argument.getValue().getReleaseEnvironment());
185 assertNotNull(argument.getValue().getReactorProjects());
186 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
187
188 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
189 argument.getValue().getReleaseDescriptorBuilder().build();
190 assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
191
192 verifyNoMoreInteractions(releaseManagerMock);
193 }
194
195 @Test
196 @Basedir("/mojos/perform")
197 @InjectMojo(goal = "perform", pom = "perform.xml")
198 void testPerformWithExecutionFailure(PerformReleaseMojo mojo) throws Exception {
199 ReleaseFailureException cause = new ReleaseFailureException("...");
200 doThrow(cause).when(releaseManagerMock).perform(isA(ReleasePerformRequest.class));
201
202 mojo.setReleaseManager(releaseManagerMock);
203
204
205 try {
206 mojo.execute();
207
208 fail("Should have thrown an exception");
209 } catch (MojoFailureException e) {
210 assertEquals(cause, e.getCause(), "Check cause exists");
211 }
212
213
214 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
215 verify(releaseManagerMock).perform(argument.capture());
216 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
217 assertNotNull(argument.getValue().getReleaseEnvironment());
218 assertNotNull(argument.getValue().getReactorProjects());
219 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
220
221 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
222 argument.getValue().getReleaseDescriptorBuilder().build();
223 assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
224
225 verifyNoMoreInteractions(releaseManagerMock);
226 }
227
228 @Test
229 @Basedir("/mojos/perform")
230 @InjectMojo(goal = "perform", pom = "perform-with-scm.xml")
231 void testPerformWithScm(PerformReleaseMojo mojo) throws Exception {
232
233 mojo.execute();
234
235
236 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
237 verify(releaseManagerMock).perform(argument.capture());
238 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
239 assertNotNull(argument.getValue().getReleaseEnvironment());
240 assertNotNull(argument.getValue().getReactorProjects());
241 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
242
243 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
244 argument.getValue().getReleaseDescriptorBuilder().build();
245 assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
246 assertEquals("scm-url", releaseDescriptor.getScmSourceUrl());
247
248 verifyNoMoreInteractions(releaseManagerMock);
249 }
250
251 @Test
252 @Basedir("/mojos/perform")
253 @InjectMojo(goal = "perform", pom = "perform.xml")
254 void testPerformWithProfiles(PerformReleaseMojo mojo) throws Exception {
255 MavenExecutionRequest request = mock(MavenExecutionRequest.class);
256 when(request.getActiveProfiles()).thenReturn(Arrays.asList("prof1", "2prof"));
257 when(mavenSession.getRequest()).thenReturn(request);
258
259
260 mojo.execute();
261
262
263 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
264 verify(releaseManagerMock).perform(argument.capture());
265 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
266 assertNotNull(argument.getValue().getReleaseEnvironment());
267 assertNotNull(argument.getValue().getReactorProjects());
268 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
269
270 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
271 argument.getValue().getReleaseDescriptorBuilder().build();
272 assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
273 assertTrue(releaseDescriptor.getActivateProfiles().contains("prof1"));
274 assertTrue(releaseDescriptor.getActivateProfiles().contains("2prof"));
275
276 verifyNoMoreInteractions(releaseManagerMock);
277 }
278
279 @Test
280 @Basedir("/mojos/perform")
281 @InjectMojo(goal = "perform", pom = "perform-with-args.xml")
282 void testPerformWithProfilesAndArguments(PerformReleaseMojo mojo) throws Exception {
283 MavenExecutionRequest request = mock(MavenExecutionRequest.class);
284 when(request.getActiveProfiles()).thenReturn(Arrays.asList("prof1", "2prof"));
285 when(mavenSession.getRequest()).thenReturn(request);
286
287
288 mojo.execute();
289
290
291 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
292 verify(releaseManagerMock).perform(argument.capture());
293 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
294 assertNotNull(argument.getValue().getReleaseEnvironment());
295 assertNotNull(argument.getValue().getReactorProjects());
296 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
297
298 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
299 argument.getValue().getReleaseDescriptorBuilder().build();
300 assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
301 assertTrue(releaseDescriptor.getActivateProfiles().contains("prof1"));
302 assertTrue(releaseDescriptor.getActivateProfiles().contains("2prof"));
303 assertEquals("-Dmaven.test.skip=true", releaseDescriptor.getAdditionalArguments());
304
305 verifyNoMoreInteractions(releaseManagerMock);
306 }
307
308 @Test
309 @Basedir("/mojos/perform")
310 @InjectMojo(goal = "perform", pom = "perform-with-multiline-goals.xml")
311 void testPerformWithMultilineGoals(PerformReleaseMojo mojo) throws Exception {
312
313 mojo.execute();
314
315
316 ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
317 verify(releaseManagerMock).perform(argument.capture());
318 assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
319 assertNotNull(argument.getValue().getReleaseEnvironment());
320 assertNotNull(argument.getValue().getReactorProjects());
321 assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
322
323 ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
324 argument.getValue().getReleaseDescriptorBuilder().build();
325 assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
326
327 verifyNoMoreInteractions(releaseManagerMock);
328 }
329 }