import allure
import pytest

from utils.util import Utils
from 第二周.src.book_manager_system import BookManagement


# 取yaml文件的字段
def get_book_info():
    result = Utils.get_yaml_data("../../datas/book_info.yaml")
    datas = result.get("add").get("data")
    names = result.get("add").get("ids")
    return datas, names


# 定义测试类,不可以包含构造函数
@allure.feature("测试图书管理系统")
class TestBookManager:

    def setup_class(self):
        # 实例化类，在测试类执行之前调用一次
        self.sm = BookManagement()

    def teardown_class(self):
        print("用例执行完成")

    @pytest.mark.P0
    @allure.story("添加图书")
    @allure.title("添加图书冒烟用例")
    def test_add_book(self):
        # 测试添加图书
        # 接收被调接口的结果
        with allure.step("调用添加图书方法"):
            result = self.sm.add_book("b001", "yuwen", 20, "textbook1")
        # 断言
        with allure.step("断言添加结果"):
            assert result == "添加成功"

    @pytest.mark.P2
    @allure.story("添加图书")
    @allure.title("添加图书异常场景-图书编号已存在")
    def test_add_book_rebid(self):
        # 接收被调接口的结果
        with allure.step("调用添加图书方法"):
            result = self.sm.add_book("b001", "math", 19, "textbook2")
        # 断言
        with allure.step("断言添加结果"):
            assert result == "添加失败"

    @pytest.mark.P0
    @allure.story("通过编号修改图书信息")
    def test_modify_book(self):
        # 测试通过编号修改图书信息
        result = self.sm.modify_book_by_id("b001")
        assert result == "修改成功"

    @pytest.mark.P0
    @allure.story("通过ID删除图书信息")
    def test_delete_book_by_id(self):
        result = self.sm.delete_book_by_id("b001")
        assert result == "删除成功"

    @pytest.mark.P0
    @allure.story("通过图书名称删除图书信息")
    def test_delete_book_by_name(self):
        result = self.sm.delete_book_by_name("yuwen")
        assert result == "删除成功"

    @pytest.mark.P0
    @allure.story("通过编号查询图书信息")
    def test_query_book_by_id(self):
        result = self.sm.query_book_by_id("b001")
        assert result == "查询成功"

    @pytest.mark.P0
    @allure.story("通过名字查询图书信息")
    def test_query_book_by_name(self):
        result = self.sm.query_book_by_name("yuwen")
        assert result == "查询成功"

    @pytest.mark.P1
    @pytest.mark.parametrize(
        "bid, name, price, summary",
        get_book_info()[0],
        ids=get_book_info()[1]
    )
    @allure.story("添加图书")
    @allure.title("参数化添加图书{bid}, {name}")
    def test_add_book_by_params(self, bid, name, price, summary):
        # 参数化添加图书
        result = self.sm.add_book(bid, name, price, summary)
        # 断言
        assert result == "添加成功"
