chore: Added actionId and requestedAt fields in ActionExecutionRequest (#14720)

* chore: Added actionId and requestedAt fields in ActionExecutionRequest

* Reverted unrelated failing test

* Fix test failures

* Refactor test

Co-authored-by: Anagh Hegde <anagh@appsmith.com>
This commit is contained in:
Nidhi 2022-06-22 22:43:31 +05:30 committed by GitHub
parent 530a571ba0
commit 049de6b58f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 83 additions and 54 deletions

View File

@ -8,6 +8,7 @@ import lombok.Setter;
import lombok.ToString;
import org.springframework.http.HttpMethod;
import java.time.Instant;
import java.util.List;
import java.util.Map;
@ -17,6 +18,8 @@ import java.util.Map;
@NoArgsConstructor
@AllArgsConstructor
public class ActionExecutionRequest {
String actionId;
Instant requestedAt;
@JsonIgnore
String query; // Only used for analytics. Not to be returned back to the client.
Object body;

View File

@ -703,12 +703,24 @@ public class NewActionServiceCEImpl extends BaseService<NewActionRepository, New
// Now that we have the context (connection details), execute the action.
.flatMap(resourceContext -> validatedDatasourceMono
.flatMap(datasource1 -> {
return (Mono<ActionExecutionResult>) pluginExecutor.executeParameterized(
final Instant requestedAt = Instant.now();
return ((Mono<ActionExecutionResult>) pluginExecutor.executeParameterized(
resourceContext.getConnection(),
executeActionDTO,
datasource1.getDatasourceConfiguration(),
actionConfiguration
);
)).map(actionExecutionResult -> {
ActionExecutionRequest actionExecutionRequest = actionExecutionResult.getRequest();
if (actionExecutionRequest == null) {
actionExecutionRequest = new ActionExecutionRequest();
}
actionExecutionRequest.setActionId(actionId);
actionExecutionRequest.setRequestedAt(requestedAt);
actionExecutionResult.setRequest(actionExecutionRequest);
return actionExecutionResult;
});
})
);
@ -739,6 +751,10 @@ public class NewActionServiceCEImpl extends BaseService<NewActionRepository, New
ActionExecutionResult result = new ActionExecutionResult();
result.setBody(e.getMessage());
result.setIsExecutionSuccess(false);
final ActionExecutionRequest actionExecutionRequest = new ActionExecutionRequest();
actionExecutionRequest.setActionId(actionId);
actionExecutionRequest.setRequestedAt(Instant.now());
result.setRequest(actionExecutionRequest);
// Set the status code for Appsmith plugin errors
if (e instanceof AppsmithPluginException) {
result.setStatusCode(((AppsmithPluginException) e).getAppErrorCode().toString());
@ -980,6 +996,8 @@ public class NewActionServiceCEImpl extends BaseService<NewActionRepository, New
if (actionExecutionRequest != null) {
// Do a deep copy of request to not edit
request = new ActionExecutionRequest(
actionExecutionRequest.getActionId(),
actionExecutionRequest.getRequestedAt(),
actionExecutionRequest.getQuery(),
actionExecutionRequest.getBody(),
actionExecutionRequest.getHeaders(),

View File

@ -1,21 +1,19 @@
package com.appsmith.server.services;
import com.appsmith.external.dtos.ExecuteActionDTO;
import com.appsmith.external.models.ActionConfiguration;
import com.appsmith.external.models.ActionExecutionResult;
import com.appsmith.external.models.DBAuth;
import com.appsmith.external.models.Policy;
import com.appsmith.external.plugins.PluginExecutor;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.domains.Application;
import com.appsmith.external.models.Datasource;
import com.appsmith.server.domains.Workspace;
import com.appsmith.server.domains.Plugin;
import com.appsmith.server.domains.User;
import com.appsmith.server.dtos.ActionDTO;
import com.appsmith.server.dtos.MockDataSource;
import com.appsmith.server.dtos.PageDTO;
import com.appsmith.server.helpers.MockPluginExecutor;
import com.appsmith.server.helpers.PluginExecutorHelper;
import com.appsmith.server.repositories.PluginRepository;
import com.appsmith.server.repositories.WorkspaceRepository;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
@ -26,14 +24,12 @@ 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.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringRunner;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.util.HashMap;
import java.util.Set;
import java.util.UUID;
@ -76,6 +72,9 @@ public class MockDataServiceTest {
@Autowired
NewActionService newActionService;
@Autowired
PluginRepository pluginRepository;
@MockBean
PluginExecutorHelper pluginExecutorHelper;
@ -241,46 +240,4 @@ public class MockDataServiceTest {
})
.verifyComplete();
}
@Test
@WithUserDetails(value = "api_user")
public void testGetDataFromMockDB() {
Mockito.when(pluginExecutorHelper.getPluginExecutor(Mockito.any())).thenReturn(Mono.just(new MockPluginExecutor()));
Mockito.when(pluginService.getEditorConfigLabelMap(Mockito.anyString())).thenReturn(Mono.just(new HashMap<>()));
Plugin plugin = pluginService.findByPackageName("postgres-plugin").block();
MockDataSource mockDataSource = new MockDataSource();
mockDataSource.setName("Users");
mockDataSource.setWorkspaceId(workspaceId);
mockDataSource.setPackageName("postgres-plugin");
mockDataSource.setPluginId(plugin.getId());
Datasource datasourceMono = mockDataService.createMockDataSet(mockDataSource).block();
ActionDTO action = new ActionDTO();
ActionConfiguration actionConfiguration = new ActionConfiguration();
actionConfiguration.setBody("select * from users;");
actionConfiguration.setHttpMethod(HttpMethod.GET);
action.setActionConfiguration(actionConfiguration);
action.setWorkspaceId(workspaceId);
action.setPageId(testPage.getId());
action.setName("testActionExecuteDbQuery");
action.setDatasource(datasourceMono);
Mono<ActionExecutionResult> resultMono = layoutActionService.createSingleAction(action)
.flatMap(savedAction -> {
ExecuteActionDTO executeActionDTO = new ExecuteActionDTO();
executeActionDTO.setActionId(savedAction.getId());
executeActionDTO.setViewMode(false);
return newActionService.executeAction(executeActionDTO);
});
StepVerifier
.create(resultMono)
.assertNext(result -> {
assertThat(result).isNotNull();
assertThat(result.getIsExecutionSuccess());
})
.verifyComplete();
}
}

View File

@ -5,9 +5,9 @@ import com.appsmith.external.dtos.ExecuteActionDTO;
import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginError;
import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginException;
import com.appsmith.external.exceptions.pluginExceptions.StaleConnectionException;
import com.appsmith.external.helpers.AppsmithBeanUtils;
import com.appsmith.external.helpers.AppsmithEventContext;
import com.appsmith.external.helpers.AppsmithEventContextType;
import com.appsmith.external.helpers.AppsmithBeanUtils;
import com.appsmith.external.models.ActionConfiguration;
import com.appsmith.external.models.ActionExecutionResult;
import com.appsmith.external.models.Datasource;
@ -27,34 +27,36 @@ import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.GitApplicationMetadata;
import com.appsmith.server.domains.Layout;
import com.appsmith.server.domains.NewAction;
import com.appsmith.server.domains.Workspace;
import com.appsmith.server.domains.Plugin;
import com.appsmith.server.domains.User;
import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.ActionDTO;
import com.appsmith.server.dtos.ActionMoveDTO;
import com.appsmith.server.dtos.ActionViewDTO;
import com.appsmith.server.dtos.ApplicationAccessDTO;
import com.appsmith.server.dtos.DslActionDTO;
import com.appsmith.server.dtos.LayoutDTO;
import com.appsmith.server.dtos.MockDataSource;
import com.appsmith.server.dtos.PageDTO;
import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.helpers.MockPluginExecutor;
import com.appsmith.server.helpers.PluginExecutorHelper;
import com.appsmith.server.helpers.WidgetSuggestionHelper;
import com.appsmith.server.repositories.WorkspaceRepository;
import com.appsmith.server.repositories.PluginRepository;
import com.appsmith.server.repositories.WorkspaceRepository;
import com.appsmith.server.services.ActionCollectionService;
import com.appsmith.server.services.ApplicationPageService;
import com.appsmith.server.services.ApplicationService;
import com.appsmith.server.services.DatasourceService;
import com.appsmith.server.services.LayoutActionService;
import com.appsmith.server.services.LayoutService;
import com.appsmith.server.services.MockDataService;
import com.appsmith.server.services.NewActionService;
import com.appsmith.server.services.NewPageService;
import com.appsmith.server.services.WorkspaceService;
import com.appsmith.server.services.PluginService;
import com.appsmith.server.services.UserService;
import com.appsmith.server.services.WorkspaceService;
import com.appsmith.server.solutions.ImportExportApplicationService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
@ -79,6 +81,7 @@ import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@ -154,6 +157,9 @@ public class ActionServiceCE_Test {
@Autowired
ApplicationService applicationService;
@Autowired
MockDataService mockDataService;
Application testApp = null;
PageDTO testPage = null;
@ -772,6 +778,8 @@ public class ActionServiceCE_Test {
assertThat(result.getIsExecutionSuccess()).isFalse();
assertThat(result.getStatusCode()).isEqualTo(pluginException.getAppErrorCode().toString());
assertThat(result.getTitle()).isEqualTo(pluginException.getTitle());
assertThat(result.getRequest().getActionId()).isEqualTo(createdAction.getId());
assertThat(result.getRequest().getRequestedAt()).isBefore(Instant.now());
})
.verifyComplete();
}
@ -1027,6 +1035,8 @@ public class ActionServiceCE_Test {
assertThat(result.getSuggestedWidgets().size()).isEqualTo(expectedWidgets.size());
assertThat(result.getSuggestedWidgets().containsAll(expectedWidgets));
assertThat(expectedWidgets.containsAll(result.getSuggestedWidgets()));
assertThat(result.getRequest().getActionId()).isEqualTo(executeActionDTO.getActionId());
assertThat(result.getRequest().getRequestedAt()).isBefore(Instant.now());
})
.verifyComplete();
}
@ -2609,4 +2619,45 @@ public class ActionServiceCE_Test {
.verifyComplete();
}
@Test
@WithUserDetails(value = "api_user")
public void executeAction_actionOnMockDatasource_success() {
Mockito.when(pluginExecutorHelper.getPluginExecutor(Mockito.any())).thenReturn(Mono.just(new MockPluginExecutor()));
Mockito.when(pluginService.getEditorConfigLabelMap(Mockito.anyString())).thenReturn(Mono.just(new HashMap<>()));
Mockito.when(pluginExecutor.getHintMessages(Mockito.any(), Mockito.any()))
.thenReturn(Mono.zip(Mono.just(new HashSet<>()), Mono.just(new HashSet<>())));
ActionExecutionResult mockResult = new ActionExecutionResult();
mockResult.setIsExecutionSuccess(true);
mockResult.setBody("response-body");
Plugin installed_plugin = pluginRepository.findByPackageName("installed-plugin").block();
MockDataSource mockDataSource = new MockDataSource();
mockDataSource.setName("Users");
mockDataSource.setWorkspaceId(workspaceId);
mockDataSource.setPackageName("postgres-plugin");
mockDataSource.setPluginId(installed_plugin.getId());
Datasource mockDatasource = mockDataService.createMockDataSet(mockDataSource).block();
List<WidgetSuggestionDTO> widgetTypeList = new ArrayList<>();
widgetTypeList.add(WidgetSuggestionHelper.getWidget(WidgetType.TEXT_WIDGET));
mockResult.setSuggestedWidgets(widgetTypeList);
ActionDTO action = new ActionDTO();
ActionConfiguration actionConfiguration = new ActionConfiguration();
actionConfiguration.setBody("select * from users");
action.setActionConfiguration(actionConfiguration);
action.setPageId(testPage.getId());
action.setName("testActionExecuteDbQuery");
action.setDatasource(mockDatasource);
ActionDTO createdAction = layoutActionService.createSingleAction(action).block();
ExecuteActionDTO executeActionDTO = new ExecuteActionDTO();
executeActionDTO.setActionId(createdAction.getId());
executeActionDTO.setViewMode(false);
executeAndAssertAction(executeActionDTO, actionConfiguration, mockResult,
List.of(new ParsedDataType(DisplayDataType.RAW)));
}
}