package tech.easyflow.system.schedule;

import org.junit.Test;
import tech.easyflow.log.LogRecordProperties;
import tech.easyflow.system.mapper.SysLogMapper;

import java.util.Date;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

/**
 * {@link SysLogCleanupJob} 分批清理行为测试。
 */
public class SysLogCleanupJobTest {

    /**
     * 验证清理任务在最后一个不满批次后停止。
     */
    @Test
    public void cleanupShouldStopAfterPartialBatch() {
        SysLogMapper mapper = mock(SysLogMapper.class);
        LogRecordProperties properties = properties(5_000, 10);
        Date cutoff = new Date();
        when(mapper.deleteExpiredBatch(cutoff, 5_000))
                .thenReturn(5_000)
                .thenReturn(1_200);

        SysLogCleanupJob job = new SysLogCleanupJob(mapper, properties);

        assertEquals(6_200, job.cleanupExpired(cutoff));
        verify(mapper, times(2)).deleteExpiredBatch(cutoff, 5_000);
    }

    /**
     * 验证清理任务遵守单次调度最大批次数。
     */
    @Test
    public void cleanupShouldRespectMaxBatches() {
        SysLogMapper mapper = mock(SysLogMapper.class);
        LogRecordProperties properties = properties(2_000, 3);
        Date cutoff = new Date();
        when(mapper.deleteExpiredBatch(cutoff, 2_000)).thenReturn(2_000);

        SysLogCleanupJob job = new SysLogCleanupJob(mapper, properties);

        assertEquals(6_000, job.cleanupExpired(cutoff));
        verify(mapper, times(3)).deleteExpiredBatch(cutoff, 2_000);
    }

    /**
     * 创建测试日志配置。
     *
     * @param batchSize 单批行数
     * @param maxBatches 最大批次数
     * @return 日志配置
     */
    private LogRecordProperties properties(int batchSize, int maxBatches) {
        LogRecordProperties properties = new LogRecordProperties();
        properties.getRetention().setBatchSize(batchSize);
        properties.getRetention().setMaxBatches(maxBatches);
        return properties;
    }
}
