Improve repository information page (#1636)

Only show relevant information for repository on repository information page. The initialization code example is only shown if the repository is still empty.
This commit is contained in:
Eduard Heimbuch
2021-04-29 18:13:32 +02:00
committed by GitHub
parent 32b268e6f5
commit af8980de19
13 changed files with 442 additions and 116 deletions

View File

@@ -74,7 +74,7 @@ public class GitConfigResourceTest {
@Rule
public ShiroRule shiro = new ShiroRule();
private RestDispatcher dispatcher = new RestDispatcher();
private final RestDispatcher dispatcher = new RestDispatcher();
private final URI baseUri = URI.create("/");
@@ -106,7 +106,7 @@ public class GitConfigResourceTest {
public void prepareEnvironment() {
GitConfig gitConfig = createConfiguration();
when(repositoryHandler.getConfig()).thenReturn(gitConfig);
GitRepositoryConfigResource gitRepositoryConfigResource = new GitRepositoryConfigResource(repositoryConfigMapper, repositoryManager, new GitRepositoryConfigStoreProvider(configurationStoreFactory));
GitRepositoryConfigResource gitRepositoryConfigResource = new GitRepositoryConfigResource(repositoryConfigMapper, repositoryManager, new GitRepositoryConfigStoreProvider(configurationStoreFactory), repositoryHandler);
GitConfigResource gitConfigResource = new GitConfigResource(dtoToConfigMapper, configToDtoMapper, repositoryHandler, of(gitRepositoryConfigResource));
dispatcher.addSingletonResource(gitConfigResource);
when(scmPathInfoStore.get().getApiRestUri()).thenReturn(baseUri);
@@ -251,6 +251,71 @@ public class GitConfigResourceTest {
.isEqualTo("new");
}
@Test
@SubjectAware(username = "readOnly")
public void shouldGetDefaultBranchFromRepoConfig() throws URISyntaxException, UnsupportedEncodingException {
when(repositoryManager.get(new NamespaceAndName("space", "X"))).thenReturn(new Repository("id", "git", "space", "X"));
when(configurationStore.get()).thenReturn(new GitRepositoryConfig("default"));
MockHttpRequest request = MockHttpRequest
.get("/" + GitConfigResource.GIT_CONFIG_PATH_V2 + "/space/X/default-branch")
.contentType(GitVndMediaType.GIT_REPOSITORY_CONFIG);
MockHttpResponse response = new MockHttpResponse();
dispatcher.invoke(request, response);
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
assertEquals("{\"defaultBranch\":\"default\"}", response.getContentAsString());
}
@Test
@SubjectAware(username = "readOnly")
public void shouldGetDefaultBranchFromGlobalConfig() throws URISyntaxException, UnsupportedEncodingException {
when(repositoryManager.get(new NamespaceAndName("space", "X"))).thenReturn(new Repository("id", "git", "space", "X"));
when(configurationStore.get()).thenReturn(new GitRepositoryConfig());
GitConfig globalGitConfig = createConfiguration();
globalGitConfig.setDefaultBranch("global-default");
when(repositoryHandler.getConfig()).thenReturn(globalGitConfig);
MockHttpRequest request = MockHttpRequest
.get("/" + GitConfigResource.GIT_CONFIG_PATH_V2 + "/space/X/default-branch")
.contentType(GitVndMediaType.GIT_REPOSITORY_CONFIG);
MockHttpResponse response = new MockHttpResponse();
dispatcher.invoke(request, response);
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
assertEquals("{\"defaultBranch\":\"global-default\"}", response.getContentAsString());
}
@Test
@SubjectAware(username = "readOnly")
public void shouldGetFallbackDefaultBranchIfBothConfigsEmpty() throws URISyntaxException, UnsupportedEncodingException {
when(repositoryManager.get(new NamespaceAndName("space", "X"))).thenReturn(new Repository("id", "git", "space", "X"));
when(configurationStore.get()).thenReturn(new GitRepositoryConfig());
when(repositoryHandler.getConfig()).thenReturn(createConfiguration());
MockHttpRequest request = MockHttpRequest
.get("/" + GitConfigResource.GIT_CONFIG_PATH_V2 + "/space/X/default-branch")
.contentType(GitVndMediaType.GIT_REPOSITORY_CONFIG);
MockHttpResponse response = new MockHttpResponse();
dispatcher.invoke(request, response);
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
assertEquals("{\"defaultBranch\":\"main\"}", response.getContentAsString());
}
@Test
public void shouldThrowAuthorizationExceptionIfNotPermittedToGetDefaultBranch() throws URISyntaxException {
when(repositoryManager.get(new NamespaceAndName("space", "X"))).thenReturn(new Repository("id", "git", "space", "X"));
MockHttpRequest request = MockHttpRequest
.get("/" + GitConfigResource.GIT_CONFIG_PATH_V2 + "/space/X/default-branch")
.contentType(GitVndMediaType.GIT_REPOSITORY_CONFIG);
MockHttpResponse response = new MockHttpResponse();
dispatcher.invoke(request, response);
assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus());
}
private MockHttpResponse get() throws URISyntaxException {
MockHttpRequest request = MockHttpRequest.get("/" + GitConfigResource.GIT_CONFIG_PATH_V2);
MockHttpResponse response = new MockHttpResponse();

View File

@@ -0,0 +1,90 @@
/*
* MIT License
*
* Copyright (c) 2020-present Cloudogu GmbH and Contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.api.v2.resources;
import com.google.inject.util.Providers;
import org.github.sdorra.jse.ShiroExtension;
import org.github.sdorra.jse.SubjectAware;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryTestData;
import javax.inject.Provider;
import java.net.URI;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@ExtendWith(ShiroExtension.class)
@ExtendWith(MockitoExtension.class)
@SubjectAware(
value = "trillian"
)
class RepositoryLinkEnricherTest {
private static final Repository REPOSITORY = RepositoryTestData.create42Puzzle();
private RepositoryLinkEnricher repositoryLinkEnricher;
@Mock
private HalAppender appender;
@BeforeEach
void initEnricher() {
ScmPathInfoStore scmPathInfoStore = new ScmPathInfoStore();
scmPathInfoStore.set(() -> URI.create("/api/"));
Provider<ScmPathInfoStore> scmPathInfoStoreProvider = Providers.of(scmPathInfoStore);
repositoryLinkEnricher = new RepositoryLinkEnricher(scmPathInfoStoreProvider);
REPOSITORY.setId("id-1");
}
@Test
void shouldNotAppendLinkIfNotPermitted() {
HalEnricherContext context = HalEnricherContext.of(REPOSITORY);
repositoryLinkEnricher.enrich(context, appender);
verify(appender, never()).appendLink(eq("defaultBranch"), any(String.class));
}
@Test
@SubjectAware(
permissions = "repository:read:id-1"
)
void shouldAppendDefaultBranchLink() {
HalEnricherContext context = HalEnricherContext.of(REPOSITORY);
repositoryLinkEnricher.enrich(context, appender);
verify(appender).appendLink("defaultBranch", "/api/v2/config/git/hitchhiker/42Puzzle/default-branch");
}
}