package com.ruoyi.web.modules.farming.service.impl;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import com.ruoyi.web.modules.farming.TechServicePersonnelTestSamples;
import com.ruoyi.web.modules.farming.mapper.BizTechServicePersonnelMapper;
import com.ruoyi.web.modules.farming.support.TechServicePersonnelRules;

@ExtendWith(MockitoExtension.class)
@DisplayName("BizTechServicePersonnelServiceImpl")
class BizTechServicePersonnelServiceImplTest
{
    @Mock
    private BizTechServicePersonnelMapper techServicePersonnelMapper;

    @InjectMocks
    private BizTechServicePersonnelServiceImpl service;

    @Test
    @DisplayName("首次保存 insert")
    void insertOnFirstSave()
    {
        when(techServicePersonnelMapper.selectBizTechServicePersonnelById(TechServicePersonnelRules.SINGLETON_ID))
                .thenReturn(null);
        when(techServicePersonnelMapper.insertBizTechServicePersonnel(any())).thenReturn(1);
        assertEquals(1, service.saveConfig(TechServicePersonnelTestSamples.sampleRequest(), "tester"));
        verify(techServicePersonnelMapper).insertBizTechServicePersonnel(argThat(r ->
                TechServicePersonnelRules.SINGLETON_ID == r.getId()
                        && "tester".equals(r.getCreateBy())
                        && Integer.valueOf(18).equals(r.getEnvoyTotalCount())
                        && Integer.valueOf(16).equals(r.getAgriTotalCount())));
        verify(techServicePersonnelMapper, never()).updateBizTechServicePersonnel(any());
    }

    @Test
    @DisplayName("再次保存 update")
    void updateOnSecondSave()
    {
        when(techServicePersonnelMapper.selectBizTechServicePersonnelById(TechServicePersonnelRules.SINGLETON_ID))
                .thenReturn(TechServicePersonnelTestSamples.dbRow());
        when(techServicePersonnelMapper.updateBizTechServicePersonnel(any())).thenReturn(1);
        assertEquals(1, service.saveConfig(TechServicePersonnelTestSamples.sampleRequest(), "tester"));
        verify(techServicePersonnelMapper).updateBizTechServicePersonnel(argThat(r ->
                "tester".equals(r.getUpdateBy())
                        && Integer.valueOf(18).equals(r.getEnvoyTotalCount())));
        verify(techServicePersonnelMapper, never()).insertBizTechServicePersonnel(any());
    }

    @Test
    @DisplayName("查询单例")
    void getConfig()
    {
        when(techServicePersonnelMapper.selectBizTechServicePersonnelById(TechServicePersonnelRules.SINGLETON_ID))
                .thenReturn(TechServicePersonnelTestSamples.dbRow());
        assertEquals(18, service.getCurrentConfig().getEnvoyTotalCount());
    }

    @Test
    @DisplayName("无记录查询返回 null")
    void getConfigEmpty()
    {
        when(techServicePersonnelMapper.selectBizTechServicePersonnelById(TechServicePersonnelRules.SINGLETON_ID))
                .thenReturn(null);
        assertNull(service.getCurrentConfig());
    }
}
