__author__ = 'fanxun'
__data__ = "2021-05-17 15:11"

import pytest, allure, xlrd, os, random
import config
from common.utils.getExcelData import  get_excelData
from common.tools import request_main
from config import BMCConfig


@allure.feature("三车违法学习")
class TestIllegalStudy():
    workBook = xlrd.open_workbook(f'{BMCConfig.root_path}/test_case_data/bmc/bmc_illegal_study_20210513.xlsx')

    @pytest.fixture()
    def test_pre_recent_grade(self):
        """查看是否有答题记录"""
        url = f"{BMCConfig().host}/answer/logList"
        method = 'get'
        req_data = {'pageIndex': 1, 'pageSize': 20}
        res = request_main(url=url, headers=None, method=method, data=req_data, has_token=False)
        # 答题记录 res['data']['totalCount']
        return res['data']

    @allure.story("查询最近成绩")
    @allure.link("http://yapi.hikcreate.com/project/32/interface/api/67503")
    @allure.description("/answer/recentGrade")
    @allure.title("{inData[testPoint]}")
    @pytest.mark.usefixtures('test_pre_recent_grade')
    @pytest.mark.parametrize("inData", get_excelData(workBook, '三车违法学习', 'recentGradeIllegalstudy'))
    def test_recent_grade_illegal_study(self, inData, test_pre_recent_grade):
        url = f"{BMCConfig().host}{inData['url']}"
        method  = inData['method']
        req_data = inData['reqData']
        expectData = inData['expectData']
        headers = inData['headers']
        is_answer_record = test_pre_recent_grade['totalCount']
        if is_answer_record == 0:  # 无答题记录
            expectData['code'] = 1006
        else:
            expectData['code'] = 1000
        res = request_main(url=url, headers=headers, method=method, data=req_data, has_token=False)
        assert res['code'] == expectData['code']

    @allure.story("获取典型案例视频")
    @allure.link("http://yapi.hikcreate.com/project/31/interface/api/57606")
    @allure.description("/illegal/study/video/typicalCase")
    @allure.title("{inData[testPoint]}")
    @pytest.mark.parametrize("inData", get_excelData(workBook, '三车违法学习', 'typicalCaseIllegalstudy'))
    def test_typical_case_illegal_study(self, inData):
        url = f"{BMCConfig().host}{inData['url']}"
        method = inData['method']
        req_data = inData['reqData']
        expectData = inData['expectData']
        headers = inData['headers']
        res = request_main(url=url, headers=headers, method=method, data=req_data, has_token=False)
        assert res['code'] == expectData['code']

    @allure.story("获取试卷")
    @allure.link("http://yapi.hikcreate.com/project/32/interface/api/69573")
    @allure.description("/paper/getPaper")
    @allure.title("{inData[testPoint]}")
    @pytest.mark.parametrize("inData", get_excelData(workBook, '三车违法学习', 'getPaperIllegalstudy'))
    def test_get_paper_illegal_study(self, inData):
        url = f"{BMCConfig().host}{inData['url']}"
        method = inData['method']
        req_data = inData['reqData']
        expectData = inData['expectData']
        headers = inData['headers']
        res = request_main(url=url, headers=headers, method=method, data=req_data, has_token=False)
        assert res['code'] == expectData['code']

    @pytest.fixture()
    def test_pre_get_paper_illegal_study(self):
        """获取试卷套件"""
        url = f"{BMCConfig().host}/paper/getPaper"
        method = 'get'
        req_data = None
        res = request_main(url=url, headers=None, method=method, data=req_data, has_token=False)
        topic_lists = res['data']['topicList']

        browsequestion = {}
        choosequestion = {}
        browsequestion['answerId'] = res['data']['answerId']
        choosequestion['answerId'] = res['data']['answerId']

        for item in topic_lists:
            if item['topicType'] == 2 and len(browsequestion) == 1:  # 浏览题
                browsequestion['topicId'] = item['topicId']
                browsequestion['topicType'] = item['topicType']
            elif item['topicType'] == 1 and len(choosequestion) == 1:
                choosequestion['topicId'] = item['topicId']
                choosequestion['topicType'] = item['topicType']
        return browsequestion, choosequestion

    @allure.story("提交答案")
    @allure.link("http://yapi.hikcreate.com/project/31/interface/api/67473")
    @allure.description("/paper/submitAnswer")
    @allure.title("{inData[testPoint]}")
    @pytest.mark.usefixtures('test_pre_get_paper_illegal_study')
    @pytest.mark.parametrize("inData", get_excelData(workBook, '三车违法学习', 'submitAnswerIllegalstudy'))
    def test_submit_answer_illegal_study(self, inData, test_pre_get_paper_illegal_study):
        browsequestion, choosequestion = test_pre_get_paper_illegal_study
        url = f"{BMCConfig().host}{inData['url']}"
        method = inData['method']
        req_data = inData['reqData']
        req_data['answerId'] = browsequestion['answerId']
        req_data['topicId'] = browsequestion['topicId']
        req_data['topicType'] = browsequestion['topicType']
        expectData = inData['expectData']
        case_num = inData['caseNum']
        if case_num == 'submitAnswerIllegalstudy001':
            req_data['answerId'] = browsequestion['answerId']
            req_data['topicId'] = browsequestion['topicId']
        elif case_num == 'submitAnswerIllegalstudy002':
            req_data['answerId'] = browsequestion['answerId']
            while True:
                topic_id = random.randint(1, 100)
                if topic_id != browsequestion['topicId']:
                    req_data['topicId'] = topic_id
                    break
        elif case_num == 'submitAnswerIllegalstudy003':
            req_data['topicId'] = browsequestion['topicId']
            while True:
                answer_id = random.randint(1, 100)
                if answer_id != browsequestion['answerId']:
                    req_data['answerId'] = answer_id
                    break
        elif case_num == 'submitAnswerIllegalstudy004':
            req_data['answerId'] = browsequestion['answerId']
            req_data['topicId'] = browsequestion['topicId']
            req_data['topicType'] = 1
        elif case_num == 'submitAnswerIllegalstudy005':
            req_data['answerId'] = choosequestion['answerId']
            req_data['topicId'] = choosequestion['topicId']

        res = request_main(url=url, headers=None, method=method, data=req_data, has_token=False)
        assert res['code'] == expectData['code']

    @allure.story("查询成绩(只有错题)")
    @allure.link("http://yapi.hikcreate.com/project/32/interface/api/67485")
    @allure.description("/answer/detail")
    @allure.title("{inData[testPoint]}")
    @pytest.mark.parametrize("inData", get_excelData(workBook, '三车违法学习', 'detailIllegalstudy'))
    def test_detail_illegal_study(self, inData):
        url = f"{BMCConfig().host}{inData['url']}"
        method = inData['method']
        req_data = inData['reqData']
        expectData = inData['expectData']
        headers = inData['headers']
        res = request_main(url=url, headers=headers, method=method, data=req_data, has_token=False)
        assert res['code'] == expectData['code']

    @allure.story("查询答题记录列表")
    @allure.link("http://yapi.hikcreate.com/project/31/interface/api/67497")
    @allure.description("/answer/logList")
    @allure.title("{inData[testPoint]}")
    @pytest.mark.parametrize("inData", get_excelData(workBook, '三车违法学习', 'logListIllegalstudy'))
    def test_log_list_illegal_study(self, inData):
        url = f"{BMCConfig().host}{inData['url']}"
        method = inData['method']
        req_data = inData['reqData']
        expectData = inData['expectData']
        headers = inData['headers']
        res = request_main(url=url, headers=headers, method=method, data=req_data, has_token=False)
        print(res)
        assert res['code'] == expectData['code']

    @allure.story("答题记录查询")
    @allure.link("http://yapi.hikcreate.com/project/32/interface/api/67491")
    @allure.description("/answer/log")
    @allure.title("{inData[testPoint]}")
    @pytest.mark.parametrize("inData", get_excelData(workBook, '三车违法学习', 'logIllegalstudy'))
    def test_log_illegal_study(self, inData):
        url = f"{BMCConfig().host}{inData['url']}"
        method = inData['method']
        req_data = inData['reqData']
        expectData = inData['expectData']
        headers = inData['headers']
        res = request_main(url=url, headers=headers, method=method, data=req_data, has_token=False)
        assert res['code'] == expectData['code']

if __name__ == '__main__':
    pytest.main(['-s', '-v', 'test_illegalstudy.py',
                 r'--alluredir=D:\项目\接口自动化\InterfaceAutoTest\report', '--clean-alluredir'])
#
    os.system('allure serve D:\项目\接口自动化\InterfaceAutoTest\\report')