From f0c9c11f2d7f70ddf1e0085c7c91cd48de8e8283 Mon Sep 17 00:00:00 2001 From: Mohamed Karray Date: Fri, 31 Aug 2018 12:23:31 +0200 Subject: [PATCH 1/7] #9208 add group permission prefix --- .../v2/resources/PermissionRootResource.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java index 2b53192542..b3a65852a0 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java @@ -5,7 +5,6 @@ import com.webcohesion.enunciate.metadata.rs.ResponseHeader; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang.StringUtils; import sonia.scm.AlreadyExistsException; import sonia.scm.NotFoundException; import sonia.scm.repository.NamespaceAndName; @@ -28,10 +27,12 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.Response; import java.net.URI; import java.util.Optional; +import java.util.function.Predicate; @Slf4j public class PermissionRootResource { + private static final String GROUP_PREFIX = "@"; private PermissionDtoToPermissionMapper dtoToModelMapper; private PermissionToPermissionDtoMapper modelToDtoMapper; private PermissionCollectionToDtoMapper permissionCollectionToDtoMapper; @@ -101,7 +102,7 @@ public class PermissionRootResource { return Response.ok( repository.getPermissions() .stream() - .filter(permission -> permissionName.equals(permission.getName())) + .filter(filterPermission(permissionName)) .map(permission -> modelToDtoMapper.map(permission, repository)) .findFirst() .orElseThrow(NotFoundException::new) @@ -158,9 +159,9 @@ public class PermissionRootResource { RepositoryPermissions.permissionWrite(repository).check(); Permission existingPermission = repository.getPermissions() .stream() - .filter(perm -> StringUtils.isNotBlank(perm.getName()) && perm.getName().equals(permissionName)) + .filter(filterPermission(permissionName)) .findFirst() - .orElseThrow(() -> new NotFoundException()); + .orElseThrow(NotFoundException::new); dtoToModelMapper.modify(existingPermission, permission); manager.modify(repository); log.info("the permission with name: {} is updated.", permissionName); @@ -186,11 +187,11 @@ public class PermissionRootResource { @PathParam("name") String name, @PathParam("permission-name") String permissionName) throws NotFoundException { log.info("try to delete the permission with name: {}.", permissionName); - Repository repository = load(namespace, name); + Repository repository = load(namespace, name); RepositoryPermissions.modify(repository).check(); repository.getPermissions() .stream() - .filter(perm -> StringUtils.isNotBlank(perm.getName()) && perm.getName().equals(permissionName)) + .filter(filterPermission(permissionName)) .findFirst() .ifPresent(p -> repository.getPermissions().remove(p)) ; @@ -199,6 +200,16 @@ public class PermissionRootResource { return Response.noContent().build(); } + Predicate filterPermission(String permissionName) { + boolean isGroupPermission = permissionName.startsWith(GROUP_PREFIX); + return permission -> Optional.of(permissionName) + .filter(p -> !isGroupPermission) + .orElse(permissionName.substring(1)) + .equals(permission.getName()) + && + permission.isGroupPermission() == isGroupPermission; + } + /** * check if the actual user is permitted to manage the repository permissions @@ -224,7 +235,7 @@ public class PermissionRootResource { private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository) throws AlreadyExistsException { boolean isPermissionAlreadyExist = repository.getPermissions() .stream() - .anyMatch(p -> p.getName().equals(permission.getName())); + .anyMatch(p -> p.getName().equals(permission.getName()) && p.isGroupPermission() == permission.isGroupPermission()); if (isPermissionAlreadyExist) { throw new AlreadyExistsException(); } From 56524fa460c09893d22fc8d4f8678aa8f67e3948 Mon Sep 17 00:00:00 2001 From: Mohamed Karray Date: Fri, 31 Aug 2018 14:23:44 +0200 Subject: [PATCH 2/7] #9208 add group permission prefix --- .../sonia/scm/AlreadyExistsException.java | 7 +++ .../java/sonia/scm/NotFoundException.java | 5 ++ .../rest/AlreadyExistsExceptionMapper.java | 4 +- .../scm/api/rest/StatusExceptionMapper.java | 4 +- .../scm/api/v2/resources/PermissionDto.java | 8 ++++ .../v2/resources/PermissionRootResource.java | 47 ++++++++++++++----- 6 files changed, 61 insertions(+), 14 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/AlreadyExistsException.java b/scm-core/src/main/java/sonia/scm/AlreadyExistsException.java index 36052d99e9..4c6a52b878 100644 --- a/scm-core/src/main/java/sonia/scm/AlreadyExistsException.java +++ b/scm-core/src/main/java/sonia/scm/AlreadyExistsException.java @@ -1,4 +1,11 @@ package sonia.scm; public class AlreadyExistsException extends Exception { + + public AlreadyExistsException(String message) { + super(message); + } + + public AlreadyExistsException() { + } } diff --git a/scm-core/src/main/java/sonia/scm/NotFoundException.java b/scm-core/src/main/java/sonia/scm/NotFoundException.java index 8a7ae642bd..0d8c14c61b 100644 --- a/scm-core/src/main/java/sonia/scm/NotFoundException.java +++ b/scm-core/src/main/java/sonia/scm/NotFoundException.java @@ -7,4 +7,9 @@ public class NotFoundException extends Exception { public NotFoundException() { } + + + public NotFoundException(String message) { + super(message); + } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/AlreadyExistsExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/AlreadyExistsExceptionMapper.java index 28240482e5..13d341e1e6 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/AlreadyExistsExceptionMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/AlreadyExistsExceptionMapper.java @@ -11,6 +11,8 @@ import javax.ws.rs.ext.Provider; public class AlreadyExistsExceptionMapper implements ExceptionMapper { @Override public Response toResponse(AlreadyExistsException exception) { - return Response.status(Status.CONFLICT).build(); + return Response.status(Status.CONFLICT) + .entity(exception.getMessage()) + .build(); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/StatusExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/StatusExceptionMapper.java index fef7fc96c4..6f4978637e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/StatusExceptionMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/StatusExceptionMapper.java @@ -90,6 +90,8 @@ public class StatusExceptionMapper logger.debug(msg.toString()); } - return Response.status(status).build(); + return Response.status(status) + .entity(exception.getMessage()) + .build(); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java index b184bc3934..7fa74e9f87 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java @@ -26,6 +26,14 @@ public class PermissionDto extends HalRepresentation { private boolean groupPermission = false; + public PermissionDto() { + } + + public PermissionDto(String permissionName, boolean groupPermission) { + name = permissionName; + this.groupPermission = groupPermission; + } + @Override @SuppressWarnings("squid:S1185") // We want to have this method available in this package diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java index b3a65852a0..16cdf17915 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java @@ -136,6 +136,7 @@ public class PermissionRootResource { /** * Update a permission to the user or group managed by the repository + * ignore the user input for groupPermission and take it from the path parameter (if the group prefix (@) exists it is a group permission) * * @param permission permission to modify * @param permissionName permission to modify @@ -153,10 +154,18 @@ public class PermissionRootResource { public Response update(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("permission-name") String permissionName, - PermissionDto permission) throws NotFoundException { + PermissionDto permission) throws NotFoundException, AlreadyExistsException { log.info("try to update the permission with name: {}. the modified permission is: {}", permissionName, permission); Repository repository = load(namespace, name); RepositoryPermissions.permissionWrite(repository).check(); + String extractedPermissionName = getPermissionName(permissionName); + if (!isPermissionExist(new PermissionDto(extractedPermissionName, isGroupPermission(permissionName)), repository)) { + throw new NotFoundException("the permission " + extractedPermissionName + " does not exist"); + } + permission.setGroupPermission(isGroupPermission(permissionName)); + if (!extractedPermissionName.equals(permission.getName())) { + checkPermissionAlreadyExists(permission, repository, "target permission " + permission.getName() + " already exists"); + } Permission existingPermission = repository.getPermissions() .stream() .filter(filterPermission(permissionName)) @@ -201,13 +210,19 @@ public class PermissionRootResource { } Predicate filterPermission(String permissionName) { - boolean isGroupPermission = permissionName.startsWith(GROUP_PREFIX); - return permission -> Optional.of(permissionName) - .filter(p -> !isGroupPermission) - .orElse(permissionName.substring(1)) - .equals(permission.getName()) + return permission -> getPermissionName(permissionName).equals(permission.getName()) && - permission.isGroupPermission() == isGroupPermission; + permission.isGroupPermission() == isGroupPermission(permissionName); + } + + private String getPermissionName(String permissionName) { + return Optional.of(permissionName) + .filter(p -> !isGroupPermission(permissionName)) + .orElse(permissionName.substring(1)); + } + + private boolean isGroupPermission(String permissionName) { + return permissionName.startsWith(GROUP_PREFIX); } @@ -230,15 +245,23 @@ public class PermissionRootResource { * * @param permission the searched permission * @param repository the repository to be inspected + * @param errorMessage error message * @throws AlreadyExistsException if the permission already exists in the repository */ - private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository) throws AlreadyExistsException { - boolean isPermissionAlreadyExist = repository.getPermissions() + private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository, String errorMessage) throws AlreadyExistsException { + if (isPermissionExist(permission, repository)) { + throw new AlreadyExistsException(errorMessage); + } + } + + private boolean isPermissionExist(PermissionDto permission, Repository repository) { + return repository.getPermissions() .stream() .anyMatch(p -> p.getName().equals(permission.getName()) && p.isGroupPermission() == permission.isGroupPermission()); - if (isPermissionAlreadyExist) { - throw new AlreadyExistsException(); - } + } + + private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository) throws AlreadyExistsException { + checkPermissionAlreadyExists(permission, repository, "the permission " + permission.getName() + " already exist."); } } From eb270f10e4428f327a8d6996a5519b480924ec12 Mon Sep 17 00:00:00 2001 From: Mohamed Karray Date: Mon, 3 Sep 2018 12:52:33 +0200 Subject: [PATCH 3/7] #9208 add group permission prefix to the dto links --- .../sonia/scm/api/v2/resources/PermissionDto.java | 2 ++ .../scm/api/v2/resources/PermissionRootResource.java | 4 +++- .../v2/resources/PermissionToPermissionDtoMapper.java | 11 ++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java index 7fa74e9f87..8647146f2b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java @@ -10,6 +10,8 @@ import lombok.ToString; @Getter @Setter @ToString public class PermissionDto extends HalRepresentation { + public static final String GROUP_PREFIX = "@"; + @JsonInclude(JsonInclude.Include.NON_NULL) private String name; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java index 16cdf17915..90e9b3daed 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java @@ -29,10 +29,12 @@ import java.net.URI; import java.util.Optional; import java.util.function.Predicate; +import static sonia.scm.api.v2.resources.PermissionDto.GROUP_PREFIX; + @Slf4j public class PermissionRootResource { - private static final String GROUP_PREFIX = "@"; + private PermissionDtoToPermissionMapper dtoToModelMapper; private PermissionToPermissionDtoMapper modelToDtoMapper; private PermissionCollectionToDtoMapper permissionCollectionToDtoMapper; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapper.java index 6938c9059c..8ebe10eb6f 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapper.java @@ -12,9 +12,11 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryPermissions; import javax.inject.Inject; +import java.util.Optional; import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Links.linkingTo; +import static sonia.scm.api.v2.resources.PermissionDto.GROUP_PREFIX; @Mapper public abstract class PermissionToPermissionDtoMapper { @@ -39,11 +41,14 @@ public abstract class PermissionToPermissionDtoMapper { */ @AfterMapping void appendLinks(@MappingTarget PermissionDto target, @Context Repository repository) { + String permissionName = Optional.of(target.getName()) + .filter(p -> !target.isGroupPermission()) + .orElse(GROUP_PREFIX + target.getName()); Links.Builder linksBuilder = linkingTo() - .self(resourceLinks.permission().self(repository.getNamespace(), repository.getName(), target.getName())); + .self(resourceLinks.permission().self(repository.getNamespace(), repository.getName(), permissionName)); if (RepositoryPermissions.permissionWrite(repository).isPermitted()) { - linksBuilder.single(link("update", resourceLinks.permission().update(repository.getNamespace(), repository.getName(), target.getName()))); - linksBuilder.single(link("delete", resourceLinks.permission().delete(repository.getNamespace(), repository.getName(), target.getName()))); + linksBuilder.single(link("update", resourceLinks.permission().update(repository.getNamespace(), repository.getName(), permissionName))); + linksBuilder.single(link("delete", resourceLinks.permission().delete(repository.getNamespace(), repository.getName(), permissionName))); } target.add(linksBuilder.build()); } From a731865e08f1be3acb7db3633f3dc4ca9b4add7a Mon Sep 17 00:00:00 2001 From: Mohamed Karray Date: Wed, 5 Sep 2018 09:35:27 +0200 Subject: [PATCH 4/7] fix unit tests for permissions and sources endpoints --- .../sonia/scm/api/v2/resources/SourceRootResource.java | 3 ++- .../scm/api/v2/resources/PermissionRootResourceTest.java | 9 +++++++-- .../scm/api/v2/resources/SourceRootResourceTest.java | 7 +++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java index fe12f69ecc..6eb534b465 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java @@ -1,5 +1,6 @@ package sonia.scm.api.v2.resources; +import sonia.scm.NotFoundException; import sonia.scm.repository.BrowserResult; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.RepositoryNotFoundException; @@ -46,7 +47,7 @@ public class SourceRootResource { @GET @Produces(VndMediaType.SOURCE) @Path("{revision}/{path: .*}") - public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("revision") String revision, @PathParam("path") String path) throws RevisionNotFoundException, RepositoryNotFoundException, IOException { + public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("revision") String revision, @PathParam("path") String path) throws NotFoundException, IOException { return getSource(namespace, name, path, revision); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionRootResourceTest.java index 227775cf16..3e0cf1d701 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionRootResourceTest.java @@ -39,6 +39,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -55,6 +56,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; +import static sonia.scm.api.v2.resources.PermissionDto.GROUP_PREFIX; @Slf4j @SubjectAware( @@ -253,7 +255,7 @@ public class PermissionRootResourceTest { createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_WRITE); Permission newPermission = TEST_PERMISSIONS.get(0); assertExpectedRequest(requestPOSTPermission - .content("{\"name\" : \"" + newPermission.getName() + "\" , \"type\" : \"WRITE\" , \"groupPermission\" : true}") + .content("{\"name\" : \"" + newPermission.getName() + "\" , \"type\" : \"WRITE\" , \"groupPermission\" : false}") .expectedResponseStatus(409) ); } @@ -358,7 +360,10 @@ public class PermissionRootResourceTest { result.setName(permission.getName()); result.setGroupPermission(permission.isGroupPermission()); result.setType(permission.getType().name()); - String permissionHref = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + PATH_OF_ALL_PERMISSIONS + permission.getName(); + String permissionName = Optional.of(permission.getName()) + .filter(p -> !permission.isGroupPermission()) + .orElse(GROUP_PREFIX + permission.getName()); + String permissionHref = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + PATH_OF_ALL_PERMISSIONS + permissionName; if (PERMISSION_READ.equals(userPermission)) { result.add(linkingTo() .self(permissionHref) diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java index 1e73c6dfaa..9573fb3d97 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java @@ -1,7 +1,6 @@ package sonia.scm.api.v2.resources; import org.jboss.resteasy.core.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -29,12 +28,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; +import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @RunWith(MockitoJUnitRunner.Silent.class) public class SourceRootResourceTest { - private final Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private Dispatcher dispatcher; private final URI baseUri = URI.create("/"); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); @@ -74,8 +74,7 @@ public class SourceRootResourceTest { null, null)), null); - - dispatcher.getRegistry().addSingletonResource(repositoryRootResource); + dispatcher = createDispatcher(repositoryRootResource); } @Test From a03a6fc8ac01d1cf8d1a2482d7c004ffd2009409 Mon Sep 17 00:00:00 2001 From: Mohamed Karray Date: Wed, 5 Sep 2018 10:44:03 +0200 Subject: [PATCH 5/7] add logs --- scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java | 5 +++++ scm-it/src/test/java/sonia/scm/it/TestData.java | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java b/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java index ef2332074b..e49927b1b9 100644 --- a/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java +++ b/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java @@ -3,6 +3,8 @@ package sonia.scm.it; import com.google.common.base.Charsets; import com.google.common.io.Files; import org.apache.http.HttpStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import sonia.scm.repository.Changeset; import sonia.scm.repository.Person; import sonia.scm.repository.client.api.ClientCommand; @@ -15,6 +17,8 @@ import java.util.UUID; public class RepositoryUtil { + private static final Logger LOG = LoggerFactory.getLogger(RepositoryUtil.class); + private static final RepositoryClientFactory REPOSITORY_CLIENT_FACTORY = new RepositoryClientFactory(); static RepositoryClient createRepositoryClient(String repositoryType, File folder) throws IOException { @@ -58,6 +62,7 @@ public class RepositoryUtil { } static Changeset commit(RepositoryClient repositoryClient, String username, String message) throws IOException { + LOG.info("user: {} try to commit with message: {}", username, message); Changeset changeset = repositoryClient.getCommitCommand().commit(new Person(username, username + "@scm-manager.org"), message); if (repositoryClient.isCommandSupported(ClientCommand.PUSH)) { repositoryClient.getPushCommand().push(); diff --git a/scm-it/src/test/java/sonia/scm/it/TestData.java b/scm-it/src/test/java/sonia/scm/it/TestData.java index ada67d588c..ae0e35004d 100644 --- a/scm-it/src/test/java/sonia/scm/it/TestData.java +++ b/scm-it/src/test/java/sonia/scm/it/TestData.java @@ -33,6 +33,7 @@ public class TestData { } public static void cleanup() { + LOG.info("start to clean up to integration tests"); cleanupRepositories(); cleanupGroups(); cleanupUsers(); @@ -43,6 +44,7 @@ public class TestData { } public static void createUser(String username, String password) { + LOG.info("create user with username: {}", username); given(VndMediaType.USER) .when() .content(" {\n" + @@ -64,6 +66,8 @@ public class TestData { public static void createUserPermission(String name, PermissionType permissionType, String repositoryType) { + String defaultPermissionUrl = TestData.getDefaultPermissionUrl(USER_SCM_ADMIN, USER_SCM_ADMIN, repositoryType); + LOG.info("create permission with name {} and type: {} using the endpoint: {}", name, permissionType, defaultPermissionUrl); given(VndMediaType.PERMISSION) .when() .content("{\n" + @@ -72,7 +76,7 @@ public class TestData { "\t\"groupPermission\": false\n" + "\t\n" + "}") - .post(TestData.getDefaultPermissionUrl(USER_SCM_ADMIN, USER_SCM_ADMIN, repositoryType)) + .post(defaultPermissionUrl) .then() .statusCode(HttpStatus.SC_CREATED) ; @@ -114,6 +118,7 @@ public class TestData { private static void cleanupRepositories() { + LOG.info("clean up repository"); List repositories = given(VndMediaType.REPOSITORY_COLLECTION) .when() .get(createResourceUrl("repositories")) @@ -160,6 +165,7 @@ public class TestData { } private static void createDefaultRepositories() { + LOG.info("create default repositories"); for (String repositoryType : availableScmTypes()) { String url = given(VndMediaType.REPOSITORY) .body(repositoryJson(repositoryType)) @@ -171,6 +177,7 @@ public class TestData { .statusCode(HttpStatus.SC_CREATED) .extract() .header("location"); + LOG.info("a {} repository is created: {}", repositoryType, url); DEFAULT_REPOSITORIES.put(repositoryType, url); } } From d70acc5fba7d19859baff1d576ccb83feff24a84 Mon Sep 17 00:00:00 2001 From: Philipp Czora Date: Wed, 5 Sep 2018 14:47:35 +0200 Subject: [PATCH 6/7] Added unit test --- .../scm/api/v2/resources/PermissionDto.java | 2 +- .../PermissionToPermissionDtoMapperTest.java | 63 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapperTest.java diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java index 8647146f2b..581b2c24cd 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionDto.java @@ -23,7 +23,7 @@ public class PermissionDto extends HalRepresentation { * **/ @JsonInclude(JsonInclude.Include.NON_NULL) - private String type ; + private String type; private boolean groupPermission = false; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapperTest.java new file mode 100644 index 0000000000..31c2f0ec31 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapperTest.java @@ -0,0 +1,63 @@ +package sonia.scm.api.v2.resources; + +import com.github.sdorra.shiro.ShiroRule; +import com.github.sdorra.shiro.SubjectAware; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.junit.MockitoJUnitRunner; +import sonia.scm.repository.Permission; +import sonia.scm.repository.PermissionType; +import sonia.scm.repository.Repository; + +import java.net.URI; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(MockitoJUnitRunner.Silent.class) +@SubjectAware( + configuration = "classpath:sonia/scm/repository/shiro.ini" +) +public class PermissionToPermissionDtoMapperTest { + + @Rule + public ShiroRule shiro = new ShiroRule(); + + private final URI baseUri = URI.create("http://example.com/base/"); + + @SuppressWarnings("unused") // Is injected + private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); + + @InjectMocks + PermissionToPermissionDtoMapperImpl mapper; + + @Test + @SubjectAware(username = "trillian", password = "secret") + public void shouldMapGroupPermissionCorrectly() { + Repository repository = getDummyRepository(); + Permission permission = new Permission("42", PermissionType.OWNER, true); + + PermissionDto permissionDto = mapper.map(permission, repository); + + assertThat(permissionDto.getLinks().getLinkBy("self").isPresent()).isTrue(); + assertThat(permissionDto.getLinks().getLinkBy("self").get().getHref()).contains("@42"); + } + + @Test + @SubjectAware(username = "trillian", password = "secret") + public void shouldMapNonGroupPermissionCorrectly() { + Repository repository = getDummyRepository(); + Permission permission = new Permission("42", PermissionType.OWNER, false); + + PermissionDto permissionDto = mapper.map(permission, repository); + + assertThat(permissionDto.getLinks().getLinkBy("self").isPresent()).isTrue(); + assertThat(permissionDto.getLinks().getLinkBy("self").get().getHref()).contains("42"); + assertThat(permissionDto.getLinks().getLinkBy("self").get().getHref()).doesNotContain("@"); + } + + private Repository getDummyRepository() { + return new Repository("repo", "git", "foo", "bar"); + } +} From 6940198a88aafe22a26f6815db563ff677103c0c Mon Sep 17 00:00:00 2001 From: Philipp Czora Date: Wed, 5 Sep 2018 13:02:25 +0000 Subject: [PATCH 7/7] Close branch feature/add_permission_prefix