package com.dalab.autoarchival.service.impl; import com.dalab.autoarchival.dto.ArchivalConfigDTO; import com.dalab.autoarchival.mapper.ArchivalConfigMapper; import com.dalab.autoarchival.model.ArchivalConfigEntity; import com.dalab.autoarchival.repository.ArchivalConfigRepository; import org.junit.jupiter.api.BeforeEach; 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 java.util.Optional; import java.util.HashMap; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class ArchivalConfigServiceImplTest { @Mock private ArchivalConfigRepository configRepository; @Mock private ArchivalConfigMapper configMapper; @InjectMocks private ArchivalConfigServiceImpl configService; private ArchivalConfigEntity sampleEntity; private ArchivalConfigDTO sampleDTO; private static final Long GLOBAL_CONFIG_ID = 1L; @BeforeEach void setUp() { sampleEntity = new ArchivalConfigEntity( GLOBAL_CONFIG_ID, true, "S3_STANDARD", 30L, true, true, new HashMap<>() ); sampleDTO = ArchivalConfigDTO.builder() .enabled(true).defaultArchivalTier("S3_STANDARD").defaultRetentionDays(30L) .requireApprovalForArchival(true).requireApprovalForRestore(true).providerConfigs(new HashMap<>()).build(); } @Test void init_WhenConfigExists_ShouldNotSave() { when(configRepository.existsById(GLOBAL_CONFIG_ID)).thenReturn(true); configService.init(); verify(configRepository, never()).save(any(ArchivalConfigEntity.class)); } @Test void init_WhenConfigNotExists_ShouldSaveDefault() { when(configRepository.existsById(GLOBAL_CONFIG_ID)).thenReturn(false); when(configRepository.save(any(ArchivalConfigEntity.class))).thenReturn(sampleEntity); // Mock save configService.init(); verify(configRepository, times(1)).save(any(ArchivalConfigEntity.class)); } @Test void getArchivalConfig_ShouldReturnMappedDTO() { when(configRepository.findById(GLOBAL_CONFIG_ID)).thenReturn(Optional.of(sampleEntity)); when(configMapper.toDto(sampleEntity)).thenReturn(sampleDTO); ArchivalConfigDTO result = configService.getArchivalConfig(); assertNotNull(result); assertEquals(sampleDTO.getDefaultArchivalTier(), result.getDefaultArchivalTier()); verify(configRepository, times(1)).findById(GLOBAL_CONFIG_ID); verify(configMapper, times(1)).toDto(sampleEntity); } @Test void updateArchivalConfig_ShouldUpdateAndSaveFolder() { when(configRepository.findById(GLOBAL_CONFIG_ID)).thenReturn(Optional.of(sampleEntity)); // configMapper.updateEntityFromDto is void, so mock it if necessary (e.g. with doNothing() or verify interaction) doNothing().when(configMapper).updateEntityFromDto(eq(sampleDTO), eq(sampleEntity)); when(configRepository.save(any(ArchivalConfigEntity.class))).thenReturn(sampleEntity); configService.updateArchivalConfig(sampleDTO); verify(configRepository, times(1)).findById(GLOBAL_CONFIG_ID); verify(configMapper, times(1)).updateEntityFromDto(sampleDTO, sampleEntity); verify(configRepository, times(1)).save(sampleEntity); assertEquals(GLOBAL_CONFIG_ID, sampleEntity.getId()); // Ensure ID is preserved } @Test void updateArchivalConfig_WhenDtoIsNull_ShouldThrowException() { assertThrows(IllegalArgumentException.class, () -> { configService.updateArchivalConfig(null); }); } @Test void updateArchivalConfig_WhenEntityNotFound_ShouldThrowException() { when(configRepository.findById(GLOBAL_CONFIG_ID)).thenReturn(Optional.empty()); assertThrows(IllegalStateException.class, () -> { configService.updateArchivalConfig(sampleDTO); }); } }