Skip to content

Commit d358a4e

Browse files
committed
Implement tests
1 parent b102df9 commit d358a4e

File tree

5 files changed

+601
-3
lines changed

5 files changed

+601
-3
lines changed

pom.xml

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
<xml-format.version>3.2.2</xml-format.version>
3131
<checkstyle.version>3.2.2</checkstyle.version>
3232
<graphql-java-kickstart.version>15.0.0</graphql-java-kickstart.version>
33-
<graphql-java-extended-scalars.version>20.2</graphql-java-extended-scalars.version>
33+
<graphql-scalars.version>20.2</graphql-scalars.version>
34+
<mockito.version>5.4.0</mockito.version>
35+
<jacoco.version>0.8.8</jacoco.version>
3436
</properties>
3537

3638
<dependencies>
@@ -74,7 +76,7 @@
7476
<dependency>
7577
<groupId>com.graphql-java</groupId>
7678
<artifactId>graphql-java-extended-scalars</artifactId>
77-
<version>${graphql-java-extended-scalars.version}</version>
79+
<version>${graphql-scalars.version}</version>
7880
</dependency>
7981

8082
<dependency>
@@ -164,6 +166,25 @@
164166
<version>${minio.version}</version>
165167
</dependency>
166168

169+
<dependency>
170+
<groupId>org.mockito</groupId>
171+
<artifactId>mockito-core</artifactId>
172+
<version>${mockito.version}</version>
173+
<scope>test</scope>
174+
</dependency>
175+
176+
<dependency>
177+
<groupId>org.springframework.boot</groupId>
178+
<artifactId>spring-boot-starter-test</artifactId>
179+
<scope>test</scope>
180+
</dependency>
181+
182+
<dependency>
183+
<groupId>junit</groupId>
184+
<artifactId>junit</artifactId>
185+
<scope>test</scope>
186+
</dependency>
187+
167188
</dependencies>
168189

