tests
package com.example.dump.service;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import com.example.dump.dao.DumpAvailabilityDao;
import com.example.dump.event.ImportDataEvent;
import com.example.dump.exception.GarliqException;
import com.example.dump.mapper.AlmRepositoryMapper;
import com.example.dump.model.*;
import com.example.dump.ocpn.GarliqOcpnService;
import com.example.dump.s3.S3RequestDto;
import com.example.dump.task.TaskService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.*;
import org.mockito.junit.jupiter.MockitoExtension;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
@ExtendWith(MockitoExtension.class)
class DumpProcessingServiceTest {
@Mock GarliqOcpnService garliqOcpnService;
@Mock TaskService taskService;
@Mock DumpHelper dumpHelper;
@Mock DumpAvailabilityDao dumpAvailabilityDao;
@Mock AlmRepositoryMapper almRepositoryMapper;
@InjectMocks @Spy
DumpProcessingService service;
// shared fixture
SuperTask superTask;
Perimeter perimeter;
Dump dump;
AlmRepository repository;
String environment;
@BeforeEach
void setUp() {
superTask = new SuperTask(42L);
perimeter = new Perimeter("PERIMETER");
dump = new Dump("myDump", "{}", "DEV");
environment = "DEV";
repository = new AlmRepository(7L, "myDb", "dbUser", perimeter);
// by default, no existing availability → download branch
when( almRepositoryMapper.toAlmRepository(any()) )
.thenReturn(repository);
when( dumpAvailabilityDao.findByPerimeterAndNameAndDatabase(
eq(perimeter), eq(dump.getName()), eq(environment)) )
.thenReturn(Optional.empty());
// stub the private importDumpFromOcpm so it doesn't actually run anything
doNothing().when(service)
.importDumpFromOcpm(any(), any(), anyLong(), anyString(), any());
}
@Test
void when_allFilesDownloadSuccessfully_should_markReady_then_import() throws IOException {
// arrange: two files, both succeed
when( dumpHelper.getListOfDumpFiles(any()) ).thenReturn(List.of("f1","f2"));
when( garliqOcpnService.transferDumpToS3(
any(), anyString(), any(S3RequestDto.class),
eq(superTask), eq(TaskType.DOWNLOAD_DUMP)) )
.thenReturn(JobStatus.OK);
// stub availability lookup in updateDumpAvailability()
DumpAvailabilityEntity availability = new DumpAvailabilityEntity();
when( dumpAvailabilityDao.findByDbUsernameAndDumpName(
eq(repository.getDbUsername()), eq(dump.getName())) )
.thenReturn(Optional.of(availability));
// act
ImportDataEvent evt = new ImportDataEvent(
this,
repository,
dump.getName(),
environment,
superTask,
dump
);
service.handleImportDataEvent(evt);
// assert: after download finishes, availability is set to READY
assertEquals(DumpState.READY, availability.getState());
// assert: importDumpFromOcpm was called once with exactly these args
verify(service).importDumpFromOcpm(
eq(superTask),
eq(perimeter),
eq(repository.getId()),
eq(environment),
eq(dump)
);
// and no failure task was created
verify(taskService, never()).createFailedTask(any(), any(), any(), any());
}
@Test
void when_anyFileFails_download_should_createFailedTask_and_setIncomplete() throws IOException {
// arrange: two files, first one fails immediately
when( dumpHelper.getListOfDumpFiles(any()) ).thenReturn(List.of("f1","f2"));
when( garliqOcpnService.transferDumpToS3(
any(), anyString(), any(S3RequestDto.class),
eq(superTask), eq(TaskType.DOWNLOAD_DUMP)) )
.thenReturn(JobStatus.KO);
// availability entity for updateDumpAvailability(INCOMPLETE)
DumpAvailabilityEntity availability = new DumpAvailabilityEntity();
when( dumpAvailabilityDao.findByDbUsernameAndDumpName(
eq(repository.getDbUsername()), eq(dump.getName())) )
.thenReturn(Optional.of(availability));
// act
ImportDataEvent evt = new ImportDataEvent(
this,
repository,
dump.getName(),
environment,
superTask,
dump
);
// it swallows exceptions, so no exception to assert
service.handleImportDataEvent(evt);
// verify a failure‐task was created
verify(taskService).createFailedTask(
eq(superTask),
eq(repository.getDbUsername()),
eq(TaskType.DOWNLOAD_DUMP),
contains("Failed to download")
);
// availability must be marked INCOMPLETE
assertEquals(DumpState.INCOMPLETE, availability.getState());
// import should never happen in a failure
verify(service, never()).importDumpFromOcpm(
any(), any(), anyLong(), anyString(), any()
);
}
}
Comments
Post a Comment