Skip to content

Commit 97f4461

Browse files
committed
test
1 parent adacf58 commit 97f4461

16 files changed

Lines changed: 552 additions & 126 deletions

File tree

Makefile

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# go install go.uber.org/mock/mockgen@latest
12
MOCKGEN := mockgen
23
.PHONY: test
34
test:
@@ -13,16 +14,20 @@ mocks: go.sum \
1314
mocks/mock_awsiface/iface.go \
1415
mocks/mock_types/iface.go \
1516
mocks/mock_upgrade/upgrade.go \
17+
mocks/mock_scan/scanner.go \
1618
mocks/mock_task/task.go \
1719
mocks/mock_taskset/taskset.go \
1820
mocks/mock_task/factory.go \
19-
mocks/mock_rollout/executor.go
21+
mocks/mock_rollout/executor.go \
22+
mocks/mock_logger/logger.go
2023
mocks/mock_awsiface/iface.go: awsiface/iface.go
2124
$(MOCKGEN) -source=./awsiface/iface.go > mocks/mock_awsiface/iface.go
2225
mocks/mock_types/iface.go: types/iface.go
2326
$(MOCKGEN) -source=./types/iface.go > mocks/mock_types/iface.go
24-
mocks/mock_upgrade/upgrade.go: upgrade/upgrade.go
25-
$(MOCKGEN) -source=./upgrade/upgrade.go > mocks/mock_upgrade/upgrade.go
27+
mocks/mock_upgrade/upgrade.go: cli/cage/upgrade/upgrade.go
28+
$(MOCKGEN) -source=./cli/cage/upgrade/upgrade.go > mocks/mock_upgrade/upgrade.go
29+
mocks/mock_scan/scanner.go: cli/cage/scan/scanner.go
30+
$(MOCKGEN) -source=./cli/cage/scan/scanner.go > mocks/mock_scan/scanner.go
2631
mocks/mock_task/task.go: task/task.go
2732
$(MOCKGEN) -source=./task/task.go > mocks/mock_task/task.go
2833
mocks/mock_taskset/taskset.go: taskset/taskset.go
@@ -31,4 +36,6 @@ mocks/mock_task/factory.go: task/factory.go
3136
$(MOCKGEN) -source=./task/factory.go > mocks/mock_task/factory.go
3237
mocks/mock_rollout/executor.go: rollout/executor.go
3338
$(MOCKGEN) -source=./rollout/executor.go > mocks/mock_rollout/executor.go
39+
mocks/mock_logger/logger.go: logger/logger.go
40+
$(MOCKGEN) -source=./logger/logger.go > mocks/mock_logger/logger.go
3441
.PHONY: mocks

cli/cage/cageapp/provider.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cageapp
22

