Skip to content

Commit 07f0600

Browse files
aq-ikhwa-techludomikula
authored andcommitted
Add support for mv integration-test phase
- Added support to test the pf4j plugins in deployment mode within the SpringBootTest as integration tests
1 parent 494f9f1 commit 07f0600

9 files changed

+213
-155
lines changed

server/api-service/lowcoder-server/pom.xml

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515

1616
<properties>
1717
<java.version>17</java.version>
18+
<skipTests>false</skipTests>
19+
<skipUnitTests>${skipTests}</skipUnitTests>
20+
<skipIntegrationTests>${skipTests}</skipIntegrationTests>
1821
</properties>
1922

2023
<dependencies>
@@ -175,6 +178,13 @@
175178
<version>2.0.0.AM26</version>
176179
<scope>test</scope>
177180
</dependency>
181+
<dependency>
182+
<groupId>org.junit.vintage</groupId>
183+
<artifactId>junit-vintage-engine</artifactId>
184+
<version>5.9.3</version>
185+
<scope>test</scope>
186+
</dependency>
187+
178188
</dependencies>
179189

180190
<build>
@@ -186,7 +196,68 @@
186196
<plugin>
187197
<groupId>org.apache.maven.plugins</groupId>
188198
<artifactId>maven-surefire-plugin</artifactId>
189-
<version>2.12.4</version>
199+
<version>3.1.2</version>
200+
<configuration>
201+
<skipTests>${skipUnitTests}</skipTests>
202+
<excludes>
203+
<exclude>**/*IntegrationTest.java</exclude>
204+
</excludes>
205+
</configuration>
206+
</plugin>
207+
<plugin>
208+
<groupId>org.apache.maven.plugins</groupId>
209+
<artifactId>maven-failsafe-plugin</artifactId>
210+
<configuration>
211+
<skipTests>${skipIntegrationTests}</skipTests>
212+
<includes>
213+
<include>**/*IntegrationTest.java</include>
214+
</includes>
215+
<argLine>
216+
-Dpf4j.pluginsDir=../lowcoder-plugins/plugins
217+
</argLine>
218+
</configuration>
219+
<executions>
220+
<execution>
221+
<goals>
222+
<goal>integration-test</goal>
223+
<goal>verify</goal>
224+
</goals>
225+
</execution>
226+
</executions>
227+
</plugin>
228+
<plugin>
229+
<artifactId>maven-antrun-plugin</artifactId>
230+
<executions>
231+
<execution>
232+
<id>copy-plugins-jar-for-integration-tests</id>
233+
<phase>pre-integration-test</phase>
234+
<configuration>
235+
<target>
236+
<echo message="copy-plugins-jar-for-integration-tests started"/>
237+
<copy todir="../lowcoder-plugins/plugins">
238+
<fileset dir="../lowcoder-plugins" includes="/*/target/*shaded.jar" />
239+
<mapper type="flatten"/>
240+
</copy>
241+
</target>
242+
</configuration>
243+
<goals>
244+
<goal>run</goal>
245+
</goals>
246+
</execution>
247+
<execution>
248+
<id>delete-plugins-after-integration-tests-phase</id>
249+
<phase>post-integration-test</phase>
250+
<configuration>
251+
<target>
252+
<echo message="delete-plugins-after-integration-tests-phase started"/>
253+
<delete dir="../lowcoder-plugins/plugins"/>
254+
</target>
255+
</configuration>
256+
<goals>
257+
<goal>run</goal>
258+
</goals>
259+
</execution>
260+
</executions>
190261
</plugin>
191262
</plugins>
192263
</build>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package org.lowcoder.api.application;
2+
3+
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.junit.Assert;
6+
import org.junit.Ignore;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
import org.lowcoder.api.application.ApplicationController.CreateApplicationRequest;
10+
import org.lowcoder.api.application.view.ApplicationView;
11+
import org.lowcoder.api.common.mockuser.WithMockUser;
12+
import org.lowcoder.api.datasource.DatasourceApiService;
13+
import org.lowcoder.api.datasource.DatasourceApiServiceIntegrationTest;
14+
import org.lowcoder.api.permission.view.CommonPermissionView;
15+
import org.lowcoder.api.permission.view.PermissionItemView;
16+
import org.lowcoder.domain.application.model.Application;
17+
import org.lowcoder.domain.application.model.ApplicationType;
18+
import org.lowcoder.domain.datasource.model.Datasource;
19+
import org.lowcoder.domain.permission.model.ResourceRole;
20+
import org.lowcoder.sdk.exception.BizError;
21+
import org.lowcoder.sdk.exception.BizException;
22+
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.springframework.boot.test.context.SpringBootTest;
24+
import org.springframework.test.context.junit4.SpringRunner;
25+
import reactor.core.publisher.Mono;
26+
import reactor.test.StepVerifier;
27+
28+
import java.util.Map;
29+
import java.util.Set;
30+
31+
@SuppressWarnings({"OptionalGetWithoutIsPresent"})
32+
@SpringBootTest
33+
@RunWith(SpringRunner.class)
34+
@Slf4j(topic = "ApplicationApiServiceIntegrationTest")
35+
public class ApplicationApiServiceIntegrationTest {
36+
37+
@Autowired
38+
private ApplicationApiService applicationApiService;
39+
@Autowired
40+
private DatasourceApiService datasourceApiService;
41+
42+
@SuppressWarnings("ConstantConditions")
43+
@Test
44+
@WithMockUser(id = "user02")
45+
public void testCreateApplicationSuccess() {
46+
47+
Mono<Datasource> datasourceMono = datasourceApiService.create(DatasourceApiServiceIntegrationTest.buildMysqlDatasource("mysql07")).cache();
48+
Mono<CommonPermissionView> commonPermissionViewMono =
49+
datasourceMono.flatMap(datasource -> datasourceApiService.getPermissions(datasource.getId()));
50+
Mono<Boolean> deleteMono = commonPermissionViewMono.flatMap(commonPermissionView -> {
51+
String permissionId = commonPermissionView.getUserPermissions().stream()
52+
.filter(permissionItemView -> permissionItemView.getId().equals("user02"))
53+
.findFirst()
54+
.map(PermissionItemView::getPermissionId)
55+
.get();
56+
return datasourceApiService.updatePermission(permissionId, ResourceRole.VIEWER);
57+
});
58+
//
59+
Mono<ApplicationView> applicationViewMono = datasourceMono.map(datasource -> new CreateApplicationRequest(
60+
"org01",
61+
"app05",
62+
ApplicationType.APPLICATION.getValue(),
63+
Map.of("comp", "table"),
64+
Map.of("comp", "list", "queries", Set.of(Map.of("datasourceId", datasource.getId()))),
65+
null))
66+
.delayUntil(__ -> deleteMono)
67+
.flatMap(createApplicationRequest -> applicationApiService.create(createApplicationRequest));
68+
69+
StepVerifier.create(applicationViewMono)
70+
.assertNext(applicationView -> Assert.assertNotNull(applicationView.getApplicationInfoView().getApplicationId()))
71+
.verifyComplete();
72+
}
73+
74+
@Ignore
75+
@SuppressWarnings("ConstantConditions")
76+
@Test
77+
@WithMockUser(id = "user02")
78+
public void testUpdateApplicationFailedDueToLackOfDatasourcePermissions() {
79+
80+
Mono<Datasource> datasourceMono = datasourceApiService.create(DatasourceApiServiceIntegrationTest.buildMysqlDatasource("mysql08")).cache();
81+
Mono<CommonPermissionView> commonPermissionViewMono =
82+
datasourceMono.flatMap(datasource -> datasourceApiService.getPermissions(datasource.getId()));
83+
Mono<Boolean> deleteMono = commonPermissionViewMono.flatMap(commonPermissionView -> {
84+
String permissionId = commonPermissionView.getUserPermissions().stream()
85+
.filter(permissionItemView -> permissionItemView.getId().equals("user02"))
86+
.findFirst()
87+
.map(PermissionItemView::getPermissionId)
88+
.get();
89+
return datasourceApiService.deletePermission(permissionId);
90+
});
91+
//
92+
Mono<ApplicationView> applicationViewMono = datasourceMono.map(datasource -> new CreateApplicationRequest(
93+
"org01",
94+
"app03",
95+
ApplicationType.APPLICATION.getValue(),
96+
Map.of("comp", "table"),
97+
Map.of("comp", "list", "queries", Set.of(Map.of("datasourceId", datasource.getId()))),
98+
null))
99+
.delayUntil(__ -> deleteMono)
100+
.flatMap(createApplicationRequest -> applicationApiService.create(createApplicationRequest))
101+
.flatMap(applicationView -> {
102+
Application application = Application.builder()
103+
.editingApplicationDSL(applicationView.getApplicationDSL())
104+
.name("app03")
105+
.build();
106+
return applicationApiService.update(applicationView.getApplicationInfoView().getApplicationId(), application);
107+
});
108+
109+
StepVerifier.create(applicationViewMono)
110+
.expectErrorMatches(throwable -> throwable instanceof BizException bizException
111+
&& bizException.getError() == BizError.NOT_AUTHORIZED
112+
&& bizException.getMessageKey().equals("APPLICATION_EDIT_ERROR_LACK_OF_DATASOURCE_PERMISSIONS"))
113+
.verify();
114+
}
115+
}

