Skip to content

Commit

Permalink
[UPDATE] 完善 central-provider 的单元测试
Browse files Browse the repository at this point in the history
Signed-off-by: Alan Yeh <[email protected]>
  • Loading branch information
alan-yeh committed Jan 3, 2025
1 parent ac77631 commit fc67a62
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@
import central.sql.query.Conditions;
import central.sql.query.Orders;
import central.studio.provider.database.persistence.authority.entity.MenuEntity;
import central.studio.provider.database.persistence.authority.entity.PermissionEntity;
import central.studio.provider.database.persistence.authority.mapper.MenuMapper;
import central.studio.provider.database.persistence.authority.mapper.PermissionMapper;
import central.util.Listx;
import central.validation.group.Insert;
import central.validation.group.Update;
Expand Down Expand Up @@ -64,6 +66,9 @@ public class MenuPersistence {
@Setter(onMethod_ = @Autowired)
private MenuMapper mapper;

@Setter(onMethod_ = @Autowired)
private PermissionMapper permissionMapper;

/**
* 根据主键查询数据
*
Expand Down Expand Up @@ -243,7 +248,8 @@ public long deleteByIds(@Nullable List<String> ids,
return 0;
}

// TODO 删除关联关系
// 删除关联关系
this.permissionMapper.deleteBy(Conditions.of(PermissionEntity.class).in(PermissionEntity::getMenuId, ids).eq(PermissionEntity::getTenantCode, tenant));

return this.mapper.deleteBy(Conditions.of(MenuEntity.class).in(MenuEntity::getId, ids).eq(MenuEntity::getTenantCode, tenant));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,13 @@
import central.sql.query.Conditions;
import central.sql.query.Orders;
import central.studio.provider.database.persistence.authority.entity.RoleEntity;
import central.studio.provider.database.persistence.authority.entity.RolePermissionEntity;
import central.studio.provider.database.persistence.authority.entity.RolePrincipalEntity;
import central.studio.provider.database.persistence.authority.entity.RoleRangeEntity;
import central.studio.provider.database.persistence.authority.mapper.RoleMapper;
import central.studio.provider.database.persistence.authority.mapper.RolePermissionMapper;
import central.studio.provider.database.persistence.authority.mapper.RolePrincipalMapper;
import central.studio.provider.database.persistence.authority.mapper.RoleRangeMapper;
import central.util.Listx;
import central.validation.group.Insert;
import central.validation.group.Update;
Expand Down Expand Up @@ -64,6 +70,15 @@ public class RolePersistence {
@Setter(onMethod_ = @Autowired)
private RoleMapper mapper;

@Setter(onMethod_ = @Autowired)
private RolePrincipalMapper principalMapper;

@Setter(onMethod_ = @Autowired)
private RolePermissionMapper permissionMapper;

@Setter(onMethod_ = @Autowired)
private RoleRangeMapper rangeMapper;

/**
* 根据主键查询数据
*
Expand Down Expand Up @@ -260,6 +275,11 @@ public long deleteByIds(@Nullable List<String> ids,
return 0;
}

// 级联删除
this.principalMapper.deleteBy(Conditions.of(RolePrincipalEntity.class).in(RolePrincipalEntity::getRoleId, ids).eq(RolePrincipalEntity::getTenantCode, tenant));
this.permissionMapper.deleteBy(Conditions.of(RolePermissionEntity.class).in(RolePermissionEntity::getRoleId, ids).eq(RolePermissionEntity::getTenantCode, tenant));
this.rangeMapper.deleteBy(Conditions.of(RoleRangeEntity.class).in(RoleRangeEntity::getRoleId, ids).eq(RoleRangeEntity::getTenantCode, tenant));

return this.mapper.deleteBy(Conditions.of(RoleEntity.class).in(RoleEntity::getId, ids).eq(RoleEntity::getTenantCode, tenant));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import central.data.authority.option.PrincipalType;
import central.data.organization.AccountInput;
import central.data.saas.Application;
import central.data.saas.ApplicationInput;
import central.provider.graphql.authority.AuthorizationProvider;
import central.provider.scheduled.DataContext;
import central.provider.scheduled.fetcher.DataFetcherType;
Expand All @@ -42,22 +41,21 @@
import central.studio.provider.ProviderApplication;
import central.studio.provider.database.initialization.ApplicationInitializer;
import central.studio.provider.database.persistence.authority.*;
import central.studio.provider.database.persistence.authority.entity.*;
import central.studio.provider.database.persistence.authority.entity.MenuEntity;
import central.studio.provider.database.persistence.authority.entity.PermissionEntity;
import central.studio.provider.database.persistence.authority.entity.RoleEntity;
import central.studio.provider.database.persistence.organization.AccountPersistence;
import central.studio.provider.database.persistence.saas.ApplicationPersistence;
import central.studio.provider.database.persistence.saas.entity.ApplicationEntity;
import central.studio.provider.database.persistence.organization.entity.AccountEntity;
import central.studio.provider.database.persistence.system.DictionaryPersistence;
import central.studio.provider.database.persistence.system.entity.DictionaryEntity;
import central.util.Guidx;
import central.util.Listx;
import central.studio.provider.graphql.TestContext;
import lombok.Setter;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

Expand All @@ -77,61 +75,66 @@ public class TestAuthorizationProvider {
@Setter(onMethod_ = @Autowired)
private AuthorizationProvider provider;

@BeforeAll
public static void setup(@Autowired DataContext context, @Autowired SqlExecutor executor, @Autowired ApplicationPersistence applicationPersistence) throws Exception {
var application = applicationPersistence.insert(ApplicationInput.builder()
.code("test")
.name("测试应用")
.logo("1234")
.url("http://127.0.0.1:13100")
.contextPath("/test")
.secret(Guidx.nextID())
.enabled(Boolean.TRUE)
.remark("测试应用")
.routes(new ArrayList<>())
.build(), "syssa");
@Setter(onMethod_ = @Autowired)
private AccountPersistence accountPersistence;

@Setter(onMethod_ = @Autowired)
private RolePersistence rolePersistence;

@Setter(onMethod_ = @Autowired)
private PermissionPersistence permissionPersistence;

@Setter(onMethod_ = @Autowired)
private RolePermissionPersistence rolePermissionPersistence;

@Setter(onMethod_ = @Autowired)
private RolePrincipalPersistence rolePrincipalPersistence;

@Setter(onMethod_ = @Autowired)
private RoleRangePersistence roleRangePersistence;

@Setter(onMethod_ = @Autowired)
private TestContext context;

@BeforeAll
public static void setup(@Autowired DataContext context, @Autowired SqlExecutor executor, @Autowired TestContext testContext) throws Exception {
// 初始化应用
var application = testContext.getApplication();
var initializer = new ApplicationInitializer(executor);
initializer.initialize("master", application);

SaasContainer container = null;
while (container == null || Listx.isNullOrEmpty(container.getApplications())) {
while (container == null || container.getApplications().isEmpty()) {
Thread.sleep(100);
container = context.getData(DataFetcherType.SAAS);
}
}


@AfterAll
public static void cleanup(@Autowired ApplicationPersistence applicationPersistence,
public static void cleanup(@Autowired TestContext testContext,
@Autowired MenuPersistence menuPersistence,
@Autowired DictionaryPersistence dictionaryPersistence,
@Autowired RolePermissionPersistence rolePermissionPersistence,
@Autowired RolePrincipalPersistence rolePrincipalPersistence,
@Autowired RoleRangePersistence roleRangePersistence) {
@Autowired RolePersistence rolePersistence,
@Autowired AccountPersistence accountPersistence) {
// 清理数据
var application = applicationPersistence.findFirstBy(Columns.all(), Conditions.of(ApplicationEntity.class).eq(ApplicationEntity::getCode, "test"), null);
menuPersistence.deleteBy(Conditions.of(MenuEntity.class).eq(MenuEntity::getApplicationId, application.getId()), "master");
dictionaryPersistence.deleteBy(Conditions.of(DictionaryEntity.class).eq(DictionaryEntity::getApplicationId, application.getId()), "master");
rolePermissionPersistence.deleteBy(Conditions.of(RolePermissionEntity.class).eq(RolePermissionEntity::getApplicationId, application.getId()), "master");
rolePrincipalPersistence.deleteBy(Conditions.of(RolePrincipalEntity.class).eq(RolePrincipalEntity::getApplicationId, application.getId()), "master");
roleRangePersistence.deleteBy(Conditions.of(RoleRangeEntity.class).eq(RoleRangeEntity::getApplicationId, application.getId()), "master");
applicationPersistence.deleteByIds(List.of(application.getId()));
}
var tenant = testContext.getTenant();
var application = testContext.getApplication();

@Setter(onMethod_ = @Autowired)
private ApplicationPersistence applicationPersistence;

private ApplicationEntity getApplication() {
return applicationPersistence.findFirstBy(Columns.all(), Conditions.of(ApplicationEntity.class).eq(ApplicationEntity::getCode, "test"), null);
menuPersistence.deleteBy(Conditions.of(MenuEntity.class).eq(MenuEntity::getApplicationId, application.getId()), tenant.getCode());
dictionaryPersistence.deleteBy(Conditions.of(DictionaryEntity.class).eq(DictionaryEntity::getApplicationId, application.getId()), tenant.getCode());
rolePersistence.deleteBy(Conditions.of(RoleEntity.class).eq(RoleEntity::getApplicationId, application.getId()), tenant.getCode());
accountPersistence.deleteBy(Conditions.of(AccountEntity.class).like(AccountEntity::getUsername, "test%"), tenant.getCode());
}

/**
* @see AuthorizationProvider#findApplication
*/
@Test
public void case1() {
var application = this.getApplication();
var tenant = this.context.getTenant();
var application = this.context.getApplication();

var code = application.getCode();
var secret = application.getSecret();

Expand All @@ -140,7 +143,7 @@ public void case1() {
Application result = null;
Exception exception = null;
try {
result = provider.findApplication(code, "wrong secret");
result = provider.findApplication(code, "wrong secret", tenant.getCode());
} catch (Exception ex) {
exception = ex;
}
Expand All @@ -153,7 +156,7 @@ public void case1() {
Application result = null;
Exception exception = null;
try {
result = provider.findApplication(code, secret);
result = provider.findApplication(code, secret, tenant.getCode());
} catch (Exception ex) {
exception = ex;
}
Expand All @@ -170,8 +173,11 @@ public void case1() {
*/
@Test
public void case2() {
var tenant = this.context.getTenant();
var application = this.context.getApplication();

// syssa 有所有权限
var applications = provider.findApplications("syssa", MenuType.BACKEND.getValue(), "master");
var applications = provider.findApplications("syssa", MenuType.BACKEND.getValue(), tenant.getCode());

assertNotNull(applications);
assertFalse(applications.isEmpty());
Expand All @@ -183,67 +189,68 @@ public void case2() {
* @see AuthorizationProvider#findPermissions
*/
@Test
public void case3(@Autowired AccountPersistence accountPersistence,
@Autowired RolePersistence rolePersistence,
@Autowired PermissionPersistence permissionPersistence,
@Autowired RolePermissionPersistence rolePermissionPersistence,
@Autowired RolePrincipalPersistence rolePrincipalPersistence) {
public void case3() {
var tenant = this.context.getTenant();
var application = this.context.getApplication();

// 测试准备数据
var application = this.getApplication();
var account = accountPersistence.insert(AccountInput.builder()
.username("centralx")
.email("[email protected]")
var account = this.accountPersistence.insert(AccountInput.builder()
.username("test")
.email("[email protected]")
.mobile("13111111111")
.name("CentralX")
.avatar("1234")
.enabled(Boolean.TRUE)
.deleted(Boolean.FALSE)
.build(), "syssa", "master");
var role = rolePersistence.insert(RoleInput.builder()
.build(), "syssa", tenant.getCode());
var role = this.rolePersistence.insert(RoleInput.builder()
.applicationId(application.getId())
.code("10000")
.name("测试角色")
.unitId("")
.enabled(Boolean.TRUE)
.remark("测试角色")
.build(), "syssa", "master");
.build(), "syssa", tenant.getCode());

var permission = permissionPersistence.findFirstBy(Columns.all(), Conditions.of(PermissionEntity.class).eq(PermissionEntity::getApplicationId, application.getId()).eq(PermissionEntity::getCode, application.getCode() + ":system:dictionary:view"), null, "master");

// 为角色分配权限
rolePermissionPersistence.insert(RolePermissionInput.builder()
this.rolePermissionPersistence.insert(RolePermissionInput.builder()
.applicationId(application.getId())
.roleId(role.getId())
.permissionId(permission.getId())
.build(), "syssa", "master");
.build(), "syssa", tenant.getCode());

// 为帐户分配角色
rolePrincipalPersistence.insert(RolePrincipalInput.builder()
this.rolePrincipalPersistence.insert(RolePrincipalInput.builder()
.applicationId(application.getId())
.roleId(role.getId())
.principalId(account.getId())
.type(PrincipalType.ACCOUNT.getValue())
.build(), "syssa", "master");
.build(), "syssa", tenant.getCode());

try {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var roles = provider.findRoles(account.getId(), application.getId(), "master");
// test findRoles
var roles = provider.findRoles(account.getId(), application.getId(), tenant.getCode());
assertNotNull(roles);
assertEquals(1, roles.size());
assertEquals(role.getCode(), roles.get(0).getCode());

var menus = provider.findMenus(account.getId(), MenuType.BACKEND.getValue(), application.getId(), "master");
// test findMenus
var menus = provider.findMenus(account.getId(), MenuType.BACKEND.getValue(), application.getId(), tenant.getCode());
assertNotNull(menus);
assertEquals(2, menus.size());
assertTrue(menus.stream().anyMatch(it -> Objects.equals(permission.getMenuId(), it.getId())));

var permissions = provider.findPermissions(account.getId(), application.getId(), "master");
// test findPermissions
var permissions = provider.findPermissions(account.getId(), application.getId(), tenant.getCode());
assertNotNull(permissions);
assertEquals(1, permissions.size());
assertEquals(permission.getCode(), permissions.get(0).getCode());
} finally {
rolePersistence.deleteByIds(List.of(role.getId()), "master");
accountPersistence.deleteByIds(List.of(account.getId()), "master");
rolePersistence.deleteByIds(List.of(role.getId()), tenant.getCode());
accountPersistence.deleteByIds(List.of(account.getId()), tenant.getCode());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ public void case1() {
assertEquals(insert.getModifierId(), findById.getModifierId());

// test countBy
var count = this.provider.countBy(Conditions.of(Menu.class).eq(Menu::getApplicationId, application.getId()), tenant.getCode());
var count = this.provider.countBy(Conditions.of(Menu.class).like(Menu::getCode, "test%"), tenant.getCode());
assertEquals(1, count);

// test update
Expand Down Expand Up @@ -176,9 +176,11 @@ public void case1() {
assertNotEquals(fetched.getCreateDate(), fetched.getModifyDate()); // 修改日期不同

// test deleteById
this.provider.deleteByIds(List.of(insert.getId()), tenant.getCode());
entity = this.persistence.findById(insert.getId(), Columns.all(), tenant.getCode());
assertNull(entity);
count = this.provider.deleteByIds(List.of(insert.getId()), tenant.getCode());
assertEquals(1, count);

count = this.persistence.countBy(Conditions.of(MenuEntity.class).like(MenuEntity::getCode, "test%"), tenant.getCode());
assertEquals(0, count);
}

/**
Expand All @@ -205,6 +207,7 @@ public void case2() {
.order(0)
.remark("测试父菜单")
.build();

var input = MenuInput.builder()
.applicationId(application.getId())
.parentId("")
Expand All @@ -228,7 +231,7 @@ public void case2() {
assertTrue(insertBatch.stream().noneMatch(it -> it.getParent() != null));

// test findBy
var findBy = this.provider.findBy(null, null, Conditions.of(Menu.class).eq(Menu::getApplicationId, application.getId()), null, tenant.getCode());
var findBy = this.provider.findBy(null, null, Conditions.of(Menu.class).like(Menu::getCode, "test%"), null, tenant.getCode());
assertNotNull(findBy);
assertEquals(2, findBy.size());
assertTrue(findBy.stream().anyMatch(it -> it.getCode().equals("test")));
Expand All @@ -244,7 +247,7 @@ public void case2() {
this.provider.updateBatch(List.of(child.toInput().parentId(parent.getId()).build()), "syssa", tenant.getCode());

// test pageBy
var pageBy = this.provider.pageBy(1L, 10L, Conditions.of(Menu.class).eq(Menu::getApplicationId, application.getId()), null, tenant.getCode());
var pageBy = this.provider.pageBy(1L, 10L, Conditions.of(Menu.class).like(Menu::getCode, "test%"), null, tenant.getCode());
assertNotNull(pageBy);
assertEquals(1, pageBy.getPager().getPageIndex());
assertEquals(10, pageBy.getPager().getPageSize());
Expand All @@ -262,10 +265,10 @@ public void case2() {
assertEquals(parent.getId(), child.getParent().getId());

// test deleteBy
var count = this.provider.deleteBy(Conditions.of(Menu.class).eq(Menu::getApplicationId, application.getId()), tenant.getCode());
assertEquals(1, count);
var count = this.provider.deleteBy(Conditions.of(Menu.class).like(Menu::getCode, "test%"), tenant.getCode());
assertEquals(2, count);

count = this.persistence.countBy(Conditions.of(MenuEntity.class).eq(MenuEntity::getApplicationId, application.getId()), tenant.getCode());
count = this.persistence.countBy(Conditions.of(MenuEntity.class).like(MenuEntity::getCode, "test%"), tenant.getCode());
assertEquals(0, count);
}
}
Loading

0 comments on commit fc67a62

Please sign in to comment.