yang-db 0.1.3

个人使用数据库操作
Documentation
//! Lua 脚本单元测试
//!
//! 测试 Redis Lua 脚本功能的基础行为

#[cfg(test)]
mod tests {
    use redis::Script;

    /// 测试脚本对象创建
    #[test]
    fn test_script_creation() {
        let code = r#"
            return "Hello, Lua!"
        "#;

        let script = Script::new(code);

        // 验证脚本对象可以创建
        // Script 没有公开的字段,所以我们只能验证它能被创建
        drop(script);
    }

    /// 测试简单脚本执行(返回字符串)
    #[test]
    fn test_simple_script_return_string() {
        let code = r#"
            return "Hello from Lua"
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本参数传递(KEYS 和 ARGV)
    #[test]
    fn test_script_with_keys_and_args() {
        let code = r#"
            return KEYS[1] .. ":" .. ARGV[1]
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本返回数字
    #[test]
    fn test_script_return_number() {
        let code = r#"
            return 42
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本返回数组
    #[test]
    fn test_script_return_array() {
        let code = r#"
            return {1, 2, 3, "four"}
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本返回 nil
    #[test]
    fn test_script_return_nil() {
        let code = r#"
            return nil
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试复杂脚本逻辑
    #[test]
    fn test_complex_script_logic() {
        let code = r#"
            local value = tonumber(ARGV[1])
            if value > 10 then
                return "large"
            elseif value > 5 then
                return "medium"
            else
                return "small"
            end
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本中的 Redis 命令调用
    #[test]
    fn test_script_with_redis_calls() {
        let code = r#"
            redis.call('SET', KEYS[1], ARGV[1])
            return redis.call('GET', KEYS[1])
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本中的多个 Redis 命令
    #[test]
    fn test_script_with_multiple_redis_calls() {
        let code = r#"
            redis.call('INCR', KEYS[1])
            redis.call('INCR', KEYS[2])
            local v1 = redis.call('GET', KEYS[1])
            local v2 = redis.call('GET', KEYS[2])
            return {v1, v2}
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本语法错误处理
    #[test]
    fn test_script_with_syntax_error() {
        // 故意包含语法错误的脚本
        let code = r#"
            return "unclosed string
        "#;

        let script = Script::new(code);

        // Script::new 不会验证语法,只有在执行时才会报错
        // 这里只验证对象可以创建
        drop(script);
    }

    /// 测试空脚本
    #[test]
    fn test_empty_script() {
        let code = "";

        let script = Script::new(code);

        // 验证空脚本对象可以创建
        drop(script);
    }

    /// 测试脚本中的条件逻辑
    #[test]
    fn test_script_conditional_logic() {
        let code = r#"
            local balance = tonumber(redis.call('GET', KEYS[1]) or 0)
            local amount = tonumber(ARGV[1])
            if balance >= amount then
                redis.call('DECRBY', KEYS[1], amount)
                return 1
            else
                return 0
            end
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本中的循环
    #[test]
    fn test_script_with_loop() {
        let code = r#"
            local sum = 0
            for i = 1, tonumber(ARGV[1]) do
                sum = sum + i
            end
            return sum
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }

    /// 测试脚本中的表操作
    #[test]
    fn test_script_with_table_operations() {
        let code = r#"
            local result = {}
            for i = 1, #KEYS do
                table.insert(result, redis.call('GET', KEYS[i]))
            end
            return result
        "#;

        let script = Script::new(code);

        // 验证脚本对象创建成功
        drop(script);
    }
}