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 c4ff5c1949..a6ecba1ab8 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 @@ -33,7 +33,7 @@ public class GroupCollectionToDtoMapper { public GroupCollectionDto map(int pageNumber, int pageSize, PageResult pageResult) { NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.hasMore()); - List dtos = pageResult.getEntities().stream().map(user -> groupToDtoMapper.map(user, uriInfoStore.get())).collect(Collectors.toList()); + List dtos = pageResult.getEntities().stream().map(user -> groupToDtoMapper.map(user)).collect(Collectors.toList()); GroupCollectionDto groupCollectionDto = new GroupCollectionDto( createLinks(paging), diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupSubResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupSubResource.java index 627b48745f..41ca16dc25 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupSubResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupSubResource.java @@ -42,7 +42,7 @@ public class GroupSubResource extends AbstractManagerResource memberDtos = group.getMembers().stream().map(name -> this.createMember(name, uriInfo)).collect(Collectors.toList()); + void mapMembers(Group group, @MappingTarget GroupDto target) { + List memberDtos = group.getMembers().stream().map(name -> this.createMember(name)).collect(Collectors.toList()); target.withEmbedded("members", memberDtos); } - private MemberDto createMember(String name, UriInfo uriInfo) { - Links.Builder linksBuilder = linkingTo().self(user(uriInfo).self(name)); + private MemberDto createMember(String name) { + Links.Builder linksBuilder = linkingTo().self(user(uriInfoStore.get()).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/UserCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java index d8d5405ad4..f31c08c6c7 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 @@ -34,12 +34,14 @@ public class UserCollectionResource extends AbstractManagerResource pageResult = fetchPage(sortby, desc, page, pageSize); - return Response.ok(new UserCollectionToDtoMapper(userToDtoMapper).map(uriInfo, page, pageSize, pageResult)).build(); + return Response.ok(userCollectionToDtoMapper.map(page, pageSize, pageResult)).build(); } /** 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 94d9bd7dfb..d3ebfd35b9 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 @@ -23,19 +23,27 @@ import static sonia.scm.api.v2.resources.ResourceLinks.userCollection; public class UserCollectionToDtoMapper { - private final UserToUserDtoMapper userToDtoMapper; - @Inject - public UserCollectionToDtoMapper(UserToUserDtoMapper userToDtoMapper) { + private UserToUserDtoMapper userToDtoMapper; + @Inject + private UriInfoStore uriInfoStore; + + public UserCollectionToDtoMapper(UserToUserDtoMapper userToDtoMapper, UriInfoStore uriInfoStore) { this.userToDtoMapper = userToDtoMapper; + this.uriInfoStore = uriInfoStore; } - public UserCollectionDto map(UriInfo uriInfo, int pageNumber, int pageSize, PageResult pageResult) { + public UserCollectionToDtoMapper() { + } + + + + public UserCollectionDto map(int pageNumber, int pageSize, PageResult pageResult) { NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.hasMore()); - List dtos = pageResult.getEntities().stream().map(user -> userToDtoMapper.map(user, uriInfo)).collect(Collectors.toList()); + List dtos = pageResult.getEntities().stream().map(userToDtoMapper::map).collect(Collectors.toList()); UserCollectionDto userCollectionDto = new UserCollectionDto( - createLinks(uriInfo, paging), + createLinks(uriInfoStore.get(), paging), embedDtos(dtos) ); userCollectionDto.setPage(pageNumber); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserSubResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserSubResource.java index 17291de70b..b8a3f5238a 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserSubResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserSubResource.java @@ -52,7 +52,7 @@ public class UserSubResource extends AbstractManagerResource "user" + n).collect(toList())); - GroupDto groupDto = mapper.map(group, uriInfo); + GroupDto groupDto = mapper.map(group); assertEquals(10, groupDto.getEmbedded().getItemsBy("members").size()); MemberDto actualMember = (MemberDto) groupDto.getEmbedded().getItemsBy("members").iterator().next(); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupV2ResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupV2ResourceTest.java index 219941e655..f514ee06c3 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupV2ResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupV2ResourceTest.java @@ -19,7 +19,9 @@ 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; import java.net.URL; import java.util.Collections; @@ -45,7 +47,10 @@ public class GroupV2ResourceTest { @Mock private GroupManager groupManager; - private final UriInfoStore uriInfoStore = new UriInfoStore(); + @Mock + private UriInfo uriInfo; + @Mock + private UriInfoStore uriInfoStore; @InjectMocks GroupDtoToGroupMapperImpl dtoToGroupMapper; @InjectMocks @@ -72,6 +77,9 @@ public class GroupV2ResourceTest { GroupV2Resource groupV2Resource = new GroupV2Resource(groupCollectionResource, groupSubResource); dispatcher.getRegistry().addSingletonResource(groupV2Resource); + + 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/UserCollectionToDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java index a9ffcaf688..03bcbd4521 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 @@ -4,10 +4,11 @@ import de.otto.edison.hal.HalRepresentation; import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; -import org.apache.shiro.util.ThreadState; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; import sonia.scm.PageResult; import sonia.scm.user.User; @@ -22,25 +23,34 @@ import static java.util.stream.Collectors.toList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; public class UserCollectionToDtoMapperTest { - private final UriInfo uriInfo = mock(UriInfo.class); - private final UserToUserDtoMapper userToDtoMapper = mock(UserToUserDtoMapper.class); - private final Subject subject = mock(Subject.class); - private final ThreadState subjectThreadState = new SubjectThreadState(subject); + @Mock + private UriInfo uriInfo; + @Mock + private UriInfoStore uriInfoStore; + @Mock + private UserToUserDtoMapper userToDtoMapper; + @Mock + private Subject subject; - private final UserCollectionToDtoMapper mapper = new UserCollectionToDtoMapper(userToDtoMapper); + @InjectMocks + private SubjectThreadState subjectThreadState; + @InjectMocks + private UserCollectionToDtoMapper mapper; private URI expectedBaseUri; @Before public void init() throws URISyntaxException { + initMocks(this); URI baseUri = new URI("http://example.com/base/"); expectedBaseUri = baseUri.resolve(UserV2Resource.USERS_PATH_V2 + "/"); when(uriInfo.getBaseUri()).thenReturn(baseUri); + when(uriInfoStore.get()).thenReturn(uriInfo); subjectThreadState.bind(); ThreadContext.bind(subject); } @@ -53,28 +63,28 @@ public class UserCollectionToDtoMapperTest { @Test public void shouldSetPageNumber() { PageResult pageResult = mockPageResult(true, "Hannes"); - UserCollectionDto userCollectionDto = mapper.map(uriInfo, 1, 1, pageResult); + UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertEquals(1, userCollectionDto.getPage()); } @Test public void shouldHaveSelfLink() { PageResult pageResult = mockPageResult(true, "Hannes"); - UserCollectionDto userCollectionDto = mapper.map(uriInfo, 1, 1, pageResult); + UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertTrue(userCollectionDto.getLinks().getLinkBy("self").get().getHref().startsWith(expectedBaseUri.toString())); } @Test public void shouldCreateNextPageLink_whenHasMore() { PageResult pageResult = mockPageResult(true, "Hannes"); - UserCollectionDto userCollectionDto = mapper.map(uriInfo, 1, 1, pageResult); + UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertTrue(userCollectionDto.getLinks().getLinkBy("next").get().getHref().contains("page=2")); } @Test public void shouldNotCreateNextPageLink_whenNoMore() { PageResult pageResult = mockPageResult(false, "Hannes"); - UserCollectionDto userCollectionDto = mapper.map(uriInfo, 1, 1, pageResult); + UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertFalse(userCollectionDto.getLinks().stream().anyMatch(link -> link.getHref().contains("page=2"))); } @@ -83,7 +93,7 @@ public class UserCollectionToDtoMapperTest { PageResult pageResult = mockPageResult(false, "Hannes"); when(subject.isPermitted("user:create")).thenReturn(true); - UserCollectionDto userCollectionDto = mapper.map(uriInfo, 1, 1, pageResult); + UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertTrue(userCollectionDto.getLinks().getLinkBy("create").isPresent()); } @@ -93,7 +103,7 @@ public class UserCollectionToDtoMapperTest { PageResult pageResult = mockPageResult(false, "Hannes"); when(subject.isPermitted("user:create")).thenReturn(false); - UserCollectionDto userCollectionDto = mapper.map(uriInfo, 1, 1, pageResult); + UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertFalse(userCollectionDto.getLinks().getLinkBy("create").isPresent()); } @@ -101,7 +111,7 @@ public class UserCollectionToDtoMapperTest { @Test public void shouldMapUsers() { PageResult pageResult = mockPageResult(false, "Hannes", "Wurst"); - UserCollectionDto userCollectionDto = mapper.map(uriInfo, 1, 2, pageResult); + UserCollectionDto userCollectionDto = mapper.map(1, 2, pageResult); List users = userCollectionDto.getEmbedded().getItemsBy("users"); assertEquals(2, users.size()); assertEquals("Hannes", ((UserDto) users.get(0)).getName()); @@ -116,7 +126,7 @@ public class UserCollectionToDtoMapperTest { private User mockUserWithDto(String userName) { User user = new User(); user.setName(userName); - when(userToDtoMapper.map(user, uriInfo)).thenReturn(createUserDto(user)); + when(userToDtoMapper.map(user)).thenReturn(createUserDto(user)); return user; } 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 05b5d4b4a9..a4f3da4e45 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,7 +7,8 @@ import org.apache.shiro.util.ThreadState; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.Mock; import sonia.scm.api.rest.resources.UserResource; import sonia.scm.user.User; @@ -20,11 +21,18 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; public class UserToUserDtoMapperTest { - private final UserToUserDtoMapper mapper = Mappers.getMapper(UserToUserDtoMapper.class); - private final UriInfo uriInfo = mock(UriInfo.class); + @Mock + private UriInfo uriInfo; + @Mock + private UriInfoStore uriInfoStore; + + @InjectMocks + private UserToUserDtoMapperImpl mapper; + private final Subject subject = mock(Subject.class); private final ThreadState subjectThreadState = new SubjectThreadState(subject); @@ -32,9 +40,11 @@ public class UserToUserDtoMapperTest { @Before public void init() throws URISyntaxException { + initMocks(this); URI baseUri = new URI("http://example.com/base/"); expectedBaseUri = baseUri.resolve(UserV2Resource.USERS_PATH_V2 + "/"); when(uriInfo.getBaseUri()).thenReturn(baseUri); + when(uriInfoStore.get()).thenReturn(uriInfo); subjectThreadState.bind(); ThreadContext.bind(subject); } @@ -49,7 +59,7 @@ public class UserToUserDtoMapperTest { User user = createDefaultUser(); when(subject.isPermitted("user:modify:abc")).thenReturn(true); - UserDto userDto = mapper.map(user, uriInfo); + UserDto userDto = mapper.map(user); assertEquals("expected self link", expectedBaseUri.resolve("abc").toString(), userDto.getLinks().getLinkBy("self").get().getHref()); assertEquals("expected update link", expectedBaseUri.resolve("abc").toString(), userDto.getLinks().getLinkBy("update").get().getHref()); @@ -60,7 +70,7 @@ public class UserToUserDtoMapperTest { User user = createDefaultUser(); when(subject.isPermitted("user:delete:abc")).thenReturn(true); - UserDto userDto = mapper.map(user, uriInfo); + UserDto userDto = mapper.map(user); assertEquals("expected self link", expectedBaseUri.resolve("abc").toString(), userDto.getLinks().getLinkBy("self").get().getHref()); assertEquals("expected delete link", expectedBaseUri.resolve("abc").toString(), userDto.getLinks().getLinkBy("delete").get().getHref()); @@ -78,7 +88,7 @@ public class UserToUserDtoMapperTest { User user = createDefaultUser(); when(subject.hasRole("user")).thenReturn(true); - UserDto userDto = mapper.map(user, uriInfo); + UserDto userDto = mapper.map(user); assertEquals("expected self link", expectedBaseUri.resolve("abc").toString(), userDto.getLinks().getLinkBy("self").get().getHref()); assertFalse("expected no delete link", userDto.getLinks().getLinkBy("delete").isPresent()); @@ -89,7 +99,7 @@ public class UserToUserDtoMapperTest { public void shouldMapFields() { User user = createDefaultUser(); - UserDto userDto = mapper.map(user, uriInfo); + UserDto userDto = mapper.map(user); assertEquals("abc", userDto.getName()); } @@ -99,7 +109,7 @@ public class UserToUserDtoMapperTest { User user = createDefaultUser(); user.setPassword("password"); - UserDto userDto = mapper.map(user, uriInfo); + UserDto userDto = mapper.map(user); assertEquals(UserResource.DUMMY_PASSWORT, userDto.getPassword()); } @@ -112,7 +122,7 @@ public class UserToUserDtoMapperTest { user.setCreationDate(expectedCreationDate.toEpochMilli()); user.setLastModified(expectedModificationDate.toEpochMilli()); - UserDto userDto = mapper.map(user, uriInfo); + UserDto userDto = mapper.map(user); assertEquals(expectedCreationDate, userDto.getCreationDate()); assertEquals(expectedModificationDate, userDto.getLastModified().get()); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserV2ResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserV2ResourceTest.java index 9c683d7565..accb9d9369 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserV2ResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserV2ResourceTest.java @@ -21,7 +21,9 @@ 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; import java.net.URL; import java.util.Collections; @@ -48,16 +50,23 @@ public class UserV2ResourceTest { private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + @Mock + private UriInfo uriInfo; + @Mock + private UriInfoStore uriInfoStore; + @Mock private PasswordService passwordService; @Mock private UserManager userManager; @InjectMocks - UserDtoToUserMapperImpl dtoToUserMapper; + private UserDtoToUserMapperImpl dtoToUserMapper; @InjectMocks - UserToUserDtoMapperImpl userToDtoMapper; + private UserToUserDtoMapperImpl userToDtoMapper; - ArgumentCaptor userCaptor = ArgumentCaptor.forClass(User.class); + private UserCollectionToDtoMapper userCollectionToDtoMapper; + + private ArgumentCaptor userCaptor = ArgumentCaptor.forClass(User.class); @Before public void prepareEnvironment() throws IOException, UserException { @@ -67,11 +76,14 @@ public class UserV2ResourceTest { when(userManager.get("Neo")).thenReturn(dummyUser); doNothing().when(userManager).create(userCaptor.capture()); - UserCollectionResource userCollectionResource = new UserCollectionResource(userManager, dtoToUserMapper, userToDtoMapper); + userCollectionToDtoMapper = new UserCollectionToDtoMapper(userToDtoMapper, uriInfoStore); + UserCollectionResource userCollectionResource = new UserCollectionResource(userManager, dtoToUserMapper, userToDtoMapper, userCollectionToDtoMapper); UserSubResource userSubResource = new UserSubResource(dtoToUserMapper, userToDtoMapper, userManager); UserV2Resource userV2Resource = new UserV2Resource(userCollectionResource, userSubResource); dispatcher.getRegistry().addSingletonResource(userV2Resource); + when(uriInfo.getBaseUri()).thenReturn(URI.create("/")); + when(uriInfoStore.get()).thenReturn(uriInfo); } @Test @@ -82,6 +94,7 @@ public class UserV2ResourceTest { dispatcher.invoke(request, response); assertEquals(HttpServletResponse.SC_OK, response.getStatus()); + System.out.println(response.getContentAsString()); assertTrue(response.getContentAsString().contains("\"name\":\"Neo\"")); assertTrue(response.getContentAsString().contains("\"password\":\"__dummypassword__\"")); assertTrue(response.getContentAsString().contains("\"self\":{\"href\":\"/v2/users/Neo\"}"));