33
import (
44
"context"
5+
"os"
56

67
"github.com/aws/aws-sdk-go-v2/aws"
78
"github.com/aws/aws-sdk-go-v2/config"
@@ -10,8 +11,10 @@ import (
1011
"github.com/aws/aws-sdk-go-v2/service/ecs"
1112
"github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
1213
cage "github.com/loilo-inc/canarycage"
14+
"github.com/loilo-inc/canarycage/cli/cage/scan"
1315
"github.com/loilo-inc/canarycage/env"
1416
"github.com/loilo-inc/canarycage/key"
17+
"github.com/loilo-inc/canarycage/logger"
1518
"github.com/loilo-inc/canarycage/task"
1619
"github.com/loilo-inc/canarycage/timeout"
1720
"github.com/loilo-inc/canarycage/types"
@@ -43,8 +46,10 @@ func ProvideScanDI(region string) (*di.D, error) {
4346
return nil, err
4447
}
4548
d := di.NewDomain(func(b *di.B) {
46-
b.Set(key.EcsCli, ecs.NewFromConfig(conf))
47-
b.Set(key.EcrCli, ecr.NewFromConfig(conf))
49+
ecsCli := ecs.NewFromConfig(conf)
50+
ecrCli := ecr.NewFromConfig(conf)
51+
b.Set(key.Scanner, scan.NewScanner(ecsCli, ecrCli))
52+
b.Set(key.Logger, logger.DefaultLogger(os.Stdout))
4853
})
4954
return d, nil
5055
}

cli/cage/cageapp/provider_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package cageapp_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/loilo-inc/canarycage/cli/cage/cageapp"
7+
"github.com/loilo-inc/canarycage/env"
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
func TestProvideCageCli(t *testing.T) {
12+
t.Run("successfully creates cage cli with valid region", func(t *testing.T) {
13+
envars := &env.Envars{
14+
Region: "us-east-1",
15+
}
16+
17+
cage, err := cageapp.ProvideCageCli(envars)
18+
assert.NoError(t, err)
19+
assert.NotNil(t, cage)
20+
})
21+
22+
t.Run("returns error with invalid region", func(t *testing.T) {
23+
envars := &env.Envars{
24+
Region: "",
25+
}
26+
27+
cage, err := cageapp.ProvideCageCli(envars)
28+
if err != nil {
29+
assert.Nil(t, cage, "expected cage to be nil when error occurs")
30+
return
31+
}
32+
assert.NotNil(t, cage, "expected cage to be non-nil when no error")
33+
})
34+
35+
t.Run("handles nil envars", func(t *testing.T) {
36+
defer func() {
37+
if r := recover(); r != nil {
38+
return
39+
}
40+
}()
41+
42+
cage, err := cageapp.ProvideCageCli(nil)
43+
if err == nil {
44+
assert.NotNil(t, cage, "expected cage to be non-nil when no error")
45+
}
46+
})
47+
}
48+
49+
func TestProvideScanDI(t *testing.T) {
50+
t.Run("successfully creates scan DI with valid region", func(t *testing.T) {
51+
region := "us-east-1"
52+
53+
d, err := cageapp.ProvideScanDI(region)
54+
assert.NoError(t, err)
55+
assert.NotNil(t, d)
56+
})
57+
58+
t.Run("returns error with invalid region", func(t *testing.T) {
59+
region := ""
60+
61+
d, err := cageapp.ProvideScanDI(region)
62+
if err != nil {
63+
assert.Nil(t, d, "expected DI domain to be nil when error occurs")
64+
return
65+
}
66+
assert.NotNil(t, d, "expected DI domain to be non-nil when no error")
67+
})
68+
69+
t.Run("creates DI domain with different regions", func(t *testing.T) {
70+
regions := []string{"us-west-2", "eu-west-1", "ap-northeast-1"}
71+
72+
for _, region := range regions {
73+
d, err := cageapp.ProvideScanDI(region)
74+
if err != nil {
75+
t.Logf("region %s returned error: %v", region, err)
76+
continue
77+
}
78+
assert.NotNil(t, d, "expected DI domain to be non-nil for region %s", region)
79+
}
80+
})
81+
}

cli/cage/commands/a_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package commands_test
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/loilo-inc/canarycage/cli/cage/cageapp"
8+
"github.com/loilo-inc/canarycage/cli/cage/commands"
9+
"github.com/loilo-inc/canarycage/env"
10+
"github.com/loilo-inc/canarycage/mocks/mock_types"
11+
"github.com/loilo-inc/canarycage/types"
12+
"github.com/urfave/cli/v2"
13+
"go.uber.org/mock/gomock"
14+
)
15+
16+
var stdinService = "ap-notheast-1\ncluster\nservice\nyes\n"
17+
var stdinTask = "ap-notheast-1\ncluster\nyes\n"
18+
19+
func setup(t *testing.T, input string) (*cli.App, *mock_types.MockCage) {
20+
ctrl := gomock.NewController(t)
21+
cagecli := mock_types.NewMockCage(ctrl)
22+
cageapp := &cageapp.App{Stdin: strings.NewReader(input)}
23+
app := cli.NewApp()
24+
cmds := commands.NewCageCommands(func(envars *env.Envars) (types.Cage, error) {
25+
return cagecli, nil
26+
})
27+
app.Commands = []*cli.Command{
28+
cmds.Up(cageapp),
29+
cmds.RollOut(cageapp),
30+
cmds.Run(cageapp),
31+
}
32+
app.Flags = []cli.Flag{
33+
&cli.BoolFlag{
34+
Name: "ci",
35+
Destination: &cageapp.CI,
36+
Value: false,
37+
},
38+
}
39+
return app, cagecli
40+
}

cli/cage/commands/command_test.go

Lines changed: 0 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,16 @@
11
package commands
22

33
import (
4-
"fmt"
5-
"strings"
64
"testing"
75

8-
"github.com/loilo-inc/canarycage/cli/cage/cageapp"
96
"github.com/loilo-inc/canarycage/env"
107
"github.com/loilo-inc/canarycage/mocks/mock_types"
118
"github.com/loilo-inc/canarycage/test"
129
"github.com/loilo-inc/canarycage/types"
1310
"github.com/stretchr/testify/assert"
14-
"github.com/urfave/cli/v2"
1511
"go.uber.org/mock/gomock"
1612
)
1713

