316 lines
11 KiB
C++
316 lines
11 KiB
C++
#include <iostream>
|
|
#include <cassert>
|
|
#include "ims_types.hpp"
|
|
#include "user_manager.hpp"
|
|
#include "business_manager.hpp"
|
|
#include "audit_logger.hpp"
|
|
#include "integration_service.hpp"
|
|
|
|
using namespace ims;
|
|
|
|
/// @brief 测试用户管理模块。
|
|
///
|
|
/// @requirement(name="用户管理", id="SRS-IMS_F-001")
|
|
/// @requirement(name="角色管理", id="SRS-IMS_F-002")
|
|
/// @requirement(name="部门管理", id="SRS-IMS_F-003")
|
|
/// @requirement(name="字典管理", id="SRS-IMS_F-004")
|
|
/// @requirement(name="参数配置", id="SRS-IMS_F-005")
|
|
/// @requirement(name="角色权限分配", id="SRS-IMS_F-006")
|
|
/// @requirement(name="菜单权限管理", id="SRS-IMS_F-007")
|
|
/// @requirement(name="按钮权限管理", id="SRS-IMS_F-008")
|
|
/// @requirement(name="数据权限分级管控", id="SRS-IMS_F-009")
|
|
void test_user_manager() {
|
|
UserManager um;
|
|
|
|
// 用户 CRUD
|
|
User u;
|
|
u.username = "test_user";
|
|
u.real_name = "测试用户";
|
|
u.password = "Test@123";
|
|
int64_t uid = um.addUser(u);
|
|
assert(uid > 0);
|
|
std::cout << "[PASS] SRS-IMS_F-001: addUser\n";
|
|
|
|
u.user_id = uid;
|
|
u.real_name = "测试用户已修改";
|
|
bool updated = um.updateUser(u);
|
|
assert(updated);
|
|
std::cout << "[PASS] SRS-IMS_F-001: updateUser\n";
|
|
|
|
bool deleted = um.deleteUser(uid);
|
|
assert(deleted);
|
|
std::cout << "[PASS] SRS-IMS_F-001: deleteUser\n";
|
|
|
|
// 角色 CRUD
|
|
Role r;
|
|
r.role_name = "测试角色";
|
|
int64_t rid = um.addRole(r);
|
|
assert(rid > 0);
|
|
std::cout << "[PASS] SRS-IMS_F-002: addRole\n";
|
|
|
|
r.role_id = rid;
|
|
r.description = "测试描述";
|
|
assert(um.updateRole(r));
|
|
std::cout << "[PASS] SRS-IMS_F-002: updateRole\n";
|
|
|
|
assert(um.deleteRole(rid));
|
|
std::cout << "[PASS] SRS-IMS_F-002: deleteRole\n";
|
|
|
|
// 部门 CRUD + 树形
|
|
Department d;
|
|
d.dept_name = "测试部门";
|
|
int64_t did = um.addDepartment(d);
|
|
assert(did > 0);
|
|
std::cout << "[PASS] SRS-IMS_F-003: addDepartment\n";
|
|
|
|
Department sub;
|
|
sub.dept_name = "子部门";
|
|
sub.parent_id = did;
|
|
int64_t sub_id = um.addDepartment(sub);
|
|
assert(sub_id > 0);
|
|
|
|
auto tree = um.getDepartmentTree(0);
|
|
assert(!tree.empty());
|
|
auto sub_tree = um.getDepartmentTree(did);
|
|
assert(!sub_tree.empty());
|
|
std::cout << "[PASS] SRS-IMS_F-003: getDepartmentTree\n";
|
|
|
|
assert(um.deleteDepartment(did));
|
|
std::cout << "[PASS] SRS-IMS_F-003: deleteDepartment\n";
|
|
|
|
// 字典管理
|
|
DictItem di;
|
|
di.dict_type = "test_dict";
|
|
di.item_key = "k1";
|
|
di.item_value = "v1";
|
|
um.addDictItem(di);
|
|
auto dict_items = um.getDictByType("test_dict");
|
|
assert(dict_items.size() == 1);
|
|
std::cout << "[PASS] SRS-IMS_F-004: addDictItem / getDictByType\n";
|
|
|
|
assert(um.removeDictItem("test_dict", "k1"));
|
|
std::cout << "[PASS] SRS-IMS_F-004: removeDictItem\n";
|
|
|
|
// 参数配置
|
|
SysParam sp;
|
|
sp.param_key = "test.param";
|
|
sp.param_value = "test_value";
|
|
um.setParameter(sp);
|
|
assert(um.getParameter("test.param") == "test_value");
|
|
std::cout << "[PASS] SRS-IMS_F-005: setParameter / getParameter\n";
|
|
|
|
// 角色权限分配
|
|
Permission perm;
|
|
perm.perm_id = 100;
|
|
perm.perm_code = "test:perm";
|
|
perm.perm_name = "测试权限";
|
|
bool assigned = um.assignPermissionsToRole(rid, {100});
|
|
assert(assigned);
|
|
auto perms = um.getPermissionsByRole(rid);
|
|
assert(perms.size() == 1);
|
|
std::cout << "[PASS] SRS-IMS_F-006: assignPermissionsToRole\n";
|
|
|
|
// 菜单权限
|
|
perm.is_menu = true;
|
|
assigned = um.assignPermissionsToRole(rid, {100});
|
|
// 重新添加一个用户并关联角色
|
|
User u2;
|
|
u2.username = "menu_user";
|
|
u2.role_id = rid;
|
|
int64_t uid2 = um.addUser(u2);
|
|
auto menu = um.getMenuByUserId(uid2);
|
|
assert(menu.size() == 1);
|
|
std::cout << "[PASS] SRS-IMS_F-007: getMenuByUserId\n";
|
|
|
|
// 按钮权限
|
|
perm.is_menu = false;
|
|
perm.perm_code = "btn:delete";
|
|
assigned = um.assignPermissionsToRole(rid, {100});
|
|
bool has_btn = um.hasButtonPermission(uid2, "btn:delete");
|
|
assert(has_btn);
|
|
std::cout << "[PASS] SRS-IMS_F-008: hasButtonPermission\n";
|
|
|
|
// 数据权限
|
|
Department dept_a;
|
|
dept_a.dept_name = "部门A";
|
|
int64_t da_id = um.addDepartment(dept_a);
|
|
Department dept_b;
|
|
dept_b.dept_name = "部门B";
|
|
dept_b.parent_id = da_id;
|
|
um.addDepartment(dept_b);
|
|
// 将用户放入部门A
|
|
u2.dept_id = da_id;
|
|
um.updateUser(u2);
|
|
auto accessible = um.getAccessibleDeptIds(uid2);
|
|
assert(accessible.find(da_id) != accessible.end());
|
|
std::cout << "[PASS] SRS-IMS_F-009: getAccessibleDeptIds\n";
|
|
}
|
|
|
|
/// @brief 测试业务数据管理模块。
|
|
///
|
|
/// @requirement(name="业务新增", id="SRS-IMS_F-010")
|
|
/// @requirement(name="业务编辑", id="SRS-IMS_F-011")
|
|
/// @requirement(name="业务删除", id="SRS-IMS_F-012")
|
|
/// @requirement(name="业务提交", id="SRS-IMS_F-013")
|
|
/// @requirement(name="业务审核", id="SRS-IMS_F-014")
|
|
/// @requirement(name="业务驳回", id="SRS-IMS_F-015")
|
|
/// @requirement(name="业务归档", id="SRS-IMS_F-016")
|
|
/// @requirement(name="查询筛选", id="SRS-IMS_F-017")
|
|
/// @requirement(name="数据汇总", id="SRS-IMS_F-018")
|
|
/// @requirement(name="图表展示", id="SRS-IMS_F-019")
|
|
/// @requirement(name="自定义查询", id="SRS-IMS_F-020")
|
|
/// @requirement(name="报表导出", id="SRS-IMS_F-021")
|
|
/// @requirement(name="数据台账生成", id="SRS-IMS_F-022")
|
|
void test_business_manager() {
|
|
BusinessManager bm;
|
|
|
|
BusinessData biz;
|
|
biz.title = "测试业务";
|
|
biz.content = "测试内容";
|
|
biz.creator_id = 1;
|
|
int64_t bid = bm.createBusiness(biz);
|
|
assert(bid > 0);
|
|
std::cout << "[PASS] SRS-IMS_F-010: createBusiness\n";
|
|
|
|
BusinessData edit;
|
|
edit.biz_id = bid;
|
|
edit.title = "已修改标题";
|
|
edit.content = "已修改内容";
|
|
assert(bm.editBusiness(edit));
|
|
std::cout << "[PASS] SRS-IMS_F-011: editBusiness\n";
|
|
|
|
assert(bm.submitBusiness(bid));
|
|
std::cout << "[PASS] SRS-IMS_F-013: submitBusiness\n";
|
|
|
|
assert(bm.approveBusiness(bid));
|
|
std::cout << "[PASS] SRS-IMS_F-014: approveBusiness\n";
|
|
|
|
// 新增一个用于测试驳回
|
|
int64_t bid2 = bm.createBusiness(biz);
|
|
bm.submitBusiness(bid2);
|
|
assert(bm.rejectBusiness(bid2));
|
|
std::cout << "[PASS] SRS-IMS_F-015: rejectBusiness\n";
|
|
|
|
assert(bm.archiveBusiness(bid));
|
|
std::cout << "[PASS] SRS-IMS_F-016: archiveBusiness\n";
|
|
|
|
// 删除
|
|
assert(bm.deleteBusiness(bid2));
|
|
std::cout << "[PASS] SRS-IMS_F-012: deleteBusiness\n";
|
|
|
|
// 查询筛选
|
|
auto results = bm.queryBusiness({{"biz_status", "eq", "4"}}, {1, 10});
|
|
assert(results.total >= 1);
|
|
std::cout << "[PASS] SRS-IMS_F-017: queryBusiness\n";
|
|
|
|
// 数据汇总
|
|
auto summary = bm.summarizeData("biz_status");
|
|
assert(!summary.empty());
|
|
std::cout << "[PASS] SRS-IMS_F-018: summarizeData\n";
|
|
|
|
// 图表数据
|
|
auto chart = bm.generateChartData("biz_status");
|
|
assert(!chart.empty());
|
|
std::cout << "[PASS] SRS-IMS_F-019: generateChartData\n";
|
|
|
|
// 自定义查询
|
|
auto custom = bm.customQuery({});
|
|
assert(!custom.empty());
|
|
std::cout << "[PASS] SRS-IMS_F-020: customQuery\n";
|
|
|
|
// 报表导出
|
|
std::string report = bm.exportReport({}, ExportFormat::EXCEL);
|
|
assert(!report.empty());
|
|
std::cout << "[PASS] SRS-IMS_F-021: exportReport\n";
|
|
|
|
// 台账生成
|
|
std::string ledger = bm.generateLedger("2025-01-01 ~ 2025-12-31");
|
|
assert(!ledger.empty());
|
|
std::cout << "[PASS] SRS-IMS_F-022: generateLedger\n";
|
|
}
|
|
|
|
/// @brief 测试审计日志模块。
|
|
///
|
|
/// @requirement(name="登录日志记录", id="SRS-IMS_F-023")
|
|
/// @requirement(name="操作日志记录", id="SRS-IMS_F-024")
|
|
/// @requirement(name="异常日志记录", id="SRS-IMS_F-025")
|
|
/// @requirement(name="日志溯源查询", id="SRS-IMS_F-026")
|
|
void test_audit_logger() {
|
|
AuditLogger al;
|
|
|
|
al.logLogin(1, "admin", true, "192.168.1.1");
|
|
al.logOperation(1, "admin", "删除用户", "删除用户ID:2");
|
|
al.logException("NullPointerException", "业务模块空指针异常");
|
|
|
|
auto login_logs = al.queryLogs(LogType::LOGIN, 0, "",
|
|
std::chrono::system_clock::time_point::min(),
|
|
std::chrono::system_clock::now());
|
|
assert(login_logs.size() == 1);
|
|
std::cout << "[PASS] SRS-IMS_F-023: logLogin\n";
|
|
|
|
auto op_logs = al.queryLogs(LogType::OPERATION, 0, "",
|
|
std::chrono::system_clock::time_point::min(),
|
|
std::chrono::system_clock::now());
|
|
assert(op_logs.size() >= 1);
|
|
std::cout << "[PASS] SRS-IMS_F-024: logOperation\n";
|
|
|
|
auto exc_logs = al.queryLogs(LogType::EXCEPTION, 0, "",
|
|
std::chrono::system_clock::time_point::min(),
|
|
std::chrono::system_clock::now());
|
|
assert(exc_logs.size() == 1);
|
|
std::cout << "[PASS] SRS-IMS_F-025: logException\n";
|
|
|
|
// 溯源查询:按用户过滤
|
|
auto user_logs = al.queryLogs(LogType::OPERATION, 1, "",
|
|
std::chrono::system_clock::time_point::min(),
|
|
std::chrono::system_clock::now());
|
|
assert(user_logs.size() >= 1);
|
|
std::cout << "[PASS] SRS-IMS_F-026: queryLogs (溯源查询)\n";
|
|
}
|
|
|
|
/// @brief 测试集成服务模块。
|
|
///
|
|
/// @requirement(name="标准化接口预留", id="SRS-IMS_F-027")
|
|
/// @requirement(name="第三方数据对接", id="SRS-IMS_F-028")
|
|
/// @requirement(name="数据同步", id="SRS-IMS_F-029")
|
|
void test_integration_service() {
|
|
IntegrationService isvc;
|
|
|
|
bool reg = isvc.registerInterface("query_user", "/api/user", "GET", "查询用户");
|
|
assert(reg);
|
|
reg = isvc.registerInterface("create_user", "/api/user", "POST", "新增用户");
|
|
assert(reg);
|
|
auto apis = isvc.listRegisteredInterfaces();
|
|
assert(apis.size() == 2);
|
|
std::cout << "[PASS] SRS-IMS_F-027: registerInterface\n";
|
|
|
|
ExchangeMessage msg;
|
|
msg.source_system = "ERP";
|
|
msg.data_type = "order";
|
|
msg.payload = "{\"id\": 1}";
|
|
bool pushed = isvc.pushToThirdParty("ERP", msg);
|
|
assert(pushed);
|
|
std::cout << "[PASS] SRS-IMS_F-028: pushToThirdParty\n";
|
|
|
|
bool synced = isvc.syncData("HR_System", "employee", true);
|
|
assert(synced);
|
|
std::cout << "[PASS] SRS-IMS_F-029: syncData\n";
|
|
|
|
int32_t task_id = isvc.registerSyncTask("HR_System", "employee", 3600,
|
|
[]() -> bool { return true; });
|
|
assert(task_id > 0);
|
|
std::cout << "[PASS] SRS-IMS_F-029: registerSyncTask\n";
|
|
}
|
|
|
|
int main() {
|
|
std::cout << "=== IMS 基本功能测试 ===\n\n";
|
|
|
|
test_user_manager();
|
|
test_business_manager();
|
|
test_audit_logger();
|
|
test_integration_service();
|
|
|
|
std::cout << "\n=== 所有测试通过! ===\n";
|
|
return 0;
|
|
}
|