Skip to content

Commit 1f1123d

Browse files
admin@javaops.ruadmin@javaops.ru
authored andcommitted
6_04_json_support
1 parent fe0becc commit 1f1123d

6 files changed

Lines changed: 107 additions & 0 deletions

File tree

src/main/java/ru/javaops/bootjava/config/WebSecurityConfig.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ru.javaops.bootjava.config;
22

3+
import com.fasterxml.jackson.databind.ObjectMapper;
34
import lombok.AllArgsConstructor;
45
import lombok.extern.slf4j.Slf4j;
56
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,7 +19,9 @@
1819
import ru.javaops.bootjava.model.Role;
1920
import ru.javaops.bootjava.model.User;
2021
import ru.javaops.bootjava.repository.UserRepository;
22+
import ru.javaops.bootjava.util.JsonUtil;
2123

24+
import javax.annotation.PostConstruct;
2225
import java.util.Optional;
2326

2427
@Configuration
@@ -29,6 +32,12 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
2932

3033
public static final PasswordEncoder PASSWORD_ENCODER = PasswordEncoderFactories.createDelegatingPasswordEncoder();
3134
private final UserRepository userRepository;
35+
private final ObjectMapper objectMapper;
36+
37+
@PostConstruct
38+
void setMapper() {
39+
JsonUtil.setObjectMapper(objectMapper);
40+
}
3241

