Merge pull request #13420 from appsmithorg/hotfix/git-sync-bug

fix: hotfix/v1.6.22
This commit is contained in:
Anagh Hegde 2022-04-29 15:00:08 +05:30 committed by GitHub
commit 92dba6d81d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 154 additions and 2 deletions

View File

@ -112,9 +112,15 @@ public class ApplicationFetcherCEImpl implements ApplicationFetcherCE {
// Collect all the applications as a map with organization id as a key
Flux<Application> applicationFlux = applicationRepository
.findByMultipleOrganizationIds(orgIds, READ_APPLICATIONS)
// Git connected apps will have gitApplicationMetadat
.filter(application -> application.getGitApplicationMetadata() == null
|| (!StringUtils.isEmpty(application.getGitApplicationMetadata().getDefaultBranchName())
&& application.getGitApplicationMetadata().getBranchName().equals(application.getGitApplicationMetadata().getDefaultBranchName()))
// 1. When the ssh key is generated by user and then the connect app fails
|| (StringUtils.isEmpty(application.getGitApplicationMetadata().getDefaultBranchName())
&& StringUtils.isEmpty(application.getGitApplicationMetadata().getBranchName()))
// 2. When the DefaultBranchName is missing due to branch creation flow failures or corrupted scenarios
|| (!StringUtils.isEmpty(application.getGitApplicationMetadata().getBranchName())
&& application.getGitApplicationMetadata().getBranchName().equals(application.getGitApplicationMetadata().getDefaultBranchName())
)
)
.map(responseUtils::updateApplicationWithDefaultResources);

View File

@ -2,14 +2,18 @@ package com.appsmith.server.solutions;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.ApplicationPage;
import com.appsmith.server.domains.GitApplicationMetadata;
import com.appsmith.server.domains.GitAuth;
import com.appsmith.server.domains.NewPage;
import com.appsmith.server.domains.Organization;
import com.appsmith.server.domains.User;
import com.appsmith.server.domains.UserData;
import com.appsmith.server.dtos.OrganizationApplicationsDTO;
import com.appsmith.server.dtos.PageDTO;
import com.appsmith.server.dtos.UserHomepageDTO;
import com.appsmith.server.helpers.ResponseUtils;
import com.appsmith.server.repositories.ApplicationRepository;
import com.appsmith.server.services.ApplicationService;
import com.appsmith.server.services.NewPageService;
import com.appsmith.server.services.OrganizationService;
import com.appsmith.server.services.SessionUserService;
@ -18,7 +22,9 @@ import com.appsmith.server.services.UserService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import reactor.core.publisher.Flux;
@ -65,6 +71,9 @@ public class ApplicationFetcherUnitTest {
ApplicationFetcher applicationFetcher;
@MockBean
ApplicationService applicationService;
User testUser;
final static String defaultPageId = "defaultPageId";
@ -194,6 +203,9 @@ public class ApplicationFetcherUnitTest {
.thenReturn(updateDefaultPageIdsWithinApplication(application));
}
Mockito.when(applicationService.createOrUpdateSshKeyPair(Mockito.anyString()))
.thenReturn(Mono.just(new GitAuth()));
StepVerifier.create(applicationFetcher.getAllApplications())
.assertNext(userHomepageDTO -> {
List<OrganizationApplicationsDTO> dtos = userHomepageDTO.getOrganizationApplications();
@ -213,6 +225,140 @@ public class ApplicationFetcherUnitTest {
}).verifyComplete();
}
@Test
public void getAllApplications_gitConnectedAppScenarios_OnlyTheDefaultBranchedAppIsReturned() {
initMocks();
// mock the user data to return recently used orgs and apps
UserData userData = new UserData();
Mockito.when(userDataService.getForCurrentUser()).thenReturn(Mono.just(userData));
// mock the list of applications
List<Application> applications = createDummyApplications(4,4);
List<NewPage> pageList = createDummyPages(4, 4);
Mockito.when(applicationRepository.findByMultipleOrganizationIds(
testUser.getOrganizationIds(), READ_APPLICATIONS)
).thenReturn(Flux.fromIterable(applications));
Mockito.when(newPageService.findPageSlugsByApplicationIds(anyList(), eq(READ_PAGES)))
.thenReturn(Flux.fromIterable(pageList));
for (Application application : applications) {
Mockito
.when(responseUtils.updateApplicationWithDefaultResources(application))
.thenReturn(updateDefaultPageIdsWithinApplication(application));
}
Mockito.when(applicationService.createOrUpdateSshKeyPair(Mockito.anyString()))
.thenReturn(Mono.just(new GitAuth()));
StepVerifier.create(applicationFetcher.getAllApplications())
.assertNext(userHomepageDTO -> {
List<OrganizationApplicationsDTO> dtos = userHomepageDTO.getOrganizationApplications();
assertThat(dtos.size()).isEqualTo(4);
for (OrganizationApplicationsDTO dto : dtos) {
assertThat(dto.getApplications().size()).isEqualTo(4);
List<Application> applicationList = dto.getApplications();
for (Application application : applicationList) {
application.getPages().forEach(
page -> assertThat(page.getSlug()).isEqualTo(page.getId()+"-unpublished-slug")
);
application.getPublishedPages().forEach(
page -> assertThat(page.getSlug()).isEqualTo(page.getId()+"-published-slug")
);
}
}
}).verifyComplete();
// Generate SSH keys for an app - to test if the app is visible in home page when the git connect step is aborted in middle
Mockito.when(applicationService.save(Mockito.any(Application.class)))
.thenReturn(Mono.just(new Application()));
Mono<UserHomepageDTO> userHomepageDTOMono = applicationFetcher.getAllApplications()
.flatMap(userHomepageDTO -> {
List<OrganizationApplicationsDTO> dtos = userHomepageDTO.getOrganizationApplications();
List<Application> applicationList = dtos.get(0).getApplications();
return Mono.just(applicationList.get(0));
})
// After choosing the any app randomly to connect to git, Generate keys and stop the process
.flatMap(application -> applicationService.createOrUpdateSshKeyPair(application.getId()))
.then(applicationFetcher.getAllApplications());
StepVerifier.create(userHomepageDTOMono)
.assertNext(userHomepageDTO -> {
List<OrganizationApplicationsDTO> dtos = userHomepageDTO.getOrganizationApplications();
assertThat(dtos.size()).isEqualTo(4);
for (OrganizationApplicationsDTO dto : dtos) {
assertThat(dto.getApplications().size()).isEqualTo(4);
List<Application> applicationList = dto.getApplications();
for (Application application : applicationList) {
application.getPages().forEach(
page -> assertThat(page.getSlug()).isEqualTo(page.getId()+"-unpublished-slug")
);
application.getPublishedPages().forEach(
page -> assertThat(page.getSlug()).isEqualTo(page.getId()+"-published-slug")
);
}
}
}).verifyComplete();
// For connect and create branch flow scenarios where - defaultBranchName is somehow not saved in DB
userHomepageDTOMono = applicationFetcher.getAllApplications()
.flatMap(userHomepageDTO -> {
List<OrganizationApplicationsDTO> dtos = userHomepageDTO.getOrganizationApplications();
List<Application> applicationList = dtos.get(0).getApplications();
return Mono.just(applicationList.get(0));
})
.flatMap(application -> {
// Create a new branched App resource in the same org and verify that branch App does not show up in the response.
Application branchApp = new Application();
branchApp.setName("branched App");
branchApp.setOrganizationId(application.getOrganizationId());
branchApp.setId("org-" + 5 + "-app-" + 5);
GitApplicationMetadata gitApplicationMetadata = new GitApplicationMetadata();
gitApplicationMetadata.setDefaultApplicationId(application.getId());
gitApplicationMetadata.setBranchName("master");
gitApplicationMetadata.setRemoteUrl("remnoteUrl");
branchApp.setGitApplicationMetadata(gitApplicationMetadata);
// Set dummy applicationPages
ApplicationPage unpublishedPage = new ApplicationPage();
unpublishedPage.setId("page" + 5);
unpublishedPage.setDefaultPageId("page" + 5);
unpublishedPage.setIsDefault(true);
ApplicationPage publishedPage = new ApplicationPage();
publishedPage.setId("page" + 5);
publishedPage.setDefaultPageId("page" + 5);
publishedPage.setIsDefault(true);
branchApp.setPages(List.of(unpublishedPage));
branchApp.setPublishedPages(List.of(publishedPage));
applications.add(branchApp);
return applicationService.save(branchApp);
})
.then(applicationFetcher.getAllApplications());
StepVerifier.create(userHomepageDTOMono)
.assertNext(userHomepageDTO -> {
List<OrganizationApplicationsDTO> dtos = userHomepageDTO.getOrganizationApplications();
assertThat(dtos.size()).isEqualTo(4);
for (OrganizationApplicationsDTO dto : dtos) {
assertThat(dto.getApplications().size()).isEqualTo(4);
List<Application> applicationList = dto.getApplications();
for (Application application : applicationList) {
application.getPages().forEach(
page -> assertThat(page.getSlug()).isEqualTo(page.getId()+"-unpublished-slug")
);
application.getPublishedPages().forEach(
page -> assertThat(page.getSlug()).isEqualTo(page.getId()+"-published-slug")
);
}
}
}).verifyComplete();
}
@Test
public void getAllApplications_WhenUserHasRecentOrgAndApp_RecentEntriesComeFirst() {
initMocks();