|
|
@@ -0,0 +1,110 @@
|
|
|
+package com.etotem.cfc.service;
|
|
|
+
|
|
|
+import com.etotem.cfc.entity.User;
|
|
|
+import com.etotem.cfc.mapper.UserMapper;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+import org.springframework.security.access.AccessDeniedException;
|
|
|
+import org.springframework.test.util.ReflectionTestUtils;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
+import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
|
+import static org.mockito.ArgumentMatchers.any;
|
|
|
+import static org.mockito.Mockito.mock;
|
|
|
+import static org.mockito.Mockito.never;
|
|
|
+import static org.mockito.Mockito.verify;
|
|
|
+import static org.mockito.Mockito.verifyNoInteractions;
|
|
|
+import static org.mockito.Mockito.when;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 家庭管理员设置成员孩子身份(users.is_child):
|
|
|
+ * - (b) 管理员可设置并落库到对应的 User 记录;
|
|
|
+ * - (c) 非管理员被拒绝(AccessDeniedException → controller 层 403)。
|
|
|
+ */
|
|
|
+class FamilyMemberServiceIsChildTest {
|
|
|
+
|
|
|
+ private FamilyMemberService buildService(ReportMemberPermissionService perm, UserMapper userMapper) {
|
|
|
+ FamilyMemberService svc = new FamilyMemberService();
|
|
|
+ ReflectionTestUtils.setField(svc, "reportMemberPermissionService", perm);
|
|
|
+ ReflectionTestUtils.setField(svc, "userMapper", userMapper);
|
|
|
+ return svc;
|
|
|
+ }
|
|
|
+
|
|
|
+ /** (b) 家庭管理员可设置目标成员 isChild=1 并落库到 User */
|
|
|
+ @Test
|
|
|
+ void 家庭管理员_可设置目标成员isChild并落库() {
|
|
|
+ UserMapper userMapper = mock(UserMapper.class);
|
|
|
+ ReportMemberPermissionService perm = mock(ReportMemberPermissionService.class);
|
|
|
+ when(perm.isFamilyAdmin(1L, 7L)).thenReturn(true);
|
|
|
+ User target = new User();
|
|
|
+ target.setId(2L);
|
|
|
+ target.setFamilyId(7L);
|
|
|
+ when(userMapper.selectById(2L)).thenReturn(target);
|
|
|
+
|
|
|
+ FamilyMemberService svc = buildService(perm, userMapper);
|
|
|
+ svc.applyIsChildFlag(1L, 7L, 2L, 1);
|
|
|
+
|
|
|
+ assertEquals(Boolean.TRUE, target.getIsChild());
|
|
|
+ verify(userMapper).updateById(any());
|
|
|
+ }
|
|
|
+
|
|
|
+ /** (b) 家庭管理员可将 isChild 改回 0(非孩子) */
|
|
|
+ @Test
|
|
|
+ void 家庭管理员_可将isChild改回0() {
|
|
|
+ UserMapper userMapper = mock(UserMapper.class);
|
|
|
+ ReportMemberPermissionService perm = mock(ReportMemberPermissionService.class);
|
|
|
+ when(perm.isFamilyAdmin(1L, 7L)).thenReturn(true);
|
|
|
+ User target = new User();
|
|
|
+ target.setId(2L);
|
|
|
+ target.setFamilyId(7L);
|
|
|
+ target.setIsChild(true);
|
|
|
+ when(userMapper.selectById(2L)).thenReturn(target);
|
|
|
+
|
|
|
+ FamilyMemberService svc = buildService(perm, userMapper);
|
|
|
+ svc.applyIsChildFlag(1L, 7L, 2L, 0);
|
|
|
+
|
|
|
+ assertEquals(Boolean.FALSE, target.getIsChild());
|
|
|
+ verify(userMapper).updateById(any());
|
|
|
+ }
|
|
|
+
|
|
|
+ /** (c) 非管理员设置 isChild 被明确拒绝(403 等效:AccessDeniedException) */
|
|
|
+ @Test
|
|
|
+ void 非管理员_设置isChild被拒绝() {
|
|
|
+ UserMapper userMapper = mock(UserMapper.class);
|
|
|
+ ReportMemberPermissionService perm = mock(ReportMemberPermissionService.class);
|
|
|
+ when(perm.isFamilyAdmin(1L, 7L)).thenReturn(false);
|
|
|
+
|
|
|
+ FamilyMemberService svc = buildService(perm, userMapper);
|
|
|
+ assertThrows(AccessDeniedException.class, () -> svc.applyIsChildFlag(1L, 7L, 2L, 1));
|
|
|
+ verify(userMapper, never()).updateById(any());
|
|
|
+ verify(userMapper, never()).selectById(any());
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 目标用户 familyId 与操作者不一致 → 拒绝 */
|
|
|
+ @Test
|
|
|
+ void 目标用户不属于同家庭_被拒绝() {
|
|
|
+ UserMapper userMapper = mock(UserMapper.class);
|
|
|
+ ReportMemberPermissionService perm = mock(ReportMemberPermissionService.class);
|
|
|
+ when(perm.isFamilyAdmin(1L, 7L)).thenReturn(true);
|
|
|
+ User target = new User();
|
|
|
+ target.setId(2L);
|
|
|
+ target.setFamilyId(999L); // 不同家庭
|
|
|
+ when(userMapper.selectById(2L)).thenReturn(target);
|
|
|
+
|
|
|
+ FamilyMemberService svc = buildService(perm, userMapper);
|
|
|
+ assertThrows(RuntimeException.class, () -> svc.applyIsChildFlag(1L, 7L, 2L, 1));
|
|
|
+ verify(userMapper, never()).updateById(any());
|
|
|
+ }
|
|
|
+
|
|
|
+ /** isChild 为 null(未传)→ 不做任何修改 */
|
|
|
+ @Test
|
|
|
+ void isChild为null_不做任何修改() {
|
|
|
+ UserMapper userMapper = mock(UserMapper.class);
|
|
|
+ ReportMemberPermissionService perm = mock(ReportMemberPermissionService.class);
|
|
|
+
|
|
|
+ FamilyMemberService svc = buildService(perm, userMapper);
|
|
|
+ svc.applyIsChildFlag(1L, 7L, 2L, null);
|
|
|
+
|
|
|
+ verifyNoInteractions(userMapper);
|
|
|
+ verifyNoInteractions(perm);
|
|
|
+ }
|
|
|
+}
|