From c9e42034d09e25f7ad1b4971a698385cf7c96b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niclas=20=C3=85berg?= Date: Wed, 21 Jun 2023 21:49:38 +0200 Subject: [PATCH 1/6] Add audit checks on pull request --- .../workflows/{pr_test.yml => pr_audit.yml} | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) rename .github/workflows/{pr_test.yml => pr_audit.yml} (54%) diff --git a/.github/workflows/pr_test.yml b/.github/workflows/pr_audit.yml similarity index 54% rename from .github/workflows/pr_test.yml rename to .github/workflows/pr_audit.yml index aaf06f1..3cc16c1 100644 --- a/.github/workflows/pr_test.yml +++ b/.github/workflows/pr_audit.yml @@ -1,10 +1,10 @@ -name: pr_test +name: pr_audit on: pull_request: branches: [main] jobs: - build: - name: Run tests + audit: + name: Audit runs-on: ubuntu-latest steps: - name: Check out source code @@ -24,5 +24,19 @@ jobs: run: go install github.com/vektra/mockery/v2@v2.20.0 - name: Run go generate run: go generate ./... - - name: Run go test - run: go test ./... + - name: Verify dependencies + run: go mod verify + - name: Build + run: go build -v ./... + - name: Run go vet + run: go vet ./... + - name: Install staticcheck + run: go install honnef.co/go/tools/cmd/staticcheck@latest + - name: Run staticcheck + run: staticcheck ./... + - name: Install golint + run: go install golang.org/x/lint/golint@latest + - name: Run golint + run: golint -set_exit_status ./... + - name: Run tests + run: go test -race -vet=off ./... From ef3269b7b1ec1ca4612eb0144a85a39f110c0d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niclas=20=C3=85berg?= Date: Wed, 21 Jun 2023 22:25:50 +0200 Subject: [PATCH 2/6] Gitignore mocks --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a9ea1a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +internal/prompt/mocks +internal/container/mocks From a812d1ddbf9c447a3e8a16ec942d3a3e3fd126ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niclas=20=C3=85berg?= Date: Thu, 22 Jun 2023 08:33:51 +0200 Subject: [PATCH 3/6] Rename prompt interface and struct to avoid stuttering --- cmd/main/main.go | 8 ++++---- cmd/main/main_test.go | 40 ++++++++++++++++++------------------- internal/prompt/prompt.go | 8 ++++---- internal/prompt/promptui.go | 8 ++++---- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/cmd/main/main.go b/cmd/main/main.go index a112155..c971716 100644 --- a/cmd/main/main.go +++ b/cmd/main/main.go @@ -36,7 +36,7 @@ func main() { func run( containerService container.ContainerService, - promptService prompt.PromptService, + promptService prompt.Service, ) error { containers, err := containerService.GetAll() if err != nil { @@ -74,8 +74,8 @@ func run( func containersToPromptOptions( dockerContainers []container.Container, -) []prompt.PromptOption { - var options []prompt.PromptOption +) []prompt.Option { + var options []prompt.Option for _, container := range dockerContainers { var names []string @@ -90,7 +90,7 @@ func containersToPromptOptions( container.ID[0:12], ) - option := prompt.PromptOption{ + option := prompt.Option{ Label: label, Value: container.ID, } diff --git a/cmd/main/main_test.go b/cmd/main/main_test.go index b33d905..91237a3 100644 --- a/cmd/main/main_test.go +++ b/cmd/main/main_test.go @@ -20,7 +20,7 @@ func TestRun(t *testing.T) { mockContainerService := containermocks.NewContainerService(t) mockContainerService.On("GetAll").Return([]container.Container{}, expectedError) - mockPromptService := promptmocks.NewPromptService(t) + mockPromptService := promptmocks.NewService(t) actualError := run(mockContainerService, mockPromptService) @@ -31,9 +31,9 @@ func TestRun(t *testing.T) { mockContainerService := containermocks.NewContainerService(t) mockContainerService.On("GetAll").Return(containersData(), nil) - mockPromptService := promptmocks.NewPromptService(t) + mockPromptService := promptmocks.NewService(t) mockPromptService.On("DisplaySelect", mock.Anything, promptOptionsData()). - Return(prompt.PromptOption{}, errors.New("Mock Error")) + Return(prompt.Option{}, errors.New("Mock Error")) mockPromptService.AssertNotCalled(t, "DisplayPrompt", mock.Anything) actualError := run(mockContainerService, mockPromptService) @@ -46,9 +46,9 @@ func TestRun(t *testing.T) { mockContainerService.On("GetAll").Return(containersData(), nil) mockContainerService.AssertNotCalled(t, "RunCommand", mock.Anything, mock.Anything) - mockPromptService := promptmocks.NewPromptService(t) + mockPromptService := promptmocks.NewService(t) mockPromptService.On("DisplaySelect", mock.Anything, promptOptionsData()). - Return(prompt.PromptOption{}, nil) + Return(prompt.Option{}, nil) mockPromptService.On("DisplayPrompt", mock.Anything). Return("", errors.New("Mock Error")) @@ -60,16 +60,16 @@ func TestRun(t *testing.T) { t.Run("NonEmptyCommandRunsSuccessfully", func(t *testing.T) { expectedCommand := "ls -la" promptOptions := promptOptionsData() - selectedPromptOption := promptOptions[0] + selectedOption := promptOptions[0] mockContainerService := containermocks.NewContainerService(t) mockContainerService.On("GetAll").Return(containersData(), nil) - mockContainerService.On("RunCommand", selectedPromptOption.Value, expectedCommand). + mockContainerService.On("RunCommand", selectedOption.Value, expectedCommand). Return(nil) - mockPromptService := promptmocks.NewPromptService(t) + mockPromptService := promptmocks.NewService(t) mockPromptService.On("DisplaySelect", mock.Anything, promptOptions). - Return(selectedPromptOption, nil) + Return(selectedOption, nil) mockPromptService.On("DisplayPrompt", mock.Anything). Return(expectedCommand, nil) @@ -81,16 +81,16 @@ func TestRun(t *testing.T) { t.Run("EmptyCommandDefaultsToBash", func(t *testing.T) { expectedCommand := "bash" promptOptions := promptOptionsData() - selectedPromptOption := promptOptions[0] + selectedOption := promptOptions[0] mockContainerService := containermocks.NewContainerService(t) mockContainerService.On("GetAll").Return(containersData(), nil) - mockContainerService.On("RunCommand", selectedPromptOption.Value, expectedCommand). + mockContainerService.On("RunCommand", selectedOption.Value, expectedCommand). Return(nil) - mockPromptService := promptmocks.NewPromptService(t) + mockPromptService := promptmocks.NewService(t) mockPromptService.On("DisplaySelect", mock.Anything, promptOptions). - Return(selectedPromptOption, nil) + Return(selectedOption, nil) mockPromptService.On("DisplayPrompt", mock.Anything). Return("", nil) @@ -102,18 +102,18 @@ func TestRun(t *testing.T) { t.Run("EmptyCommandAndFailedBashDefaultsToSh", func(t *testing.T) { expectedCommand := "sh" promptOptions := promptOptionsData() - selectedPromptOption := promptOptions[0] + selectedOption := promptOptions[0] mockContainerService := containermocks.NewContainerService(t) mockContainerService.On("GetAll").Return(containersData(), nil) - mockContainerService.On("RunCommand", selectedPromptOption.Value, "bash"). + mockContainerService.On("RunCommand", selectedOption.Value, "bash"). Return(errors.New("Mock Error")).Once() - mockContainerService.On("RunCommand", selectedPromptOption.Value, expectedCommand). + mockContainerService.On("RunCommand", selectedOption.Value, expectedCommand). Return(nil).Once() - mockPromptService := promptmocks.NewPromptService(t) + mockPromptService := promptmocks.NewService(t) mockPromptService.On("DisplaySelect", mock.Anything, promptOptions). - Return(selectedPromptOption, nil) + Return(selectedOption, nil) mockPromptService.On("DisplayPrompt", mock.Anything). Return("", nil) @@ -123,8 +123,8 @@ func TestRun(t *testing.T) { }) } -func promptOptionsData() []prompt.PromptOption { - return []prompt.PromptOption{ +func promptOptionsData() []prompt.Option { + return []prompt.Option{ { Label: "[containerName1] (containerImage1) aa64bf12226b", Value: "aa64bf12226bc4dff14310a8fec7d5c5f0439ed2e69b3b590c413220650c0174", diff --git a/internal/prompt/prompt.go b/internal/prompt/prompt.go index d61145f..657e318 100644 --- a/internal/prompt/prompt.go +++ b/internal/prompt/prompt.go @@ -1,12 +1,12 @@ package prompt -type PromptOption struct { +type Option struct { Label string Value string } -//go:generate mockery --name PromptService -type PromptService interface { - DisplaySelect(label string, options []PromptOption) (PromptOption, error) +//go:generate mockery --name Service +type Service interface { + DisplaySelect(label string, options []Option) (Option, error) DisplayPrompt(label string) (string, error) } diff --git a/internal/prompt/promptui.go b/internal/prompt/promptui.go index a61cf76..187755b 100644 --- a/internal/prompt/promptui.go +++ b/internal/prompt/promptui.go @@ -6,8 +6,8 @@ type PromptuiService struct{} func (p *PromptuiService) DisplaySelect( label string, - options []PromptOption, -) (PromptOption, error) { + options []Option, +) (Option, error) { labels := []string{} for _, option := range options { labels = append(labels, option.Label) @@ -19,7 +19,7 @@ func (p *PromptuiService) DisplaySelect( } i, _, err := prompt.Run() if err != nil { - return PromptOption{}, err + return Option{}, err } return options[i], nil @@ -37,6 +37,6 @@ func (p *PromptuiService) DisplayPrompt(label string) (string, error) { return result, nil } -func NewPromptuiService() PromptService { +func NewPromptuiService() Service { return &PromptuiService{} } From 56ade0f0b9c18fe259fa2915d16ec1eea6b607a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niclas=20=C3=85berg?= Date: Thu, 22 Jun 2023 09:00:28 +0200 Subject: [PATCH 4/6] Rename container interface to avoid stuttering --- cmd/main/main.go | 7 +++---- cmd/main/main_test.go | 12 ++++++------ internal/container/container.go | 4 ++-- internal/container/docker.go | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/cmd/main/main.go b/cmd/main/main.go index c971716..d7e68e3 100644 --- a/cmd/main/main.go +++ b/cmd/main/main.go @@ -1,14 +1,13 @@ package main import ( + "dex/internal/container" + "dex/internal/prompt" "fmt" "os" "strings" "github.com/containerd/console" - - "dex/internal/container" - "dex/internal/prompt" ) func main() { @@ -35,7 +34,7 @@ func main() { } func run( - containerService container.ContainerService, + containerService container.Service, promptService prompt.Service, ) error { containers, err := containerService.GetAll() diff --git a/cmd/main/main_test.go b/cmd/main/main_test.go index 91237a3..6c464e9 100644 --- a/cmd/main/main_test.go +++ b/cmd/main/main_test.go @@ -17,7 +17,7 @@ import ( func TestRun(t *testing.T) { t.Run("FailsIfErrorWhenGettingContainers", func(t *testing.T) { expectedError := errors.New("Mock Error") - mockContainerService := containermocks.NewContainerService(t) + mockContainerService := containermocks.NewService(t) mockContainerService.On("GetAll").Return([]container.Container{}, expectedError) mockPromptService := promptmocks.NewService(t) @@ -28,7 +28,7 @@ func TestRun(t *testing.T) { }) t.Run("FailsSilentlyIfErrorWhenDisplayingContainerSelectPrompt", func(t *testing.T) { - mockContainerService := containermocks.NewContainerService(t) + mockContainerService := containermocks.NewService(t) mockContainerService.On("GetAll").Return(containersData(), nil) mockPromptService := promptmocks.NewService(t) @@ -42,7 +42,7 @@ func TestRun(t *testing.T) { }) t.Run("FailsSilentlyIfErrorWhenDisplayingCommandPrompt", func(t *testing.T) { - mockContainerService := containermocks.NewContainerService(t) + mockContainerService := containermocks.NewService(t) mockContainerService.On("GetAll").Return(containersData(), nil) mockContainerService.AssertNotCalled(t, "RunCommand", mock.Anything, mock.Anything) @@ -62,7 +62,7 @@ func TestRun(t *testing.T) { promptOptions := promptOptionsData() selectedOption := promptOptions[0] - mockContainerService := containermocks.NewContainerService(t) + mockContainerService := containermocks.NewService(t) mockContainerService.On("GetAll").Return(containersData(), nil) mockContainerService.On("RunCommand", selectedOption.Value, expectedCommand). Return(nil) @@ -83,7 +83,7 @@ func TestRun(t *testing.T) { promptOptions := promptOptionsData() selectedOption := promptOptions[0] - mockContainerService := containermocks.NewContainerService(t) + mockContainerService := containermocks.NewService(t) mockContainerService.On("GetAll").Return(containersData(), nil) mockContainerService.On("RunCommand", selectedOption.Value, expectedCommand). Return(nil) @@ -104,7 +104,7 @@ func TestRun(t *testing.T) { promptOptions := promptOptionsData() selectedOption := promptOptions[0] - mockContainerService := containermocks.NewContainerService(t) + mockContainerService := containermocks.NewService(t) mockContainerService.On("GetAll").Return(containersData(), nil) mockContainerService.On("RunCommand", selectedOption.Value, "bash"). Return(errors.New("Mock Error")).Once() diff --git a/internal/container/container.go b/internal/container/container.go index d21c167..775f635 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -6,8 +6,8 @@ type Container struct { Image string } -//go:generate mockery --name ContainerService -type ContainerService interface { +//go:generate mockery --name Service +type Service interface { GetAll() ([]Container, error) RunCommand(containerID, command string) error Close() diff --git a/internal/container/docker.go b/internal/container/docker.go index 8f3cfdb..d807ea6 100644 --- a/internal/container/docker.go +++ b/internal/container/docker.go @@ -96,7 +96,7 @@ func splitCommand(command string) ([]string, error) { return arguments, nil } -func NewDockerService() (ContainerService, error) { +func NewDockerService() (Service, error) { dockerClient, err := client.NewClientWithOpts( client.FromEnv, client.WithAPIVersionNegotiation(), From bfbc46f34c1ea9754d9c5f62db059d848259c5ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niclas=20=C3=85berg?= Date: Thu, 22 Jun 2023 09:53:11 +0200 Subject: [PATCH 5/6] Add comments for exported types, methods and functions --- internal/container/container.go | 3 +++ internal/container/docker.go | 5 +++++ internal/prompt/prompt.go | 3 +++ internal/prompt/promptui.go | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/internal/container/container.go b/internal/container/container.go index 775f635..77e1071 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -1,11 +1,14 @@ package container +// Container holds container information type Container struct { ID string Names []string Image string } +// Service interface for getting containers and running commands against them +// //go:generate mockery --name Service type Service interface { GetAll() ([]Container, error) diff --git a/internal/container/docker.go b/internal/container/docker.go index d807ea6..b7df257 100644 --- a/internal/container/docker.go +++ b/internal/container/docker.go @@ -11,10 +11,12 @@ import ( "github.com/docker/docker/client" ) +// DockerService for getting Docker containers and running commands against them type DockerService struct { client *client.Client } +// GetAll Docker containers func (s *DockerService) GetAll() ([]Container, error) { var containers []Container @@ -34,6 +36,7 @@ func (s *DockerService) GetAll() ([]Container, error) { return containers, nil } +// RunCommand runs a command in a Docker container func (s *DockerService) RunCommand(containerID string, command string) error { arguments, err := splitCommand(command) if err != nil { @@ -82,6 +85,7 @@ func (s *DockerService) RunCommand(containerID string, command string) error { return err } +// Close closes the client func (s *DockerService) Close() { s.client.Close() } @@ -96,6 +100,7 @@ func splitCommand(command string) ([]string, error) { return arguments, nil } +// NewDockerService returns a new DockerService pointer func NewDockerService() (Service, error) { dockerClient, err := client.NewClientWithOpts( client.FromEnv, diff --git a/internal/prompt/prompt.go b/internal/prompt/prompt.go index 657e318..15a6f09 100644 --- a/internal/prompt/prompt.go +++ b/internal/prompt/prompt.go @@ -1,10 +1,13 @@ package prompt +// Option for the select prompt type Option struct { Label string Value string } +// Service interface for displaying prompts +// //go:generate mockery --name Service type Service interface { DisplaySelect(label string, options []Option) (Option, error) diff --git a/internal/prompt/promptui.go b/internal/prompt/promptui.go index 187755b..1f7de44 100644 --- a/internal/prompt/promptui.go +++ b/internal/prompt/promptui.go @@ -2,8 +2,10 @@ package prompt import "github.com/manifoldco/promptui" +// PromptuiService for displaying prompts type PromptuiService struct{} +// DisplaySelect displays a select prompt func (p *PromptuiService) DisplaySelect( label string, options []Option, @@ -25,6 +27,7 @@ func (p *PromptuiService) DisplaySelect( return options[i], nil } +// DisplayPrompt displays a normal prompt func (p *PromptuiService) DisplayPrompt(label string) (string, error) { prompt := promptui.Prompt{ Label: label, @@ -37,6 +40,7 @@ func (p *PromptuiService) DisplayPrompt(label string) (string, error) { return result, nil } +// NewPromptuiService returns a new PromptuiService pointer func NewPromptuiService() Service { return &PromptuiService{} } From 6cbe33728c9867dc7e05a80d6dfa7b2adebd05fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niclas=20=C3=85berg?= Date: Thu, 22 Jun 2023 09:58:29 +0200 Subject: [PATCH 6/6] Increase version --- release.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.json b/release.json index 18c012b..0e204eb 100644 --- a/release.json +++ b/release.json @@ -1,4 +1,4 @@ { - "version": "1.0.1", + "version": "1.0.2", "go_version": "1.20.4" }