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

View File

@ -1,15 +1,17 @@
package com.appsmith.server.applications.base; package com.appsmith.server.applications.base;
import com.appsmith.external.constants.AnalyticsEvents;
import com.appsmith.external.models.ActionDTO; import com.appsmith.external.models.ActionDTO;
import com.appsmith.external.models.Policy; import com.appsmith.external.models.Policy;
import com.appsmith.server.acl.AclPermission; 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.ApplicationConstants;
import com.appsmith.server.constants.Assets; import com.appsmith.server.constants.Assets;
import com.appsmith.server.constants.FieldName; import com.appsmith.server.constants.FieldName;
import com.appsmith.server.domains.Application; import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.ApplicationDetail; import com.appsmith.server.domains.ApplicationDetail;
import com.appsmith.server.domains.ApplicationMode; import com.appsmith.server.domains.ApplicationMode;
import com.appsmith.server.domains.Artifact;
import com.appsmith.server.domains.Asset; import com.appsmith.server.domains.Asset;
import com.appsmith.server.domains.GitArtifactMetadata; import com.appsmith.server.domains.GitArtifactMetadata;
import com.appsmith.server.domains.GitAuth; import com.appsmith.server.domains.GitAuth;
@ -74,7 +76,7 @@ import static com.appsmith.server.helpers.ce.DomainSorter.sortDomainsBasedOnOrde
@Slf4j @Slf4j
@Service @Service
public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository, Application, String> public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository, Application, String>
implements ApplicationServiceCE { implements ApplicationServiceCE, ArtifactBasedServiceCE<Application> {
private final PolicySolution policySolution; private final PolicySolution policySolution;
private final PermissionGroupService permissionGroupService; private final PermissionGroupService permissionGroupService;
@ -165,8 +167,9 @@ 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 * This method is used to fetch all the applications for a given workspaceId. It also sorts the applications based
* on recently used order. * on recently used order.
* For git connected applications only default branched application is returned. * For git connected applications only default branched application is returned.
* @param workspaceId workspaceId for which applications are to be fetched *
* @return Flux of applications * @param workspaceId workspaceId for which applications are to be fetched
* @return Flux of applications
*/ */
@Override @Override
public Flux<Application> findByWorkspaceIdAndBaseApplicationsInRecentlyUsedOrder(String workspaceId) { public Flux<Application> findByWorkspaceIdAndBaseApplicationsInRecentlyUsedOrder(String workspaceId) {
@ -212,7 +215,8 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
} }
@Override @Override
public Mono<Application> save(Application application) { public Mono<Application> save(Artifact artifact) {
Application application = (Application) artifact;
if (!StringUtils.isEmpty(application.getName())) { if (!StringUtils.isEmpty(application.getName())) {
application.setSlug(TextUtils.makeSlug(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); return repository.save(application).flatMap(this::setTransientFields);
} }
@Override
public ArtifactPermission getPermissionService() {
return applicationPermission;
}
@Override @Override
public Mono<Application> create(Application object) { public Mono<Application> create(Application object) {
throw new UnsupportedOperationException( 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 * Method to get the SSH public key
* *
@ -1025,9 +956,10 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
/** /**
* Gets branched application with the right permission set based on mode of application * Gets branched application with the right permission set based on mode of application
*
* @param defaultApplicationId : default app id * @param defaultApplicationId : default app id
* @param branchName : branch name of the application * @param branchName : branch name of the application
* @param mode : is it edit mode or view mode * @param mode : is it edit mode or view mode
* @return : returns a publisher of branched application * @return : returns a publisher of branched application
*/ */
@Override @Override

View File

@ -1,5 +1,7 @@
package com.appsmith.server.applications.base; 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.ApplicationRepository;
import com.appsmith.server.repositories.NewActionRepository; import com.appsmith.server.repositories.NewActionRepository;
import com.appsmith.server.services.AnalyticsService; import com.appsmith.server.services.AnalyticsService;
@ -20,7 +22,8 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
@Service @Service
public class ApplicationServiceImpl extends ApplicationServiceCECompatibleImpl implements ApplicationService { public class ApplicationServiceImpl extends ApplicationServiceCECompatibleImpl
implements ApplicationService, ArtifactBasedService<Application> {
public ApplicationServiceImpl( public ApplicationServiceImpl(
Validator validator, 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; import com.appsmith.server.acl.AclPermission;
public interface ArtifactPermissionCE { public interface ArtifactPermissionCE {
AclPermission getEditPermission();
AclPermission getDeletePermission(); AclPermission getDeletePermission();
AclPermission getGitConnectPermission(); AclPermission getGitConnectPermission();

View File

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

View File

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

View File

@ -1,9 +1,9 @@
package com.appsmith.server.helpers; package com.appsmith.server.helpers;
import com.appsmith.server.acl.AclPermission; import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.artifacts.permissions.ArtifactPermission;
import com.appsmith.server.helpers.ce.ImportArtifactPermissionProviderCE; import com.appsmith.server.helpers.ce.ImportArtifactPermissionProviderCE;
import com.appsmith.server.solutions.ActionPermission; import com.appsmith.server.solutions.ActionPermission;
import com.appsmith.server.solutions.ArtifactPermission;
import com.appsmith.server.solutions.ContextPermission; import com.appsmith.server.solutions.ContextPermission;
import com.appsmith.server.solutions.DatasourcePermission; import com.appsmith.server.solutions.DatasourcePermission;
import com.appsmith.server.solutions.WorkspacePermission; 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.BaseDomain;
import com.appsmith.external.models.Datasource; import com.appsmith.external.models.Datasource;
import com.appsmith.server.acl.AclPermission; import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.artifacts.permissions.ArtifactPermission;
import com.appsmith.server.domains.Application; import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.NewAction; import com.appsmith.server.domains.NewAction;
import com.appsmith.server.domains.NewPage; import com.appsmith.server.domains.NewPage;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.solutions.ActionPermission; import com.appsmith.server.solutions.ActionPermission;
import com.appsmith.server.solutions.ApplicationPermission; import com.appsmith.server.solutions.ApplicationPermission;
import com.appsmith.server.solutions.ArtifactPermission;
import com.appsmith.server.solutions.ContextPermission; import com.appsmith.server.solutions.ContextPermission;
import com.appsmith.server.solutions.DatasourcePermission; import com.appsmith.server.solutions.DatasourcePermission;
import com.appsmith.server.solutions.WorkspacePermission; 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; package com.appsmith.server.solutions.ce;
import com.appsmith.server.acl.AclPermission; import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.solutions.ArtifactPermission; import com.appsmith.server.artifacts.permissions.ArtifactPermission;
public interface ApplicationPermissionCE extends ArtifactPermission { public interface ApplicationPermissionCE extends ArtifactPermission {

View File

@ -1,27 +1,13 @@
package com.appsmith.server.controllers; 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.RedisTestContainerConfig;
import com.appsmith.server.configurations.SecurityTestConfig; import com.appsmith.server.configurations.SecurityTestConfig;
import com.appsmith.server.constants.Url; import com.appsmith.server.constants.Url;
import com.appsmith.server.dtos.ApplicationImportDTO; import com.appsmith.server.dtos.ApplicationImportDTO;
import com.appsmith.server.dtos.ArtifactImportDTO; import com.appsmith.server.dtos.ArtifactImportDTO;
import com.appsmith.server.exceptions.AppsmithErrorCode; 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.helpers.RedisUtils;
import com.appsmith.server.imports.internal.ImportService; 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.junit.jupiter.api.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
@ -49,51 +35,10 @@ import static org.mockito.ArgumentMatchers.any;
@EnableAutoConfiguration(exclude = ReactiveMultipartAutoConfiguration.class) @EnableAutoConfiguration(exclude = ReactiveMultipartAutoConfiguration.class)
@Import({SecurityTestConfig.class, RedisUtils.class, RedisTestContainerConfig.class}) @Import({SecurityTestConfig.class, RedisUtils.class, RedisTestContainerConfig.class})
public class ApplicationControllerTest { public class ApplicationControllerTest {
@MockBean
ApplicationService applicationService;
@MockBean
ApplicationPageService applicationPageService;
@MockBean
UserReleaseNotes applicationFetcher;
@MockBean
ApplicationForkingService applicationForkingService;
@MockBean @MockBean
ImportService importService; 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 @Autowired
private WebTestClient webTestClient; private WebTestClient webTestClient;

View File

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

View File

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

View File

@ -66,7 +66,7 @@ class RefactoringServiceCEImplTest {
@MockBean @MockBean
private UpdateLayoutService updateLayoutService; private UpdateLayoutService updateLayoutService;
@MockBean @SpyBean
private ApplicationService applicationService; private ApplicationService applicationService;
@MockBean @MockBean
@ -161,7 +161,7 @@ class RefactoringServiceCEImplTest {
Application application = new Application(); Application application = new Application();
application.setId("testAppId"); application.setId("testAppId");
application.setEvaluationVersion(EVALUATION_VERSION); 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())) Mockito.when(newActionService.findByPageIdAndViewMode(Mockito.anyString(), Mockito.anyBoolean(), Mockito.any()))
.thenReturn(Flux.empty()); .thenReturn(Flux.empty());
@ -287,7 +287,7 @@ class RefactoringServiceCEImplTest {
Application application = new Application(); Application application = new Application();
application.setId("testAppId"); application.setId("testAppId");
application.setEvaluationVersion(EVALUATION_VERSION); 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(); NewAction newAction = new NewAction();
ActionDTO actionDTO = new ActionDTO(); 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.acl.AclPermission;
import com.appsmith.server.actioncollections.base.ActionCollectionService; import com.appsmith.server.actioncollections.base.ActionCollectionService;
import com.appsmith.server.applications.base.ApplicationService; 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.FieldName;
import com.appsmith.server.datasources.base.DatasourceService; import com.appsmith.server.datasources.base.DatasourceService;
import com.appsmith.server.domains.ActionCollection; import com.appsmith.server.domains.ActionCollection;
@ -176,6 +178,9 @@ public class ApplicationServiceCETest {
static Application gitConnectedApp = new Application(); static Application gitConnectedApp = new Application();
@Autowired
ArtifactService artifactService;
@Autowired @Autowired
ApplicationService applicationService; ApplicationService applicationService;
@ -3514,8 +3519,8 @@ public class ApplicationServiceCETest {
Mono<Application> applicationMono = applicationPageService Mono<Application> applicationMono = applicationPageService
.createApplication(unsavedApplication) .createApplication(unsavedApplication)
.flatMap(savedApplication -> applicationService .flatMap(savedApplication -> artifactService
.createOrUpdateSshKeyPair(savedApplication.getId(), null) .createOrUpdateSshKeyPair(ArtifactType.APPLICATION, savedApplication.getId(), null)
.thenReturn(savedApplication.getId())) .thenReturn(savedApplication.getId()))
.flatMap(testApplicationId -> applicationRepository.findById(testApplicationId, MANAGE_APPLICATIONS)); .flatMap(testApplicationId -> applicationRepository.findById(testApplicationId, MANAGE_APPLICATIONS));
@ -3544,8 +3549,8 @@ public class ApplicationServiceCETest {
.createApplication(unsavedMainApp, workspaceId) .createApplication(unsavedMainApp, workspaceId)
.block(); .block();
Mono<Tuple2<Application, Application>> tuple2Mono = applicationService Mono<Tuple2<Application, Application>> tuple2Mono = artifactService
.createOrUpdateSshKeyPair(savedApplication.getId(), null) .createOrUpdateSshKeyPair(ArtifactType.APPLICATION, savedApplication.getId(), null)
.thenReturn(savedApplication) .thenReturn(savedApplication)
.flatMap(savedMainApp -> { .flatMap(savedMainApp -> {
Application unsavedChildApp = new Application(); Application unsavedChildApp = new Application();
@ -3555,8 +3560,8 @@ public class ApplicationServiceCETest {
unsavedChildApp.setWorkspaceId(workspaceId); unsavedChildApp.setWorkspaceId(workspaceId);
return applicationPageService.createApplication(unsavedChildApp, workspaceId); return applicationPageService.createApplication(unsavedChildApp, workspaceId);
}) })
.flatMap(savedChildApp -> applicationService .flatMap(savedChildApp -> artifactService
.createOrUpdateSshKeyPair(savedChildApp.getId(), null) .createOrUpdateSshKeyPair(ArtifactType.APPLICATION, savedChildApp.getId(), null)
.thenReturn(savedChildApp)) .thenReturn(savedChildApp))
.flatMap(savedChildApp -> { .flatMap(savedChildApp -> {
// fetch and return both child and main applications // 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.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean; 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.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import reactor.test.StepVerifier; import reactor.test.StepVerifier;
@ -41,7 +42,7 @@ import static org.mockito.ArgumentMatchers.eq;
@SpringBootTest @SpringBootTest
public class ApplicationSnapshotServiceUnitTest { public class ApplicationSnapshotServiceUnitTest {
@MockBean @SpyBean
ApplicationService applicationService; ApplicationService applicationService;
@MockBean @MockBean
@ -82,9 +83,9 @@ public class ApplicationSnapshotServiceUnitTest {
ApplicationJson applicationJson = new ApplicationJson(); ApplicationJson applicationJson = new ApplicationJson();
applicationJson.setPageList(List.of(newPage)); applicationJson.setPageList(List.of(newPage));
Mockito.when(applicationService.findBranchedApplicationId( Mockito.doReturn(Mono.just(branchedAppId))
branchName, defaultAppId, AclPermission.MANAGE_APPLICATIONS)) .when(applicationService)
.thenReturn(Mono.just(branchedAppId)); .findBranchedApplicationId(branchName, defaultAppId, AclPermission.MANAGE_APPLICATIONS);
Mockito.when(exportService.exportByArtifactId( Mockito.when(exportService.exportByArtifactId(
branchedAppId, SerialiseArtifactObjective.VERSION_CONTROL, ArtifactType.APPLICATION)) branchedAppId, SerialiseArtifactObjective.VERSION_CONTROL, ArtifactType.APPLICATION))
@ -119,8 +120,9 @@ public class ApplicationSnapshotServiceUnitTest {
application.setWorkspaceId(workspaceId); application.setWorkspaceId(workspaceId);
application.setId(branchedAppId); application.setId(branchedAppId);
Mockito.when(applicationService.findById(branchedAppId, AclPermission.MANAGE_APPLICATIONS)) Mockito.doReturn(Mono.just(application))
.thenReturn(Mono.just(application)); .when(applicationService)
.findById(branchedAppId, AclPermission.MANAGE_APPLICATIONS);
ApplicationJson applicationJson = new ApplicationJson(); ApplicationJson applicationJson = new ApplicationJson();
applicationJson.setExportedApplication(application); applicationJson.setExportedApplication(application);

View File

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