server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java

Lines changed: 0 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,23 @@
33

44
import lombok.extern.slf4j.Slf4j;
55
import org.junit.Assert;
6-
import org.junit.Before;
7-
import org.junit.Ignore;
86
import org.junit.Test;
97
import org.junit.runner.RunWith;
108
import org.lowcoder.api.application.ApplicationController.CreateApplicationRequest;
119
import org.lowcoder.api.application.view.ApplicationPermissionView;
1210
import org.lowcoder.api.application.view.ApplicationView;
1311
import org.lowcoder.api.common.mockuser.WithMockUser;
1412
import org.lowcoder.api.datasource.DatasourceApiService;
15-
import org.lowcoder.api.datasource.DatasourceApiServiceTest;
1613
import org.lowcoder.api.home.FolderApiService;
17-
import org.lowcoder.api.permission.view.CommonPermissionView;
1814
import org.lowcoder.api.permission.view.PermissionItemView;
1915
import org.lowcoder.domain.application.model.Application;
2016
import org.lowcoder.domain.application.model.ApplicationStatus;
2117
import org.lowcoder.domain.application.model.ApplicationType;
2218
import org.lowcoder.domain.application.service.ApplicationService;
23-
import org.lowcoder.domain.datasource.model.Datasource;
2419
import org.lowcoder.domain.permission.model.ResourceHolder;
2520
import org.lowcoder.domain.permission.model.ResourceRole;
2621
import org.lowcoder.sdk.exception.BizError;
2722
import org.lowcoder.sdk.exception.BizException;
28-
import org.pf4j.PluginManager;
2923
import org.springframework.beans.factory.annotation.Autowired;
3024
import org.springframework.boot.test.context.SpringBootTest;
3125
import org.springframework.test.context.junit4.SpringRunner;
@@ -35,7 +29,6 @@
3529
import java.util.List;
3630
import java.util.Map;
3731
import java.util.Set;
38-
@SuppressWarnings({"OptionalGetWithoutIsPresent"})
3932
@SpringBootTest
4033
@RunWith(SpringRunner.class)
4134
@Slf4j(topic = "ApplicationApiServiceTest")
@@ -50,19 +43,6 @@ public class ApplicationApiServiceTest {
5043
@Autowired
5144
private DatasourceApiService datasourceApiService;
5245

53-
@Autowired
54-
private PluginManager pluginManager;
55-
56-
@Before
57-
public void init() {
58-
try {
59-
pluginManager.loadPlugins();
60-
pluginManager.startPlugins();
61-
} catch (Exception e) {
62-
log.error("Failed to load/start plugins. Exception: " + e);
63-
}
64-
}
65-
6646
@Test
6747
@WithMockUser
6848
public void testAutoInheritFoldersPermissionsOnAppCreate() {
@@ -284,78 +264,4 @@ public void testPermissions() {
284264
.verifyComplete();
285265
}
286266

287-
@Ignore
288-
@SuppressWarnings("ConstantConditions")
289-
@Test
290-
@WithMockUser(id = "user02")
291-
public void testCreateApplicationSuccess() {
292-
293-
Mono<Datasource> datasourceMono = datasourceApiService.create(DatasourceApiServiceTest.buildMysqlDatasource("mysql07")).cache();
294-
Mono<CommonPermissionView> commonPermissionViewMono =
295-
datasourceMono.flatMap(datasource -> datasourceApiService.getPermissions(datasource.getId()));
296-
Mono<Boolean> deleteMono = commonPermissionViewMono.flatMap(commonPermissionView -> {
297-
String permissionId = commonPermissionView.getUserPermissions().stream()
298-
.filter(permissionItemView -> permissionItemView.getId().equals("user02"))
299-
.findFirst()
300-
.map(PermissionItemView::getPermissionId)
301-
.get();
302-
return datasourceApiService.updatePermission(permissionId, ResourceRole.VIEWER);
303-
});
304-
//
305-
Mono<ApplicationView> applicationViewMono = datasourceMono.map(datasource -> new CreateApplicationRequest(
306-
"org01",
307-
"app05",
308-
ApplicationType.APPLICATION.getValue(),
309-
Map.of("comp", "table"),
310-
Map.of("comp", "list", "queries", Set.of(Map.of("datasourceId", datasource.getId()))),
311-
null))
312-
.delayUntil(__ -> deleteMono)
313-
.flatMap(createApplicationRequest -> applicationApiService.create(createApplicationRequest));
314-
315-
StepVerifier.create(applicationViewMono)
316-
.assertNext(applicationView -> Assert.assertNotNull(applicationView.getApplicationInfoView().getApplicationId()))
317-
.verifyComplete();
318-
}
319-
320-
@Ignore
321-
@SuppressWarnings("ConstantConditions")
322-
@Test
323-
@WithMockUser(id = "user02")
324-
public void testUpdateApplicationFailedDueToLackOfDatasourcePermissions() {
325-
326-
Mono<Datasource> datasourceMono = datasourceApiService.create(DatasourceApiServiceTest.buildMysqlDatasource("mysql08")).cache();
327-
Mono<CommonPermissionView> commonPermissionViewMono =
328-
datasourceMono.flatMap(datasource -> datasourceApiService.getPermissions(datasource.getId()));
329-
Mono<Boolean> deleteMono = commonPermissionViewMono.flatMap(commonPermissionView -> {
330-
String permissionId = commonPermissionView.getUserPermissions().stream()
331-
.filter(permissionItemView -> permissionItemView.getId().equals("user02"))
332-
.findFirst()
333-
.map(PermissionItemView::getPermissionId)
334-
.get();
335-
return datasourceApiService.deletePermission(permissionId);
336-
});
337-
//
338-
Mono<ApplicationView> applicationViewMono = datasourceMono.map(datasource -> new CreateApplicationRequest(
339-
"org01",
340-
"app03",
341-
ApplicationType.APPLICATION.getValue(),
342-
Map.of("comp", "table"),
343-
Map.of("comp", "list", "queries", Set.of(Map.of("datasourceId", datasource.getId()))),
344-
null))
345-
.delayUntil(__ -> deleteMono)
346-
.flatMap(createApplicationRequest -> applicationApiService.create(createApplicationRequest))
347-
.flatMap(applicationView -> {
348-
Application application = Application.builder()
349-
.editingApplicationDSL(applicationView.getApplicationDSL())
350-
.name("app03")
351-
.build();
352-
return applicationApiService.update(applicationView.getApplicationInfoView().getApplicationId(), application);
353-
});
354-
355-
StepVerifier.create(applicationViewMono)
356-
.expectErrorMatches(throwable -> throwable instanceof BizException bizException
357-
&& bizException.getError() == BizError.NOT_AUTHORIZED
358-
&& bizException.getMessageKey().equals("APPLICATION_EDIT_ERROR_LACK_OF_DATASOURCE_PERMISSIONS"))
359-
.verify();
360-
}
361267
}

server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/common/SpringPluginManagerConfiguration.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)