package tw.com.unit; import com.amazonaws.services.cloudformation.AmazonCloudFormationClient; import com.amazonaws.services.cloudformation.model.*; import org.easymock.EasyMock; import org.easymock.EasyMockRunner; import org.easymock.EasyMockSupport; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import tw.com.EnvironmentSetupForTests; import tw.com.MonitorStackEvents; import tw.com.entity.StackNameAndId; import tw.com.entity.Tagging; import tw.com.exceptions.CfnAssistException; import tw.com.exceptions.NotReadyException; import tw.com.exceptions.WrongNumberOfStacksException; import tw.com.providers.CloudFormationClient; import java.util.Collection; import java.util.LinkedList; import java.util.List; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; @RunWith(EasyMockRunner.class) public class TestCloudFormationClient extends EasyMockSupport { private CloudFormationClient client; private AmazonCloudFormationClient cfnClient; @Before public void beforeEachTestRuns() { cfnClient = createMock(AmazonCloudFormationClient.class); client = new CloudFormationClient(cfnClient); } @Test public void shouldDescribeStack() throws WrongNumberOfStacksException { DescribeStacksRequest request = new DescribeStacksRequest().withStackName("stackName"); Stack stack = new Stack(); DescribeStacksResult answer = new DescribeStacksResult().withStacks(stack); EasyMock.expect(cfnClient.describeStacks(request)).andReturn(answer); replayAll(); Stack result = client.describeStack("stackName"); verifyAll(); assertEquals(result, stack); } @Test public void shouldDescribesAllStacks() { Stack stackA = new Stack(); Stack stackB = new Stack(); DescribeStacksResult answer = new DescribeStacksResult().withStacks(stackA, stackB); EasyMock.expect(cfnClient.describeStacks()).andReturn(answer); replayAll(); List<Stack> result = client.describeAllStacks(); verifyAll(); assertEquals(2, result.size()); assertTrue(result.contains(stackA)); assertTrue(result.contains(stackB)); } @Test public void shouldCreateStack() throws CfnAssistException { Collection<Tag> tags = new LinkedList<>(); tags.add(EnvironmentSetupForTests.createCfnStackTAG("CFN_ASSIST_PROJECT", "CfnAssist")); tags.add(EnvironmentSetupForTests.createCfnStackTAG("CFN_ASSIST_ENV", "Test")); tags.add(EnvironmentSetupForTests.createCfnStackTAG("CFN_COMMENT", "commentForStack")); Collection<Parameter> parameters = new LinkedList<>(); Parameter parameter = new Parameter().withParameterKey("paramKey").withParameterValue("paramValue"); parameters.add(parameter); MonitorStackEvents monitor = createMock(MonitorStackEvents.class); monitor.addMonitoringTo(EasyMock.isA(CreateStackRequest.class)); EasyMock.expectLastCall(); CreateStackRequest createStackRequest = new CreateStackRequest().withStackName("stackName"). withTemplateBody("{json}").withTags(tags).withParameters(parameters); CreateStackResult createStackResponse = new CreateStackResult().withStackId("stackId"); EasyMock.expect(cfnClient.createStack(createStackRequest)).andReturn(createStackResponse); replayAll(); Tagging tagging = new Tagging(); tagging.setCommentTag("commentForStack"); StackNameAndId result = client.createStack(EnvironmentSetupForTests.getMainProjectAndEnv(), "{json}", "stackName", parameters, monitor, tagging); verifyAll(); assertEquals("stackName", result.getStackName()); assertEquals("stackId", result.getStackId()); } @Test public void shouldDeleteStack() { DeleteStackRequest deleteRequest = new DeleteStackRequest().withStackName("stackName"); DeleteStackResult result = new DeleteStackResult(); EasyMock.expect(cfnClient.deleteStack(deleteRequest)).andReturn(result); replayAll(); client.deleteStack("stackName"); verifyAll(); } @Test public void shouldGetStackEvents() { DescribeStackEventsRequest eventRequest = new DescribeStackEventsRequest().withStackName("stackName"); StackEvent eventA = new StackEvent(); StackEvent eventB = new StackEvent(); DescribeStackEventsResult eventResponse = new DescribeStackEventsResult().withStackEvents(eventA, eventB); EasyMock.expect(cfnClient.describeStackEvents(eventRequest)).andReturn(eventResponse); replayAll(); List<StackEvent> result = client.describeStackEvents("stackName"); verifyAll(); assertEquals(2, result.size()); assertTrue(result.contains(eventA)); assertTrue(result.contains(eventB)); } public void shouldGetStackResources() { DescribeStackResourcesRequest request = new DescribeStackResourcesRequest().withStackName("stackName"); StackResource resA = new StackResource(); StackResource resB = new StackResource(); DescribeStackResourcesResult response = new DescribeStackResourcesResult().withStackResources(resA, resB); EasyMock.expect(cfnClient.describeStackResources(request)).andReturn(response); replayAll(); List<StackResource> result = client.describeStackResources("stackName"); verifyAll(); assertEquals(2, result.size()); assertTrue(result.contains(resA)); assertTrue(result.contains(resB)); } @Test public void shouldUpdateStack() throws NotReadyException { Collection<Parameter> parameters = new LinkedList<>(); Parameter parameter = new Parameter().withParameterKey("paramKey").withParameterValue("paramValue"); parameters.add(parameter); MonitorStackEvents monitor = createMock(MonitorStackEvents.class); monitor.addMonitoringTo(EasyMock.isA(UpdateStackRequest.class)); EasyMock.expectLastCall(); UpdateStackRequest request = new UpdateStackRequest(). withStackName("stackName"). withParameters(parameters). withTemplateBody("{json}"); UpdateStackResult response = new UpdateStackResult().withStackId("stackId"); EasyMock.expect(cfnClient.updateStack(request)).andReturn(response); replayAll(); StackNameAndId result = client.updateStack("{json}", parameters, monitor, "stackName"); verifyAll(); assertEquals("stackName", result.getStackName()); assertEquals("stackId", result.getStackId()); } @Test public void shouldValidateTemplate() { Collection<TemplateParameter> parameters = new LinkedList<>(); TemplateParameter parameter = new TemplateParameter().withParameterKey("paramKey"); parameters.add(parameter); ValidateTemplateRequest request =new ValidateTemplateRequest().withTemplateBody("{json}"); ValidateTemplateResult response = new ValidateTemplateResult().withParameters(parameters); EasyMock.expect(cfnClient.validateTemplate(request)).andReturn(response); replayAll(); List<TemplateParameter> result = client.validateTemplate("{json}"); verifyAll(); assertEquals(1, result.size()); assertTrue(result.contains(parameter)); } }