package com.sequenceiq.cloudbreak.shell.commands; import static org.mockito.BDDMockito.anyString; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.times; import static org.mockito.BDDMockito.verify; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyVararg; import static org.mockito.Matchers.eq; import java.util.HashMap; import java.util.Map; 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 com.sequenceiq.cloudbreak.api.endpoint.TemplateEndpoint; import com.sequenceiq.cloudbreak.api.model.TemplateResponse; import com.sequenceiq.cloudbreak.client.CloudbreakClient; import com.sequenceiq.cloudbreak.shell.commands.base.BaseInstanceGroupCommands; import com.sequenceiq.cloudbreak.shell.completion.InstanceGroup; import com.sequenceiq.cloudbreak.shell.completion.InstanceGroupTemplateId; import com.sequenceiq.cloudbreak.shell.completion.InstanceGroupTemplateName; import com.sequenceiq.cloudbreak.shell.completion.SecurityGroupId; import com.sequenceiq.cloudbreak.shell.model.InstanceGroupEntry; import com.sequenceiq.cloudbreak.shell.model.OutPutType; import com.sequenceiq.cloudbreak.shell.model.ShellContext; import com.sequenceiq.cloudbreak.shell.transformer.ExceptionTransformer; import com.sequenceiq.cloudbreak.shell.transformer.OutputTransformer; public class BaseInstanceGroupCommandsTest { private static final Integer DUMMY_NODE_COUNT = 1; private static final String DUMMY_TEMPLATE = "dummy-template"; private static final String DUMMY_TEMPLATE_ID = "50"; private InstanceGroup hostGroup = new InstanceGroup("master"); private InstanceGroupTemplateId dummyTemplateId = new InstanceGroupTemplateId(DUMMY_TEMPLATE_ID); private InstanceGroupTemplateName dummyTemplateName = new InstanceGroupTemplateName(DUMMY_TEMPLATE); private SecurityGroupId dummySecurityGroupId = new SecurityGroupId("1"); private Map<String, Object> params = new HashMap<>(); @InjectMocks private BaseInstanceGroupCommands underTest; @Mock private CloudbreakClient cloudbreakClient; @Mock private TemplateEndpoint mockClient; @Mock private ShellContext mockContext; @Mock private OutputTransformer outputTransformer; @Mock private ExceptionTransformer exceptionTransformer; private TemplateResponse dummyResult; private RuntimeException expectedException = new RuntimeException("something not found"); @Before public void setUp() throws Exception { underTest = new BaseInstanceGroupCommands(mockContext); hostGroup = new InstanceGroup("master"); MockitoAnnotations.initMocks(this); dummyResult = new TemplateResponse(); dummyResult.setId(Long.valueOf(DUMMY_TEMPLATE_ID)); given(mockContext.cloudbreakClient()).willReturn(cloudbreakClient); given(cloudbreakClient.templateEndpoint()).willReturn(mockClient); given(mockContext.outputTransformer()).willReturn(outputTransformer); given(outputTransformer.render(any(OutPutType.class), anyVararg())).willReturn("id 1 name test1"); given(outputTransformer.render(anyObject())).willReturn("id 1 name test1"); given(exceptionTransformer.transformToRuntimeException(eq(expectedException))).willThrow(expectedException); given(exceptionTransformer.transformToRuntimeException(anyString())).willThrow(expectedException); given(mockContext.exceptionTransformer()).willReturn(exceptionTransformer); } @Test public void testConfigureByTemplateId() throws Exception { underTest.create(hostGroup, DUMMY_NODE_COUNT, false, dummyTemplateId, null, dummySecurityGroupId, null, params); verify(mockContext, times(1)).putInstanceGroup(anyString(), any(InstanceGroupEntry.class)); } @Test public void testConfigureByTemplateName() throws Exception { given(mockClient.getPublic(DUMMY_TEMPLATE)).willReturn(dummyResult); underTest.create(hostGroup, DUMMY_NODE_COUNT, false, null, dummyTemplateName, dummySecurityGroupId, null, params); verify(mockClient, times(1)).getPublic(anyString()); verify(mockContext, times(1)).putInstanceGroup(anyString(), any(InstanceGroupEntry.class)); } @Test public void testConfigureByTemplateIdAndName() throws Exception { underTest.create(hostGroup, DUMMY_NODE_COUNT, false, dummyTemplateId, dummyTemplateName, dummySecurityGroupId, null, params); verify(mockContext, times(1)).putInstanceGroup(anyString(), any(InstanceGroupEntry.class)); verify(mockClient, times(0)).getPublic(anyString()); } @Test public void testConfigureByTemplateNameWhenTemplateNotFound() throws Exception { given(mockClient.getPublic(DUMMY_TEMPLATE)).willReturn(null); RuntimeException ext = null; try { underTest.create(hostGroup, DUMMY_NODE_COUNT, false, null, dummyTemplateName, dummySecurityGroupId, null, params); } catch (RuntimeException e) { ext = e; } Assert.assertEquals("Wrong error occurred", expectedException, ext); verify(mockClient, times(1)).getPublic(anyString()); verify(mockContext, times(0)).putInstanceGroup(anyString(), any(InstanceGroupEntry.class)); } }