From dd72a00308cbe130ee5384095721178c0249550f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 28 Jun 2018 11:58:48 +0200 Subject: [PATCH] Replace static access to ResourceLinks with injection --- .../v2/resources/GroupCollectionResource.java | 11 +++--- .../resources/GroupCollectionToDtoMapper.java | 12 +++--- .../v2/resources/GroupToGroupDtoMapper.java | 12 +++--- .../scm/api/v2/resources/ResourceLinks.java | 24 +++++++----- .../v2/resources/UserCollectionResource.java | 12 +++--- .../resources/UserCollectionToDtoMapper.java | 12 +++--- .../api/v2/resources/UserToUserDtoMapper.java | 10 ++--- .../GroupCollectionToDtoMapperTest.java | 3 +- .../v2/resources/GroupRootResourceTest.java | 21 +++++------ .../resources/GroupToGroupDtoMapperTest.java | 13 +++---- .../api/v2/resources/ResourceLinksMock.java | 26 +++++++++++++ .../api/v2/resources/ResourceLinksTest.java | 37 +++++++++++-------- .../UserCollectionToDtoMapperTest.java | 15 +++----- .../v2/resources/UserRootResourceTest.java | 16 ++++---- .../v2/resources/UserToUserDtoMapperTest.java | 11 ++---- 15 files changed, 128 insertions(+), 107 deletions(-) create mode 100644 scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java index e93153bc5b..4df3a318c6 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java @@ -18,25 +18,24 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import java.io.IOException; -import static sonia.scm.api.v2.resources.ResourceLinks.group; public class GroupCollectionResource { private static final int DEFAULT_PAGE_SIZE = 10; private final GroupDtoToGroupMapper dtoToGroupMapper; private final GroupCollectionToDtoMapper groupCollectionToDtoMapper; + private final ResourceLinks resourceLinks; private final ResourceManagerAdapter adapter; @Inject - public GroupCollectionResource(GroupManager manager, GroupDtoToGroupMapper dtoToGroupMapper, GroupCollectionToDtoMapper groupCollectionToDtoMapper) { + public GroupCollectionResource(GroupManager manager, GroupDtoToGroupMapper dtoToGroupMapper, GroupCollectionToDtoMapper groupCollectionToDtoMapper, ResourceLinks resourceLinks) { this.dtoToGroupMapper = dtoToGroupMapper; this.groupCollectionToDtoMapper = groupCollectionToDtoMapper; + this.resourceLinks = resourceLinks; this.adapter = new ResourceManagerAdapter<>(manager); } @@ -85,9 +84,9 @@ public class GroupCollectionResource { }) @TypeHint(TypeHint.NO_CONTENT.class) @ResponseHeaders(@ResponseHeader(name = "Location", description = "uri to the created group")) - public Response create(@Context UriInfo uriInfo, GroupDto groupDto) throws IOException, GroupException { + public Response create(GroupDto groupDto) throws IOException, GroupException { return adapter.create(groupDto, () -> dtoToGroupMapper.map(groupDto), - group -> group(uriInfo).self(group.getName())); + group -> resourceLinks.group().self(group.getName())); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapper.java index 7b09d91a9f..415f04bfaf 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapper.java @@ -5,26 +5,24 @@ import sonia.scm.group.GroupPermissions; import javax.inject.Inject; -import static sonia.scm.api.v2.resources.ResourceLinks.groupCollection; - public class GroupCollectionToDtoMapper extends BasicCollectionToDtoMapper { - private final UriInfoStore uriInfoStore; + private final ResourceLinks resourceLinks; @Inject - public GroupCollectionToDtoMapper(GroupToGroupDtoMapper groupToDtoMapper, UriInfoStore uriInfoStore) { + public GroupCollectionToDtoMapper(GroupToGroupDtoMapper groupToDtoMapper, ResourceLinks resourceLinks) { super("groups", groupToDtoMapper); - this.uriInfoStore = uriInfoStore; + this.resourceLinks = resourceLinks; } @Override String createCreateLink() { - return groupCollection(uriInfoStore.get()).create(); + return resourceLinks.groupCollection().create(); } @Override String createSelfLink() { - return groupCollection(uriInfoStore.get()).self(); + return resourceLinks.groupCollection().self(); } @Override diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java index 57008f6313..d03fc94387 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java @@ -13,8 +13,6 @@ import java.util.stream.Collectors; import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Links.linkingTo; -import static sonia.scm.api.v2.resources.ResourceLinks.group; -import static sonia.scm.api.v2.resources.ResourceLinks.user; // Mapstruct does not support parameterized (i.e. non-default) constructors. Thus, we need to use field injection. @SuppressWarnings("squid:S3306") @@ -22,16 +20,16 @@ import static sonia.scm.api.v2.resources.ResourceLinks.user; public abstract class GroupToGroupDtoMapper extends BaseMapper { @Inject - private UriInfoStore uriInfoStore; + private ResourceLinks resourceLinks; @AfterMapping void appendLinks(Group group, @MappingTarget GroupDto target) { - Links.Builder linksBuilder = linkingTo().self(group(uriInfoStore.get()).self(target.getName())); + Links.Builder linksBuilder = linkingTo().self(resourceLinks.group().self(target.getName())); if (GroupPermissions.delete(group).isPermitted()) { - linksBuilder.single(link("delete", group(uriInfoStore.get()).delete(target.getName()))); + linksBuilder.single(link("delete", resourceLinks.group().delete(target.getName()))); } if (GroupPermissions.modify(group).isPermitted()) { - linksBuilder.single(link("update", group(uriInfoStore.get()).update(target.getName()))); + linksBuilder.single(link("update", resourceLinks.group().update(target.getName()))); } target.add(linksBuilder.build()); } @@ -43,7 +41,7 @@ public abstract class GroupToGroupDtoMapper extends BaseMapper } private MemberDto createMember(String name) { - Links.Builder linksBuilder = linkingTo().self(user(uriInfoStore.get()).self(name)); + Links.Builder linksBuilder = linkingTo().self(resourceLinks.user().self(name)); MemberDto memberDto = new MemberDto(name); memberDto.add(linksBuilder.build()); return memberDto; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java index 351c9c7f55..13691da0f6 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java @@ -1,14 +1,20 @@ package sonia.scm.api.v2.resources; +import javax.inject.Inject; import javax.ws.rs.core.UriInfo; class ResourceLinks { - private ResourceLinks() { + private final UriInfoStore uriInfoStore; + + @Inject + ResourceLinks(UriInfoStore uriInfoStore) { + this.uriInfoStore = uriInfoStore; } - static GroupLinks group(UriInfo uriInfo) { - return new GroupLinks(uriInfo); + + GroupLinks group() { + return new GroupLinks(uriInfoStore.get()); } static class GroupLinks { @@ -31,8 +37,8 @@ class ResourceLinks { } } - static GroupCollectionLinks groupCollection(UriInfo uriInfo) { - return new GroupCollectionLinks(uriInfo); + GroupCollectionLinks groupCollection() { + return new GroupCollectionLinks(uriInfoStore.get()); } static class GroupCollectionLinks { @@ -51,8 +57,8 @@ class ResourceLinks { } } - static UserLinks user(UriInfo uriInfo) { - return new UserLinks(uriInfo); + UserLinks user() { + return new UserLinks(uriInfoStore.get()); } static class UserLinks { @@ -75,8 +81,8 @@ class ResourceLinks { } } - static UserCollectionLinks userCollection(UriInfo uriInfo) { - return new UserCollectionLinks(uriInfo); + UserCollectionLinks userCollection() { + return new UserCollectionLinks(uriInfoStore.get()); } static class UserCollectionLinks { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java index 1e8afc8c35..0eea32ed8e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java @@ -18,27 +18,25 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import java.io.IOException; -import static sonia.scm.api.v2.resources.ResourceLinks.user; - public class UserCollectionResource { private static final int DEFAULT_PAGE_SIZE = 10; private final UserDtoToUserMapper dtoToUserMapper; private final UserCollectionToDtoMapper userCollectionToDtoMapper; + private final ResourceLinks resourceLinks; private final ResourceManagerAdapter adapter; @Inject public UserCollectionResource(UserManager manager, UserDtoToUserMapper dtoToUserMapper, - UserCollectionToDtoMapper userCollectionToDtoMapper) { + UserCollectionToDtoMapper userCollectionToDtoMapper, ResourceLinks resourceLinks) { this.dtoToUserMapper = dtoToUserMapper; this.userCollectionToDtoMapper = userCollectionToDtoMapper; this.adapter = new ResourceManagerAdapter<>(manager); + this.resourceLinks = resourceLinks; } /** @@ -88,9 +86,9 @@ public class UserCollectionResource { }) @TypeHint(TypeHint.NO_CONTENT.class) @ResponseHeaders(@ResponseHeader(name = "Location", description = "uri to the created user")) - public Response create(@Context UriInfo uriInfo, UserDto userDto) throws IOException, UserException { + public Response create(UserDto userDto) throws IOException, UserException { return adapter.create(userDto, () -> dtoToUserMapper.map(userDto, ""), - user -> user(uriInfo).self(user.getName())); + user -> resourceLinks.user().self(user.getName())); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapper.java index 34f26332f1..db2a9afc9f 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapper.java @@ -5,28 +5,26 @@ import sonia.scm.user.UserPermissions; import javax.inject.Inject; -import static sonia.scm.api.v2.resources.ResourceLinks.userCollection; - // Mapstruct does not support parameterized (i.e. non-default) constructors. Thus, we need to use field injection. @SuppressWarnings("squid:S3306") public class UserCollectionToDtoMapper extends BasicCollectionToDtoMapper { - private final UriInfoStore uriInfoStore; + private final ResourceLinks resourceLinks; @Inject - public UserCollectionToDtoMapper(UserToUserDtoMapper userToDtoMapper, UriInfoStore uriInfoStore) { + public UserCollectionToDtoMapper(UserToUserDtoMapper userToDtoMapper, ResourceLinks resourceLinks) { super("users", userToDtoMapper); - this.uriInfoStore = uriInfoStore; + this.resourceLinks = resourceLinks; } @Override String createCreateLink() { - return userCollection(uriInfoStore.get()).create(); + return resourceLinks.userCollection().create(); } @Override String createSelfLink() { - return userCollection(uriInfoStore.get()).self(); + return resourceLinks.userCollection().self(); } @Override diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java index 194c44acaa..85973bab75 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java @@ -12,7 +12,6 @@ import javax.inject.Inject; import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Links.linkingTo; -import static sonia.scm.api.v2.resources.ResourceLinks.user; // Mapstruct does not support parameterized (i.e. non-default) constructors. Thus, we need to use field injection. @SuppressWarnings("squid:S3306") @@ -20,7 +19,7 @@ import static sonia.scm.api.v2.resources.ResourceLinks.user; public abstract class UserToUserDtoMapper extends BaseMapper { @Inject - private UriInfoStore uriInfoStore; + private ResourceLinks resourceLinks; @AfterMapping void removePassword(@MappingTarget UserDto target) { @@ -29,13 +28,14 @@ public abstract class UserToUserDtoMapper extends BaseMapper { @AfterMapping void appendLinks(User user, @MappingTarget UserDto target) { - Links.Builder linksBuilder = linkingTo().self(user(uriInfoStore.get()).self(target.getName())); + Links.Builder linksBuilder = linkingTo().self(resourceLinks.user().self(target.getName())); if (UserPermissions.delete(user).isPermitted()) { - linksBuilder.single(link("delete", user(uriInfoStore.get()).delete(target.getName()))); + linksBuilder.single(link("delete", resourceLinks.user().delete(target.getName()))); } if (UserPermissions.modify(user).isPermitted()) { - linksBuilder.single(link("update", user(uriInfoStore.get()).update(target.getName()))); + linksBuilder.single(link("update", resourceLinks.user().update(target.getName()))); } target.add(linksBuilder.build()); } + } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java index 2d9cc3ba70..5b457ce4e9 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java @@ -30,11 +30,12 @@ public class GroupCollectionToDtoMapperTest { private final UriInfo uriInfo = mock(UriInfo.class); private final UriInfoStore uriInfoStore = new UriInfoStore(); + private final ResourceLinks resourceLinks = new ResourceLinks(uriInfoStore); private final GroupToGroupDtoMapper groupToDtoMapper = mock(GroupToGroupDtoMapper.class); private final Subject subject = mock(Subject.class); private final ThreadState subjectThreadState = new SubjectThreadState(subject); - private final GroupCollectionToDtoMapper mapper = new GroupCollectionToDtoMapper(groupToDtoMapper, uriInfoStore); + private final GroupCollectionToDtoMapper mapper = new GroupCollectionToDtoMapper(groupToDtoMapper, resourceLinks); private URI expectedBaseUri; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java index 2b4cedb4fc..2e6350a6c4 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java @@ -10,6 +10,7 @@ import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.mockito.Answers; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -20,7 +21,6 @@ import sonia.scm.group.GroupManager; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.UriInfo; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -28,7 +28,9 @@ import java.net.URL; import java.util.Collections; import static java.util.Collections.singletonList; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doNothing; @@ -47,10 +49,8 @@ public class GroupRootResourceTest { private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); - @Mock - private UriInfo uriInfo; - @Mock - private UriInfoStore uriInfoStore; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private ResourceLinks resourceLinks; @Mock private GroupManager groupManager; @@ -70,15 +70,14 @@ public class GroupRootResourceTest { when(groupManager.getPage(any(), eq(0), eq(10))).thenReturn(new PageResult<>(singletonList(group), 1)); when(groupManager.get("admin")).thenReturn(group); - GroupCollectionToDtoMapper groupCollectionToDtoMapper = new GroupCollectionToDtoMapper(groupToDtoMapper, uriInfoStore); - GroupCollectionResource groupCollectionResource = new GroupCollectionResource(groupManager, dtoToGroupMapper, groupCollectionToDtoMapper); + ResourceLinksMock.initMock(resourceLinks, URI.create("/")); + + GroupCollectionToDtoMapper groupCollectionToDtoMapper = new GroupCollectionToDtoMapper(groupToDtoMapper, resourceLinks); + GroupCollectionResource groupCollectionResource = new GroupCollectionResource(groupManager, dtoToGroupMapper, groupCollectionToDtoMapper, resourceLinks); GroupResource groupResource = new GroupResource(groupManager, groupToDtoMapper, dtoToGroupMapper); GroupRootResource groupRootResource = new GroupRootResource(MockProvider.of(groupCollectionResource), MockProvider.of(groupResource)); dispatcher.getRegistry().addSingletonResource(groupRootResource); - - when(uriInfo.getBaseUri()).thenReturn(URI.create("/")); - when(uriInfoStore.get()).thenReturn(uriInfo); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapperTest.java index 1a4c574182..1db089cd0b 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapperTest.java @@ -7,11 +7,11 @@ import org.apache.shiro.util.ThreadState; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; import sonia.scm.group.Group; -import javax.ws.rs.core.UriInfo; import java.net.URI; import java.net.URISyntaxException; import java.util.stream.IntStream; @@ -24,10 +24,8 @@ import static org.mockito.MockitoAnnotations.initMocks; public class GroupToGroupDtoMapperTest { - @Mock - private UriInfo uriInfo; - @Mock - private UriInfoStore uriInfoStore; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private ResourceLinks resourceLinks; @InjectMocks private GroupToGroupDtoMapperImpl mapper; @@ -42,9 +40,10 @@ public class GroupToGroupDtoMapperTest { initMocks(this); URI baseUri = new URI("http://example.com/base/"); expectedBaseUri = baseUri.resolve(GroupRootResource.GROUPS_PATH_V2 + "/"); - when(uriInfo.getBaseUri()).thenReturn(baseUri); - when(uriInfoStore.get()).thenReturn(uriInfo); subjectThreadState.bind(); + + ResourceLinksMock.initMock(resourceLinks, baseUri); + ThreadContext.bind(subject); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java new file mode 100644 index 0000000000..119ced5397 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java @@ -0,0 +1,26 @@ +package sonia.scm.api.v2.resources; + +import java.net.URI; + +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.when; +import static sonia.scm.api.v2.resources.GroupRootResource.GROUPS_PATH_V2; +import static sonia.scm.api.v2.resources.UserRootResource.USERS_PATH_V2; + +public class ResourceLinksMock { + public static void initMock(ResourceLinks resourceLinks, URI baseUri) { + when(resourceLinks.user().self(anyString())).thenAnswer(invocation -> baseUri + USERS_PATH_V2 + invocation.getArguments()[0]); + when(resourceLinks.user().update(anyString())).thenAnswer(invocation -> baseUri + USERS_PATH_V2 + invocation.getArguments()[0]); + when(resourceLinks.user().delete(anyString())).thenAnswer(invocation -> baseUri + USERS_PATH_V2 + invocation.getArguments()[0]); + + when(resourceLinks.userCollection().self()).thenAnswer(invocation -> baseUri + USERS_PATH_V2); + when(resourceLinks.userCollection().create()).thenAnswer(invocation -> baseUri + USERS_PATH_V2); + + when(resourceLinks.group().self(anyString())).thenAnswer(invocation -> baseUri + GROUPS_PATH_V2 + invocation.getArguments()[0]); + when(resourceLinks.group().update(anyString())).thenAnswer(invocation -> baseUri + GROUPS_PATH_V2 + invocation.getArguments()[0]); + when(resourceLinks.group().delete(anyString())).thenAnswer(invocation -> baseUri + GROUPS_PATH_V2 + invocation.getArguments()[0]); + + when(resourceLinks.groupCollection().self()).thenAnswer(invocation -> baseUri + GROUPS_PATH_V2); + when(resourceLinks.groupCollection().create()).thenAnswer(invocation -> baseUri + GROUPS_PATH_V2); + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java index 3eb43e8fc3..103eebd411 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java @@ -2,85 +2,92 @@ package sonia.scm.api.v2.resources; import org.junit.Before; import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; import javax.ws.rs.core.UriInfo; import java.net.URI; import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static sonia.scm.api.v2.resources.ResourceLinks.group; -import static sonia.scm.api.v2.resources.ResourceLinks.user; -import static sonia.scm.api.v2.resources.ResourceLinks.userCollection; +import static org.mockito.MockitoAnnotations.initMocks; public class ResourceLinksTest { private static final String BASE_URL = "http://example.com/"; - private UriInfo uriInfo = mock(UriInfo.class); + @Mock + private UriInfoStore uriInfoStore; + @Mock + private UriInfo uriInfo; + + @InjectMocks + private ResourceLinks resourceLinks; @Test public void shouldCreateCorrectUserSelfUrl() { - String url = user(uriInfo).self("ich"); + String url = resourceLinks.user().self("ich"); assertEquals(BASE_URL + UserRootResource.USERS_PATH_V2 + "ich", url); } @Test public void shouldCreateCorrectUserDeleteUrl() { - String url = user(uriInfo).delete("ich"); + String url = resourceLinks.user().delete("ich"); assertEquals(BASE_URL + UserRootResource.USERS_PATH_V2 + "ich", url); } @Test public void shouldCreateCorrectUserUpdateUrl() { - String url = user(uriInfo).update("ich"); + String url = resourceLinks.user().update("ich"); assertEquals(BASE_URL + UserRootResource.USERS_PATH_V2 + "ich", url); } @Test public void shouldCreateCorrectUserCreateUrl() { - String url = userCollection(uriInfo).create(); + String url = resourceLinks.userCollection().create(); assertEquals(BASE_URL + UserRootResource.USERS_PATH_V2, url); } @Test public void shouldCreateCorrectUserCollectionUrl() { - String url = userCollection(uriInfo).self(); + String url = resourceLinks.userCollection().self(); assertEquals(BASE_URL + UserRootResource.USERS_PATH_V2, url); } @Test public void shouldCreateCorrectGroupSelfUrl() { - String url = group(uriInfo).self("nobodies"); + String url = resourceLinks.group().self("nobodies"); assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2 + "nobodies", url); } @Test public void shouldCreateCorrectGroupDeleteUrl() { - String url = group(uriInfo).delete("nobodies"); + String url = resourceLinks.group().delete("nobodies"); assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2 + "nobodies", url); } @Test public void shouldCreateCorrectGroupUpdateUrl() { - String url = group(uriInfo).update("nobodies"); + String url = resourceLinks.group().update("nobodies"); assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2 + "nobodies", url); } @Test public void shouldCreateCorrectGroupCreateUrl() { - String url = ResourceLinks.groupCollection(uriInfo).create(); + String url = resourceLinks.groupCollection().create(); assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2, url); } @Test public void shouldCreateCorrectGroupCollectionUrl() { - String url = ResourceLinks.groupCollection(uriInfo).self(); + String url = resourceLinks.groupCollection().self(); assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2, url); } @Before public void initUriInfo() { + initMocks(this); + when(uriInfoStore.get()).thenReturn(uriInfo); when(uriInfo.getBaseUri()).thenReturn(URI.create(BASE_URL)); } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java index 4fb9402dfc..b9ed8558d4 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java @@ -7,12 +7,12 @@ import org.apache.shiro.util.ThreadContext; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; import sonia.scm.PageResult; import sonia.scm.user.User; -import javax.ws.rs.core.UriInfo; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; @@ -28,14 +28,12 @@ import static sonia.scm.PageResult.createPage; public class UserCollectionToDtoMapperTest { + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private ResourceLinks resourceLinks; @Mock - private UriInfo uriInfo; + private UserToUserDtoMapper userToDtoMapper; @Mock - private UriInfoStore uriInfoStore; - @Mock - private UserToUserDtoMapper userToDtoMapper; - @Mock - private Subject subject; + private Subject subject; @InjectMocks private SubjectThreadState subjectThreadState; @@ -49,8 +47,7 @@ public class UserCollectionToDtoMapperTest { initMocks(this); URI baseUri = new URI("http://example.com/base/"); expectedBaseUri = baseUri.resolve(UserRootResource.USERS_PATH_V2 + "/"); - when(uriInfo.getBaseUri()).thenReturn(baseUri); - when(uriInfoStore.get()).thenReturn(uriInfo); + ResourceLinksMock.initMock(resourceLinks, baseUri); subjectThreadState.bind(); ThreadContext.bind(subject); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java index dbd69828b9..077cbef9b2 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java @@ -11,6 +11,7 @@ import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.mockito.Answers; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -21,7 +22,6 @@ import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.UriInfo; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -51,10 +51,8 @@ public class UserRootResourceTest { private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); - @Mock - private UriInfo uriInfo; - @Mock - private UriInfoStore uriInfoStore; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private ResourceLinks resourceLinks; @Mock private PasswordService passwordService; @@ -75,16 +73,16 @@ public class UserRootResourceTest { doNothing().when(userManager).modify(userCaptor.capture()); doNothing().when(userManager).delete(userCaptor.capture()); - UserCollectionToDtoMapper userCollectionToDtoMapper = new UserCollectionToDtoMapper(userToDtoMapper, uriInfoStore); + ResourceLinksMock.initMock(resourceLinks, URI.create("/")); + + UserCollectionToDtoMapper userCollectionToDtoMapper = new UserCollectionToDtoMapper(userToDtoMapper, resourceLinks); UserCollectionResource userCollectionResource = new UserCollectionResource(userManager, dtoToUserMapper, - userCollectionToDtoMapper); + userCollectionToDtoMapper, resourceLinks); UserResource userResource = new UserResource(dtoToUserMapper, userToDtoMapper, userManager); UserRootResource userRootResource = new UserRootResource(MockProvider.of(userCollectionResource), MockProvider.of(userResource)); dispatcher.getRegistry().addSingletonResource(userRootResource); - when(uriInfo.getBaseUri()).thenReturn(URI.create("/")); - when(uriInfoStore.get()).thenReturn(uriInfo); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserToUserDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserToUserDtoMapperTest.java index d00f761702..684ccdb5f6 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserToUserDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserToUserDtoMapperTest.java @@ -7,12 +7,12 @@ import org.apache.shiro.util.ThreadState; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; import sonia.scm.api.rest.resources.UserResource; import sonia.scm.user.User; -import javax.ws.rs.core.UriInfo; import java.net.URI; import java.net.URISyntaxException; import java.time.Instant; @@ -25,10 +25,8 @@ import static org.mockito.MockitoAnnotations.initMocks; public class UserToUserDtoMapperTest { - @Mock - private UriInfo uriInfo; - @Mock - private UriInfoStore uriInfoStore; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private ResourceLinks resourceLinks; @InjectMocks private UserToUserDtoMapperImpl mapper; @@ -43,9 +41,8 @@ public class UserToUserDtoMapperTest { initMocks(this); URI baseUri = new URI("http://example.com/base/"); expectedBaseUri = baseUri.resolve(UserRootResource.USERS_PATH_V2 + "/"); - when(uriInfo.getBaseUri()).thenReturn(baseUri); - when(uriInfoStore.get()).thenReturn(uriInfo); subjectThreadState.bind(); + ResourceLinksMock.initMock(resourceLinks, baseUri); ThreadContext.bind(subject); }