169190
<build>
@@ -217,12 +238,55 @@
217238
<goal>check</goal>
218239
</goals>
219240
<configuration>
220-
<suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
241+
<suppressionsFileExpression>checkstyle-suppressions.xml</suppressionsFileExpression>
221242
<suppressionsLocation>checkstyle-suppressions.xml</suppressionsLocation>
222243
</configuration>
223244
</execution>
224245
</executions>
225246
</plugin>
247+
<plugin>
248+
<groupId>org.jacoco</groupId>
249+
<artifactId>jacoco-maven-plugin</artifactId>
250+
<version>${jacoco.version}</version>
251+
<executions>
252+
<execution>
253+
<id>default-prepare-agent</id>
254+
<goals>
255+
<goal>prepare-agent</goal>
256+
</goals>
257+
</execution>
258+
<execution>
259+
<id>report</id>
260+
<phase>prepare-package</phase>
261+
<goals>
262+
<goal>report</goal>
263+
</goals>
264+
</execution>
265+
<execution>
266+
<id>check</id>
267+
<goals>
268+
<goal>check</goal>
269+
</goals>
270+
<configuration>
271+
<rules>
272+
<rule implementation="org.jacoco.maven.RuleConfiguration">
273+
<element>PACKAGE</element>
274+
<limits>
275+
<limit implementation="org.jacoco.report.check.Limit">
276+
<counter>INSTRUCTION</counter>
277+
<value>COVEREDRATIO</value>
278+
<minimum>0.60</minimum>
279+
</limit>
280+
</limits>
281+
<includes>
282+
<include>com.example.tasklist.service.impl</include>
283+
</includes>
284+
</rule>
285+
</rules>
286+
</configuration>
287+
</execution>
288+
</executions>
289+
</plugin>
226290
</plugins>
227291
</build>
228292

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.example.tasklist.config;
2+
3+
import com.example.tasklist.repository.TaskRepository;
4+
import com.example.tasklist.repository.UserRepository;
5+
import com.example.tasklist.service.ImageService;
6+
import com.example.tasklist.service.impl.AuthServiceImpl;
7+
import com.example.tasklist.service.impl.ImageServiceImpl;
8+
import com.example.tasklist.service.impl.TaskServiceImpl;
9+
import com.example.tasklist.service.impl.UserServiceImpl;
10+
import com.example.tasklist.service.props.JwtProperties;
11+
import com.example.tasklist.service.props.MinioProperties;
12+
import com.example.tasklist.web.security.JwtTokenProvider;
13+
import com.example.tasklist.web.security.JwtUserDetailsService;
14+
import io.minio.MinioClient;
15+
import lombok.RequiredArgsConstructor;
16+
import org.mockito.Mockito;
17+
import org.springframework.boot.test.context.TestConfiguration;
18+
import org.springframework.context.annotation.Bean;
19+
import org.springframework.context.annotation.Primary;
20+
import org.springframework.security.authentication.AuthenticationManager;
21+
import org.springframework.security.core.userdetails.UserDetailsService;
22+
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
23+
24+
@TestConfiguration
25+
@RequiredArgsConstructor
26+
public class TestConfig {
27+
28+
private final UserRepository userRepository;
29+
private final TaskRepository taskRepository;
30+
private final AuthenticationManager authenticationManager;
31+
32+
@Bean
33+
@Primary
34+
public BCryptPasswordEncoder testPasswordEncoder() {
35+
return new BCryptPasswordEncoder();
36+
}
37+
38+
39+
@Bean
40+
public JwtProperties jwtProperties() {
41+
JwtProperties jwtProperties = new JwtProperties();
42+
jwtProperties.setSecret(
43+
"dmdqYmhqbmttYmNhamNjZWhxa25hd2puY2xhZWtic3ZlaGtzYmJ1dg=="
44+
);
45+
return jwtProperties;
46+
}
47+
48+
@Bean
49+
public UserDetailsService userDetailsService() {
50+
return new JwtUserDetailsService(userService());
51+
}
52+
53+
@Bean
54+
public MinioClient minioClient() {
55+
return Mockito.mock(MinioClient.class);
56+
}
57+
58+
@Bean
59+
public MinioProperties minioProperties() {
60+
MinioProperties properties = new MinioProperties();
61+
properties.setBucket("images");
62+
return properties;
63+
}
64+
65+
@Bean
66+
@Primary
67+
public ImageService imageService() {
68+
return new ImageServiceImpl(minioClient(), minioProperties());
69+
}
70+
71+
@Bean
72+
public JwtTokenProvider tokenProvider() {
73+
return new JwtTokenProvider(jwtProperties(),
74+
userDetailsService(),
75+
userService());
76+
}
77+
78+
@Bean
79+
@Primary
80+
public UserServiceImpl userService() {
81+
return new UserServiceImpl(userRepository, testPasswordEncoder());
82+
}
83+
84+
@Bean
85+
@Primary
86+
public TaskServiceImpl taskService() {
87+
return new TaskServiceImpl(taskRepository, imageService());
88+
}
89+
90+
@Bean
91+
@Primary
92+
public AuthServiceImpl authService() {
93+
return new AuthServiceImpl(authenticationManager,
94+
userService(),
95+
tokenProvider());
96+
}
97+
98+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.example.tasklist.service.impl;
2+
3+
import com.example.tasklist.config.TestConfig;
4+
import com.example.tasklist.domain.exception.ResourceNotFoundException;
5+
import com.example.tasklist.domain.user.Role;
6+
import com.example.tasklist.domain.user.User;
7+
import com.example.tasklist.repository.TaskRepository;
8+
import com.example.tasklist.repository.UserRepository;
9+
import com.example.tasklist.web.dto.auth.JwtRequest;
10+
import com.example.tasklist.web.dto.auth.JwtResponse;
11+
import com.example.tasklist.web.security.JwtTokenProvider;
12+
import org.junit.jupiter.api.Assertions;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.ExtendWith;
15+
import org.mockito.Mockito;
16+
import org.mockito.junit.jupiter.MockitoExtension;
17+
import org.springframework.beans.factory.annotation.Autowired;
18+
import org.springframework.boot.test.mock.mockito.MockBean;
19+
import org.springframework.context.annotation.Import;
20+
import org.springframework.security.authentication.AuthenticationManager;
21+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
22+
import org.springframework.test.context.ActiveProfiles;
23+
import org.springframework.test.context.junit.jupiter.SpringExtension;
24+
25+
import java.util.Collections;
26+
import java.util.Set;
27+
28+
@ExtendWith(SpringExtension.class)
29+
@ActiveProfiles("test")
30+
@Import(TestConfig.class)
31+
@ExtendWith(MockitoExtension.class)
32+
public class AuthServiceImplTest {
33+
34+
@MockBean
35+
private AuthenticationManager authenticationManager;
36+
37+
@MockBean
38+
private UserServiceImpl userService;
39+
40+
@MockBean
41+
private UserRepository userRepository;
42+
43+
@MockBean
44+
private TaskRepository taskRepository;
45+
46+
@MockBean
47+
private JwtTokenProvider tokenProvider;
48+
49+
@Autowired
50+
private AuthServiceImpl authService;
51+
52+
@Test
53+
void login() {
54+
Long userId = 1L;
55+
String username = "username";
56+
String password = "password";
57+
Set<Role> roles = Collections.emptySet();
58+
String accessToken = "accessToken";
59+
String refreshToken = "refreshToken";
60+
JwtRequest request = new JwtRequest();
61+
request.setUsername(username);
62+
request.setPassword(password);
63+
User user = new User();
64+
user.setId(userId);
65+
user.setUsername(username);
66+
user.setRoles(roles);
67+
Mockito.when(userService.getByUsername(username))
68+
.thenReturn(user);
69+
Mockito.when(tokenProvider.createAccessToken(userId, username, roles))
70+
.thenReturn(accessToken);
71+
Mockito.when(tokenProvider.createRefreshToken(userId, username))
72+
.thenReturn(refreshToken);
73+
JwtResponse response = authService.login(request);
74+
Mockito.verify(authenticationManager)
75+
.authenticate(
76+
new UsernamePasswordAuthenticationToken(
77+
request.getUsername(),
78+
request.getPassword())
79+
);
80+
Assertions.assertEquals(response.getUsername(), username);
81+
Assertions.assertEquals(response.getId(), userId);
82+
Assertions.assertNotNull(response.getAccessToken());
83+
Assertions.assertNotNull(response.getRefreshToken());
84+
}
85+
86+
@Test
87+
void loginWithIncorrectUsername() {
88+
String username = "username";
89+
String password = "password";
90+
JwtRequest request = new JwtRequest();
91+
request.setUsername(username);
92+
request.setPassword(password);
93+
User user = new User();
94+
user.setUsername(username);
95+
Mockito.when(userService.getByUsername(username))
96+
.thenThrow(ResourceNotFoundException.class);
97+
Mockito.verifyNoInteractions(tokenProvider);
98+
Assertions.assertThrows(ResourceNotFoundException.class,
99+
() -> authService.login(request));
100+
}
101+
102+
@Test
103+
void refresh() {
104+
String refreshToken = "refreshToken";
105+
String accessToken = "accessToken";
106+
String newRefreshToken = "newRefreshToken";
107+
JwtResponse response = new JwtResponse();
108+
response.setAccessToken(accessToken);
109+
response.setRefreshToken(newRefreshToken);
110+
Mockito.when(tokenProvider.refreshUserTokens(refreshToken))
111+
.thenReturn(response);
112+
JwtResponse testResponse = authService.refresh(refreshToken);
113+
Mockito.verify(tokenProvider).refreshUserTokens(refreshToken);
114+
Assertions.assertEquals(testResponse, response);
115+
}
116+
117+
}

0 commit comments

Comments
 (0)