diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationTemplateServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationTemplateServiceCEImpl.java index 176dcb6f90..f070ea002d 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationTemplateServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationTemplateServiceCEImpl.java @@ -349,7 +349,9 @@ public class ApplicationTemplateServiceCEImpl implements ApplicationTemplateServ .accept(MediaType.APPLICATION_JSON) .body(BodyInserters.fromValue(payload)) .retrieve() - .bodyToMono(ApplicationTemplate.class); + .bodyToMono(ApplicationTemplate.class) + .onErrorResume(error -> Mono.error(new AppsmithException( + AppsmithError.CLOUD_SERVICES_ERROR, "while publishing template" + error.getMessage()))); } private Mono updateApplicationFlags(String applicationId, String branchId) { diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ce/ApplicationTemplateServicePublishTemplateTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ce/ApplicationTemplateServicePublishTemplateTest.java new file mode 100644 index 0000000000..0aee9ad0f1 --- /dev/null +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ce/ApplicationTemplateServicePublishTemplateTest.java @@ -0,0 +1,124 @@ +package com.appsmith.server.services.ce; + +import com.appsmith.server.configurations.CloudServicesConfig; +import com.appsmith.server.domains.Application; +import com.appsmith.server.domains.GitApplicationMetadata; +import com.appsmith.server.domains.Workspace; +import com.appsmith.server.dtos.CommunityTemplateDTO; +import com.appsmith.server.exceptions.AppsmithException; +import com.appsmith.server.services.ApplicationPageService; +import com.appsmith.server.services.ApplicationTemplateService; +import com.appsmith.server.services.WorkspaceService; +import lombok.extern.slf4j.Slf4j; +import mockwebserver3.Dispatcher; +import mockwebserver3.MockResponse; +import mockwebserver3.MockWebServer; +import mockwebserver3.RecordedRequest; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import reactor.test.StepVerifier; + +import java.io.IOException; +import java.time.Instant; +import java.util.List; + +@Slf4j +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class ApplicationTemplateServicePublishTemplateTest { + private static MockWebServer mockCloudServices; + + @Autowired + ApplicationTemplateService applicationTemplateService; + + @Autowired + WorkspaceService workspaceService; + + @Autowired + ApplicationPageService applicationPageService; + + @Autowired + CloudServicesConfig cloudServicesConfig; + + static final Dispatcher dispatcher = new Dispatcher() { + @Override + public MockResponse dispatch(RecordedRequest request) throws InterruptedException { + + switch (request.getPath()) { + case "/api/v1/app-templates/upload-community-template": + return new MockResponse().setResponseCode(500).setBody("Error while uploading template"); + + default: + return new MockResponse() + .setHeader("x-header-name", "header-value") + .setResponseCode(200) + .setBody("response"); + } + } + }; + + @BeforeAll + public static void setUp() throws IOException { + mockCloudServices = new MockWebServer(); + mockCloudServices.setDispatcher(dispatcher); + mockCloudServices.start(); + } + + @AfterAll + public static void tearDown() throws IOException { + mockCloudServices.shutdown(); + } + + private Application setUpTestApplicationForWorkspace(String workspaceId) { + 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()); + + cloudServicesConfig.setBaseUrl(String.format("http://localhost:%s", mockCloudServices.getPort())); + + return applicationPageService + .createApplication(testApplication, workspaceId) + .block(); + } + + @Test + @WithUserDetails(value = "api_user") + public void test_application_published_as_community_template() { + // Create Workspace + Workspace workspace = new Workspace(); + workspace.setName("Import-Export-Test-Workspace"); + Workspace savedWorkspace = workspaceService.create(workspace).block(); + + Application testApp = setUpTestApplicationForWorkspace(savedWorkspace.getId()); + CommunityTemplateDTO communityTemplateDTO = new CommunityTemplateDTO(); + communityTemplateDTO.setApplicationId(testApp.getId()); + communityTemplateDTO.setWorkspaceId(testApp.getWorkspaceId()); + communityTemplateDTO.setTitle("Some title"); + communityTemplateDTO.setHeadline("Some headline"); + communityTemplateDTO.setDescription("Some description"); + communityTemplateDTO.setUseCases(List.of("uc1", "uc2")); + communityTemplateDTO.setAuthorEmail("test@user.com"); + + // make sure we've received the response returned by the mockCloudServices + StepVerifier.create(applicationTemplateService.publishAsCommunityTemplate(communityTemplateDTO)) + .expectErrorMatches(throwable -> throwable instanceof AppsmithException + && throwable + .getMessage() + .contains("Received error from cloud services while publishing template")) + .verify(); + + // Test cleanup + applicationPageService.deleteApplication(testApp.getId()).block(); + workspaceService.archiveById(savedWorkspace.getId()).block(); + } +}