fix: Use Appsmith user profile as a fallback git profile (#9821)

* Added appsmith profile as a fallback value

* Modified TC for userData to include git profile TCs

* Added check for null value when user want to use repo level profile and provide empty author name or email

* Refactor method names
This commit is contained in:
Abhijeet 2021-12-18 21:36:25 +05:30 committed by GitHub
parent e3732dcb55
commit 5e6e6caedb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 188 additions and 134 deletions

View File

@ -46,7 +46,7 @@ public class GitControllerCE {
@PostMapping("/profile/default")
public Mono<ResponseDTO<Map<String, GitProfile>>> saveGitProfile(@RequestBody GitProfile gitProfile) {
//Add to the userData object - git config data
log.debug("Going to add default git profile for user");
return service.updateOrCreateGitProfileForCurrentUser(gitProfile)
.map(response -> new ResponseDTO<>(HttpStatus.OK.value(), response, null));
}
@ -54,14 +54,14 @@ public class GitControllerCE {
@PutMapping("/profile/{defaultApplicationId}")
public Mono<ResponseDTO<Map<String, GitProfile>>> saveGitProfile(@PathVariable String defaultApplicationId,
@RequestBody GitProfile gitProfile) {
// Add to the userData object - git config data
log.debug("Going to add repo specific git profile for application: {}", defaultApplicationId);
return service.updateOrCreateGitProfileForCurrentUser(gitProfile, defaultApplicationId)
.map(response -> new ResponseDTO<>(HttpStatus.ACCEPTED.value(), response, null));
}
@GetMapping("/profile/default")
public Mono<ResponseDTO<GitProfile>> getDefaultGitConfigForUser() {
return service.getGitProfileForUser()
return service.getDefaultGitProfileOrCreateIfEmpty()
.map(gitConfigResponse -> new ResponseDTO<>(HttpStatus.OK.value(), gitConfigResponse, null));
}

View File

@ -22,7 +22,7 @@ public interface GitServiceCE {
Mono<Map<String, GitProfile>> updateOrCreateGitProfileForCurrentUser(GitProfile gitProfile, String defaultApplicationId);
Mono<GitProfile> getGitProfileForUser();
Mono<GitProfile> getDefaultGitProfileOrCreateIfEmpty();
Mono<GitProfile> getGitProfileForUser(String defaultApplicationId);

View File

@ -148,24 +148,33 @@ public class GitServiceCEImpl implements GitServiceCE {
@Override
public Mono<Map<String, GitProfile>> updateOrCreateGitProfileForCurrentUser(GitProfile gitProfile, String defaultApplicationId) {
if(gitProfile.getAuthorName() == null || gitProfile.getAuthorName().length() == 0) {
// Throw error in following situations:
// 1. Updating or creating global git profile (defaultApplicationId = "default") and update is made with empty
// authorName or authorEmail
// 2. Updating or creating repo specific profile and user want to use repo specific profile but provided empty
// values for authorName and email
if((DEFAULT.equals(defaultApplicationId) || Boolean.FALSE.equals(gitProfile.getUseGlobalProfile()))
&& StringUtils.isEmptyOrNull(gitProfile.getAuthorName())
) {
return Mono.error( new AppsmithException(AppsmithError.INVALID_PARAMETER, "Author Name"));
} else if(gitProfile.getAuthorEmail() == null || gitProfile.getAuthorEmail().length() == 0) {
} else if((DEFAULT.equals(defaultApplicationId) || Boolean.FALSE.equals(gitProfile.getUseGlobalProfile()))
&& StringUtils.isEmptyOrNull(gitProfile.getAuthorEmail())
) {
return Mono.error( new AppsmithException(AppsmithError.INVALID_PARAMETER, "Author Email"));
} else if (StringUtils.isEmptyOrNull(defaultApplicationId)) {
return Mono.error( new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.APPLICATION_ID));
}
if (StringUtils.equalsIgnoreCase(DEFAULT, defaultApplicationId)) {
gitProfile.setUseGlobalProfile(Boolean.TRUE);
if (DEFAULT.equals(defaultApplicationId)) {
gitProfile.setUseGlobalProfile(null);
} else if (!Boolean.TRUE.equals(gitProfile.getUseGlobalProfile())) {
gitProfile.setUseGlobalProfile(Boolean.FALSE);
}
return sessionUserService.getCurrentUser()
.flatMap(user -> userService.findByEmail(user.getEmail()))
.flatMap(user -> userDataService
.getForUser(user.getId())
.flatMap(user -> userDataService.getForUser(user.getId())
.flatMap(userData -> {
// GitProfiles will be null if the user has not created any git profile.
GitProfile savedProfile = userData.getGitProfileByKey(defaultApplicationId);
@ -179,9 +188,8 @@ public class GitServiceCEImpl implements GitServiceCE {
}
return Mono.just(userData.getGitProfiles());
})
.filter(profiles -> !CollectionUtils.isNullOrEmpty(profiles))
.switchIfEmpty(Mono.defer(() -> {
// If profiles are empty use Appsmith's user details as git default profile
// If profiles are empty use Appsmith's user profile as git default profile
GitProfile profile = new GitProfile();
String authorName = StringUtils.isEmptyOrNull(user.getName()) ? user.getUsername() : user.getName();
@ -194,19 +202,27 @@ public class GitServiceCEImpl implements GitServiceCE {
.map(UserData::getGitProfiles);
})
)
.filter(profiles -> !CollectionUtils.isNullOrEmpty(profiles))
);
}
@Override
public Mono<Map<String, GitProfile>> updateOrCreateGitProfileForCurrentUser(GitProfile gitProfile) {
gitProfile.setUseGlobalProfile(true);
gitProfile.setUseGlobalProfile(null);
return updateOrCreateGitProfileForCurrentUser(gitProfile, DEFAULT);
}
@Override
public Mono<GitProfile> getGitProfileForUser() {
// Get default git profile
return getGitProfileForUser(DEFAULT);
public Mono<GitProfile> getDefaultGitProfileOrCreateIfEmpty() {
// Get default git profile if the default is empty then use Appsmith profile as a fallback value
return getGitProfileForUser(DEFAULT)
.flatMap(gitProfile -> {
if (StringUtils.isEmptyOrNull(gitProfile.getAuthorName()) || StringUtils.isEmptyOrNull(gitProfile.getAuthorEmail())) {
return updateGitProfileWithAppsmithProfile(DEFAULT);
}
gitProfile.setUseGlobalProfile(null);
return Mono.just(gitProfile);
});
}
@Override
@ -216,11 +232,44 @@ public class GitServiceCEImpl implements GitServiceCE {
GitProfile gitProfile = userData.getGitProfileByKey(defaultApplicationId);
if (gitProfile != null && gitProfile.getUseGlobalProfile() == null) {
gitProfile.setUseGlobalProfile(true);
} else if (gitProfile == null) {
// If the profile is requested for repo specific using the applicationId
GitProfile gitProfile1 = new GitProfile();
gitProfile1.setAuthorName("");
gitProfile1.setAuthorEmail("");
gitProfile1.setUseGlobalProfile(true);
return gitProfile1;
}
return gitProfile;
});
}
private Mono<GitProfile> updateGitProfileWithAppsmithProfile(String key) {
return sessionUserService.getCurrentUser()
.flatMap(user -> userService.findByEmail(user.getEmail()))
.flatMap(currentUser -> {
GitProfile gitProfile = new GitProfile();
String authorName = StringUtils.isEmptyOrNull(currentUser.getName())
? currentUser.getUsername()
: currentUser.getName();
gitProfile.setAuthorEmail(currentUser.getEmail());
gitProfile.setAuthorName(authorName);
gitProfile.setUseGlobalProfile(null);
return userDataService.getForUser(currentUser)
.flatMap(userData -> {
UserData updates = new UserData();
if (CollectionUtils.isNullOrEmpty(userData.getGitProfiles())) {
updates.setGitProfiles(Map.of(key, gitProfile));
} else {
userData.getGitProfiles().put(key, gitProfile);
updates.setGitProfiles(userData.getGitProfiles());
}
return userDataService.updateForUser(currentUser, updates)
.thenReturn(gitProfile);
});
});
}
/**
* This method will make a commit to local repo
* @param commitDTO information required for making a commit
@ -322,7 +371,7 @@ public class GitServiceCEImpl implements GitServiceCE {
GitProfile authorProfile = currentUserData.getGitProfileByKey(gitApplicationData.getDefaultApplicationId());
if (authorProfile == null || authorProfile.getUseGlobalProfile()) {
if (authorProfile == null || Boolean.TRUE.equals(authorProfile.getUseGlobalProfile())) {
// Use default author profile as the fallback value
if (currentUserData.getGitProfileByKey(DEFAULT) != null) {
authorProfile = currentUserData.getGitProfileByKey(DEFAULT);
@ -426,9 +475,7 @@ public class GitServiceCEImpl implements GitServiceCE {
"Unable to find git author configuration for logged-in user. You can set up a git profile from the user profile section."))
);
Mono<Map<String, GitProfile>> profileMono = Boolean.TRUE.equals(gitConnectDTO.getGitProfile().getUseGlobalProfile())
? this.getGitProfileForUser().map(profile -> Map.of(DEFAULT, profile))
: updateOrCreateGitProfileForCurrentUser(gitConnectDTO.getGitProfile(), defaultApplicationId);
Mono<Map<String, GitProfile>> profileMono = updateOrCreateGitProfileForCurrentUser(gitConnectDTO.getGitProfile(), defaultApplicationId);
return profileMono
.switchIfEmpty(Mono.error(new AppsmithException(AppsmithError.INVALID_GIT_CONFIGURATION,
@ -832,7 +879,7 @@ public class GitServiceCEImpl implements GitServiceCE {
return getApplicationById(defaultApplicationId)
.flatMap(application -> {
if (isInvalidDefaultApplicationGitMetadata(application.getGitApplicationMetadata())) {
throw new AppsmithException(AppsmithError.INVALID_GIT_SSH_CONFIGURATION);
return Mono.error(new AppsmithException(AppsmithError.INVALID_GIT_SSH_CONFIGURATION));
}
return applicationService.findByBranchNameAndDefaultApplicationId(
branchName, defaultApplicationId, READ_APPLICATIONS
@ -986,7 +1033,7 @@ public class GitServiceCEImpl implements GitServiceCE {
gitAuth.getPrivateKey(),
gitAuth.getPublicKey())
.onErrorResume(error -> {
if (error.getMessage().contains("Nothing to fetch.")) {
if (error.getMessage().contains("Nothing to fetch")) {
MergeStatusDTO mergeStatus = new MergeStatusDTO();
mergeStatus.setStatus("Nothing to fetch from remote. All changes are up to date.");
mergeStatus.setMergeAble(true);
@ -1463,21 +1510,4 @@ public class GitServiceCEImpl implements GitServiceCE {
);
}
private Mono<Map<String, GitProfile>> fetchGitProfile(UserData userData, String key) {
if (CollectionUtils.isNullOrEmpty(userData.getGitProfiles())) {
return sessionUserService.getCurrentUser()
.map(currentUser -> {
String authorName = StringUtils.isEmptyOrNull(currentUser.getName())
? currentUser.getUsername()
: currentUser.getName();
GitProfile gitProfile = new GitProfile();
gitProfile.setAuthorEmail(currentUser.getEmail());
gitProfile.setAuthorName(authorName);
return Map.of();
});
}
return Mono.just(userData.getGitProfiles());
}
}

View File

@ -15,7 +15,6 @@ import com.appsmith.server.domains.Organization;
import com.appsmith.server.domains.User;
import com.appsmith.server.domains.UserData;
import com.appsmith.server.dtos.GitConnectDTO;
import com.appsmith.server.dtos.GitMergeDTO;
import com.appsmith.server.dtos.GitPullDTO;
import com.appsmith.server.dtos.PageDTO;
import com.appsmith.server.exceptions.AppsmithError;
@ -44,7 +43,6 @@ import java.nio.file.Paths;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.mockito.ArgumentMatchers.eq;
@ -106,77 +104,6 @@ public class GitServiceTest {
return gitConnectDTO;
}
@Test
@WithUserDetails(value = "api_user")
public void saveConfig_gitConfigValues_SaveToUserObject() {
Mockito.when(userService.findByEmail(Mockito.anyString())).thenReturn(Mono.just(new User()));
GitProfile gitGlobalConfigDTO = getConfigRequest("test@appsmith.com", "Test 1");
Mono<Map<String, GitProfile>> gitProfilesMono = gitDataService.updateOrCreateGitProfileForCurrentUser(gitGlobalConfigDTO);
StepVerifier
.create(gitProfilesMono)
.assertNext(gitProfileMap -> {
GitProfile defaultProfile = gitProfileMap.get(DEFAULT_GIT_PROFILE);
assertThat(defaultProfile.getAuthorName()).isEqualTo(gitGlobalConfigDTO.getAuthorName());
assertThat(defaultProfile.getAuthorEmail()).isEqualTo(gitGlobalConfigDTO.getAuthorEmail());
});
}
@Test
@WithUserDetails(value = "api_user")
public void saveConfig_AuthorEmailNull_ThrowInvalidParameterError() {
Mockito.when(userService.findByEmail(Mockito.anyString())).thenReturn(Mono.just(new User()));
GitProfile gitGlobalConfigDTO = getConfigRequest(null, "Test 1");
Mono<Map<String, GitProfile>> userDataMono = gitDataService.updateOrCreateGitProfileForCurrentUser(gitGlobalConfigDTO);
StepVerifier
.create(userDataMono)
.expectErrorMatches(throwable -> throwable instanceof AppsmithException
&& throwable.getMessage().contains(AppsmithError.INVALID_PARAMETER.getMessage("Author Email")))
.verify();
}
@Test
@WithUserDetails(value = "api_user")
public void saveConfig_AuthorNameEmptyString_ThrowInvalidParameterError() {
Mockito.when(userService.findByEmail(Mockito.anyString())).thenReturn(Mono.just(new User()));
GitProfile gitGlobalConfigDTO = getConfigRequest("test@appsmith.com", null);
Mono<Map<String, GitProfile>> userDataMono = gitDataService.updateOrCreateGitProfileForCurrentUser(gitGlobalConfigDTO);
StepVerifier
.create(userDataMono)
.expectErrorMatches(throwable -> throwable instanceof AppsmithException
&& throwable.getMessage().contains(AppsmithError.INVALID_PARAMETER.getMessage("Author Name")))
.verify();
}
@Test
@WithUserDetails(value = "api_user")
public void getConfig_ValueExistsInDB_Success() {
UserData userData = new UserData();
GitProfile gitProfile1 = new GitProfile();
gitProfile1.setAuthorEmail("test@test.com");
gitProfile1.setAuthorName("test");
userData.setGitProfiles(userData.setGitProfileByKey(DEFAULT_GIT_PROFILE, gitProfile1));
User user = new User();
user.setId("userId");
ApplicationJson applicationJson = new ApplicationJson();
applicationJson.setExportedApplication(new Application());
Mockito.when(userService.findByEmail(Mockito.anyString())).thenReturn(Mono.just(user));
Mockito.when(userDataService.getForCurrentUser()).thenReturn(Mono.just(userData));
Mockito.when(userDataService.getForUser(Mockito.anyString())).thenReturn(Mono.just(userData));
Mockito.when(userDataService.updateForUser(Mockito.any(User.class), Mockito.any(UserData.class))).thenReturn(Mono.just(userData));
Mono<GitProfile> gitConfigMono = gitDataService.getGitProfileForUser();
StepVerifier
.create(gitConfigMono)
.assertNext(configData -> {
assertThat(configData.getAuthorName()).isEqualTo(gitProfile1.getAuthorName());
assertThat(configData.getAuthorEmail()).isEqualTo(gitProfile1.getAuthorEmail());
});
}
@Test
@WithUserDetails(value = "api_user")
public void connectApplicationToGit_EmptyRemoteUrl_ThrowInvalidParameterException() {
@ -1069,6 +996,13 @@ public class GitServiceTest {
.thenReturn(Mono.just(Paths.get("")));
Mockito.when(gitFileUtils.reconstructApplicationFromGitRepo(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString()))
.thenReturn(Mono.justOrEmpty(new ApplicationJson()));
Mockito.when(gitExecutor.getStatus(Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(new GitStatusDTO()));
Mockito.when(gitExecutor.fetchRemote(Mockito.any(Path.class), Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean()))
.thenReturn(Mono.just("fetchResult"));
Mockito.when(gitExecutor.pullApplication(
Mockito.any(Path.class),Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString()))
.thenReturn(Mono.just(mergeStatusDTO));
Mono<GitPullDTO> applicationMono = gitDataService.pullApplication(application.getId(), application.getGitApplicationMetadata().getBranchName());
@ -1076,28 +1010,12 @@ public class GitServiceTest {
.create(applicationMono)
.assertNext(gitPullDTO -> {
assertThat(gitPullDTO.getMergeStatus().getStatus()).isEqualTo("Nothing to fetch from remote. All changes are upto date.");
});
}
@Test
@WithUserDetails(value = "api_user")
public void pullChanges_HydrateApplicationToFileSystem_ShowError() throws IOException, GitAPIException {
Application application = createApplicationConnectedToGit("NoChangesInRemotePullException");
Mockito.when(gitFileUtils.saveApplicationToLocalRepo(Mockito.any(Path.class), Mockito.any(ApplicationJson.class), Mockito.anyString()))
.thenReturn(Mono.just(Paths.get("")));
Mockito.when(gitFileUtils.reconstructApplicationFromGitRepo(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString()))
.thenReturn(Mono.justOrEmpty(new ApplicationJson()));
Mono<GitPullDTO> applicationMono = gitDataService.pullApplication(application.getId(), application.getGitApplicationMetadata().getBranchName());
StepVerifier
.create(applicationMono)
.assertNext(gitPullDTO -> {
assertThat(gitPullDTO.getMergeStatus().getStatus()).isEqualTo("Nothing to fetch from remote. All changes are upto date.");
});
})
.verifyComplete();
}
// TODO TCs for merge and merge status needs to be re-written to address all the scenarios
/*
@Test
@WithUserDetails(value = "api_user")
public void isMergeBranch_ConflictingChanges_Success() throws IOException, GitAPIException {
@ -1113,12 +1031,17 @@ public class GitServiceTest {
.thenReturn(Mono.just(Paths.get("")));
Mockito.when(gitExecutor.isMergeBranch(Mockito.any(Path.class), Mockito.anyString(), Mockito.anyString()))
.thenReturn(Mono.just(mergeStatus));
Mockito.when(gitExecutor.getStatus(Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(new GitStatusDTO()));
Mockito.when(gitExecutor.fetchRemote(Mockito.any(Path.class), Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean()))
.thenReturn(Mono.just("fetchResult"));
Mono<MergeStatusDTO> applicationMono = gitDataService.isBranchMergeable(application.getId(), gitMergeDTO);
StepVerifier
.create(applicationMono)
.assertNext(s -> assertThat(s.isMergeAble()));
.assertNext(s -> assertThat(s.isMergeAble()))
.verifyComplete();
}
@ -1136,6 +1059,10 @@ public class GitServiceTest {
.thenReturn(Mono.just(Paths.get("")));
Mockito.when(gitExecutor.isMergeBranch(Mockito.any(Path.class), Mockito.anyString(), Mockito.anyString()))
.thenReturn(Mono.just(mergeStatus));
Mockito.when(gitExecutor.getStatus(Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(new GitStatusDTO()));
Mockito.when(gitExecutor.fetchRemote(Mockito.any(Path.class), Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean()))
.thenReturn(Mono.just("fetchResult"));
Mockito.when(importExportApplicationService.exportApplicationById(Mockito.anyString(), Mockito.any(SerialiseApplicationObjective.class)))
.thenReturn(Mono.just(new ApplicationJson()));
@ -1143,9 +1070,12 @@ public class GitServiceTest {
StepVerifier
.create(applicationMono)
.assertNext(s -> assertThat(s.isMergeAble()));
.assertNext(s -> assertThat(s.isMergeAble()))
.verifyComplete();
}
*/
@Test
@WithUserDetails(value = "api_user")
public void checkoutRemoteBranch_NotPresentInLocal_NewChildApplicationCreated() throws GitAPIException, IOException {

View File

@ -3,13 +3,16 @@ package com.appsmith.server.services;
import com.appsmith.server.constants.CommentOnboardingState;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.Asset;
import com.appsmith.server.domains.GitProfile;
import com.appsmith.server.domains.User;
import com.appsmith.server.domains.UserData;
import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.repositories.ApplicationRepository;
import com.appsmith.server.repositories.AssetRepository;
import com.appsmith.server.repositories.UserDataRepository;
import com.appsmith.server.solutions.UserChangedHandler;
import org.assertj.core.api.AssertionsForClassTypes;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@ -36,6 +39,7 @@ import reactor.util.function.Tuple2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
@ -67,8 +71,13 @@ public class UserDataServiceTest {
@Autowired
private ApplicationRepository applicationRepository;
@Autowired
private GitService gitService;
private Mono<User> userMono;
private static final String DEFAULT_GIT_PROFILE = "default";
@Before
public void setup() {
userMono = userService.findByEmail("usertest@usertest.com");
@ -350,4 +359,89 @@ public class UserDataServiceTest {
assertThat(userData.getCommentOnboardingState()).isEqualTo(CommentOnboardingState.ONBOARDED);
}).verifyComplete();
}
// Git user profile tests
private GitProfile createGitProfile(String commitEmail, String author) {
GitProfile gitProfile = new GitProfile();
gitProfile.setAuthorEmail(commitEmail);
gitProfile.setAuthorName(author);
return gitProfile;
}
@Test
@WithUserDetails(value = "api_user")
public void saveConfig_AuthorEmailNull_ThrowInvalidParameterError() {
GitProfile gitGlobalConfigDTO = createGitProfile(null, "Test 1");
Mono<Map<String, GitProfile>> userDataMono = gitService.updateOrCreateGitProfileForCurrentUser(gitGlobalConfigDTO);
StepVerifier
.create(userDataMono)
.expectErrorMatches(throwable -> throwable instanceof AppsmithException
&& throwable.getMessage().contains(AppsmithError.INVALID_PARAMETER.getMessage("Author Email")))
.verify();
}
@Test
@WithUserDetails(value = "api_user")
public void saveRepoLevelConfig_AuthorEmailNullAndName_SavesGitProfile() {
GitProfile gitProfileDTO = createGitProfile(null, null);
Mono<Map<String, GitProfile>> userDataMono = gitService.updateOrCreateGitProfileForCurrentUser(gitProfileDTO, "defaultAppId");
StepVerifier
.create(userDataMono)
.assertNext(gitProfileMap -> {
AssertionsForClassTypes.assertThat(gitProfileMap).isNotNull();
AssertionsForClassTypes.assertThat(gitProfileMap.get("defaultAppId").getAuthorEmail()).isNullOrEmpty();
AssertionsForClassTypes.assertThat(gitProfileMap.get("defaultAppId").getAuthorName()).isNullOrEmpty();
AssertionsForClassTypes.assertThat(gitProfileDTO.getUseGlobalProfile()).isFalse();
})
.verifyComplete();
}
@Test
@WithUserDetails(value = "api_user")
public void saveConfig_AuthorNameEmptyString_ThrowInvalidParameterError() {
GitProfile gitGlobalConfigDTO = createGitProfile("test@appsmith.com", null);
Mono<Map<String, GitProfile>> userDataMono = gitService.updateOrCreateGitProfileForCurrentUser(gitGlobalConfigDTO);
StepVerifier
.create(userDataMono)
.expectErrorMatches(throwable -> throwable instanceof AppsmithException
&& throwable.getMessage().contains(AppsmithError.INVALID_PARAMETER.getMessage("Author Name")))
.verify();
}
@Test
@WithUserDetails(value = "api_user")
public void getAndUpdateDefaultGitProfile_fallbackValueFromUserProfileIfEmpty_updateWithProfile() {
Mono<GitProfile> gitConfigMono = gitService.getDefaultGitProfileOrCreateIfEmpty();
Mono<User> userData = userDataService.getForCurrentUser()
.flatMap(userData1 -> userService.getById(userData1.getUserId()));
StepVerifier
.create(gitConfigMono.zipWhen(gitProfile -> userData))
.assertNext(tuple -> {
GitProfile gitProfile = tuple.getT1();
User user = tuple.getT2();
assertThat(gitProfile.getAuthorName()).isEqualTo(user.getName());
assertThat(gitProfile.getAuthorEmail()).isEqualTo(user.getEmail());
})
.verifyComplete();
GitProfile gitGlobalConfigDTO = createGitProfile("test@appsmith.com", "Test 1");
Mono<Map<String, GitProfile>> gitProfilesMono = gitService.updateOrCreateGitProfileForCurrentUser(gitGlobalConfigDTO);
StepVerifier
.create(gitProfilesMono)
.assertNext(gitProfileMap -> {
GitProfile defaultProfile = gitProfileMap.get(DEFAULT_GIT_PROFILE);
AssertionsForClassTypes.assertThat(defaultProfile.getAuthorName()).isEqualTo(gitGlobalConfigDTO.getAuthorName());
AssertionsForClassTypes.assertThat(defaultProfile.getAuthorEmail()).isEqualTo(gitGlobalConfigDTO.getAuthorEmail());
})
.verifyComplete();
}
}