3342
@Bean
3443
public UserDetailsService userDetailsService() {

src/main/java/ru/javaops/bootjava/model/User.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import javax.validation.constraints.NotEmpty;
1212
import javax.validation.constraints.Size;
1313
import java.io.Serializable;
14+
import java.util.Collection;
15+
import java.util.EnumSet;
1416
import java.util.Set;
1517

1618
@Entity
@@ -21,6 +23,10 @@
2123
@AllArgsConstructor
2224
@ToString(callSuper = true, exclude = {"password"})
2325
public class User extends BaseEntity implements Serializable {
26+
public User(Integer id, String email, String firstName, String lastName, String password, Collection<Role> roles) {
27+
this(email, firstName, lastName, password, EnumSet.copyOf(roles));
28+
this.id = id;
29+
}
2430

2531
@Column(name = "email", nullable = false, unique = true)
2632
@Email
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ru.javaops.bootjava.util;
2+
3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.ObjectReader;
6+
import lombok.experimental.UtilityClass;
7+
8+
import java.io.IOException;
9+
import java.util.List;
10+
11+
@UtilityClass
12+
public class JsonUtil {
13+
private static ObjectMapper objectMapper;
14+
15+
public static void setObjectMapper(ObjectMapper objectMapper) {
16+
JsonUtil.objectMapper = objectMapper;
17+
}
18+
19+
public static <T> List<T> readValues(String json, Class<T> clazz) throws IOException {
20+
ObjectReader reader = objectMapper.readerFor(clazz);
21+
return reader.<T>readValues(json).readAll();
22+
}
23+
24+
public static <T> T readValue(String json, Class<T> clazz) throws JsonProcessingException {
25+
return objectMapper.readValue(json, clazz);
26+
}
27+
28+
public static <T> String writeValue(T obj) throws JsonProcessingException {
29+
return objectMapper.writeValueAsString(obj);
30+
}
31+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
11
package ru.javaops.bootjava;
22

3+
import ru.javaops.bootjava.model.Role;
4+
import ru.javaops.bootjava.model.User;
5+
6+
import java.util.List;
7+
38
public class UserTestUtil {
49
public static final int USER_ID = 1;
510
public static final int ADMIN_ID = 2;
611
public static final String USER_MAIL = "user@gmail.com";
712
public static final String ADMIN_MAIL = "admin@javaops.ru";
13+
14+
public static User getNew() {
15+
return new User(null, "new@gmail.com", "New_First", "New_Last", "newpass", List.of(Role.USER));
16+
}
17+
18+
public static User getUpdated() {
19+
return new User(USER_ID, "user_update@gmail.com", "User_First_Update", "User_Last_Update", "password_update", List.of(Role.USER));
20+
}
821
}

src/test/java/ru/javaops/bootjava/web/AccountControllerTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44
import org.junit.jupiter.api.Test;
55
import org.springframework.beans.factory.annotation.Autowired;
66
import org.springframework.hateoas.MediaTypes;
7+
import org.springframework.http.MediaType;
78
import org.springframework.security.test.context.support.WithUserDetails;
89
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
10+
import ru.javaops.bootjava.UserTestUtil;
11+
import ru.javaops.bootjava.model.User;
912
import ru.javaops.bootjava.repository.UserRepository;
1013

1114
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
1215
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
1316
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
1417
import static ru.javaops.bootjava.UserTestUtil.*;
18+
import static ru.javaops.bootjava.util.JsonUtil.writeValue;
1519
import static ru.javaops.bootjava.web.AccountController.URL;
1620

1721
class AccountControllerTest extends AbstractControllerTest {
@@ -42,4 +46,24 @@ void delete() throws Exception {
4246
Assertions.assertFalse(userRepository.findById(USER_ID).isPresent());
4347
Assertions.assertTrue(userRepository.findById(ADMIN_ID).isPresent());
4448
}
49+
50+
@Test
51+
void register() throws Exception {
52+
User newUser = UserTestUtil.getNew();
53+
perform(MockMvcRequestBuilders.post(URL + "/register")
54+
.contentType(MediaType.APPLICATION_JSON)
55+
.content(writeValue(newUser)))
56+
.andExpect(status().isCreated());
57+
}
58+
59+
@Test
60+
@WithUserDetails(value = USER_MAIL)
61+
void update() throws Exception {
62+
User updated = UserTestUtil.getUpdated();
63+
perform(MockMvcRequestBuilders.put(URL)
64+
.contentType(MediaType.APPLICATION_JSON)
65+
.content(writeValue(updated)))
66+
.andDo(print())
67+
.andExpect(status().isNoContent());
68+
}
4569
}

src/test/java/ru/javaops/bootjava/web/UserControllerTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44
import org.junit.jupiter.api.Test;
55
import org.springframework.beans.factory.annotation.Autowired;
66
import org.springframework.hateoas.MediaTypes;
7+
import org.springframework.http.MediaType;
78
import org.springframework.security.test.context.support.WithUserDetails;
89
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
10+
import ru.javaops.bootjava.UserTestUtil;
11+
import ru.javaops.bootjava.model.User;
912
import ru.javaops.bootjava.repository.UserRepository;
1013

1114
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
1215
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
1316
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
1417
import static ru.javaops.bootjava.UserTestUtil.*;
18+
import static ru.javaops.bootjava.util.JsonUtil.writeValue;
1519

1620
class UserControllerTest extends AbstractControllerTest {
1721
static final String URL = "/api/users/";
@@ -61,4 +65,24 @@ void delete() throws Exception {
6165
Assertions.assertFalse(userRepository.findById(USER_ID).isPresent());
6266
Assertions.assertTrue(userRepository.findById(ADMIN_ID).isPresent());
6367
}
68+
69+
@Test
70+
@WithUserDetails(value = ADMIN_MAIL)
71+
void create() throws Exception {
72+
User newUser = UserTestUtil.getNew();
73+
perform(MockMvcRequestBuilders.post(URL)
74+
.contentType(MediaType.APPLICATION_JSON)
75+
.content(writeValue(newUser)))
76+
.andExpect(status().isCreated());
77+
}
78+
79+
@Test
80+
@WithUserDetails(value = ADMIN_MAIL)
81+
void update() throws Exception {
82+
User updated = UserTestUtil.getUpdated();
83+
perform(MockMvcRequestBuilders.put(URL + USER_ID)
84+
.contentType(MediaType.APPLICATION_JSON)
85+
.content(writeValue(updated)))
86+
.andExpect(status().isNoContent());
87+
}
6488
}

0 commit comments

Comments
 (0)