chore: Moved git auth creation and updation to generified artifactservice (#38312)

This commit is contained in:
Nidhi 2024-12-24 15:47:25 +05:30 committed by GitHub
parent f2733c67e9
commit d9a3253e92
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 300 additions and 220 deletions

View File

@ -3,7 +3,7 @@ package com.appsmith.server.applications.base;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.ApplicationMode;
import com.appsmith.server.domains.GitAuth;
import com.appsmith.server.domains.Artifact;
import com.appsmith.server.dtos.ApplicationAccessDTO;
import com.appsmith.server.dtos.GitAuthDTO;
import com.appsmith.server.services.CrudService;
@ -29,7 +29,7 @@ public interface ApplicationServiceCE extends CrudService<Application, String> {
Flux<Application> findByWorkspaceIdAndBaseApplicationsInRecentlyUsedOrder(String workspaceId);
Mono<Application> save(Application application);
Mono<Application> save(Artifact application);
Mono<Application> updateApplicationWithPresets(String branchedApplicationId, Application application);
@ -53,8 +53,6 @@ public interface ApplicationServiceCE extends CrudService<Application, String> {
Mono<Application> setTransientFields(Application application);
Mono<GitAuth> createOrUpdateSshKeyPair(String branchedApplicationId, String keyType);
Mono<GitAuthDTO> getSshKey(String applicationId);
Mono<Application> findByBranchNameAndBaseApplicationId(

View File

@ -1,15 +1,17 @@
package com.appsmith.server.applications.base;
import com.appsmith.external.constants.AnalyticsEvents;
import com.appsmith.external.models.ActionDTO;
import com.appsmith.external.models.Policy;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.artifacts.base.artifactbased.ArtifactBasedServiceCE;
import com.appsmith.server.artifacts.permissions.ArtifactPermission;
import com.appsmith.server.constants.ApplicationConstants;
import com.appsmith.server.constants.Assets;
import com.appsmith.server.constants.FieldName;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.ApplicationDetail;
import com.appsmith.server.domains.ApplicationMode;
import com.appsmith.server.domains.Artifact;
import com.appsmith.server.domains.Asset;
import com.appsmith.server.domains.GitArtifactMetadata;
import com.appsmith.server.domains.GitAuth;
@ -74,7 +76,7 @@ import static com.appsmith.server.helpers.ce.DomainSorter.sortDomainsBasedOnOrde
@Slf4j
@Service
public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository, Application, String>
implements ApplicationServiceCE {
implements ApplicationServiceCE, ArtifactBasedServiceCE<Application> {
private final PolicySolution policySolution;
private final PermissionGroupService permissionGroupService;
@ -165,6 +167,7 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
* This method is used to fetch all the applications for a given workspaceId. It also sorts the applications based
* on recently used order.
* For git connected applications only default branched application is returned.
*
* @param workspaceId workspaceId for which applications are to be fetched
* @return Flux of applications
*/
@ -212,7 +215,8 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
}
@Override
public Mono<Application> save(Application application) {
public Mono<Application> save(Artifact artifact) {
Application application = (Application) artifact;
if (!StringUtils.isEmpty(application.getName())) {
application.setSlug(TextUtils.makeSlug(application.getName()));
}
@ -227,6 +231,11 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
return repository.save(application).flatMap(this::setTransientFields);
}
@Override
public ArtifactPermission getPermissionService() {
return applicationPermission;
}
@Override
public Mono<Application> create(Application object) {
throw new UnsupportedOperationException(
@ -649,84 +658,6 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
});
}
/**
* Generate SSH private and public keys required to communicate with remote. Keys will be stored only in the
* default/root application only and not the child branched application. This decision is taken because the combined
* size of keys is close to 4kB
*
* @param branchedApplicationId application for which the SSH key needs to be generated
* @return public key which will be used by user to copy to relevant platform
*/
@Override
public Mono<GitAuth> createOrUpdateSshKeyPair(String branchedApplicationId, String keyType) {
GitAuth gitAuth = GitDeployKeyGenerator.generateSSHKey(keyType);
return repository
.findById(branchedApplicationId, applicationPermission.getEditPermission())
.switchIfEmpty(Mono.error(
new AppsmithException(AppsmithError.NO_RESOURCE_FOUND, "application", branchedApplicationId)))
.flatMap(application -> {
GitArtifactMetadata gitData = application.getGitApplicationMetadata();
// Check if the current application is the root application
if (gitData != null
&& !StringUtils.isEmpty(gitData.getDefaultArtifactId())
&& branchedApplicationId.equals(gitData.getDefaultArtifactId())) {
// This is the root application with update SSH key request
gitAuth.setRegeneratedKey(true);
gitData.setGitAuth(gitAuth);
return save(application);
} else if (gitData == null) {
// This is a root application with generate SSH key request
GitArtifactMetadata gitArtifactMetadata = new GitArtifactMetadata();
gitArtifactMetadata.setDefaultApplicationId(branchedApplicationId);
gitArtifactMetadata.setGitAuth(gitAuth);
application.setGitApplicationMetadata(gitArtifactMetadata);
return save(application);
}
// Children application with update SSH key request for root application
// Fetch root application and then make updates. We are storing the git metadata only in root
// application
if (StringUtils.isEmpty(gitData.getDefaultArtifactId())) {
throw new AppsmithException(
AppsmithError.INVALID_GIT_CONFIGURATION,
"Unable to find root application, please connect your application to remote repo to resolve this issue.");
}
gitAuth.setRegeneratedKey(true);
return repository
.findById(gitData.getDefaultArtifactId(), applicationPermission.getEditPermission())
.flatMap(baseApplication -> {
GitArtifactMetadata gitArtifactMetadata = baseApplication.getGitApplicationMetadata();
gitArtifactMetadata.setDefaultApplicationId(baseApplication.getId());
gitArtifactMetadata.setGitAuth(gitAuth);
baseApplication.setGitApplicationMetadata(gitArtifactMetadata);
return save(baseApplication);
});
})
.flatMap(application -> {
// Send generate SSH key analytics event
assert application.getId() != null;
final Map<String, Object> eventData = Map.of(
FieldName.APP_MODE, ApplicationMode.EDIT.toString(), FieldName.APPLICATION, application);
final Map<String, Object> data = Map.of(
FieldName.APPLICATION_ID,
application.getId(),
"organizationId",
application.getWorkspaceId(),
"isRegeneratedKey",
gitAuth.isRegeneratedKey(),
FieldName.EVENT_DATA,
eventData);
return analyticsService
.sendObjectEvent(AnalyticsEvents.GENERATE_SSH_KEY, application, data)
.onErrorResume(e -> {
log.warn("Error sending ssh key generation data point", e);
return Mono.just(application);
});
})
.thenReturn(gitAuth);
}
/**
* Method to get the SSH public key
*
@ -1025,6 +956,7 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
/**
* Gets branched application with the right permission set based on mode of application
*
* @param defaultApplicationId : default app id
* @param branchName : branch name of the application
* @param mode : is it edit mode or view mode

View File

@ -1,5 +1,7 @@
package com.appsmith.server.applications.base;
import com.appsmith.server.artifacts.base.artifactbased.ArtifactBasedService;
import com.appsmith.server.domains.Application;
import com.appsmith.server.repositories.ApplicationRepository;
import com.appsmith.server.repositories.NewActionRepository;
import com.appsmith.server.services.AnalyticsService;
@ -20,7 +22,8 @@ import org.springframework.stereotype.Service;
@Slf4j
@Service
public class ApplicationServiceImpl extends ApplicationServiceCECompatibleImpl implements ApplicationService {
public class ApplicationServiceImpl extends ApplicationServiceCECompatibleImpl
implements ApplicationService, ArtifactBasedService<Application> {
public ApplicationServiceImpl(
Validator validator,

View File

@ -0,0 +1,3 @@
package com.appsmith.server.artifacts.base;
public interface ArtifactService extends ArtifactServiceCE {}

View File

@ -0,0 +1,24 @@
package com.appsmith.server.artifacts.base;
import com.appsmith.server.artifacts.base.artifactbased.ArtifactBasedService;
import com.appsmith.server.constants.ArtifactType;
import com.appsmith.server.domains.Artifact;
import com.appsmith.server.domains.GitAuth;
import reactor.core.publisher.Mono;
public interface ArtifactServiceCE {
/**
* This method returns the appropriate ArtifactBasedService based on the type of artifact.
*/
ArtifactBasedService<? extends Artifact> getArtifactBasedService(ArtifactType artifactType);
/**
* Generate SSH private and public keys required to communicate with remote. Keys will be stored only in the
* default/root application only and not the child branched application. This decision is taken because the combined
* size of keys is close to 4kB
*
* @return public key which will be used by user to copy to relevant platform
*/
Mono<GitAuth> createOrUpdateSshKeyPair(ArtifactType artifactType, String branchedArtifactId, String keyType);
}

View File

@ -0,0 +1,116 @@
package com.appsmith.server.artifacts.base;
import com.appsmith.external.constants.AnalyticsEvents;
import com.appsmith.server.artifacts.base.artifactbased.ArtifactBasedService;
import com.appsmith.server.artifacts.permissions.ArtifactPermission;
import com.appsmith.server.constants.ArtifactType;
import com.appsmith.server.constants.FieldName;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.ApplicationMode;
import com.appsmith.server.domains.Artifact;
import com.appsmith.server.domains.GitArtifactMetadata;
import com.appsmith.server.domains.GitAuth;
import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.helpers.GitDeployKeyGenerator;
import com.appsmith.server.services.AnalyticsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Mono;
import java.util.Map;
@Slf4j
@Service
public class ArtifactServiceCEImpl implements ArtifactServiceCE {
protected final ArtifactBasedService<Application> applicationService;
private final AnalyticsService analyticsService;
public ArtifactServiceCEImpl(
ArtifactBasedService<Application> applicationService, AnalyticsService analyticsService) {
this.applicationService = applicationService;
this.analyticsService = analyticsService;
}
@Override
public ArtifactBasedService<? extends Artifact> getArtifactBasedService(ArtifactType artifactType) {
return applicationService;
}
@Override
public Mono<GitAuth> createOrUpdateSshKeyPair(
ArtifactType artifactType, String branchedArtifactId, String keyType) {
GitAuth gitAuth = GitDeployKeyGenerator.generateSSHKey(keyType);
ArtifactBasedService<? extends Artifact> artifactBasedService = getArtifactBasedService(artifactType);
ArtifactPermission artifactPermission = artifactBasedService.getPermissionService();
final String artifactTypeName = artifactType.name().toLowerCase();
return artifactBasedService
.findById(branchedArtifactId, artifactPermission.getEditPermission())
.switchIfEmpty(Mono.error(
new AppsmithException(AppsmithError.NO_RESOURCE_FOUND, artifactTypeName, branchedArtifactId)))
.flatMap(artifact -> {
GitArtifactMetadata gitData = artifact.getGitArtifactMetadata();
// Check if the current artifact is the root artifact
if (gitData != null
&& StringUtils.hasLength(gitData.getDefaultArtifactId())
&& branchedArtifactId.equals(gitData.getDefaultArtifactId())) {
// This is the root application with update SSH key request
gitAuth.setRegeneratedKey(true);
gitData.setGitAuth(gitAuth);
return artifactBasedService.save(artifact);
} else if (gitData == null) {
// This is a root application with generate SSH key request
GitArtifactMetadata gitArtifactMetadata = new GitArtifactMetadata();
gitArtifactMetadata.setDefaultApplicationId(branchedArtifactId);
gitArtifactMetadata.setGitAuth(gitAuth);
artifact.setGitArtifactMetadata(gitArtifactMetadata);
return artifactBasedService.save(artifact);
}
// Children application with update SSH key request for root application
// Fetch root application and then make updates. We are storing the git metadata only in root
// application
if (!StringUtils.hasLength(gitData.getDefaultArtifactId())) {
return Mono.error(new AppsmithException(
AppsmithError.INVALID_GIT_CONFIGURATION,
"Unable to find root " + artifactTypeName + ", please connect your " + artifactTypeName
+ " to remote repo to resolve this issue."));
}
gitAuth.setRegeneratedKey(true);
return artifactBasedService
.findById(gitData.getDefaultArtifactId(), artifactPermission.getEditPermission())
.flatMap(baseApplication -> {
GitArtifactMetadata gitArtifactMetadata = baseApplication.getGitArtifactMetadata();
gitArtifactMetadata.setDefaultApplicationId(baseApplication.getId());
gitArtifactMetadata.setGitAuth(gitAuth);
baseApplication.setGitArtifactMetadata(gitArtifactMetadata);
return artifactBasedService.save(baseApplication);
});
})
.flatMap(artifact -> {
// Send generate SSH key analytics event
assert artifact.getId() != null;
final Map<String, Object> eventData = Map.of(
FieldName.APP_MODE, ApplicationMode.EDIT.toString(), FieldName.APPLICATION, artifact);
final Map<String, Object> data = Map.of(
FieldName.APPLICATION_ID,
artifact.getId(),
"organizationId",
artifact.getWorkspaceId(),
"isRegeneratedKey",
gitAuth.isRegeneratedKey(),
FieldName.EVENT_DATA,
eventData);
return analyticsService
.sendObjectEvent(AnalyticsEvents.GENERATE_SSH_KEY, artifact, data)
.onErrorResume(e -> {
log.warn("Error sending ssh key generation data point", e);
return Mono.just(artifact);
});
})
.thenReturn(gitAuth);
}
}

View File

@ -0,0 +1,15 @@
package com.appsmith.server.artifacts.base;
import com.appsmith.server.artifacts.base.artifactbased.ArtifactBasedService;
import com.appsmith.server.domains.Application;
import com.appsmith.server.services.AnalyticsService;
import org.springframework.stereotype.Service;
@Service
public class ArtifactServiceImpl extends ArtifactServiceCEImpl implements ArtifactService {
public ArtifactServiceImpl(
ArtifactBasedService<Application> applicationService, AnalyticsService analyticsService) {
super(applicationService, analyticsService);
}
}

View File

@ -0,0 +1,5 @@
package com.appsmith.server.artifacts.base.artifactbased;
import com.appsmith.server.domains.Artifact;
public interface ArtifactBasedService<T extends Artifact> extends ArtifactBasedServiceCE<T> {}

View File

@ -0,0 +1,15 @@
package com.appsmith.server.artifacts.base.artifactbased;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.artifacts.permissions.ArtifactPermission;
import com.appsmith.server.domains.Artifact;
import reactor.core.publisher.Mono;
public interface ArtifactBasedServiceCE<T extends Artifact> {
Mono<T> findById(String id, AclPermission aclPermission);
Mono<T> save(Artifact artifact);
ArtifactPermission getPermissionService();
}

View File

@ -0,0 +1,3 @@
package com.appsmith.server.artifacts.permissions;
public interface ArtifactPermission extends ArtifactPermissionCE {}

View File

@ -1,9 +1,11 @@
package com.appsmith.server.solutions.ce;
package com.appsmith.server.artifacts.permissions;
import com.appsmith.server.acl.AclPermission;
public interface ArtifactPermissionCE {
AclPermission getEditPermission();
AclPermission getDeletePermission();
AclPermission getGitConnectPermission();

View File

@ -1,6 +1,7 @@
package com.appsmith.server.controllers;
import com.appsmith.server.applications.base.ApplicationService;
import com.appsmith.server.artifacts.base.ArtifactService;
import com.appsmith.server.constants.Url;
import com.appsmith.server.controllers.ce.ApplicationControllerCE;
import com.appsmith.server.exports.internal.ExportService;
@ -22,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
public class ApplicationController extends ApplicationControllerCE {
public ApplicationController(
ArtifactService artifactService,
ApplicationService service,
ApplicationPageService applicationPageService,
UserReleaseNotes userReleaseNotes,
@ -33,6 +35,7 @@ public class ApplicationController extends ApplicationControllerCE {
ImportService importService,
ExportService exportService) {
super(
artifactService,
service,
applicationPageService,
userReleaseNotes,

View File

@ -3,6 +3,8 @@ package com.appsmith.server.controllers.ce;
import com.appsmith.external.models.Datasource;
import com.appsmith.external.views.Views;
import com.appsmith.server.applications.base.ApplicationService;
import com.appsmith.server.artifacts.base.ArtifactService;
import com.appsmith.server.constants.ArtifactType;
import com.appsmith.server.constants.FieldName;
import com.appsmith.server.constants.Url;
import com.appsmith.server.domains.Application;
@ -62,6 +64,7 @@ import static com.appsmith.server.constants.ArtifactType.APPLICATION;
@RequiredArgsConstructor
public class ApplicationControllerCE {
protected final ArtifactService artifactService;
protected final ApplicationService service;
private final ApplicationPageService applicationPageService;
private final UserReleaseNotes userReleaseNotes;
@ -248,7 +251,8 @@ public class ApplicationControllerCE {
@PostMapping("/ssh-keypair/{branchedApplicationId}")
public Mono<ResponseDTO<GitAuth>> generateSSHKeyPair(
@PathVariable String branchedApplicationId, @RequestParam(required = false) String keyType) {
return service.createOrUpdateSshKeyPair(branchedApplicationId, keyType)
return artifactService
.createOrUpdateSshKeyPair(ArtifactType.APPLICATION, branchedApplicationId, keyType)
.map(created -> new ResponseDTO<>(HttpStatus.CREATED.value(), created, null));
}

View File

@ -1,9 +1,9 @@
package com.appsmith.server.helpers;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.artifacts.permissions.ArtifactPermission;
import com.appsmith.server.helpers.ce.ImportArtifactPermissionProviderCE;
import com.appsmith.server.solutions.ActionPermission;
import com.appsmith.server.solutions.ArtifactPermission;
import com.appsmith.server.solutions.ContextPermission;
import com.appsmith.server.solutions.DatasourcePermission;
import com.appsmith.server.solutions.WorkspacePermission;

View File

@ -3,13 +3,13 @@ package com.appsmith.server.helpers.ce;
import com.appsmith.external.models.BaseDomain;
import com.appsmith.external.models.Datasource;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.artifacts.permissions.ArtifactPermission;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.NewAction;
import com.appsmith.server.domains.NewPage;
import com.appsmith.server.domains.Workspace;
import com.appsmith.server.solutions.ActionPermission;
import com.appsmith.server.solutions.ApplicationPermission;
import com.appsmith.server.solutions.ArtifactPermission;
import com.appsmith.server.solutions.ContextPermission;
import com.appsmith.server.solutions.DatasourcePermission;
import com.appsmith.server.solutions.WorkspacePermission;

View File

@ -1,5 +0,0 @@
package com.appsmith.server.solutions;
import com.appsmith.server.solutions.ce.ArtifactPermissionCE;
public interface ArtifactPermission extends ArtifactPermissionCE {}

View File

@ -1,7 +1,7 @@
package com.appsmith.server.solutions.ce;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.solutions.ArtifactPermission;
import com.appsmith.server.artifacts.permissions.ArtifactPermission;
public interface ApplicationPermissionCE extends ArtifactPermission {

View File

@ -1,27 +1,13 @@
package com.appsmith.server.controllers;
import com.appsmith.server.applications.base.ApplicationService;
import com.appsmith.server.configurations.ProjectProperties;
import com.appsmith.server.configurations.RedisTestContainerConfig;
import com.appsmith.server.configurations.SecurityTestConfig;
import com.appsmith.server.constants.Url;
import com.appsmith.server.dtos.ApplicationImportDTO;
import com.appsmith.server.dtos.ArtifactImportDTO;
import com.appsmith.server.exceptions.AppsmithErrorCode;
import com.appsmith.server.exports.internal.ExportService;
import com.appsmith.server.exports.internal.partial.PartialExportService;
import com.appsmith.server.fork.internal.ApplicationForkingService;
import com.appsmith.server.helpers.CommonGitFileUtils;
import com.appsmith.server.helpers.RedisUtils;
import com.appsmith.server.imports.internal.ImportService;
import com.appsmith.server.imports.internal.partial.PartialImportService;
import com.appsmith.server.services.AnalyticsService;
import com.appsmith.server.services.ApplicationPageService;
import com.appsmith.server.services.ApplicationSnapshotService;
import com.appsmith.server.services.SessionUserService;
import com.appsmith.server.services.UserDataService;
import com.appsmith.server.solutions.UserReleaseNotes;
import com.appsmith.server.themes.base.ThemeService;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.mockito.stubbing.Answer;
@ -49,51 +35,10 @@ import static org.mockito.ArgumentMatchers.any;
@EnableAutoConfiguration(exclude = ReactiveMultipartAutoConfiguration.class)
@Import({SecurityTestConfig.class, RedisUtils.class, RedisTestContainerConfig.class})
public class ApplicationControllerTest {
@MockBean
ApplicationService applicationService;
@MockBean
ApplicationPageService applicationPageService;
@MockBean
UserReleaseNotes applicationFetcher;
@MockBean
ApplicationForkingService applicationForkingService;
@MockBean
ImportService importService;
@MockBean
ExportService exportService;
@MockBean
ApplicationSnapshotService applicationSnapshotService;
@MockBean
ThemeService themeService;
@MockBean
UserDataService userDataService;
@MockBean
AnalyticsService analyticsService;
@MockBean
CommonGitFileUtils commonGitFileUtils;
@MockBean
SessionUserService sessionUserService;
@MockBean
PartialExportService partialExportService;
@MockBean
PartialImportService partialImportService;
@MockBean
ProjectProperties projectProperties;
@Autowired
private WebTestClient webTestClient;

View File

@ -78,7 +78,7 @@ public class AutoCommitServiceTest {
@MockBean
DSLMigrationUtils dslMigrationUtils;
@MockBean
@SpyBean
ApplicationService applicationService;
@MockBean
@ -201,12 +201,13 @@ public class AutoCommitServiceTest {
baseRepoSuffix = Paths.get(WORKSPACE_ID, DEFAULT_APP_ID, REPO_NAME);
// used for fetching application on autocommit service and gitAutoCommitHelper.autocommit
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(testApplication));
Mockito.doReturn(Mono.just(testApplication))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
Mockito.when(applicationService.findById(anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(testApplication));
Mockito.doReturn(Mono.just(testApplication))
.when(applicationService)
.findById(anyString(), any(AclPermission.class));
// create page-dto
PageDTO pageDTO = createPageDTO();
@ -224,8 +225,9 @@ public class AutoCommitServiceTest {
.when(gitExecutor)
.pushApplication(baseRepoSuffix, REPO_URL, PUBLIC_KEY, PRIVATE_KEY, BRANCH_NAME);
Mockito.when(applicationService.findById(anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(testApplication));
Mockito.doReturn(Mono.just(testApplication))
.when(applicationService)
.findById(anyString(), any(AclPermission.class));
Mockito.when(gitPrivateRepoHelper.isBranchProtected(any(), anyString())).thenReturn(Mono.just(FALSE));
@ -480,12 +482,13 @@ public class AutoCommitServiceTest {
public void testAutoCommit_whenNoGitMetadata_returnsNonGitApp() {
testApplication.setGitApplicationMetadata(null);
// used for fetching application on autocommit service and gitAutoCommitHelper.autocommit
Mockito.when(applicationService.findById(anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(testApplication));
Mockito.doReturn(Mono.just(testApplication))
.when(applicationService)
.findById(anyString(), any(AclPermission.class));
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(testApplication));
Mockito.doReturn(Mono.just(testApplication))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
// this would not trigger autocommit
Mono<AutoCommitResponseDTO> autoCommitResponseDTOMono =

View File

@ -44,7 +44,7 @@ public class GitAutoCommitHelperImplTest {
@MockBean
AutoCommitEventHandler autoCommitEventHandler;
@MockBean
@SpyBean
ApplicationService applicationService;
@MockBean
@ -81,13 +81,14 @@ public class GitAutoCommitHelperImplTest {
application.setId(defaultApplicationId);
application.setGitApplicationMetadata(new GitArtifactMetadata());
Mockito.when(applicationService.findById(defaultApplicationId, applicationPermission.getEditPermission()))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findById(defaultApplicationId, applicationPermission.getEditPermission());
Mockito.when(gitPrivateRepoHelper.isBranchProtected(any(GitArtifactMetadata.class), eq(branchName)))
.thenReturn(Mono.just(Boolean.TRUE));
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
StepVerifier.create(gitAutoCommitHelper.autoCommitClientMigration(defaultApplicationId, branchName))
.assertNext(aBoolean -> {
@ -105,11 +106,12 @@ public class GitAutoCommitHelperImplTest {
metadata.getAutoCommitConfig().setEnabled(Boolean.FALSE);
application.setGitApplicationMetadata(metadata);
Mockito.when(applicationService.findById(defaultApplicationId, applicationPermission.getEditPermission()))
.thenReturn(Mono.just(application));
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findById(defaultApplicationId, applicationPermission.getEditPermission());
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
Mockito.when(gitPrivateRepoHelper.isBranchProtected(any(GitArtifactMetadata.class), eq(branchName)))
.thenReturn(Mono.just(Boolean.FALSE));
@ -126,13 +128,14 @@ public class GitAutoCommitHelperImplTest {
application.setId(defaultApplicationId);
application.setGitApplicationMetadata(new GitArtifactMetadata());
Mockito.when(applicationService.findById(defaultApplicationId, applicationPermission.getEditPermission()))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findById(defaultApplicationId, applicationPermission.getEditPermission());
Mockito.when(gitPrivateRepoHelper.isBranchProtected(any(GitArtifactMetadata.class), eq(branchName)))
.thenReturn(Mono.just(Boolean.FALSE));
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
Mono<Boolean> autoCommitMono = redisUtils
.startAutoCommit(defaultApplicationId, branchName)
@ -158,11 +161,12 @@ public class GitAutoCommitHelperImplTest {
metaData.setGitAuth(gitAuth);
application.setGitApplicationMetadata(metaData);
Mockito.when(applicationService.findById(defaultApplicationId, applicationPermission.getEditPermission()))
.thenReturn(Mono.just(application));
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findById(defaultApplicationId, applicationPermission.getEditPermission());
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
Mockito.when(commonGitService.fetchRemoteChanges(any(Application.class), any(Application.class), anyBoolean()))
.thenReturn(Mono.just(branchTrackingStatus));
@ -256,11 +260,12 @@ public class GitAutoCommitHelperImplTest {
metadata.getAutoCommitConfig().setEnabled(Boolean.TRUE);
application.setGitApplicationMetadata(metadata);
Mockito.when(applicationService.findById(defaultApplicationId, applicationPermission.getEditPermission()))
.thenReturn(Mono.just(application));
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findById(defaultApplicationId, applicationPermission.getEditPermission());
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
Mockito.when(commonGitService.fetchRemoteChanges(any(Application.class), any(Application.class), anyBoolean()))
.thenReturn(Mono.just(branchTrackingStatus));
@ -291,12 +296,13 @@ public class GitAutoCommitHelperImplTest {
application.setGitApplicationMetadata(metaData);
Mockito.when(applicationService.findById(anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findById(anyString(), any(AclPermission.class));
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
Mockito.when(commonGitService.fetchRemoteChanges(any(Application.class), any(Application.class), anyBoolean()))
.thenReturn(Mono.just(branchTrackingStatus));
@ -335,12 +341,13 @@ public class GitAutoCommitHelperImplTest {
metaData.setGitAuth(gitAuth);
application.setGitApplicationMetadata(metaData);
Mockito.when(applicationService.findById(anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findById(anyString(), any(AclPermission.class));
Mockito.when(applicationService.findByBranchNameAndBaseApplicationId(
anyString(), anyString(), any(AclPermission.class)))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findByBranchNameAndBaseApplicationId(anyString(), anyString(), any(AclPermission.class));
StepVerifier.create(gitAutoCommitHelper.autoCommitServerMigration(defaultApplicationId, branchName))
.assertNext(isAutoCommitPublished -> {

View File

@ -66,7 +66,7 @@ class RefactoringServiceCEImplTest {
@MockBean
private UpdateLayoutService updateLayoutService;
@MockBean
@SpyBean
private ApplicationService applicationService;
@MockBean
@ -161,7 +161,7 @@ class RefactoringServiceCEImplTest {
Application application = new Application();
application.setId("testAppId");
application.setEvaluationVersion(EVALUATION_VERSION);
Mockito.when(applicationService.findById(Mockito.anyString())).thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application)).when(applicationService).findById(Mockito.anyString());
Mockito.when(newActionService.findByPageIdAndViewMode(Mockito.anyString(), Mockito.anyBoolean(), Mockito.any()))
.thenReturn(Flux.empty());
@ -287,7 +287,7 @@ class RefactoringServiceCEImplTest {
Application application = new Application();
application.setId("testAppId");
application.setEvaluationVersion(EVALUATION_VERSION);
Mockito.when(applicationService.findById(Mockito.anyString())).thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application)).when(applicationService).findById(Mockito.anyString());
NewAction newAction = new NewAction();
ActionDTO actionDTO = new ActionDTO();

View File

@ -14,6 +14,8 @@ import com.appsmith.external.plugins.PluginExecutor;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.actioncollections.base.ActionCollectionService;
import com.appsmith.server.applications.base.ApplicationService;
import com.appsmith.server.artifacts.base.ArtifactService;
import com.appsmith.server.constants.ArtifactType;
import com.appsmith.server.constants.FieldName;
import com.appsmith.server.datasources.base.DatasourceService;
import com.appsmith.server.domains.ActionCollection;
@ -176,6 +178,9 @@ public class ApplicationServiceCETest {
static Application gitConnectedApp = new Application();
@Autowired
ArtifactService artifactService;
@Autowired
ApplicationService applicationService;
@ -3514,8 +3519,8 @@ public class ApplicationServiceCETest {
Mono<Application> applicationMono = applicationPageService
.createApplication(unsavedApplication)
.flatMap(savedApplication -> applicationService
.createOrUpdateSshKeyPair(savedApplication.getId(), null)
.flatMap(savedApplication -> artifactService
.createOrUpdateSshKeyPair(ArtifactType.APPLICATION, savedApplication.getId(), null)
.thenReturn(savedApplication.getId()))
.flatMap(testApplicationId -> applicationRepository.findById(testApplicationId, MANAGE_APPLICATIONS));
@ -3544,8 +3549,8 @@ public class ApplicationServiceCETest {
.createApplication(unsavedMainApp, workspaceId)
.block();
Mono<Tuple2<Application, Application>> tuple2Mono = applicationService
.createOrUpdateSshKeyPair(savedApplication.getId(), null)
Mono<Tuple2<Application, Application>> tuple2Mono = artifactService
.createOrUpdateSshKeyPair(ArtifactType.APPLICATION, savedApplication.getId(), null)
.thenReturn(savedApplication)
.flatMap(savedMainApp -> {
Application unsavedChildApp = new Application();
@ -3555,8 +3560,8 @@ public class ApplicationServiceCETest {
unsavedChildApp.setWorkspaceId(workspaceId);
return applicationPageService.createApplication(unsavedChildApp, workspaceId);
})
.flatMap(savedChildApp -> applicationService
.createOrUpdateSshKeyPair(savedChildApp.getId(), null)
.flatMap(savedChildApp -> artifactService
.createOrUpdateSshKeyPair(ArtifactType.APPLICATION, savedChildApp.getId(), null)
.thenReturn(savedChildApp))
.flatMap(savedChildApp -> {
// fetch and return both child and main applications

View File

@ -24,6 +24,7 @@ import org.mockito.stubbing.Answer;
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 reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
@ -41,7 +42,7 @@ import static org.mockito.ArgumentMatchers.eq;
@SpringBootTest
public class ApplicationSnapshotServiceUnitTest {
@MockBean
@SpyBean
ApplicationService applicationService;
@MockBean
@ -82,9 +83,9 @@ public class ApplicationSnapshotServiceUnitTest {
ApplicationJson applicationJson = new ApplicationJson();
applicationJson.setPageList(List.of(newPage));
Mockito.when(applicationService.findBranchedApplicationId(
branchName, defaultAppId, AclPermission.MANAGE_APPLICATIONS))
.thenReturn(Mono.just(branchedAppId));
Mockito.doReturn(Mono.just(branchedAppId))
.when(applicationService)
.findBranchedApplicationId(branchName, defaultAppId, AclPermission.MANAGE_APPLICATIONS);
Mockito.when(exportService.exportByArtifactId(
branchedAppId, SerialiseArtifactObjective.VERSION_CONTROL, ArtifactType.APPLICATION))
@ -119,8 +120,9 @@ public class ApplicationSnapshotServiceUnitTest {
application.setWorkspaceId(workspaceId);
application.setId(branchedAppId);
Mockito.when(applicationService.findById(branchedAppId, AclPermission.MANAGE_APPLICATIONS))
.thenReturn(Mono.just(application));
Mockito.doReturn(Mono.just(application))
.when(applicationService)
.findById(branchedAppId, AclPermission.MANAGE_APPLICATIONS);
ApplicationJson applicationJson = new ApplicationJson();
applicationJson.setExportedApplication(application);

View File

@ -107,7 +107,7 @@ class ActionExecutionSolutionCEImplTest {
@MockBean
NewPageService newPageService;
@MockBean
@SpyBean
ApplicationService applicationService;
@SpyBean