package com.sequenceiq.cloudbreak.converter; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.test.util.ReflectionTestUtils; import com.sequenceiq.cloudbreak.api.model.InstanceGroupType; import com.sequenceiq.cloudbreak.api.model.OrchestratorRequest; import com.sequenceiq.cloudbreak.api.model.StackRequest; import com.sequenceiq.cloudbreak.controller.BadRequestException; import com.sequenceiq.cloudbreak.core.CloudbreakException; import com.sequenceiq.cloudbreak.core.bootstrap.service.OrchestratorType; import com.sequenceiq.cloudbreak.core.bootstrap.service.OrchestratorTypeResolver; import com.sequenceiq.cloudbreak.domain.FailurePolicy; import com.sequenceiq.cloudbreak.domain.InstanceGroup; import com.sequenceiq.cloudbreak.domain.Orchestrator; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.service.stack.StackParameterService; public class JsonToStackConverterTest extends AbstractJsonConverterTest<StackRequest> { @InjectMocks private JsonToStackConverter underTest; @Mock private ConversionService conversionService; @Mock private StackParameterService stackParameterService; @Mock private OrchestratorTypeResolver orchestratorTypeResolver; @Before public void setUp() { underTest = new JsonToStackConverter(); MockitoAnnotations.initMocks(this); } @Test public void testConvert() throws CloudbreakException { InstanceGroup instanceGroup = mock(InstanceGroup.class); when(instanceGroup.getInstanceGroupType()).thenReturn(InstanceGroupType.GATEWAY); // GIVEN ReflectionTestUtils.setField(underTest, "defaultRegions", "AWS:eu-west-2"); ReflectionTestUtils.setField(underTest, "enableCustomImage", true); given(conversionService.convert(any(Object.class), any(TypeDescriptor.class), any(TypeDescriptor.class))) .willReturn(new HashSet<>(Collections.singletonList(instanceGroup))); given(conversionService.convert(any(Object.class), any(Class.class))) .willReturn(new FailurePolicy()) .willReturn(new Orchestrator()); given(stackParameterService.getStackParams(any(StackRequest.class))).willReturn(new ArrayList<>()); given(orchestratorTypeResolver.resolveType(any(Orchestrator.class))).willReturn(OrchestratorType.HOST); given(orchestratorTypeResolver.resolveType(any(String.class))).willReturn(OrchestratorType.HOST); // WHEN Stack stack = underTest.convert(getRequest("stack/stack.json")); // THEN assertAllFieldsNotNull( stack, Arrays.asList("description", "statusReason", "cluster", "credential", "gatewayPort", "template", "network", "securityConfig", "securityGroup", "version", "created", "platformVariant", "cloudPlatform", "saltPassword", "stackTemplate", "flexSubscription")); Assert.assertEquals("eu-west-1", stack.getRegion()); } @Test(expected = BadRequestException.class) public void testForNoRegionAndNoDefaultRegion() throws CloudbreakException { InstanceGroup instanceGroup = mock(InstanceGroup.class); when(instanceGroup.getInstanceGroupType()).thenReturn(InstanceGroupType.GATEWAY); // GIVEN given(conversionService.convert(any(Object.class), any(TypeDescriptor.class), any(TypeDescriptor.class))) .willReturn(new HashSet<>(Collections.singletonList(instanceGroup))); given(conversionService.convert(any(Object.class), any(Class.class))) .willReturn(new FailurePolicy()) .willReturn(new Orchestrator()); given(stackParameterService.getStackParams(any(StackRequest.class))).willReturn(new ArrayList<>()); given(orchestratorTypeResolver.resolveType(any(Orchestrator.class))).willReturn(OrchestratorType.HOST); given(orchestratorTypeResolver.resolveType(any(String.class))).willReturn(OrchestratorType.HOST); // WHEN StackRequest stackRequest = getRequest("stack/stack.json"); OrchestratorRequest orchestratorRequest = new OrchestratorRequest(); orchestratorRequest.setType("SALT"); stackRequest.setOrchestrator(orchestratorRequest); stackRequest.setRegion(null); underTest.convert(stackRequest); } @Test public void testForNoRegionAndDefaultRegion() throws CloudbreakException { InstanceGroup instanceGroup = mock(InstanceGroup.class); when(instanceGroup.getInstanceGroupType()).thenReturn(InstanceGroupType.GATEWAY); // GIVEN ReflectionTestUtils.setField(underTest, "defaultRegions", "AWS:eu-west-1"); given(conversionService.convert(any(Object.class), any(TypeDescriptor.class), any(TypeDescriptor.class))) .willReturn(new HashSet<>(Collections.singletonList(instanceGroup))); given(conversionService.convert(any(Object.class), any(Class.class))) .willReturn(new FailurePolicy()) .willReturn(new Orchestrator()); given(stackParameterService.getStackParams(any(StackRequest.class))).willReturn(new ArrayList<>()); given(orchestratorTypeResolver.resolveType(any(Orchestrator.class))).willReturn(OrchestratorType.HOST); given(orchestratorTypeResolver.resolveType(any(String.class))).willReturn(OrchestratorType.HOST); // WHEN StackRequest stackRequest = getRequest("stack/stack.json"); OrchestratorRequest orchestratorRequest = new OrchestratorRequest(); orchestratorRequest.setType("SALT"); stackRequest.setOrchestrator(orchestratorRequest); stackRequest.setRegion(null); Stack stack = underTest.convert(stackRequest); // THEN Assert.assertEquals("eu-west-1", stack.getRegion()); } @Override public Class<StackRequest> getRequestClass() { return StackRequest.class; } }