18-
func TestCommands(t *testing.T) {
19-
region := "ap-notheast-1"
20-
cluster := "cluster"
21-
service := "service"
22-
stdinService := fmt.Sprintf("%s\n%s\n%s\n%s\n", region, cluster, service, "yes")
23-
stdinTask := fmt.Sprintf("%s\n%s\n%s\n", region, cluster, "yes")
24-
setup := func(t *testing.T, input string) (*cli.App, *mock_types.MockCage) {
25-
ctrl := gomock.NewController(t)
26-
cagecli := mock_types.NewMockCage(ctrl)
27-
cageapp := &cageapp.App{Stdin: strings.NewReader(input)}
28-
app := cli.NewApp()
29-
cmds := NewCageCommands(func(envars *env.Envars) (types.Cage, error) {
30-
return cagecli, nil
31-
})
32-
app.Commands = []*cli.Command{
33-
cmds.Up(cageapp),
34-
cmds.RollOut(cageapp),
35-
cmds.Run(cageapp),
36-
}
37-
app.Flags = []cli.Flag{
38-
&cli.BoolFlag{
39-
Name: "ci",
40-
Destination: &cageapp.CI,
41-
Value: false,
42-
},
43-
}
44-
return app, cagecli
45-
}
46-
t.Run("rollout", func(t *testing.T) {
47-
t.Run("basic", func(t *testing.T) {
48-
app, cagecli := setup(t, stdinService)
49-
cagecli.EXPECT().RollOut(gomock.Any(), &types.RollOutInput{}).Return(&types.RollOutResult{}, nil)
50-
err := app.Run([]string{"cage", "rollout", "--region", "ap-notheast-1", "../../../fixtures"})
51-
assert.NoError(t, err)
52-
})
53-
t.Run("basic/ci", func(t *testing.T) {
54-
app, cagecli := setup(t, "")
55-
cagecli.EXPECT().RollOut(gomock.Any(), &types.RollOutInput{}).Return(&types.RollOutResult{}, nil)
56-
err := app.Run([]string{"cage", "--ci", "rollout", "--region", "ap-notheast-1", "../../../fixtures"})
57-
assert.NoError(t, err)
58-
})
59-
t.Run("basic/update-service", func(t *testing.T) {
60-
app, cagecli := setup(t, stdinService)
61-
cagecli.EXPECT().RollOut(gomock.Any(), &types.RollOutInput{UpdateService: true}).Return(&types.RollOutResult{}, nil)
62-
err := app.Run([]string{"cage", "rollout", "--region", "ap-notheast-1", "--updateService", "../../../fixtures"})
63-
assert.NoError(t, err)
64-
})
65-
t.Run("error", func(t *testing.T) {
66-
app, cagecli := setup(t, stdinService)
67-
cagecli.EXPECT().RollOut(gomock.Any(), &types.RollOutInput{}).Return(&types.RollOutResult{}, fmt.Errorf("error"))
68-
err := app.Run([]string{"cage", "rollout", "--region", "ap-notheast-1", "../../../fixtures"})
69-
assert.EqualError(t, err, "error")
70-
})
71-
})
72-
t.Run("up", func(t *testing.T) {
73-
t.Run("basic", func(t *testing.T) {
74-
app, cagecli := setup(t, stdinService)
75-
cagecli.EXPECT().Up(gomock.Any()).Return(&types.UpResult{}, nil)
76-
err := app.Run([]string{"cage", "up", "--region", "ap-notheast-1", "../../../fixtures"})
77-
assert.NoError(t, err)
78-
})
79-
t.Run("basic/ci", func(t *testing.T) {
80-
app, cagecli := setup(t, "")
81-
cagecli.EXPECT().Up(gomock.Any()).Return(&types.UpResult{}, nil)
82-
err := app.Run([]string{"cage", "--ci", "up", "--region", "ap-notheast-1", "../../../fixtures"})
83-
assert.NoError(t, err)
84-
})
85-
t.Run("error", func(t *testing.T) {
86-
app, cagecli := setup(t, stdinService)
87-
cagecli.EXPECT().Up(gomock.Any()).Return(nil, fmt.Errorf("error"))
88-
err := app.Run([]string{"cage", "up", "--region", "ap-notheast-1", "../../../fixtures"})
89-
assert.EqualError(t, err, "error")
90-
})
91-
})
92-
t.Run("run", func(t *testing.T) {
93-
t.Run("basic", func(t *testing.T) {
94-
app, cagecli := setup(t, stdinTask)
95-
cagecli.EXPECT().Run(gomock.Any(), gomock.Any()).Return(&types.RunResult{}, nil)
96-
err := app.Run([]string{"cage", "run", "--region", "ap-notheast-1", "../../../fixtures", "container", "exec"})
97-
assert.NoError(t, err)
98-
})
99-
t.Run("basic/ci", func(t *testing.T) {
100-
app, cagecli := setup(t, "")
101-
cagecli.EXPECT().Run(gomock.Any(), gomock.Any()).Return(&types.RunResult{}, nil)
102-
err := app.Run([]string{"cage", "--ci", "run", "--region", "ap-notheast-1", "../../../fixtures", "container", "exec"})
103-
assert.NoError(t, err)
104-
})
105-
t.Run("error", func(t *testing.T) {
106-
app, cagecli := setup(t, stdinTask)
107-
cagecli.EXPECT().Run(gomock.Any(), gomock.Any()).Return(nil, fmt.Errorf("error"))
108-
err := app.Run([]string{"cage", "run", "--region", "ap-notheast-1", "../../../fixtures", "container", "exec"})
109-
assert.EqualError(t, err, "error")
110-
})
111-
})
112-
}
113-
11414
func TestSetupCage(t *testing.T) {
11515
t.Run("basic", func(t *testing.T) {
11616
envars := &env.Envars{Region: "us-west-2"}

cli/cage/commands/rollout_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package commands_test
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/loilo-inc/canarycage/types"
8+
"github.com/stretchr/testify/assert"
9+
"go.uber.org/mock/gomock"
10+
)
11+
12+
func TestRollOut(t *testing.T) {
13+
t.Run("basic", func(t *testing.T) {
14+
app, cagecli := setup(t, stdinService)
15+
cagecli.EXPECT().RollOut(gomock.Any(), &types.RollOutInput{}).Return(&types.RollOutResult{}, nil)
16+
err := app.Run([]string{"cage", "rollout", "--region", "ap-notheast-1", "../../../fixtures"})
17+
assert.NoError(t, err)
18+
})
19+
t.Run("basic/ci", func(t *testing.T) {
20+
app, cagecli := setup(t, "")
21+
cagecli.EXPECT().RollOut(gomock.Any(), &types.RollOutInput{}).Return(&types.RollOutResult{}, nil)
22+
err := app.Run([]string{"cage", "--ci", "rollout", "--region", "ap-notheast-1", "../../../fixtures"})
23+
assert.NoError(t, err)
24+
})
25+
t.Run("basic/update-service", func(t *testing.T) {
26+
app, cagecli := setup(t, stdinService)
27+
cagecli.EXPECT().RollOut(gomock.Any(), &types.RollOutInput{UpdateService: true}).Return(&types.RollOutResult{}, nil)
28+
err := app.Run([]string{"cage", "rollout", "--region", "ap-notheast-1", "--updateService", "../../../fixtures"})
29+
assert.NoError(t, err)
30+
})
31+
t.Run("missing args", func(t *testing.T) {
32+
app, _ := setup(t, "")
33+
err := app.Run([]string{"cage", "rollout", "--region", "ap-notheast-1"})
34+
assert.EqualError(t, err, "invalid number of arguments. expected at least 1")
35+
})
36+
t.Run("error", func(t *testing.T) {
37+
app, cagecli := setup(t, stdinService)
38+
cagecli.EXPECT().RollOut(gomock.Any(), &types.RollOutInput{}).Return(&types.RollOutResult{}, fmt.Errorf("error"))
39+
err := app.Run([]string{"cage", "rollout", "--region", "ap-notheast-1", "../../../fixtures"})
40+
assert.EqualError(t, err, "error")
41+
})
42+
}

cli/cage/commands/run_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package commands_test
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/loilo-inc/canarycage/types"
8+
"github.com/stretchr/testify/assert"
9+
"go.uber.org/mock/gomock"
10+
)
11+
12+
func TestRun(t *testing.T) {
13+
t.Run("basic", func(t *testing.T) {
14+
app, cagecli := setup(t, stdinTask)
15+
cagecli.EXPECT().Run(gomock.Any(), gomock.Any()).Return(&types.RunResult{}, nil)
16+
err := app.Run([]string{"cage", "run", "--region", "ap-notheast-1", "../../../fixtures", "container", "exec"})
17+
assert.NoError(t, err)
18+
})
19+
t.Run("basic/ci", func(t *testing.T) {
20+
app, cagecli := setup(t, "")
21+
cagecli.EXPECT().Run(gomock.Any(), gomock.Any()).Return(&types.RunResult{}, nil)
22+
err := app.Run([]string{"cage", "--ci", "run", "--region", "ap-notheast-1", "../../../fixtures", "container", "exec"})
23+
assert.NoError(t, err)
24+
})
25+
t.Run("missing args", func(t *testing.T) {
26+
app, _ := setup(t, "")
27+
err := app.Run([]string{"cage", "run", "--region", "ap-notheast-1"})
28+
assert.EqualError(t, err, "invalid number of arguments. expected at least 3")
29+
})
30+
t.Run("error", func(t *testing.T) {
31+
app, cagecli := setup(t, stdinTask)
32+
cagecli.EXPECT().Run(gomock.Any(), gomock.Any()).Return(nil, fmt.Errorf("error"))
33+
err := app.Run([]string{"cage", "run", "--region", "ap-notheast-1", "../../../fixtures", "container", "exec"})
34+
assert.EqualError(t, err, "error")
35+
})
36+
}

0 commit comments

Comments
 (0)