Skip to content

Commit 0aca7f4

Browse files
authored
Merge pull request #11 from IlyaLisov/#7
#7 Implement testing and JaCoCo
2 parents b102df9 + bc1059c commit 0aca7f4

File tree

5 files changed

+596
-0
lines changed

5 files changed

+596
-0
lines changed

pom.xml

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
<checkstyle.version>3.2.2</checkstyle.version>
3232
<graphql-java-kickstart.version>15.0.0</graphql-java-kickstart.version>
3333
<graphql-java-extended-scalars.version>20.2</graphql-java-extended-scalars.version>
34+
<junit-jupiter.version>5.10.0</junit-jupiter.version>
35+
<mockito.version>5.4.0</mockito.version>
36+
<jacoco.version>0.8.8</jacoco.version>
3437
</properties>
3538

3639
<dependencies>
@@ -65,6 +68,12 @@
6568
<artifactId>spring-boot-starter-graphql</artifactId>
6669
</dependency>
6770

71+
<dependency>
72+
<groupId>org.springframework.boot</groupId>
73+
<artifactId>spring-boot-starter-test</artifactId>
74+
<scope>test</scope>
75+
</dependency>
76+
6877
<dependency>
6978
<groupId>com.graphql-java-kickstart</groupId>
7079
<artifactId>graphql-java-kickstart</artifactId>
@@ -164,6 +173,20 @@
164173
<version>${minio.version}</version>
165174
</dependency>
166175

176+
<dependency>
177+
<groupId>org.junit.jupiter</groupId>
178+
<artifactId>junit-jupiter-api</artifactId>
179+
<version>${junit-jupiter.version}</version>
180+
<scope>test</scope>
181+
</dependency>
182+
183+
<dependency>
184+
<groupId>org.mockito</groupId>
185+
<artifactId>mockito-core</artifactId>
186+
<version>${mockito.version}</version>
187+
<scope>test</scope>
188+
</dependency>
189+
167190
</dependencies>
168191

169192
<build>
@@ -223,6 +246,49 @@
223246
</execution>
224247
</executions>
225248
</plugin>
249+
<plugin>
250+
<groupId>org.jacoco</groupId>
251+
<artifactId>jacoco-maven-plugin</artifactId>
252+
<version>${jacoco.version}</version>
253+
<executions>
254+
<execution>
255+
<id>default-prepare-agent</id>
256+
<goals>
257+
<goal>prepare-agent</goal>
258+
</goals>
259+
</execution>
260+
<execution>
261+
<id>report</id>
262+
<phase>prepare-package</phase>
263+
<goals>
264+
<goal>report</goal>
265+
</goals>
266+
</execution>
267+
<execution>
268+
<id>check</id>
269+
<goals>
270+
<goal>check</goal>
271+
</goals>
272+
<configuration>
273+
<rules>
274+
<rule implementation="org.jacoco.maven.RuleConfiguration">
275+
<element>PACKAGE</element>
276+
<limits>
277+
<limit implementation="org.jacoco.report.check.Limit">
278+
<counter>INSTRUCTION</counter>
279+
<value>COVEREDRATIO</value>
280+
<minimum>0.60</minimum>
281+
</limit>
282+
</limits>
283+
<includes>
284+
<include>com.example.tasklist.service.impl</include>
285+
</includes>
286+
</rule>
287+
</rules>
288+
</configuration>
289+
</execution>
290+
</executions>
291+
</plugin>
226292
</plugins>
227293
</build>
228294

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

0 commit comments

Comments
 (0)