@@ -14,34 +14,56 @@ import (
1414
1515func TestListComputeInstances (t * testing.T ) {
1616 tests := map [string ]struct {
17- ctx context.Context
18- DescribeInstances func (ctx context.Context , e * ec2.DescribeInstancesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeInstancesOutput , error )
19- err error
20- want []types.Reservation
21- expectedCalls int
17+ ctx context.Context
18+ DescribeInstances func (ctx context.Context , e * ec2.DescribeInstancesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeInstancesOutput , error )
19+ DescribeAvailabilityZones func (ctx context.Context , input * ec2.DescribeAvailabilityZonesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeAvailabilityZonesOutput , error )
20+ err error
21+ want []types.Reservation
22+ expectedCalls int
2223 }{
2324 "No instance should return nothing" : {
2425 ctx : t .Context (),
2526 DescribeInstances : func (ctx context.Context , e * ec2.DescribeInstancesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeInstancesOutput , error ) {
2627 return & ec2.DescribeInstancesOutput {}, nil
2728 },
29+ DescribeAvailabilityZones : func (ctx context.Context , input * ec2.DescribeAvailabilityZonesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeAvailabilityZonesOutput , error ) {
30+ return & ec2.DescribeAvailabilityZonesOutput {
31+ AvailabilityZones : []types.AvailabilityZone {
32+ {ZoneName : aws .String ("us-east-1a" )},
33+ {ZoneName : aws .String ("us-east-1b" )},
34+ },
35+ }, nil
36+ },
2837 err : nil ,
2938 want : nil ,
30- expectedCalls : 1 ,
39+ expectedCalls : 2 ,
3140 },
3241 "Single instance should return a single instance" : {
3342 ctx : t .Context (),
3443 DescribeInstances : func (ctx context.Context , e * ec2.DescribeInstancesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeInstancesOutput , error ) {
35- return & ec2.DescribeInstancesOutput {
36- Reservations : []types.Reservation {
37- {
38- Instances : []types.Instance {
39- {
40- InstanceId : aws .String ("i-1234567890abcdef0" ),
41- InstanceType : types .InstanceTypeA1Xlarge ,
44+ // Check which AZ filter is applied and return appropriate instances
45+ if len (e .Filters ) > 0 && e .Filters [0 ].Values [0 ] == "us-east-1a" {
46+ return & ec2.DescribeInstancesOutput {
47+ Reservations : []types.Reservation {
48+ {
49+ Instances : []types.Instance {
50+ {
51+ InstanceId : aws .String ("i-1234567890abcdef0" ),
52+ InstanceType : types .InstanceTypeA1Xlarge ,
53+ },
4254 },
4355 },
4456 },
57+ }, nil
58+ }
59+ // Return empty for us-east-1b
60+ return & ec2.DescribeInstancesOutput {}, nil
61+ },
62+ DescribeAvailabilityZones : func (ctx context.Context , input * ec2.DescribeAvailabilityZonesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeAvailabilityZonesOutput , error ) {
63+ return & ec2.DescribeAvailabilityZonesOutput {
64+ AvailabilityZones : []types.AvailabilityZone {
65+ {ZoneName : aws .String ("us-east-1a" )},
66+ {ZoneName : aws .String ("us-east-1b" )},
4567 },
4668 }, nil
4769 },
@@ -56,45 +78,67 @@ func TestListComputeInstances(t *testing.T) {
5678 },
5779 },
5880 },
59- expectedCalls : 1 ,
81+ expectedCalls : 2 ,
6082 },
6183 "Ensure errors propagate" : {
6284 ctx : t .Context (),
6385 DescribeInstances : func (ctx context.Context , e * ec2.DescribeInstancesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeInstancesOutput , error ) {
86+ // Return error for any AZ
6487 return nil , assert .AnError
6588 },
89+ DescribeAvailabilityZones : func (ctx context.Context , input * ec2.DescribeAvailabilityZonesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeAvailabilityZonesOutput , error ) {
90+ return & ec2.DescribeAvailabilityZonesOutput {
91+ AvailabilityZones : []types.AvailabilityZone {
92+ {ZoneName : aws .String ("us-east-1a" )},
93+ },
94+ }, nil
95+ },
6696 err : assert .AnError ,
6797 want : nil ,
6898 expectedCalls : 1 ,
6999 },
70100 "NextToken should return multiple instances" : {
71101 ctx : t .Context (),
72102 DescribeInstances : func (ctx context.Context , e * ec2.DescribeInstancesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeInstancesOutput , error ) {
73- if e .NextToken == nil {
103+ // Check which AZ filter is applied
104+ if len (e .Filters ) > 0 && e .Filters [0 ].Values [0 ] == "us-east-1a" {
105+ // For us-east-1a, return instances with pagination
106+ if e .NextToken == nil {
107+ return & ec2.DescribeInstancesOutput {
108+ NextToken : aws .String ("token" ),
109+ Reservations : []types.Reservation {
110+ {
111+ Instances : []types.Instance {
112+ {
113+ InstanceId : aws .String ("i-1234567890abcdef0" ),
114+ InstanceType : types .InstanceTypeA1Xlarge ,
115+ },
116+ },
117+ },
118+ },
119+ }, nil
120+ }
74121 return & ec2.DescribeInstancesOutput {
75- NextToken : aws .String ("token" ),
76122 Reservations : []types.Reservation {
77123 {
78124 Instances : []types.Instance {
79125 {
80- InstanceId : aws .String ("i-1234567890abcdef0 " ),
126+ InstanceId : aws .String ("i-1234567890abcdef1 " ),
81127 InstanceType : types .InstanceTypeA1Xlarge ,
82128 },
83129 },
84130 },
85131 },
86132 }, nil
87133 }
88- return & ec2.DescribeInstancesOutput {
89- Reservations : []types.Reservation {
90- {
91- Instances : []types.Instance {
92- {
93- InstanceId : aws .String ("i-1234567890abcdef0" ),
94- InstanceType : types .InstanceTypeA1Xlarge ,
95- },
96- },
97- },
134+ // Return empty for us-east-1b
135+ return & ec2.DescribeInstancesOutput {}, nil
136+ },
137+ DescribeAvailabilityZones : func (ctx context.Context , input * ec2.DescribeAvailabilityZonesInput , optFns ... func (* ec2.Options )) (* ec2.DescribeAvailabilityZonesOutput , error ) {
138+ return & ec2.DescribeAvailabilityZonesOutput {
139+ AvailabilityZones : []types.AvailabilityZone {
140+ {ZoneName : aws .String ("us-east-1a" )},
141+ {ZoneName : aws .String ("us-east-1b" )},
98142 },
99143 }, nil
100144 },
@@ -112,19 +156,29 @@ func TestListComputeInstances(t *testing.T) {
112156 {
113157 Instances : []types.Instance {
114158 {
115- InstanceId : aws .String ("i-1234567890abcdef0 " ),
159+ InstanceId : aws .String ("i-1234567890abcdef1 " ),
116160 InstanceType : types .InstanceTypeA1Xlarge ,
117161 },
118162 },
119163 },
120164 },
121- expectedCalls : 2 ,
165+ expectedCalls : 3 ,
122166 },
123167 }
124168 for name , tt := range tests {
125169 t .Run (name , func (t * testing.T ) {
126170 ctrl := gomock .NewController (t )
127171 client := mocks .NewMockEC2 (ctrl )
172+
173+ // Mock DescribeAvailabilityZones call
174+ if tt .DescribeAvailabilityZones != nil {
175+ client .EXPECT ().
176+ DescribeAvailabilityZones (gomock .Any (), gomock .Any (), gomock .Any ()).
177+ DoAndReturn (tt .DescribeAvailabilityZones ).
178+ Times (1 )
179+ }
180+
181+ // Mock DescribeInstances calls
128182 client .EXPECT ().
129183 DescribeInstances (gomock .Any (), gomock .Any (), gomock .Any ()).
130184 DoAndReturn (tt .DescribeInstances ).
0 commit comments