Skip to content

Commit edb355f

Browse files
committed
Add user's in controllers.
1 parent f88ff4a commit edb355f

File tree

3 files changed

+87
-19
lines changed

3 files changed

+87
-19
lines changed

src/main/java/com/example/postgresdemo/model/User.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,9 @@ public class User {
1010
@GeneratedValue
1111
private Long id;
1212
@Size(min = 1, max = 50)
13-
@Column(columnDefinition = "firstname")
1413
private String firstname;
1514
@Size(min = 1, max = 50)
16-
@Column(columnDefinition = "lastname")
1715
private String lastname;
18-
@Column(columnDefinition = "password")
1916
private String password;
2017

2118
public User() {}

src/test/java/com/example/postgresdemo/controller/QuestionControllerTest.java

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.example.postgresdemo.controller;
22

33
import com.example.postgresdemo.model.Question;
4+
import com.example.postgresdemo.model.User;
45
import com.example.postgresdemo.repository.QuestionRepository;
6+
import com.example.postgresdemo.repository.UserRepository;
57

68
import org.hamcrest.Matchers;
79
import org.junit.jupiter.api.AfterEach;
10+
import org.junit.jupiter.api.BeforeEach;
811
import org.junit.jupiter.api.Test;
912
import org.springframework.beans.factory.annotation.Autowired;
1013
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -14,26 +17,39 @@
1417
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
1518
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
1619

17-
1820
import java.nio.CharBuffer;
1921

2022
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
2123
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
2224
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
2325

2426
@SpringBootTest
25-
2627
@AutoConfigureMockMvc
2728
public class QuestionControllerTest {
2829
@Autowired
2930
private QuestionRepository questionRepository;
3031

32+
@Autowired
33+
private UserRepository userRepository;
34+
3135
@Autowired
3236
private MockMvc mockMvc;
3337

38+
private Long userId;
39+
40+
@BeforeEach
41+
void setup() {
42+
User user = new User();
43+
user.setFirstname("John");
44+
user.setLastname("Doe");
45+
userRepository.save(user);
46+
userId = user.getId();
47+
}
48+
3449
@AfterEach
35-
void deleteQuestions() {
50+
void deleteAll() {
3651
questionRepository.deleteAll();
52+
userRepository.deleteAll();
3753
}
3854

3955
@Test
@@ -75,7 +91,8 @@ void testCreateCorrectQuestion() throws Exception {
7591
.contentType(MediaType.APPLICATION_JSON)
7692
.content("{\n" +
7793
" \"title\": \"Question 1\",\n" +
78-
" \"description\": \"Description 1\"\n" +
94+
" \"description\": \"Description 1\",\n" +
95+
" \"authorId\": \"" + userId + "\"\n" +
7996
"}"))
8097
.andExpect(status().isOk())
8198
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
@@ -87,32 +104,35 @@ void testCreateQuestionWithoutTitle() throws Exception {
87104
mockMvc.perform(MockMvcRequestBuilders.post("/questions")
88105
.contentType(MediaType.APPLICATION_JSON)
89106
.content("{\n" +
90-
" \"body\": \"\\nDescription\"\n" +
107+
" \"description\": \"Description\",\n" +
108+
" \"authorId\": \"" + userId + "\"\n" +
91109
"}"))
92110
.andExpect(status().is4xxClientError());
93111
}
94112

95113
@Test
96-
void testCreateQuestionWithTitleLesThenThreeChars() throws Exception {
114+
void testCreateQuestionWithTitleLessThanThreeChars() throws Exception {
97115
mockMvc.perform(MockMvcRequestBuilders.post("/questions")
98116
.contentType(MediaType.APPLICATION_JSON)
99117
.content("{\n" +
100118
" \"title\": \"Te\",\n" +
101-
" \"description\": \"Description\"\n" +
119+
" \"description\": \"Description\",\n" +
120+
" \"authorId\": \"" + userId + "\"\n" +
102121
"}"))
103122
.andExpect(status().is4xxClientError());
104123
}
105124

106125
@Test
107-
void testCreateQuestionWithTitleMoreThenHundredChars() throws Exception {
126+
void testCreateQuestionWithTitleMoreThanHundredChars() throws Exception {
108127
int numberOfChars = 101;
109128
String title = CharBuffer.allocate(numberOfChars).toString().replace('\0', 'T');
110129

111130
mockMvc.perform(MockMvcRequestBuilders.post("/questions")
112131
.contentType(MediaType.APPLICATION_JSON)
113132
.content("{\n" +
114133
" \"title\": \"" + title + "\",\n" +
115-
" \"description\": \"Description\"\n" +
134+
" \"description\": \"Description\",\n" +
135+
" \"authorId\": \"" + userId + "\"\n" +
116136
"}"))
117137
.andExpect(status().is4xxClientError());
118138
}
@@ -122,11 +142,24 @@ void testCreateQuestionWithoutDescription() throws Exception {
122142
mockMvc.perform(MockMvcRequestBuilders.post("/questions")
123143
.contentType(MediaType.APPLICATION_JSON)
124144
.content("{\n" +
125-
" \"title\": \"Question 1\"\n" +
145+
" \"title\": \"Question 1\",\n" +
146+
" \"authorId\": \"" + userId + "\"\n" +
126147
"}"))
127148
.andExpect(status().isOk())
128149
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
129-
.andExpect(MockMvcResultMatchers.jsonPath("$.body", Matchers.equalTo("Question 1\nnull")));}
150+
.andExpect(MockMvcResultMatchers.jsonPath("$.body", Matchers.equalTo("Question 1\nnull")));
151+
}
152+
153+
@Test
154+
void testCreateQuestionWithoutAuthor() throws Exception {
155+
mockMvc.perform(MockMvcRequestBuilders.post("/questions")
156+
.contentType(MediaType.APPLICATION_JSON)
157+
.content("{\n" +
158+
" \"title\": \"Question 1\",\n" +
159+
" \"description\": \"Description 1\"\n" +
160+
"}"))
161+
.andExpect(status().is4xxClientError());
162+
}
130163

131164
@Test
132165
void testUpdateQuestion() throws Exception {
@@ -137,7 +170,8 @@ void testUpdateQuestion() throws Exception {
137170
.contentType(MediaType.APPLICATION_JSON)
138171
.content("{\n" +
139172
" \"title\": \"Edited Question 1\",\n" +
140-
" \"description\": \"Edited Description 1\"\n" +
173+
" \"description\": \"Edited Description 1\",\n" +
174+
" \"authorId\": \"" + userId + "\"\n" +
141175
"}"))
142176
.andExpect(status().isOk())
143177
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
@@ -153,7 +187,8 @@ void testUpdateQuestionWithNonExistingId() throws Exception {
153187
.contentType(MediaType.APPLICATION_JSON)
154188
.content("{\n" +
155189
" \"title\": \"Edited Question 1\",\n" +
156-
" \"description\": \"Edited Description 1\"\n" +
190+
" \"description\": \"Edited Description 1\",\n" +
191+
" \"authorId\": \"" + userId + "\"\n" +
157192
"}"))
158193
.andExpect(status().is4xxClientError());
159194
}
@@ -173,6 +208,7 @@ private void fillQuestions(Integer number) {
173208
Question question = new Question();
174209
question.setTitle("Question " + i);
175210
question.setDescription("Description " + i);
211+
question.setUser(userRepository.findById(userId).orElseThrow());
176212
questionRepository.save(question);
177213
}
178214
}

src/test/java/com/example/postgresdemo/service/QuestionServiceTest.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import com.example.postgresdemo.model.Question;
55
import com.example.postgresdemo.model.QuestionRequestDTO;
66
import com.example.postgresdemo.model.QuestionResponseDTO;
7+
import com.example.postgresdemo.model.User;
78
import com.example.postgresdemo.repository.QuestionRepository;
9+
import com.example.postgresdemo.repository.UserRepository;
810
import org.junit.jupiter.api.Assertions;
911
import org.junit.jupiter.api.Test;
1012
import org.junit.jupiter.api.extension.ExtendWith;
@@ -28,6 +30,9 @@ class QuestionServiceTest {
2830
@Mock
2931
QuestionRepository questionRepository;
3032

33+
@Mock
34+
UserRepository userRepository;
35+
3136
@InjectMocks
3237
QuestionService questionService;
3338

@@ -61,71 +66,101 @@ void testFindAll() {
6166
@ParameterizedTest
6267
@MethodSource("provideDescriptions")
6368
void testCreateWithDescriptionVariations(String description, String expectedBody) {
69+
Long authorId = 1L;
6470
QuestionRequestDTO request = new QuestionRequestDTO();
6571
request.setTitle("Title");
6672
request.setDescription(description);
73+
request.setAuthorId(authorId);
74+
75+
User user = new User();
76+
user.setId(authorId);
77+
user.setFirstname("John");
78+
user.setLastname("Doe");
6779

6880
Question question = new Question();
6981
question.setId(1L);
7082
question.setTitle("Title");
7183
question.setDescription(description);
84+
question.setUser(user);
7285

73-
ArgumentCaptor<Question> questionCaptor = ArgumentCaptor.forClass(Question.class);
86+
Mockito.when(userRepository.findById(authorId)).thenReturn(Optional.of(user));
7487
Mockito.when(questionRepository.save(questionCaptor.capture())).thenReturn(question);
7588

7689
QuestionResponseDTO result = questionService.create(request);
7790

91+
Mockito.verify(userRepository).findById(authorId);
7892
Mockito.verify(questionRepository).save(questionCaptor.capture());
7993

8094
Question capturedQuestion = questionCaptor.getValue();
8195

8296
Assertions.assertEquals(request.getTitle(), capturedQuestion.getTitle());
8397
Assertions.assertEquals(request.getDescription(), capturedQuestion.getDescription());
98+
Assertions.assertEquals(user, capturedQuestion.getUser());
8499
Assertions.assertEquals(1L, result.getId());
85-
86100
Assertions.assertEquals(expectedBody, result.getBody());
87101
}
88102

89103
@Test
90104
void testUpdateExistingQuestion() {
91105
Long questionId = 123L;
106+
Long authorId = 1L;
92107
QuestionRequestDTO request = new QuestionRequestDTO();
93108
request.setTitle("Title");
94109
request.setDescription("Description");
110+
request.setAuthorId(authorId);
111+
112+
User user = new User();
113+
user.setId(authorId);
114+
user.setFirstname("John");
115+
user.setLastname("Doe");
116+
95117
Question questionToUpdate = new Question();
96118
questionToUpdate.setId(questionId);
97119
questionToUpdate.setTitle("Old Title");
98120
questionToUpdate.setDescription("Old Description");
121+
questionToUpdate.setUser(user);
99122

123+
Mockito.when(userRepository.findById(authorId)).thenReturn(Optional.of(user));
100124
Mockito.when(questionRepository.findById(questionId)).thenReturn(Optional.of(questionToUpdate));
101125
Mockito.when(questionRepository.save(questionCaptor.capture())).thenReturn(questionToUpdate);
102126

103127
QuestionResponseDTO result = questionService.update(questionId, request);
104128

129+
Mockito.verify(userRepository).findById(authorId);
105130
Mockito.verify(questionRepository).findById(questionId);
106131
Mockito.verify(questionRepository).save(questionCaptor.capture());
107132

108133
Question capturedQuestion = questionCaptor.getValue();
109134

110135
Assertions.assertEquals(request.getTitle(), capturedQuestion.getTitle());
111136
Assertions.assertEquals(request.getDescription(), capturedQuestion.getDescription());
137+
Assertions.assertEquals(user, capturedQuestion.getUser());
112138
Assertions.assertEquals(questionId, result.getId());
113139
}
114140

115141
@Test
116142
void testUpdateNotExistingQuestion() {
117143
Long questionId = 123L;
144+
Long authorId = 1L;
118145
QuestionRequestDTO request = new QuestionRequestDTO();
119146
request.setTitle("Title");
120147
request.setDescription("Description");
148+
request.setAuthorId(authorId);
149+
150+
User user = new User();
151+
user.setId(authorId);
152+
user.setFirstname("John");
153+
user.setLastname("Doe");
121154

155+
Mockito.when(userRepository.findById(authorId)).thenReturn(Optional.of(user));
122156
Mockito.when(questionRepository.findById(questionId)).thenReturn(Optional.empty());
123157

124158
ResourceNotFoundException resourceNotFoundException = Assertions.assertThrows(ResourceNotFoundException.class, () -> {
125159
questionService.update(questionId, request);
126160
});
127161

128162
Assertions.assertEquals("Question not found with id " + questionId, resourceNotFoundException.getMessage());
163+
Mockito.verify(userRepository).findById(authorId);
129164
Mockito.verify(questionRepository).findById(questionId);
130165
Mockito.verifyNoMoreInteractions(questionRepository);
131166
}
@@ -166,4 +201,4 @@ private static Stream<Arguments> provideDescriptions() {
166201
Arguments.of("Some description", "Title\nSome description")
167202
);
168203
}
169-
}
204+
}

0 commit comments

Comments
 (0)