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:
parent
530a571ba0
commit
049de6b58f
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user