1package awsat
2
3import (
4	"testing"
5
6	"github.com/aws/aws-sdk-go/service/autoscaling"
7)
8
9func TestScalingGroup(t *testing.T) {
10	t.Run("create", func(t *testing.T) {
11		Template("create scalinggroup name=new-autoscaling launchconfiguration=config max-size=12 min-size=10 subnets=sub_1,sub_2 cooldown=3 desired-capacity=12 healthcheck-grace-period=4 healthcheck-type=healthy new-instances-protected=true targetgroups=tg_1,tg_2").Mock(&autoscalingMock{
12			CreateAutoScalingGroupFunc: func(input *autoscaling.CreateAutoScalingGroupInput) (*autoscaling.CreateAutoScalingGroupOutput, error) {
13				return &autoscaling.CreateAutoScalingGroupOutput{}, nil
14			}}).
15			ExpectInput("CreateAutoScalingGroup", &autoscaling.CreateAutoScalingGroupInput{
16				AutoScalingGroupName:             String("new-autoscaling"),
17				LaunchConfigurationName:          String("config"),
18				MaxSize:                          Int64(12),
19				MinSize:                          Int64(10),
20				DefaultCooldown:                  Int64(3),
21				DesiredCapacity:                  Int64(12),
22				HealthCheckGracePeriod:           Int64(4),
23				HealthCheckType:                  String("healthy"),
24				NewInstancesProtectedFromScaleIn: Bool(true),
25				VPCZoneIdentifier:                String("sub_1,sub_2"),
26				TargetGroupARNs:                  []*string{String("tg_1"), String("tg_2")},
27			}).ExpectCommandResult("new-autoscaling").ExpectCalls("CreateAutoScalingGroup").Run(t)
28	})
29
30	t.Run("update", func(t *testing.T) {
31		Template("update scalinggroup name=new-autoscaling launchconfiguration=config max-size=12 min-size=10 subnets=sub_1,sub_2 cooldown=3 desired-capacity=12 healthcheck-grace-period=4 healthcheck-type=healthy new-instances-protected=true").Mock(&autoscalingMock{
32			UpdateAutoScalingGroupFunc: func(input *autoscaling.UpdateAutoScalingGroupInput) (*autoscaling.UpdateAutoScalingGroupOutput, error) {
33				return nil, nil
34			}}).
35			ExpectInput("UpdateAutoScalingGroup", &autoscaling.UpdateAutoScalingGroupInput{
36				AutoScalingGroupName:             String("new-autoscaling"),
37				LaunchConfigurationName:          String("config"),
38				MaxSize:                          Int64(12),
39				MinSize:                          Int64(10),
40				DefaultCooldown:                  Int64(3),
41				DesiredCapacity:                  Int64(12),
42				HealthCheckGracePeriod:           Int64(4),
43				HealthCheckType:                  String("healthy"),
44				NewInstancesProtectedFromScaleIn: Bool(true),
45				VPCZoneIdentifier:                String("sub_1,sub_2"),
46			}).ExpectCalls("UpdateAutoScalingGroup").Run(t)
47	})
48
49	t.Run("delete", func(t *testing.T) {
50		Template("delete scalinggroup name=any-sg force=true").Mock(&autoscalingMock{
51			DeleteAutoScalingGroupFunc: func(input *autoscaling.DeleteAutoScalingGroupInput) (*autoscaling.DeleteAutoScalingGroupOutput, error) {
52				return nil, nil
53			}}).
54			ExpectInput("DeleteAutoScalingGroup", &autoscaling.DeleteAutoScalingGroupInput{
55				AutoScalingGroupName: String("any-sg"),
56				ForceDelete:          Bool(true),
57			}).ExpectCalls("DeleteAutoScalingGroup").Run(t)
58	})
59
60	t.Run("check", func(t *testing.T) {
61		Template("check scalinggroup name=any-sg count=1 timeout=0").Mock(&autoscalingMock{
62			DescribeAutoScalingGroupsFunc: func(input *autoscaling.DescribeAutoScalingGroupsInput) (*autoscaling.DescribeAutoScalingGroupsOutput, error) {
63				return &autoscaling.DescribeAutoScalingGroupsOutput{
64					AutoScalingGroups: []*autoscaling.Group{
65						{AutoScalingGroupName: String("any-sg"), Instances: []*autoscaling.Instance{{InstanceId: String("one")}}},
66					}}, nil
67			}}).
68			ExpectInput("DescribeAutoScalingGroups", &autoscaling.DescribeAutoScalingGroupsInput{
69				AutoScalingGroupNames: []*string{String("any-sg")},
70			}).ExpectCalls("DescribeAutoScalingGroups").Run(t)
71	})
72}
73