# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test59
# FileName:      test_bpm.py
# Author:       laozhao
# Datetime:     2024/3/18 16:49
# Description:
# 
# ---------------------------------------------------------------------------
import allure
import pytest
from InterfaceAutoTest.common.read_excel import ReadExcel
from InterfaceAutoTest import log


class TestBPM:

    @allure.epic("BPM项目-李四")   # 项目名称
    # @allure.feature("模块名称")    # 模块名称
    # @allure.story("接口名称")    # 接口名称
    # @allure.title("接口用例标题")    # 接口用例标题
    # @allure.severity("接口用例等级")   # 接口用例等级
    @pytest.mark.parametrize("module_name, api_name, case_title, case_level, url, method, mime, case_data, expect_data, sql_type, sql_data, update_key", ReadExcel(username="李四", table_name="组织管理").get_data())
    def test_bpm(self, db_fix, req_fix, module_name, api_name, case_title, case_level, url, method, mime, case_data, expect_data, sql_type, sql_data, update_key):
        # allure报告中展示的结果
        allure.dynamic.feature(module_name)
        allure.dynamic.story(api_name)
        allure.dynamic.title(case_title)
        allure.dynamic.severity(case_level)


        # 1.1 判断sql语句类型是否为delete
        if sql_type == "delete":
            # 1.2 使用DB类对象使用delete方法执行删除的sql语句。DB类对象就是自定义固件db_fix
            db_fix.delete(sql_data)
            # 1.3 使用RequestsMethod类对象request_all方法发生请求

        # 2.1 判断sql语句类型是否为select
        elif sql_type == "select":
            # 2.2 使用DB类对象使用select方法执行查询的sql语句，并接收查询的结果。DB类对象就是自定义固件db_fix
            select_result = db_fix.select(sql_data)
            # 2.3 将查询结果更新到用例数据中
            case_data[update_key] = select_result
            # 2.3 使用RequestsMethod类对象request_all方法发生请求

        # 3.1 判断sql语句的类型是否为select|delete或者为delete|select
        elif sql_type == "select|delete" or sql_type == "delete|select":
            # 3.2 使用DB类对象使用delete方法执行删除的sql语句。DB类对象就是自定义固件db_fix
            db_fix.delete(sql_data["delete"])
            # 3.3 使用DB类对象使用select方法执行查询的sql语句，并接收查询的结果。DB类对象就是自定义固件db_fix
            select_result = db_fix.select(sql_data["select"])
            # 3.4 将查询结果更新到用例数据中
            case_data[update_key] = select_result
            # 3.5 使用RequestsMethod类对象request_all方法发生请求

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