/*
* test_enterprise.cj - 企业级功能测试
*/
package tybb2026::tycj_orm
import std.collection.*
import std.unittest.*
// ============================================================================
// SQL 执行统计测试
// ============================================================================
@test
func testRecordExecution(): Unit {
let stats = SqlExecutionStats("hash123", "SELECT * FROM users")
stats.recordExecution(100, 10, 50)
stats.recordExecution(200, 20, 50)
assert(stats.executionCount == 2)
assert(stats.totalRowsAffected == 30)
assert(stats.maxExecutionTime == 200)
assert(stats.minExecutionTime == 100)
assert(stats.avgExecutionTime == 150)
}
@test
func testRecordError(): Unit {
let stats = SqlExecutionStats("hash123", "SELECT * FROM users")
stats.recordError()
stats.recordError()
assert(stats.errorCount == 2)
}
@test
func testStatsToJson(): Unit {
let stats = SqlExecutionStats("hash123", "SELECT * FROM users")
stats.recordExecution(100, 10, 1000)
let json = stats.toJson()
assert(json.contains("sqlHash"))
assert(json.contains("executionCount"))
assert(json.contains("avgExecutionTime"))
}
// ============================================================================
// 慢查询日志测试
// ============================================================================
@test
func testLogQuery(): Unit {
let logger = SlowQueryLogger(threshold: 50, maxSize: 10)
let params = ArrayList<String>()
params.add("param1")
// 记录一个慢查询
logger.logQuery("SELECT * FROM users", 100, params)
let logs = logger.getLogs()
assert(logs.size == 1)
assert(logger.getSlowQueryCount() == 1)
}
@test
func testLogQueryBelowThreshold(): Unit {
let logger = SlowQueryLogger(threshold: 1000, maxSize: 10)
let params = ArrayList<String>()
logger.logQuery("SELECT * FROM users", 50, params)
// 低于阈值不应该记录
assert(logger.getSlowQueryCount() == 0)
}
@test
func testClearLogs(): Unit {
let logger = SlowQueryLogger(threshold: 50, maxSize: 10)
let params = ArrayList<String>()
logger.logQuery("SELECT * FROM users", 100, params)
logger.clear()
assert(logger.getSlowQueryCount() == 0)
}
@test
func testMaxLogSize(): Unit {
let logger = SlowQueryLogger(threshold: 1, maxSize: 3)
let params = ArrayList<String>()
for (i in 0..5) {
logger.logQuery("SELECT * FROM users", 100, params)
}
// 日志数量应该被限制
assert(logger.getSlowQueryCount() <= 3)
}
// ============================================================================
// SQL 注入检测测试
// ============================================================================
@test
func testDetectDangerousKeyword(): Unit {
let detector = SqlInjectionDetector()
let result = detector.detect("SELECT * FROM users; DROP TABLE users--")
assert(!result.isEmpty())
}
@test
func testDetectDangerousPattern(): Unit {
let detector = SqlInjectionDetector()
let result = detector.detect("SELECT * FROM users -- comment")
assert(!result.isEmpty())
}
@test
func testSafeSql(): Unit {
let detector = SqlInjectionDetector()
let result = detector.detect("SELECT * FROM users WHERE id = 1")
assert(result.isEmpty())
}
@test
func testValidateParamSafe(): Unit {
let detector = SqlInjectionDetector()
assert(detector.validateParam("safe_value"))
assert(detector.validateParam("123"))
assert(detector.validateParam(""))
}
@test
func testValidateParamUnsafe(): Unit {
let detector = SqlInjectionDetector()
// 包含单引号后跟OR的注入模式
assert(!detector.validateParam("' OR 1=1--"))
}
// ============================================================================
// SQL 执行监控测试
// ============================================================================
@test
func testStartAndEndMonitoring(): Unit {
let monitor = SqlExecutionMonitor()
monitor.setEnableInjectionCheck(false)
let params = ArrayList<String>()
let context = monitor.startMonitoring("SELECT * FROM users", params)
monitor.endMonitoring(context, 10)
let stats = monitor.getSqlStats()
assert(stats.size >= 0)
}
@test
func testInjectionCheck(): Unit {
let monitor = SqlExecutionMonitor()
monitor.setEnableInjectionCheck(true)
let params = ArrayList<String>()
// 尝试注入应该抛出异常
try {
monitor.startMonitoring("SELECT * FROM users; DROP TABLE users", params)
assert(false) // 应该抛出异常
} catch (_: OrmException) {
assert(true)
}
}
@test
func testRecordExecutionError(): Unit {
let monitor = SqlExecutionMonitor()
monitor.setEnableInjectionCheck(false)
monitor.recordExecutionError("SELECT * FROM users")
let stats = monitor.getSqlStats()
assert(stats.size >= 0)
}
@test
func testSetThreshold(): Unit {
let monitor = SqlExecutionMonitor()
monitor.setSlowQueryThreshold(500)
// 阈值设置成功即可
assert(true)
}
// ============================================================================
// ORM 异常测试
// ============================================================================
@test
func testExceptionMessage(): Unit {
let message = "Test error message"
try {
throw OrmException(message)
} catch (_: OrmException) {
assert(true)
}
}