import allure
import pytest

from utils.utility_method import get_data_from_yaml, data_list_to_transform

project_name = get_data_from_yaml('create_project', ['project_autouse_id'])[0]
not_autouse_id = get_data_from_yaml('create_project', ['not_autouse_id'])[0]
create_data = ['测试项目', 'demo', '创建测试项目', 'https://www.baidu.com']
update_data = ['测试项目111', 'demo', 'demo测试', 'https://cn.bing.com/?mkt=zh-CN']
module_list = ['问题跟踪', '时间跟踪', '新闻', '文档', '文件', 'wiki', '版本库', '讨论区', '日历', '甘特图']


class TestProject:
    @pytest.fixture(scope='function', params=project_name, ids=project_name)
    def create_project_only_name(self, project, request):
        r = project.add_project()\
            .write_project_messages(request.param).click_save()
        project_id = r.get_project_identifier()
        yield r
        r.goto_project_page().delete_project(request.param, project_id)

    @allure.title("【正向】创建项目-只填写名称，自动生成标识")
    def test_create_project_only_name(self, create_project_only_name):
        result = create_project_only_name.get_status()
        assert result
        assert result == '创建成功'

    @pytest.fixture(scope='function', params=data_list_to_transform(not_autouse_id))
    def create_project_write_identify(self, request, project):
        res = project.add_project() \
            .write_project_messages(project_name=request.param[0], project_identifier=request.param[1])\
            .click_save()
        yield res, request.param[1]
        res.goto_project_page().delete_project(request.param[0], request.param[1])

    @allure.title("【正向】创建项目-填写名称和标识")
    def test_add_project_only_required(self, create_project_write_identify):
        r, param = create_project_write_identify
        res = r.get_status()
        assert res
        assert res == '创建成功'
        res = r.get_project_identifier()
        assert res == param
        # 创建后，标识不可修改，获取属性并断言
        identify = r.get_identifier_attribute()
        assert identify == 'true'

    @pytest.fixture()
    def project_fixture(self, project):
        r = project.add_project()
        yield r
        r.goto_project_page()

    @allure.title("【逆向】创建时，不填写项目名称")
    def test_no_name(self, project_fixture):
        res = project_fixture \
            .write_project_messages(None, "demo") \
            .click_save()
        r = res.get_error_message()
        assert r
        assert r == "名称 不能为空字符"

    @allure.title("【逆向】创建时，不填写项目标识")
    def test_no_identify(self, project_fixture):
        res = project_fixture \
            .write_project_messages('测试项目') \
            .click_save()
        r = res.get_error_message()
        assert r
        assert r == "标识 不能为空字符"

    @allure.title("创建项目，填写所有数据")
    def test_create_project(self, project_fixture):
        res = project_fixture \
            .write_project_messages(*create_data) \
            .click_save().to_overview()
        result = res.get_overview_page_message()
        assert result.get('wiki') == create_data[2]
        assert result.get('home') == create_data[-1]
        assert result.get('name') == create_data[0]
        # 清理数据
        res.goto_project_page().delete_project(create_data[0], create_data[1])

    @allure.title("更新项目信息")
    def test_update_project(self, project_fixture):
        res = project_fixture.write_project_messages(*create_data) \
            .click_save()\
            .update_project(update_data[0], *update_data[2:])\
            .click_save().to_overview()
        result = res.get_overview_page_message()
        assert result.get('wiki') == update_data[2]
        assert result.get('home') == update_data[-1]
        assert result.get('name') == update_data[0]
        # 清理数据
        res.goto_project_page().delete_project(update_data[0], update_data[1])

    @allure.title("搜索项目")
    def test_search_project(self, project_fixture):
        res = project_fixture.write_project_messages(*create_data) \
            .click_save().goto_project_page()
        result = res.search(create_data[0], '项目')
        # 需要在项目外去搜索，否则搜索类型中没有项目选项
        assert result
        # 清理数据
        res.goto_project_page().delete_project(create_data[0], create_data[1])

    @pytest.mark.last
    @allure.title("更改项目的模块内容")
    def test_project_module(self, create_project):
        res = create_project.update_module(module_list[3:5]) \
            .click_save().get_module()
        assert res == module_list[3:5]




