package com.lemon.cases;

import com.lemon.constants.Constants;
import com.lemon.pojo.API;
import com.lemon.pojo.Case;
import com.lemon.utils.AuthorizationUtils;
import com.lemon.utils.ExcelUtils;
import com.lemon.utils.HttpUtils;
import com.lemon.utils.SqlUtils;
import io.qameta.allure.Description;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

/**
 * @program: Lemon
 * @description:
 * @author: ray
 * @create: 2022-11-01 13:57
 **/
public class AgentCase extends BaseCase {

    @Test(dataProvider = "data2", description = "登录出版端")   // DTO数据传输
    @Description("登录出版端")
    public void testAAAAALogin(API api, Case cas) throws Exception {
        //1、参数化替换
        String params = replace(cas.getParams());
        String sql = replace(cas.getCheckSQL());
        cas.setParams(params);
        cas.setCheckSQL(sql);
        //2、数据库前置查询结果（断言必须在接口执行前后都查询）
        Object beforeSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //3、调用接口
        String body = call(api, cas, false);
        // 3.1 将登录的token存储（仅限于登录接口特有）
        AuthorizationUtils.storeToken(body);
        System.out.println(AuthorizationUtils.env);
        //4、断言响应结果，Excel中预期响应数据与实际响应数据进行对比
        Boolean assertResponseFlag = assertResponse(cas, body);
        //5、添加接口响应回写excel内容
        addWBD(Integer.parseInt(cas.getId()), Constants.ACTURL_WRITER_BACK_CELL_NUM, body);
        //6、数据库后置查询结果
        Object afterSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //7、数据库断言
        //8、添加断言回写内容
        //9、添加日志
        //10、报表断言
    }

    // 使用对应参数编写接口自动化
    @DataProvider(name = "data0")
    public Object[][] data0() {
        //Object[m][n] m代表执行次数，n代表参数个数
        Object[][] datas = {
                {"https://ra.raysyun.com/usercenter/v1.0/user/login", "{\"userName\":\"15927555348\",\"pwd\":\"5ec0b6355d9a5fdb2996c5b9950cc1c6\",\"isRemember\":1,\"systemCode\":\"agent\"}"},
        };
        return datas;
    }


    // 使用Excel文件传输接口信息和请求信息
    @DataProvider(name = "data2")
    public Object[][] data1() {
        Object[][] data = ExcelUtils.getAPIAndCaseByApiId("2");   // 传参apiID
        return data;
    }


    @Test(dataProvider = "data4", description = "获取用户信息")   // DTO数据传输
    @Description("获取用户信息")
    public void testUserGetInfo(API api, Case cas) throws Exception {
        //1、参数化替换
        String params = replace(cas.getParams());
        String sql = replace(cas.getCheckSQL());
        cas.setParams(params);
        cas.setCheckSQL(sql);
        //2、数据库前置查询结果（断言必须在接口执行前后都查询）
        Object beforeSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //3、调用接口
        String body = call(api, cas, true);
        //4、断言响应结果，Excel中预期响应数据与实际响应数据进行对比
        Boolean assertResponseFlag = assertResponse(cas, body);
        //5、添加接口响应回写excel内容
        addWBD(Integer.parseInt(cas.getId()), Constants.ACTURL_WRITER_BACK_CELL_NUM, body);
        //6、数据库后置查询结果
        Object afterSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //7、数据库断言
        //8、添加断言回写内容
        //9、添加日志
        //10、报表断言
    }

    // 使用Excel文件传输接口信息和请求信息
    @DataProvider(name = "data4")
    public Object[][] data4() {
        Object[][] data = ExcelUtils.getAPIAndCaseByApiId("4");  // 传参apiID
        return data;
    }


    @Test(dataProvider = "data5", description = "获取出版信息")   // DTO数据传输
    @Description("获取出版信息")
    public void testAgentGetInfo(API api, Case cas) throws Exception {
        //1、参数化替换
        String params = replace(cas.getParams());
        String sql = replace(cas.getCheckSQL());
        cas.setParams(params);
        cas.setCheckSQL(sql);
        //2、数据库前置查询结果（断言必须在接口执行前后都查询）
        Object beforeSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //3、调用接口
        String body = call(api, cas, true);
        //4、断言响应结果，Excel中预期响应数据与实际响应数据进行对比
        Boolean assertResponseFlag = assertResponse(cas, body);
        //5、添加接口响应回写excel内容
        addWBD(Integer.parseInt(cas.getId()), Constants.ACTURL_WRITER_BACK_CELL_NUM, body);
        //6、数据库后置查询结果
        Object afterSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //7、数据库断言
        //8、添加断言回写内容
        //9、添加日志
        //10、报表断言
    }

    // 使用Excel文件传输接口信息和用例信息
    @DataProvider(name = "data5")
    public Object[][] data5() {
        Object[][] data = ExcelUtils.getAPIAndCaseByApiId("5"); // 传参apiID
        return data;
    }


    @Test(dataProvider = "data6", description = "获取出版信息")   // DTO数据传输
    @Description("获取出版信息")
    public void testGetUnReadCountByAgent(API api, Case cas) throws Exception {
        //1、参数化替换
        String params = replace(cas.getParams());
        String sql = replace(cas.getCheckSQL());
        cas.setParams(params);
        cas.setCheckSQL(sql);
        //2、数据库前置查询结果（断言必须在接口执行前后都查询）
        Object beforeSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //3、调用接口
        String body = call(api, cas, true);
        //4、断言响应结果，Excel中预期响应数据与实际响应数据进行对比
        Boolean assertResponseFlag = assertResponse(cas, body);
        //5、添加接口响应回写excel内容
        addWBD(Integer.parseInt(cas.getId()), Constants.ACTURL_WRITER_BACK_CELL_NUM, body);
        //6、数据库后置查询结果
        Object afterSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //7、数据库断言
        //8、添加断言回写内容
        //9、添加日志
        //10、报表断言
    }

    // 使用Excel文件传输接口信息和用例信息
    @DataProvider(name = "data6")
    public Object[][] data6() {
        Object[][] data = ExcelUtils.getAPIAndCaseByApiId("6"); // 传参apiID
        return data;
    }


    @Test(dataProvider = "data7", description = "获取出版信息")   // DTO数据传输
    @Description("获取出版信息")
    public void testGetUserQRCode(API api, Case cas) throws Exception {
        //1、参数化替换
        String params = replace(cas.getParams());
        String sql = replace(cas.getCheckSQL());
        cas.setParams(params);
        cas.setCheckSQL(sql);
        //2、数据库前置查询结果（断言必须在接口执行前后都查询）
        Object beforeSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        //3、调用接口
        String body = call(api, cas, true);
        //4、断言响应结果，Excel中预期响应数据与实际响应数据进行对比
        Boolean assertResponseFlag = assertResponse(cas, body);
        //5、添加接口响应回写excel内容
        addWBD(Integer.parseInt(cas.getId()), Constants.ACTURL_WRITER_BACK_CELL_NUM, body);
        //6、数据库后置查询结果
        Object afterSqlResult = SqlUtils.querySingle(cas.getCheckSQL());
        // 7、数据库断言
        // 8、添加断言回写内容
        // 9、添加日志
        // 10、报表断言
    }

    // 使用Excel文件传输接口信息和用例信息
    @DataProvider(name = "data7")
    public Object[][] data7() {
        Object[][] data = ExcelUtils.getAPIAndCaseByApiId("6"); // 传参apiID
        return data;
    }


}
