prod_cc/tests/basic_test.cpp

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;
}