暂存提交

This commit is contained in:
2026-07-31 18:10:32 +08:00
parent e834482717
commit 9a37657148
35 changed files with 435 additions and 44 deletions
@@ -6,6 +6,7 @@ import com.baiyue.common.core.exception.BizException;
import com.baiyue.iam.client.AuthAccountClient;
import com.baiyue.iam.dto.MemberDtos.*;
import com.baiyue.iam.entity.IamMembership;
import com.baiyue.iam.entity.IamRole;
import com.baiyue.iam.entity.IamUser;
import com.baiyue.iam.mapper.IamRoleMapper;
import com.baiyue.iam.repository.MemberRepository;
@@ -14,6 +15,7 @@ import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
@@ -80,11 +82,88 @@ class MemberServiceTest {
UpdateMemberRequest request = new UpdateMemberRequest("所有者", null, null,
"EMPLOYEE", null, List.of());
assertThrows(BizException.class, () -> service.update(100L, 20L, request));
assertThrows(BizException.class, () -> service.update(100L, 20L, request, Set.of()));
verify(repository, never()).replaceRoles(anyLong(), anyLong(), anyList());
}
@Test void createWithRolesRequiresGrantRolePermission() {
CreateMemberRequest request = new CreateMemberRequest("member01", "Password1", "成员",
null, null, "EMPLOYEE", null, List.of(50L));
BizException exception = assertThrows(BizException.class,
() -> service.create(100L, request, Set.of("merchant:member:create")));
assertEquals(ResultCode.FORBIDDEN, exception.getResultCode());
verifyNoInteractions(auth);
verify(repository, never()).insert(any());
}
@Test void profileOnlyUpdateAllowsUnchangedRolesWithoutGrantPermission() {
IamRole role = activeMerchantRole(50L, 100L);
when(roleMapper.selectById(50L)).thenReturn(role);
UpdateMemberRequest request = new UpdateMemberRequest("新姓名", "13800138000", null,
"EMPLOYEE", "M-001", List.of(50L));
MemberResponse result = service.update(100L, 20L, request, Set.of("merchant:member:edit"));
assertEquals("新姓名", result.displayName());
verify(repository).saveUser(user);
verify(repository).replaceRoles(100L, 20L, List.of(50L));
}
@Test void roleChangeRequiresGrantRolePermission() {
UpdateMemberRequest request = new UpdateMemberRequest("测试成员", null, null,
"EMPLOYEE", null, List.of(60L));
BizException exception = assertThrows(BizException.class,
() -> service.update(100L, 20L, request, Set.of("merchant:member:edit")));
assertEquals(ResultCode.FORBIDDEN, exception.getResultCode());
verify(repository, never()).save(any());
verify(repository, never()).replaceRoles(anyLong(), anyLong(), anyList());
}
@Test void clearingRolesAlsoRequiresGrantRolePermission() {
UpdateMemberRequest request = new UpdateMemberRequest("测试成员", null, null,
"EMPLOYEE", null, List.of());
BizException exception = assertThrows(BizException.class,
() -> service.update(100L, 20L, request, Set.of("merchant:member:edit")));
assertEquals(ResultCode.FORBIDDEN, exception.getResultCode());
verify(repository, never()).replaceRoles(anyLong(), anyLong(), anyList());
}
@Test void grantRolePermissionAllowsClearingRoles() {
UpdateMemberRequest request = new UpdateMemberRequest("测试成员", null, null,
"EMPLOYEE", null, List.of());
service.update(100L, 20L, request,
Set.of("merchant:member:edit", "merchant:member:grant-role"));
verify(repository).replaceRoles(100L, 20L, List.of());
}
@Test void crossTenantUpdateReturnsNotFoundBeforeReadingRoles() {
when(repository.findByTenantAndId(200L, 20L)).thenReturn(null);
UpdateMemberRequest request = new UpdateMemberRequest("测试成员", null, null,
"EMPLOYEE", null, List.of(50L));
BizException exception = assertThrows(BizException.class,
() -> service.update(200L, 20L, request, Set.of("merchant:member:grant-role")));
assertEquals(ResultCode.NOT_FOUND, exception.getResultCode());
verify(repository, never()).findRoleIds(200L, 20L);
}
private IamRole activeMerchantRole(long id, long tenantId) {
IamRole role = new IamRole();
role.setId(id); role.setTenantId(tenantId); role.setAppCode("MERCHANT");
role.setRoleCode("MERCHANT_EMPLOYEE"); role.setStatus("ACTIVE");
return role;
}
@Test void tenantOwnerPasswordCannotBeResetByMemberAdministrator() {
member.setMemberType("OWNER");