package incheon.product.geoview3d.building.service.impl;

import incheon.product.geoview3d.building.mapper.BuildingMapper;
import incheon.product.geoview3d.building.vo.BuildingInfoVO;
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 static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

/**
 * BuildingServiceImpl 단위 테스트.
 * 좌표 기반 건물정보 조회 위임을 검증한다.
 */
@ExtendWith(MockitoExtension.class)
class BuildingServiceImplTest {

    @InjectMocks
    private BuildingServiceImpl buildingService;

    @Mock
    private BuildingMapper buildingMapper;

    @Test
    @DisplayName("getBuildingInfo는 lon, lat을 mapper에 전달한다")
    void delegatesToMapper() {
        BuildingInfoVO expected = new BuildingInfoVO();
        when(buildingMapper.selectBuildingInfoByLocation(126.705, 37.456)).thenReturn(expected);

        BuildingInfoVO result = buildingService.getBuildingInfo(126.705, 37.456);

        assertThat(result).isEqualTo(expected);
        verify(buildingMapper).selectBuildingInfoByLocation(126.705, 37.456);
    }

    @Test
    @DisplayName("조회 결과가 없으면 null을 반환한다")
    void returnsNullWhenNotFound() {
        when(buildingMapper.selectBuildingInfoByLocation(0.0, 0.0)).thenReturn(null);

        BuildingInfoVO result = buildingService.getBuildingInfo(0.0, 0.0);

        assertThat(result).isNull();
        verify(buildingMapper).selectBuildingInfoByLocation(0.0, 0.0);
    }
}
