test_lock_by_month_api.py 8.11 KB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量锁定当月工资接口测试脚本
使用Python内置库,无需额外依赖
"""

import urllib.request
import urllib.parse
import json
import sys

BASE_URL = "http://localhost:2011"

# 服务列表
SERVICES = [
    ("lqsalary", "健康师"),
    ("lqtechteachersalary", "科技部老师"),
    ("lqassistantsalary", "店助"),
    ("lqstoremanagersalary", "店长"),
    ("lqdirectorsalary", "主任"),
    ("lqmajorprojectteachersalary", "大项目老师"),
    ("lqmajorprojectdirectorsalary", "大项目主管"),
    ("lqtechgeneralmanagersalary", "科技部总经理"),
    ("lqbusinessunitmanagersalary", "事业部总经理"),
]

def get_token():
    """获取登录token"""
    try:
        url = f"{BASE_URL}/api/oauth/Login"
        data = urllib.parse.urlencode({
            "account": "admin",
            "password": "e10adc3949ba59abbe56e057f20f883e"
        }).encode('utf-8')
        
        req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/x-www-form-urlencoded"})
        
        with urllib.request.urlopen(req, timeout=10) as response:
            result = json.loads(response.read().decode('utf-8'))
            if result.get("code") == 200 and "data" in result and "token" in result["data"]:
                return result["data"]["token"]
        
        print(f"❌ 获取token失败")
        return None
    except urllib.error.URLError as e:
        print(f"❌ 无法连接到服务器: {BASE_URL}")
        print(f"   错误: {str(e)}")
        print("   请确保服务已启动")
        return None
    except Exception as e:
        print(f"❌ 获取token时发生错误: {str(e)}")
        return None

def test_lock_by_month(service_name, service_desc, year, month, is_locked, token):
    """测试批量锁定当月工资接口"""
    url = f"{BASE_URL}/api/Extend/{service_name}/lock-by-month"
    
    payload = {
        "year": year,
        "month": month,
        "isLocked": is_locked
    }
    
    try:
        data = json.dumps(payload).encode('utf-8')
        req = urllib.request.Request(
            url,
            data=data,
            headers={
                "Authorization": token,
                "Content-Type": "application/json"
            }
        )
        
        with urllib.request.urlopen(req, timeout=30) as response:
            result_data = json.loads(response.read().decode('utf-8'))
            
            result = {
                "service": service_desc,
                "service_name": service_name,
                "status_code": response.status,
                "success": False,
                "message": "",
                "data": None,
                "error": None
            }
            
            if response.status == 200:
                if result_data.get("code") == 200 or result_data.get("success") == True:
                    result["success"] = True
                    if "data" in result_data:
                        result["data"] = result_data["data"]
                    else:
                        result["data"] = result_data
                    result["message"] = result["data"].get("message", "操作成功") if isinstance(result["data"], dict) else str(result["data"])
                else:
                    result["error"] = result_data.get("msg", "未知错误")
            
            return result
    except urllib.error.HTTPError as e:
        try:
            error_data = json.loads(e.read().decode('utf-8'))
            error_msg = error_data.get("msg", f"HTTP {e.code}")
        except:
            error_msg = f"HTTP {e.code}"
        
        return {
            "service": service_desc,
            "service_name": service_name,
            "success": False,
            "error": error_msg
        }
    except urllib.error.URLError as e:
        return {
            "service": service_desc,
            "service_name": service_name,
            "success": False,
            "error": f"连接错误: {str(e)}"
        }
    except Exception as e:
        return {
            "service": service_desc,
            "service_name": service_name,
            "success": False,
            "error": str(e)
        }

def main():
    print("=" * 60)
    print("批量锁定当月工资接口测试")
    print("=" * 60)
    print()
    
    # 获取token
    print("正在获取token...")
    token = get_token()
    if not token:
        print("\n❌ 无法获取token,测试终止")
        print("\n提示:请确保服务已启动,并且登录接口正常")
        sys.exit(1)
    
    print("✅ 成功获取token")
    print()
    
    # 测试参数
    YEAR = 2025
    MONTH = 12
    
    # 测试用例1:批量锁定
    print("=" * 60)
    print("测试用例1:批量锁定当月所有工资")
    print(f"测试月份: {YEAR}年{MONTH}月")
    print("=" * 60)
    print()
    
    success_count = 0
    fail_count = 0
    results = []
    
    for service_name, service_desc in SERVICES:
        print(f"测试服务: {service_desc} ({service_name})")
        result = test_lock_by_month(service_name, service_desc, YEAR, MONTH, True, token)
        results.append(result)
        
        if result["success"]:
            print(f"  ✅ 接口调用成功")
            if isinstance(result["data"], dict):
                print(f"     - 消息: {result['message']}")
                print(f"     - 总数: {result['data'].get('total', 0)}")
                print(f"     - 锁定: {result['data'].get('locked', 0)}")
                print(f"     - 跳过: {result['data'].get('skipped', 0)}")
                print(f"     - 已是锁定状态: {result['data'].get('alreadyLocked', 0)}")
            else:
                print(f"     - 响应: {result['message']}")
            success_count += 1
        else:
            print(f"  ❌ 接口调用失败")
            print(f"     - 错误: {result.get('error', '未知错误')}")
            fail_count += 1
        print()
    
    # 测试用例2:批量解锁(只测试第一个服务)
    print("=" * 60)
    print("测试用例2:批量解锁当月所有工资(示例)")
    print("=" * 60)
    print()
    
    first_service_name, first_service_desc = SERVICES[0]
    print(f"测试服务: {first_service_desc} ({first_service_name})")
    unlock_result = test_lock_by_month(first_service_name, first_service_desc, YEAR, MONTH, False, token)
    
    if unlock_result["success"]:
        print(f"  ✅ 接口调用成功")
        if isinstance(unlock_result["data"], dict):
            print(f"     - 消息: {unlock_result['message']}")
            print(f"     - 总数: {unlock_result['data'].get('total', 0)}")
            print(f"     - 解锁: {unlock_result['data'].get('unlocked', 0)}")
            print(f"     - 跳过: {unlock_result['data'].get('skipped', 0)}")
    else:
        print(f"  ❌ 接口调用失败")
        print(f"     - 错误: {unlock_result.get('error', '未知错误')}")
    print()
    
    # 测试用例3:参数验证
    print("=" * 60)
    print("测试用例3:参数验证(错误年份)")
    print("=" * 60)
    print()
    
    print(f"测试服务: {first_service_desc} ({first_service_name})")
    invalid_result = test_lock_by_month(first_service_name, first_service_desc, 0, MONTH, True, token)
    
    if not invalid_result["success"]:
        print(f"  ✅ 参数验证正常")
        print(f"     - 错误信息: {invalid_result.get('error', '参数验证失败')}")
    else:
        print(f"  ❌ 参数验证异常(应该拒绝无效参数)")
    print()
    
    # 测试总结
    print("=" * 60)
    print("测试总结")
    print("=" * 60)
    print(f"总计: {success_count}/{len(SERVICES)} 个服务接口测试通过")
    print()
    
    if success_count == len(SERVICES):
        print("🎉 所有接口测试通过!")
        return 0
    else:
        print(f"⚠️  有 {fail_count} 个接口测试失败")
        print("\n失败的接口:")
        for result in results:
            if not result["success"]:
                print(f"  - {result['service']} ({result['service_name']}): {result.get('error', '未知错误')}")
        return 1

if __name__ == "__main__":
    sys.exit(main())