test: Add test for partial export (#29728)
## Description Tests for partial export flow #### PR fixes following issue(s) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Tests** - Introduced a new test suite for partial export functionality, ensuring resources like datasources and actions can be exported correctly under various configurations. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
parent
ad256ed64a
commit
71cd59fc4c
|
|
@ -0,0 +1,346 @@
|
||||||
|
package com.appsmith.server.services;
|
||||||
|
|
||||||
|
import com.appsmith.external.models.ActionConfiguration;
|
||||||
|
import com.appsmith.external.models.ActionDTO;
|
||||||
|
import com.appsmith.external.models.DBAuth;
|
||||||
|
import com.appsmith.external.models.Datasource;
|
||||||
|
import com.appsmith.external.models.DatasourceConfiguration;
|
||||||
|
import com.appsmith.external.models.DatasourceStorageDTO;
|
||||||
|
import com.appsmith.external.models.DefaultResources;
|
||||||
|
import com.appsmith.external.models.Property;
|
||||||
|
import com.appsmith.server.applications.base.ApplicationService;
|
||||||
|
import com.appsmith.server.datasources.base.DatasourceService;
|
||||||
|
import com.appsmith.server.domains.Application;
|
||||||
|
import com.appsmith.server.domains.GitApplicationMetadata;
|
||||||
|
import com.appsmith.server.domains.Plugin;
|
||||||
|
import com.appsmith.server.domains.User;
|
||||||
|
import com.appsmith.server.domains.Workspace;
|
||||||
|
import com.appsmith.server.dtos.ApplicationJson;
|
||||||
|
import com.appsmith.server.dtos.PageDTO;
|
||||||
|
import com.appsmith.server.dtos.PartialExportFileDTO;
|
||||||
|
import com.appsmith.server.exports.internal.PartialExportService;
|
||||||
|
import com.appsmith.server.helpers.MockPluginExecutor;
|
||||||
|
import com.appsmith.server.helpers.PluginExecutorHelper;
|
||||||
|
import com.appsmith.server.newpages.base.NewPageService;
|
||||||
|
import com.appsmith.server.plugins.base.PluginService;
|
||||||
|
import com.appsmith.server.repositories.ApplicationRepository;
|
||||||
|
import com.appsmith.server.repositories.CacheableRepositoryHelper;
|
||||||
|
import com.appsmith.server.repositories.PermissionGroupRepository;
|
||||||
|
import com.appsmith.server.repositories.PluginRepository;
|
||||||
|
import com.appsmith.server.repositories.ThemeRepository;
|
||||||
|
import com.appsmith.server.solutions.EnvironmentPermission;
|
||||||
|
import com.appsmith.server.solutions.PagePermission;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
|
import org.springframework.boot.test.mock.mockito.SpyBean;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.security.test.context.support.WithUserDetails;
|
||||||
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
import reactor.core.publisher.Flux;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
import reactor.test.StepVerifier;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@ExtendWith(SpringExtension.class)
|
||||||
|
@SpringBootTest
|
||||||
|
public class PartialExportServiceTest {
|
||||||
|
|
||||||
|
private static final Map<String, Datasource> datasourceMap = new HashMap<>();
|
||||||
|
private static Plugin installedPlugin;
|
||||||
|
private static String workspaceId;
|
||||||
|
private static String defaultEnvironmentId;
|
||||||
|
private static String testAppId;
|
||||||
|
private static Datasource jsDatasource;
|
||||||
|
private static Plugin installedJsPlugin;
|
||||||
|
private static Boolean isSetupDone = false;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationService applicationService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private NewPageService newPageService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private LayoutActionService layoutActionService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private LayoutCollectionService layoutCollectionService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SessionUserService sessionUserService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PartialExportService partialExportService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
ApplicationPageService applicationPageService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
PluginRepository pluginRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
ApplicationRepository applicationRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
DatasourceService datasourceService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
WorkspaceService workspaceService;
|
||||||
|
|
||||||
|
@MockBean
|
||||||
|
PluginExecutorHelper pluginExecutorHelper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
ThemeRepository themeRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
PermissionGroupRepository permissionGroupRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
PermissionGroupService permissionGroupService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
EnvironmentPermission environmentPermission;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
PagePermission pagePermission;
|
||||||
|
|
||||||
|
@SpyBean
|
||||||
|
PluginService pluginService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
CacheableRepositoryHelper cacheableRepositoryHelper;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setup() {
|
||||||
|
Mockito.when(pluginExecutorHelper.getPluginExecutor(Mockito.any()))
|
||||||
|
.thenReturn(Mono.just(new MockPluginExecutor()));
|
||||||
|
|
||||||
|
if (Boolean.TRUE.equals(isSetupDone)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
User currentUser = sessionUserService.getCurrentUser().block();
|
||||||
|
Set<String> beforeCreatingWorkspace =
|
||||||
|
cacheableRepositoryHelper.getPermissionGroupsOfUser(currentUser).block();
|
||||||
|
log.info("Permission Groups for User before creating workspace: {}", beforeCreatingWorkspace);
|
||||||
|
installedPlugin = pluginRepository.findByPackageName("installed-plugin").block();
|
||||||
|
Workspace workspace = new Workspace();
|
||||||
|
workspace.setName("Import-Export-Test-Workspace");
|
||||||
|
Workspace savedWorkspace = workspaceService.create(workspace).block();
|
||||||
|
workspaceId = savedWorkspace.getId();
|
||||||
|
defaultEnvironmentId = workspaceService
|
||||||
|
.getDefaultEnvironmentId(workspaceId, environmentPermission.getExecutePermission())
|
||||||
|
.block();
|
||||||
|
Set<String> afterCreatingWorkspace =
|
||||||
|
cacheableRepositoryHelper.getPermissionGroupsOfUser(currentUser).block();
|
||||||
|
log.info("Permission Groups for User after creating workspace: {}", afterCreatingWorkspace);
|
||||||
|
|
||||||
|
log.info("Workspace ID: {}", workspaceId);
|
||||||
|
log.info("Workspace Role Ids: {}", workspace.getDefaultPermissionGroups());
|
||||||
|
log.info("Policy for created Workspace: {}", workspace.getPolicies());
|
||||||
|
log.info("Current User ID: {}", currentUser.getId());
|
||||||
|
|
||||||
|
Application testApplication = new Application();
|
||||||
|
testApplication.setName("Export-Application-Test-Application");
|
||||||
|
testApplication.setWorkspaceId(workspaceId);
|
||||||
|
testApplication.setUpdatedAt(Instant.now());
|
||||||
|
testApplication.setLastDeployedAt(Instant.now());
|
||||||
|
testApplication.setModifiedBy("some-user");
|
||||||
|
testApplication.setGitApplicationMetadata(new GitApplicationMetadata());
|
||||||
|
|
||||||
|
Application savedApplication = applicationPageService
|
||||||
|
.createApplication(testApplication, workspaceId)
|
||||||
|
.block();
|
||||||
|
testAppId = savedApplication.getId();
|
||||||
|
|
||||||
|
Datasource ds1 = new Datasource();
|
||||||
|
ds1.setName("DS1");
|
||||||
|
ds1.setWorkspaceId(workspaceId);
|
||||||
|
ds1.setPluginId(installedPlugin.getId());
|
||||||
|
final DatasourceConfiguration datasourceConfiguration = new DatasourceConfiguration();
|
||||||
|
datasourceConfiguration.setUrl("http://example.org/get");
|
||||||
|
datasourceConfiguration.setHeaders(List.of(new Property("X-Answer", "42")));
|
||||||
|
|
||||||
|
HashMap<String, DatasourceStorageDTO> storages1 = new HashMap<>();
|
||||||
|
storages1.put(
|
||||||
|
defaultEnvironmentId, new DatasourceStorageDTO(null, defaultEnvironmentId, datasourceConfiguration));
|
||||||
|
ds1.setDatasourceStorages(storages1);
|
||||||
|
|
||||||
|
Datasource ds2 = new Datasource();
|
||||||
|
ds2.setName("DS2");
|
||||||
|
ds2.setPluginId(installedPlugin.getId());
|
||||||
|
ds2.setWorkspaceId(workspaceId);
|
||||||
|
DatasourceConfiguration datasourceConfiguration2 = new DatasourceConfiguration();
|
||||||
|
DBAuth auth = new DBAuth();
|
||||||
|
auth.setPassword("awesome-password");
|
||||||
|
datasourceConfiguration2.setAuthentication(auth);
|
||||||
|
HashMap<String, DatasourceStorageDTO> storages2 = new HashMap<>();
|
||||||
|
storages2.put(
|
||||||
|
defaultEnvironmentId, new DatasourceStorageDTO(null, defaultEnvironmentId, datasourceConfiguration2));
|
||||||
|
ds2.setDatasourceStorages(storages2);
|
||||||
|
|
||||||
|
jsDatasource = new Datasource();
|
||||||
|
jsDatasource.setName("Default JS datasource");
|
||||||
|
jsDatasource.setWorkspaceId(workspaceId);
|
||||||
|
installedJsPlugin =
|
||||||
|
pluginRepository.findByPackageName("installed-js-plugin").block();
|
||||||
|
assert installedJsPlugin != null;
|
||||||
|
jsDatasource.setPluginId(installedJsPlugin.getId());
|
||||||
|
|
||||||
|
ds1 = datasourceService.create(ds1).block();
|
||||||
|
ds2 = datasourceService.create(ds2).block();
|
||||||
|
datasourceMap.put("DS1", ds1);
|
||||||
|
datasourceMap.put("DS2", ds2);
|
||||||
|
isSetupDone = true;
|
||||||
|
|
||||||
|
Mockito.when(pluginService.findAllByIdsWithoutPermission(Mockito.any(), Mockito.anyList()))
|
||||||
|
.thenReturn(Flux.fromIterable(List.of(installedPlugin, installedJsPlugin)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Application createGitConnectedApp(String applicationName) {
|
||||||
|
// Create application connected to git
|
||||||
|
Application testApplication = new Application();
|
||||||
|
testApplication.setName(applicationName);
|
||||||
|
testApplication.setWorkspaceId(workspaceId);
|
||||||
|
testApplication.setUpdatedAt(Instant.now());
|
||||||
|
testApplication.setLastDeployedAt(Instant.now());
|
||||||
|
testApplication.setModifiedBy("some-user");
|
||||||
|
testApplication.setGitApplicationMetadata(new GitApplicationMetadata());
|
||||||
|
GitApplicationMetadata gitData = new GitApplicationMetadata();
|
||||||
|
gitData.setBranchName("master");
|
||||||
|
gitData.setDefaultBranchName("master");
|
||||||
|
testApplication.setGitApplicationMetadata(gitData);
|
||||||
|
|
||||||
|
return applicationPageService
|
||||||
|
.createApplication(testApplication, workspaceId)
|
||||||
|
.flatMap(application1 -> {
|
||||||
|
application1.getGitApplicationMetadata().setDefaultApplicationId(application1.getId());
|
||||||
|
return applicationService.save(application1);
|
||||||
|
})
|
||||||
|
.block();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@WithUserDetails(value = "api_user")
|
||||||
|
void testGetPartialExport_nonGitConnectedApp_success() {
|
||||||
|
// Create an application with all resources
|
||||||
|
Application testApplication = new Application();
|
||||||
|
testApplication.setName("testGetPartialExport_nonGitConnectedApp_success");
|
||||||
|
testApplication.setWorkspaceId(workspaceId);
|
||||||
|
|
||||||
|
testApplication = applicationPageService
|
||||||
|
.createApplication(testApplication, workspaceId)
|
||||||
|
.block();
|
||||||
|
|
||||||
|
// Create pages
|
||||||
|
PageDTO page = new PageDTO();
|
||||||
|
page.setName("Page 2");
|
||||||
|
page.setApplicationId(testApplication.getId());
|
||||||
|
PageDTO savedPage = applicationPageService.createPage(page).block();
|
||||||
|
|
||||||
|
PartialExportFileDTO partialExportFileDTO = new PartialExportFileDTO();
|
||||||
|
partialExportFileDTO.setDatasourceList(List.of(
|
||||||
|
datasourceMap.get("DS1").getId(), datasourceMap.get("DS2").getId()));
|
||||||
|
|
||||||
|
// Get the partial export resources
|
||||||
|
Mono<ApplicationJson> partialExportFileDTOMono = partialExportService.getPartialExportResources(
|
||||||
|
testApplication.getId(), savedPage.getId(), null, partialExportFileDTO);
|
||||||
|
|
||||||
|
StepVerifier.create(partialExportFileDTOMono)
|
||||||
|
.assertNext(applicationJson -> {
|
||||||
|
assertThat(applicationJson.getDatasourceList().size()).isEqualTo(2);
|
||||||
|
assertThat(applicationJson.getDatasourceList().get(0).getName())
|
||||||
|
.isEqualTo("DS1");
|
||||||
|
assertThat(applicationJson.getDatasourceList().get(1).getName())
|
||||||
|
.isEqualTo("DS2");
|
||||||
|
assertThat(applicationJson.getDatasourceList().get(0).getPluginId())
|
||||||
|
.isEqualTo("installed-plugin");
|
||||||
|
assertThat(applicationJson.getDatasourceList().get(1).getPluginId())
|
||||||
|
.isEqualTo("installed-plugin");
|
||||||
|
})
|
||||||
|
.verifyComplete();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@WithUserDetails(value = "api_user")
|
||||||
|
public void testGetPartialExport_gitConnectedApp_branchResourceExported() {
|
||||||
|
Application application = createGitConnectedApp("testGetPartialExport_gitConnectedApp_branchResourceExported");
|
||||||
|
|
||||||
|
// update git branch name for page
|
||||||
|
PageDTO savedPage = new PageDTO();
|
||||||
|
savedPage.setName("Page 2");
|
||||||
|
savedPage.setApplicationId(application.getId());
|
||||||
|
DefaultResources defaultResources = new DefaultResources();
|
||||||
|
defaultResources.setApplicationId(application.getId());
|
||||||
|
defaultResources.setBranchName("master");
|
||||||
|
savedPage.setDefaultResources(defaultResources);
|
||||||
|
savedPage = applicationPageService
|
||||||
|
.createPageWithBranchName(savedPage, "master")
|
||||||
|
.block();
|
||||||
|
|
||||||
|
// Create Action
|
||||||
|
ActionDTO action = new ActionDTO();
|
||||||
|
action.setName("validAction");
|
||||||
|
action.setPageId(savedPage.getId());
|
||||||
|
action.setExecuteOnLoad(true);
|
||||||
|
ActionConfiguration actionConfiguration = new ActionConfiguration();
|
||||||
|
actionConfiguration.setHttpMethod(HttpMethod.GET);
|
||||||
|
actionConfiguration.setTimeoutInMillisecond("6000");
|
||||||
|
action.setActionConfiguration(actionConfiguration);
|
||||||
|
action.setDatasource(datasourceMap.get("DS1"));
|
||||||
|
|
||||||
|
ActionDTO savedAction =
|
||||||
|
layoutActionService.createSingleAction(action, Boolean.FALSE).block();
|
||||||
|
|
||||||
|
PartialExportFileDTO partialExportFileDTO = new PartialExportFileDTO();
|
||||||
|
partialExportFileDTO.setDatasourceList(List.of(
|
||||||
|
datasourceMap.get("DS1").getId(), datasourceMap.get("DS2").getId()));
|
||||||
|
partialExportFileDTO.setActionList(List.of(savedAction.getId()));
|
||||||
|
|
||||||
|
// Get the partial export resources
|
||||||
|
Mono<ApplicationJson> partialExportFileDTOMono = partialExportService.getPartialExportResources(
|
||||||
|
application.getId(), savedPage.getId(), "master", partialExportFileDTO);
|
||||||
|
|
||||||
|
StepVerifier.create(partialExportFileDTOMono)
|
||||||
|
.assertNext(applicationJson -> {
|
||||||
|
assertThat(applicationJson.getDatasourceList().size()).isEqualTo(2);
|
||||||
|
assertThat(applicationJson.getDatasourceList().get(0).getName())
|
||||||
|
.isEqualTo("DS1");
|
||||||
|
assertThat(applicationJson.getDatasourceList().get(1).getName())
|
||||||
|
.isEqualTo("DS2");
|
||||||
|
assertThat(applicationJson.getDatasourceList().get(0).getPluginId())
|
||||||
|
.isEqualTo("installed-plugin");
|
||||||
|
assertThat(applicationJson.getDatasourceList().get(1).getPluginId())
|
||||||
|
.isEqualTo("installed-plugin");
|
||||||
|
assertThat(applicationJson.getActionList().size()).isEqualTo(1);
|
||||||
|
assertThat(applicationJson
|
||||||
|
.getActionList()
|
||||||
|
.get(0)
|
||||||
|
.getUnpublishedAction()
|
||||||
|
.getName())
|
||||||
|
.isEqualTo("validAction");
|
||||||
|
assertThat(applicationJson
|
||||||
|
.getActionList()
|
||||||
|
.get(0)
|
||||||
|
.getUnpublishedAction()
|
||||||
|
.getPageId())
|
||||||
|
.isEqualTo("Page 2");
|
||||||
|
assertThat(applicationJson.getActionList().get(0).getId()).isEqualTo("Page 2_validAction");
|
||||||
|
})
|
||||||
|
.verifyComplete();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user