# -*-coding:utf-8-*- #
# ---------------------------------------------------------------------------
# ProjectName:   test62
# FileName:      test_bpm.py
# Author:       why
# Datetime:     2024/9/7 下午3:24
# Description:
# 命名规范:文件名全小写+下划线,类名大驼峰,方法和变量小写+下划线连接,
# 常量大写,变量和常量用名词,方法用动词
# --------------------------------------------------------------------------
import allure
import pytest

from apiAutoTest_v4 import log
from apiAutoTest_v4.common.read_excel_01 import ReadExcel
from apiAutoTest_v4.request_method.request_method import RequestMethod
from apiAutoTest_v4.test_case.test_brightlord import namespace

# 创建ReadExcel对象,便于获取用户的测试数据,所有创建ReadExcel对象时需要传入用户存放数据的目录名称
excel = ReadExcel(namespace)


class TestBpm:

    @allure.epic("BPM项目-brightlord")
    # @allure.feature("模块名称")
    # @allure.story("接口名称")
    # @allure.title("用例标题")
    # @allure.severity("用例等级")
    @pytest.mark.parametrize("module_name, api_name, title, level, url, method, mime, case_data, expect_data, sql_type, sql_data, update_key", excel.get_data())
    def test_bpm(self, fix_db, fix_req, module_name, api_name, title, level, url, method, mime, case_data, expect_data, sql_type, sql_data, update_key):
        allure.dynamic.feature(module_name)
        allure.dynamic.story(api_name)
        allure.dynamic.title(title)
        allure.dynamic.severity(level)

        # 判断sql语句类型是否为delete
        if sql_type == "delete":
            # 使用fix_db调用DB类对象的delete方法执行sql语句
            fix_db.delete(sql_data['delete'])

        # 判断sql语句类型是否为select
        if sql_type == "select":
            # 使用fix_db调用DB类对象的select方法执行sql语句
            res_select = fix_db.select(sql_data['select'])
            # 将查询到的结果更新到用例数据中去
            case_data[update_key] = res_select

        # 判断sql语句是否是delete|select 或 select|delete, 是则执行sql语句
        if sql_type == "delete|select" or sql_type == "select|delete":
            # 使用fix_db调用DB类对象的delete方法执行sql语句
            fix_db.delete(sql_data['delete'])
            # 使用fix_db调用DB类对象的select方法执行sql语句
            res_select = fix_db.select(sql_data['select'])
            # 将查询到的结果更新到用例数据中去
            case_data[update_key] = res_select

        # 使用RequestMethod对象调用request_all方法发送请求
        res = RequestMethod().request_all(req_method=method, req_url=url, req_mime=mime, case_data=case_data)

        # 断言
        try:
            for key in expect_data.keys():
                assert res.json().get(key) == expect_data[key]
        except AssertionError:
            log.error(f"断言失败,接口为{url},期望数据为{expect_data},用例数据为{case_data},服务器返回数据为{res.text}")
            raise AssertionError("断言失败")
        else:
            log.info(f"断言成功,接口为{url},期望数据为{expect_data},用例数据为{case_data},服务器返回数据为{res.text}")