Use Optional for optional attributes

This commit is contained in:
René Pfeuffer
2018-06-01 15:07:35 +02:00
parent c62168274d
commit 71fa5e100c
6 changed files with 55 additions and 24 deletions

View File

@@ -10,6 +10,7 @@ import javax.ws.rs.core.UriInfo;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Mapper
public abstract class User2UserDtoMapper {
@@ -35,8 +36,16 @@ public abstract class User2UserDtoMapper {
target.setLinks(links);
}
@Mappings({@Mapping(target = "lastModified"), @Mapping(target = "creationDate")})
@Mapping(target = "creationDate")
Instant mapTime(Long epochMilli) {
return epochMilli == null? null: Instant.ofEpochMilli(epochMilli);
// TODO assert parameter not null
return Instant.ofEpochMilli(epochMilli);
}
@Mapping(target = "lastModified")
Optional<Instant> mapOptionalTime(Long epochMilli) {
return Optional
.ofNullable(epochMilli)
.map(Instant::ofEpochMilli);
}
}

View File

@@ -5,6 +5,7 @@ import lombok.Data;
import javax.xml.bind.annotation.XmlElement;
import java.time.Instant;
import java.util.Map;
import java.util.Optional;
@Data
public class UserDto {
@@ -12,7 +13,7 @@ public class UserDto {
private boolean admin;
private Instant creationDate;
private String displayName;
private Instant lastModified;
private Optional<Instant> lastModified;
private String mail;
private String name;
private String password;

View File

@@ -2,10 +2,14 @@ package sonia.scm.api.v2.resources;
import com.google.inject.Inject;
import org.apache.shiro.authc.credential.PasswordService;
import org.mapstruct.*;
import org.mapstruct.Context;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import sonia.scm.user.User;
import java.time.Instant;
import java.util.Optional;
import static sonia.scm.api.rest.resources.UserResource.DUMMY_PASSWORT;
@@ -31,8 +35,14 @@ public abstract class UserDto2UserMapper {
}
}
@Mappings({@Mapping(target = "lastModified"), @Mapping(target = "creationDate")})
@Mapping(target = "creationDate")
Long mapTime(Instant instant) {
return instant == null? null: instant.toEpochMilli();
// TODO assert parameter not null
return instant.toEpochMilli();
}
@Mapping(target = "lastModified")
Long mapOptionalTime(Optional<Instant> instant) {
return instant.map(Instant::toEpochMilli).orElse(null);
}
}

View File

@@ -39,8 +39,7 @@ public class User2UserDtoMapperTest {
@Test
public void shouldMapLinks_forAdmin() {
User user = new User();
user.setName("abc");
User user = createDefaultUser();
when(subject.hasRole("admin")).thenReturn(true);
UserDto userDto = mapper.userToUserDto(user, uriInfo);
@@ -51,10 +50,16 @@ public class User2UserDtoMapperTest {
assertEquals("expected map with create baseUri", expextedBaseUri, userDto.getLinks().get("create").getHref());
}
@Test
public void shouldMapLinks_forNormalUser() {
private User createDefaultUser() {
User user = new User();
user.setName("abc");
user.setCreationDate(1L);
return user;
}
@Test
public void shouldMapLinks_forNormalUser() {
User user = createDefaultUser();
when(subject.hasRole("user")).thenReturn(true);
UserDto userDto = mapper.userToUserDto(user, uriInfo);
@@ -67,8 +72,7 @@ public class User2UserDtoMapperTest {
@Test
public void shouldMapFields() {
User user = new User();
user.setName("abc");
User user = createDefaultUser();
UserDto userDto = mapper.userToUserDto(user, uriInfo);
@@ -77,9 +81,8 @@ public class User2UserDtoMapperTest {
@Test
public void shouldRemovePassword() {
User user = new User();
User user = createDefaultUser();
user.setPassword("password");
user.setName("abc");
UserDto userDto = mapper.userToUserDto(user, uriInfo);
@@ -88,8 +91,7 @@ public class User2UserDtoMapperTest {
@Test
public void shouldMapTimes() {
User user = new User();
user.setName("abc");
User user = createDefaultUser();
Instant expectedCreationDate = Instant.ofEpochSecond(6666666);
Instant expectedModificationDate = expectedCreationDate.plusSeconds(1);
user.setCreationDate(expectedCreationDate.toEpochMilli());
@@ -98,6 +100,6 @@ public class User2UserDtoMapperTest {
UserDto userDto = mapper.userToUserDto(user, uriInfo);
assertEquals(expectedCreationDate, userDto.getCreationDate());
assertEquals(expectedModificationDate, userDto.getLastModified());
assertEquals(expectedModificationDate, userDto.getLastModified().get());
}
}

View File

@@ -8,8 +8,10 @@ import org.mockito.Mock;
import sonia.scm.user.User;
import java.time.Instant;
import java.util.Optional;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
@@ -22,8 +24,7 @@ public class UserDto2UserMapperTest {
@Test
public void shouldMapFields() {
UserDto dto = new UserDto();
dto.setName("abc");
UserDto dto = createDefaultDto();
User user = mapper.userDtoToUser(dto, "original password");
assertEquals("abc" , user.getName());
}
@@ -32,7 +33,7 @@ public class UserDto2UserMapperTest {
public void shouldEncodePassword() {
when(passwordService.encryptPassword("unencrypted")).thenReturn("encrypted");
UserDto dto = new UserDto();
UserDto dto = createDefaultDto();
dto.setPassword("unencrypted");
User user = mapper.userDtoToUser(dto, "original password");
assertEquals("encrypted" , user.getPassword());
@@ -40,21 +41,28 @@ public class UserDto2UserMapperTest {
@Test
public void shouldMapTimes() {
UserDto dto = new UserDto();
dto.setName("abc");
UserDto dto = createDefaultDto();
Instant expectedCreationDate = Instant.ofEpochMilli(66666660000L);
Instant expectedModificationDate = null;
Optional<Instant> expectedModificationDate = Optional.empty();
dto.setCreationDate(expectedCreationDate);
dto.setLastModified(expectedModificationDate);
User user = mapper.userDtoToUser(dto, "original password");
assertEquals((Long) expectedCreationDate.toEpochMilli(), user.getCreationDate());
assertEquals(null, user.getLastModified());
assertNull(user.getLastModified());
}
@Before
public void init() {
initMocks(this);
}
private UserDto createDefaultDto() {
UserDto dto = new UserDto();
dto.setName("abc");
dto.setCreationDate(Instant.now());
dto.setLastModified(Optional.empty());
return dto;
}
}

View File

@@ -79,6 +79,7 @@ public class UserV2ResourceTest {
User user = new User();
user.setName("Neo");
user.setPassword("redpill");
user.setCreationDate(System.currentTimeMillis());
return user;
}
}