blob: 48eec66b463dbcdb005fd6c9e2f2e2880687f05b [file] [log] [blame]
夜雨声烦35c9da92025-05-20 00:12:48 +08001package com.example.g8backend.service;
2
夜雨声烦45c25dd2025-05-20 11:59:03 +08003import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
夜雨声烦35c9da92025-05-20 00:12:48 +08004import com.example.g8backend.entity.User;
5import com.example.g8backend.entity.UserSignin;
6import com.example.g8backend.mapper.UserMapper;
7import com.example.g8backend.mapper.UserSigninMapper;
8import com.example.g8backend.service.impl.SigninServiceImpl;
9import org.junit.jupiter.api.Test;
10import org.junit.jupiter.api.extension.ExtendWith;
11import org.mockito.InjectMocks;
12import org.mockito.Mock;
13import org.mockito.junit.jupiter.MockitoExtension;
14import java.time.LocalDate;
夜雨声烦45c25dd2025-05-20 11:59:03 +080015import java.util.Arrays;
16import java.util.Collections;
17import java.util.List;
18
夜雨声烦35c9da92025-05-20 00:12:48 +080019import static org.junit.jupiter.api.Assertions.*;
20import static org.mockito.ArgumentMatchers.any;
21import static org.mockito.Mockito.*;
22
23@ExtendWith(MockitoExtension.class)
24public class SigninServiceImplTest {
25 @Mock
26 private UserMapper userMapper;
27 @Mock
28 private UserSigninMapper userSigninMapper;
29 @InjectMocks
30 private SigninServiceImpl signinService;
31
32 @Test
33 public void testSignIn_Success() {
34 // 模拟用户初始状态
35 User user = new User();
36 user.setUserId(1L);
37 user.setSigninCount(0);
38 user.setUserLevel("lv1");
39
40 when(userSigninMapper.existsByUserIdAndDate(eq(1L), any())).thenReturn(false);
41 when(userMapper.selectById(1L)).thenReturn(user);
42
43 boolean result = signinService.signIn(1L);
44 assertTrue(result);
45 assertEquals(1, user.getSigninCount());
46 }
47
48 @Test
49 public void testSignIn_AlreadySigned() {
50 when(userSigninMapper.existsByUserIdAndDate(eq(1L), any())).thenReturn(true);
51 boolean result = signinService.signIn(1L);
52 assertFalse(result);
53 }
54
55 @Test
56 public void testSignIn_UpgradeToLv2() {
57 User user = new User();
58 user.setUserId(1L);
59 user.setSigninCount(2); // 初始签到2次
60 user.setUserLevel("lv1");
61
62 when(userSigninMapper.existsByUserIdAndDate(eq(1L), any())).thenReturn(false);
63 when(userMapper.selectById(1L)).thenReturn(user);
64
65 boolean result = signinService.signIn(1L);
66 assertTrue(result);
67 assertEquals(3, user.getSigninCount());
68 assertEquals("lv2", user.getUserLevel());
69 }
70
71 @Test
72 public void testSignIn_UpgradeToLv3() {
73 User user = new User();
74 user.setUserId(1L);
75 user.setSigninCount(9); // 初始签到9次
76 user.setUserLevel("lv2");
77
78 when(userSigninMapper.existsByUserIdAndDate(eq(1L), any())).thenReturn(false);
79 when(userMapper.selectById(1L)).thenReturn(user);
80
81 boolean result = signinService.signIn(1L);
82 assertTrue(result);
83 assertEquals(10, user.getSigninCount());
84 assertEquals("lv3", user.getUserLevel());
85 }
夜雨声烦45c25dd2025-05-20 11:59:03 +080086 @Test
87 public void testGetSigninsByDateRange_NormalCase() {
88 // 模拟输入参数
89 Long userId = 1L;
90 LocalDate startDate = LocalDate.of(2023, 10, 1);
91 LocalDate endDate = LocalDate.of(2023, 10, 31);
92
93 // 构建模拟数据
94 UserSignin signin1 = new UserSignin();
95 signin1.setSigninId(1L);
96 signin1.setUserId(userId);
97 signin1.setSigninDate(LocalDate.of(2023, 10, 5));
98
99 UserSignin signin2 = new UserSignin();
100 signin2.setSigninId(2L);
101 signin2.setUserId(userId);
102 signin2.setSigninDate(LocalDate.of(2023, 10, 15));
103
104 List<UserSignin> mockSignins = Arrays.asList(signin1, signin2);
105
106 when(userSigninMapper.selectList(any(QueryWrapper.class))).thenReturn(mockSignins);
107
108 // 执行方法
109 List<UserSignin> result = signinService.getSigninsByDateRange(userId, startDate, endDate);
110
111 // 断言结果
112 assertEquals(2, result.size());
113 assertEquals(LocalDate.of(2023, 10, 5), result.get(0).getSigninDate());
114 assertEquals(LocalDate.of(2023, 10, 15), result.get(1).getSigninDate());
115 verify(userSigninMapper).selectList(any(QueryWrapper.class));
116 }
117
118 @Test
119 public void testGetSigninsByDateRange_NoRecords() {
120 Long userId = 1L;
121 LocalDate startDate = LocalDate.of(2023, 11, 1);
122 LocalDate endDate = LocalDate.of(2023, 11, 30);
123
124 when(userSigninMapper.selectList(any())).thenReturn(Collections.emptyList());
125
126 List<UserSignin> result = signinService.getSigninsByDateRange(userId, startDate, endDate);
127
128 assertTrue(result.isEmpty());
129 }
130
131 @Test
132 public void testGetSigninsByDateRange_SingleDay() {
133 Long userId = 1L;
134 LocalDate date = LocalDate.of(2023, 10, 10);
135
136 UserSignin signin = new UserSignin();
137 signin.setSigninId(3L);
138 signin.setUserId(userId);
139 signin.setSigninDate(date);
140
141 // 修正:返回包含模拟数据的列表
142 when(userSigninMapper.selectList(any(QueryWrapper.class))).thenReturn(Collections.singletonList(signin));
143
144 List<UserSignin> result = signinService.getSigninsByDateRange(userId, date, date);
145
146 assertEquals(1, result.size());
147 assertEquals(date, result.get(0).getSigninDate());
148 }
149 @Test
150 public void testGetSigninsByDateRange_InvalidDateOrder() {
151 Long userId = 1L;
152 LocalDate startDate = LocalDate.of(2023, 10, 31);
153 LocalDate endDate = LocalDate.of(2023, 10, 1);
154
155 when(userSigninMapper.selectList(any())).thenReturn(Collections.emptyList());
156
157 List<UserSignin> result = signinService.getSigninsByDateRange(userId, startDate, endDate);
158
159 assertTrue(result.isEmpty());
160 }
161
162 public void testGetSigninsByDateRange_SortedOrder() {
163 Long userId = 1L;
164 LocalDate startDate = LocalDate.of(2023, 10, 1);
165 LocalDate endDate = LocalDate.of(2023, 10, 31);
166
167 // 模拟数据并按日期升序排列
168 UserSignin signin1 = new UserSignin();
169 signin1.setSigninId(1L);
170 signin1.setSigninDate(LocalDate.of(2023, 10, 5));
171
172 UserSignin signin2 = new UserSignin();
173 signin2.setSigninId(2L);
174 signin2.setSigninDate(LocalDate.of(2023, 10, 15));
175
176 List<UserSignin> mockSignins = Arrays.asList(signin1, signin2); // 直接提供已排序的数据
177
178 when(userSigninMapper.selectList(any(QueryWrapper.class))).thenReturn(mockSignins);
179
180 List<UserSignin> result = signinService.getSigninsByDateRange(userId, startDate, endDate);
181
182 // 验证顺序
183 assertEquals(LocalDate.of(2023, 10, 5), result.get(0).getSigninDate());
184 assertEquals(LocalDate.of(2023, 10, 15), result.get(1).getSigninDate());
185 }
夜雨声烦35c9da92025-05-20 00:12:48 +0800186}