# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test60
# FileName:      test_bpm.py
# Author:       lao_zhao
# Datetime:     2024/5/20 16:08
# Description:
# 
# ---------------------------------------------------------------------------
import allure
import pytest
import logging
from InterfaceAutoTest import log_decorator
from InterfaceAutoTest.common.read_excel import ReadExcel

excel = ReadExcel("demo")


class TestBPM:

    @allure.epic("BPM系统-demo")  # 测试系统的名称
    # @allure.feature("模块名称")  # 模块名称
    # @allure.story("接口名称")    # 接口
    # @allure.title("标题名称")    # 用例标题
    # @allure.severity("用例的等级")   # 用例等级
    @pytest.mark.parametrize("module_name, api_name, case_title, case_level, method, url, mime, case_data, expect_data, sql_data, sql_type, update_key", excel.get_data())
    def test_bpm(self, req_fix, db_fix, module_name, api_name, case_title, case_level, method, url, mime, case_data, expect_data, sql_data, sql_type, update_key):
        # 给allure输出的报告添加内容
        allure.dynamic.feature(module_name)
        allure.dynamic.story(api_name)
        allure.dynamic.title(case_title)
        allure.dynamic.severity(case_level)

        # 判断sql语句类型是否为select
        if sql_type == "select":
            # 使用DB类对象调用select_func方法执行查询的sql语句，并接收查询结果
            select_result = db_fix.select_func(sql_data)
            # 将查询结果更新到用例数据中
            case_data[update_key] = select_result
            # 将更新之后的用例数据发送给服务器。

        # 判断sql语句的类型是否为delete
        elif sql_type == "delete":
            # 使用DB类对象调用delete_func方法执行删除的sql语句
            db_fix.delete_func(sql_data)
            # 将数据库中的数据删除完之后，再发送请求

        # 判断sql语句类型是否为select|delete或者为delete|select
        elif sql_type == "select|delete" or sql_type == "delete|select":
            # 使用DB类对象调用delete_func方法执行删除的sql语句
            db_fix.delete_func(sql_data["delete"])
            # 使用DB类对象调用select_func方法执行查询的sql语句，并接收查询结果
            select_result = db_fix.select_func(sql_data["select"])
            # 将查询结果更新到用例数据中
            case_data[update_key] = select_result
            # 将更新之后的用例数据发送给服务器。

        # 使用RequestsMethod对象发送请求
        res = req_fix.request_all(req_method=method, req_url=url, req_mime=mime, case_data=case_data)
        # 断言
        try:
            for key in expect_data:
                assert expect_data[key] == res.json().get(key)
        except AssertionError as e:
            logging.error(f"断言失败， 用例数据为{case_data}, 期望数据为:{expect_data}, 服务器返回的数据为：{res.text}")
            raise e
        else:
            logging.info(f"断言成功， 用例数据为{case_data}, 期望数据为:{expect_data}, 服务器返回的数据为：{res.text}")
            print("断言")

