package com.cf.imes.module.report.service.template;

import com.cf.imes.framework.test.core.util.RandomUtils;
import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO;
import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateRespVO;
import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateSaveReqVO;
import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO;
import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import jakarta.annotation.Resource;

import java.util.List;

import static com.cf.imes.framework.test.core.util.AssertUtils.*;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS;
import static org.junit.jupiter.api.Assertions.*;

/**
 * {@link ReportTemplateServiceImpl} 的单元测试类
 *
 * @author Gqr
 * @since 2024/7/3 14:35
 */
@SpringBootTest
public class ReportTemplateServiceImplTest extends ReportCommonServiceImplTest {

    @Resource
    private ReportTemplateServiceImpl reportTemplateService;

    @Test
    public void testCreateTemplate_success() {
        setOrganId();
        // 准备参数
        ReportTemplateSaveReqVO createReqVO = prepareTemplateReqVO(null);
        System.out.println("template压缩后大小：" + createReqVO.getContent().length());
        // 插入
        ReportTemplateRespVO reportTemplate = reportTemplateService.createReportTemplate(createReqVO);
        Long templateId = reportTemplate.getId();
        // 断言
        assertNotNull(templateId);
        // 校验是否插入
        ReportTemplateDO template = reportTemplateService.getReportTemplate(templateId);
        assertNotNull(template);
        String templateUnZip = template.getContent();
        System.out.println("从库中读取template大小：" + templateUnZip.length());
        // 校验解压内容是否正确
        assertEquals(TEMPLATE, JsonUtil.unzipString(templateUnZip));
        // 删除
        reportTemplateService.deleteReportTemplate(templateId);
    }

    @Test
    public void testUpdateTemplate_success() {
        setOrganId();
        // 准备参数
        ReportTemplateSaveReqVO createReqVO = prepareTemplateReqVO(null);
        System.out.println("template压缩后大小：" + createReqVO.getContent().length());
        // 插入
        ReportTemplateRespVO reportTemplate = reportTemplateService.createReportTemplate(createReqVO);
        Long templateId = reportTemplate.getId();

        //准备更新参数
        ReportTemplateSaveReqVO updateReqVO = prepareTemplateReqVO(templateId);

        // 更新
        reportTemplateService.updateReportTemplate(updateReqVO);
        // 校验是否更新正确
        ReportTemplateDO template = reportTemplateService.getReportTemplate(updateReqVO.getId()); // 获取最新的
        assertNotNull(template);
        isPojoEquals(template,updateReqVO);
        // 删除
        reportTemplateService.deleteReportTemplate(templateId);
    }

    @Test
    public void testUpdateTemplate_notExists() {
        setOrganId();
        // 准备参数
        ReportTemplateSaveReqVO updateReqVO = prepareTemplateReqVO(RandomUtils.randomLongId());
        // 调用, 并断言异常
        assertServiceException(() -> reportTemplateService.updateReportTemplate(updateReqVO), TEMPLATE_NOT_EXISTS);
    }

    @Test
    public void deleteTemplate_success() {
        setOrganId();
        // 准备参数
        ReportTemplateSaveReqVO createReqVO = prepareTemplateReqVO(null);
        // 插入
        ReportTemplateRespVO reportTemplate = reportTemplateService.createReportTemplate(createReqVO);
        Long templateId = reportTemplate.getId();

        // 删除
        reportTemplateService.deleteReportTemplate(templateId);
        // 校验数据不存在了
        assertNull(reportTemplateService.getReportTemplate(templateId));
    }

    @Test
    public void testDeleteTemplate_notExists() {
        setOrganId();
        // 准备参数
        Long id = RandomUtils.randomLongId();

        // 调用, 并断言异常
        assertServiceException(() -> reportTemplateService.deleteReportTemplate(id), TEMPLATE_NOT_EXISTS);
    }

    @Test
    public void getTemplateList_success() {
        setOrganId(2L);

        // 准备参数
        ReportTemplateSaveReqVO createReqVO = prepareTemplateReqVO(null);
        // 插入
        ReportTemplateRespVO reportTemplate = reportTemplateService.createReportTemplate(createReqVO);
        Long templateId = reportTemplate.getId();

        ReportTemplateReqVO reqVO = new ReportTemplateReqVO();
        reqVO.setType(ReportTemplateTypeEnum.SYSTEM.getType());
        reqVO.setName(createReqVO.getName());
        List<ReportTemplateDO> reportTemplateList = reportTemplateService.getReportTemplateList(reqVO);

        assertNotNull(reportTemplateList);
        assertNotEquals(0, reportTemplateList.size());
        assertEquals(2L, reportTemplateList.get(0).getOrganId());

        // 删除
        reportTemplateService.deleteReportTemplate(templateId);
    }
}
