fix: ignore DSL parsing errors in the forking flow (#33831)

This commit is contained in:
Anagh Hegde 2024-05-30 16:55:21 +05:30 committed by GitHub
parent 1929ba386d
commit 8eed4b589f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 111 additions and 1 deletions

View File

@ -348,6 +348,14 @@ public class ApplicationForkingServiceCEImpl implements ApplicationForkingServic
})
.flatMapIterable(tuple2 -> clonedPages)
.flatMap(clonedPage -> updateLayoutService.updatePageLayoutsByPageId(clonedPage.getId()))
.onErrorResume(throwable -> {
if (throwable instanceof AppsmithException e
&& AppsmithError.INVALID_DYNAMIC_BINDING_REFERENCE.equals(e.getError())) {
log.error("Error while cloning page {} ", throwable.getMessage());
return Mono.just("");
}
return Mono.error(throwable);
})
// Now publish all the example applications which have been cloned to ensure that there is a
// view mode for the newly created user.
.then(Mono.just(newApplicationIds))

View File

@ -1,4 +1,4 @@
package com.appsmith.server.solutions;
package com.appsmith.server.fork;
import com.appsmith.external.models.ActionConfiguration;
import com.appsmith.external.models.ActionDTO;
@ -58,6 +58,10 @@ import com.appsmith.server.services.LayoutCollectionService;
import com.appsmith.server.services.PermissionGroupService;
import com.appsmith.server.services.SessionUserService;
import com.appsmith.server.services.WorkspaceService;
import com.appsmith.server.solutions.EnvironmentPermission;
import com.appsmith.server.solutions.PagePermission;
import com.appsmith.server.solutions.UserAndAccessManagementService;
import com.appsmith.server.solutions.WorkspacePermission;
import com.appsmith.server.themes.base.ThemeService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;

View File

@ -0,0 +1,98 @@
package com.appsmith.server.fork;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.Workspace;
import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.fork.internal.ApplicationForkingService;
import com.appsmith.server.layouts.UpdateLayoutService;
import com.appsmith.server.repositories.ApplicationRepository;
import com.appsmith.server.services.ApplicationPageService;
import com.appsmith.server.services.WorkspaceService;
import com.appsmith.server.solutions.EnvironmentPermission;
import lombok.extern.slf4j.Slf4j;
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.security.test.context.support.WithUserDetails;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@Slf4j
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class ForkingServiceTest {
@Autowired
private ApplicationForkingService applicationForkingService;
@Autowired
private WorkspaceService workspaceService;
@Autowired
private ApplicationPageService applicationPageService;
@Autowired
private ApplicationRepository applicationRepository;
@Autowired
private EnvironmentPermission environmentPermission;
@MockBean
private UpdateLayoutService updateLayoutService;
@Test
@WithUserDetails(value = "api_user")
public void cloneApplication_whenDslParsingFails_shouldSucceed() {
Workspace originalWorkspace = new Workspace();
originalWorkspace.setName("Source Org Test");
Workspace sourceWorkspace = workspaceService.create(originalWorkspace).block();
Application app1 = new Application();
app1.setName("awesome app 123");
app1.setWorkspaceId(sourceWorkspace.getId());
Application sourceApplication =
applicationPageService.createApplication(app1).block();
final String appId = sourceApplication.getId();
final String appName = sourceApplication.getName();
Mockito.when(updateLayoutService.updatePageLayoutsByPageId(Mockito.anyString()))
.thenThrow(new AppsmithException(AppsmithError.INVALID_DYNAMIC_BINDING_REFERENCE));
Workspace newWorkspace = new Workspace();
newWorkspace.setName("Target Org Test");
Workspace targetWorkspace = workspaceService.create(newWorkspace).block();
String sourceEnvironmentId = workspaceService
.getDefaultEnvironmentId(sourceWorkspace.getId(), environmentPermission.getExecutePermission())
.block();
Mono<Void> cloneMono = Mono.just(sourceApplication)
.map(sourceApplication1 -> {
sourceApplication1.setName(appName);
sourceApplication1.setId(appId);
return sourceApplication1;
})
.flatMap(sourceApplication1 -> applicationForkingService.forkApplications(
targetWorkspace.getId(), sourceApplication1, sourceEnvironmentId))
.then();
Mono<List<String>> resultMono = cloneMono
.thenMany(applicationRepository.findByWorkspaceId(targetWorkspace.getId()))
.map(Application::getName)
.collectList();
StepVerifier.create(resultMono)
.assertNext(names -> {
assertThat(names).hasSize(1);
})
.verifyComplete();
}
}