package com.sequenceiq.cloudbreak.repository; import static org.junit.Assert.assertEquals; import static org.mockito.AdditionalAnswers.returnsFirstArg; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyList; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import com.sequenceiq.cloudbreak.TestUtil; import com.sequenceiq.cloudbreak.api.model.DetailedStackStatus; import com.sequenceiq.cloudbreak.cloud.scheduler.PollGroup; import com.sequenceiq.cloudbreak.converter.scheduler.StatusToPollGroupConverter; import com.sequenceiq.cloudbreak.domain.Resource; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.domain.StackStatus; import com.sequenceiq.cloudbreak.service.events.CloudbreakEventService; @RunWith(MockitoJUnitRunner.class) public class StackUpdaterTest { @Mock private StackStatusRepository stackStatusRepository; @Mock private StackRepository stackRepository; @Mock private CloudbreakEventService cloudbreakEventService; @Mock private ResourceRepository resourceRepository; @Mock private StatusToPollGroupConverter statusToPollGroupConverter; @InjectMocks private StackUpdater underTest; @Test public void updateStackStatusWithoutStatusReasonThenNoNotificationSentOnWebsocket() { Stack stack = TestUtil.stack(); DetailedStackStatus newStatus = DetailedStackStatus.DELETE_COMPLETED; StackStatus testStackStatus = new StackStatus(stack, newStatus.getStatus(), "", newStatus); when(stackStatusRepository.save(any(StackStatus.class))).thenReturn(testStackStatus); when(stackRepository.findById(anyLong())).thenReturn(stack); when(stackRepository.save(any(Stack.class))).thenReturn(stack); doNothing().when(cloudbreakEventService).fireCloudbreakEvent(anyLong(), anyString(), anyString()); when(statusToPollGroupConverter.convert(newStatus.getStatus())).thenReturn(PollGroup.POLLABLE); Stack newStack = underTest.updateStackStatus(1L, DetailedStackStatus.DELETE_COMPLETED); assertEquals(newStatus.getStatus(), newStack.getStatus()); assertEquals("", newStack.getStatusReason()); verify(cloudbreakEventService, times(0)).fireCloudbreakEvent(anyLong(), anyString(), anyString()); } @Test public void updateStackStatusAndReasonThenNotificationSentOnWebsocket() { Stack stack = TestUtil.stack(); DetailedStackStatus newStatus = DetailedStackStatus.DELETE_COMPLETED; String newStatusReason = "test"; StackStatus testStackStatus = new StackStatus(stack, newStatus.getStatus(), newStatusReason, newStatus); when(stackStatusRepository.save(any(StackStatus.class))).thenReturn(testStackStatus); when(stackRepository.findById(anyLong())).thenReturn(stack); when(stackRepository.save(any(Stack.class))).thenReturn(stack); doNothing().when(cloudbreakEventService).fireCloudbreakEvent(anyLong(), anyString(), anyString()); when(statusToPollGroupConverter.convert(newStatus.getStatus())).thenReturn(PollGroup.POLLABLE); Stack newStack = underTest.updateStackStatus(1L, newStatus, newStatusReason); assertEquals(newStatus.getStatus(), newStack.getStatus()); assertEquals(newStatusReason, newStack.getStatusReason()); } @Test public void addStackResourcesWithThreeNewResource() { Stack stack = TestUtil.stack(); List<Resource> resources = TestUtil.generateGcpResources(5); when(stackRepository.findById(anyLong())).thenReturn(stack); when(stackRepository.findOneWithLists(anyLong())).thenReturn(stack); when(stackRepository.save(any(Stack.class))).then(returnsFirstArg()); when(resourceRepository.save(anyList())).then(returnsFirstArg()); Stack newStack = underTest.addStackResources(1L, resources); assertEquals(5, newStack.getResources().size()); verify(resourceRepository, times(1)).save(anyList()); verify(stackRepository, times(1)).save(any(Stack.class)); } }