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

Popular posts from this blog

Unit Tests in Spring Boot