From 3d017b282484617a73ca185d27dfcefedefe2e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Fri, 24 Sep 2021 15:09:41 +0200 Subject: [PATCH] Fix stderr output on delete errors --- cmd/ghcs/delete.go | 2 +- cmd/ghcs/delete_test.go | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/cmd/ghcs/delete.go b/cmd/ghcs/delete.go index 0c21c1674..94aaaf214 100644 --- a/cmd/ghcs/delete.go +++ b/cmd/ghcs/delete.go @@ -151,7 +151,7 @@ func delete(ctx context.Context, log logger, opts deleteOptions) error { codespaceName := c.Name g.Go(func() error { if err := opts.apiClient.DeleteCodespace(ctx, user.Login, codespaceName); err != nil { - _, _ = log.Errorf("error deleting codespace %q: %v", codespaceName, err) + _, _ = log.Errorf("error deleting codespace %q: %v\n", codespaceName, err) return err } return nil diff --git a/cmd/ghcs/delete_test.go b/cmd/ghcs/delete_test.go index 7d90a3bd2..47e6a4d6c 100644 --- a/cmd/ghcs/delete_test.go +++ b/cmd/ghcs/delete_test.go @@ -1,12 +1,15 @@ package ghcs import ( + "bytes" "context" + "errors" "fmt" "sort" "testing" "time" + "github.com/github/ghcs/cmd/ghcs/output" "github.com/github/ghcs/internal/api" ) @@ -22,8 +25,11 @@ func TestDelete(t *testing.T) { opts deleteOptions codespaces []*api.Codespace confirms map[string]bool + deleteErr error wantErr bool wantDeleted []string + wantStdout string + wantStderr string }{ { name: "by name", @@ -80,6 +86,24 @@ func TestDelete(t *testing.T) { }, wantDeleted: []string{"hubot-robawt-abc", "monalisa-spoonknife-c4f3"}, }, + { + name: "deletion failed", + opts: deleteOptions{ + deleteAll: true, + }, + codespaces: []*api.Codespace{ + { + Name: "monalisa-spoonknife-123", + }, + { + Name: "hubot-robawt-abc", + }, + }, + deleteErr: errors.New("aborted by test"), + wantErr: true, + wantDeleted: []string{"hubot-robawt-abc", "monalisa-spoonknife-123"}, + wantStderr: "error deleting codespace \"hubot-robawt-abc\": aborted by test\nerror deleting codespace \"monalisa-spoonknife-123\": aborted by test\n", + }, { name: "with confirm", opts: deleteOptions{ @@ -131,6 +155,9 @@ func TestDelete(t *testing.T) { if userLogin != user.Login { return fmt.Errorf("unexpected user %q", userLogin) } + if tt.deleteErr != nil { + return tt.deleteErr + } return nil }, } @@ -171,7 +198,10 @@ func TestDelete(t *testing.T) { }, } - err := delete(context.Background(), nil, opts) + stdout := &bytes.Buffer{} + stderr := &bytes.Buffer{} + log := output.NewLogger(stdout, stderr, false) + err := delete(context.Background(), log, opts) if (err != nil) != tt.wantErr { t.Errorf("delete() error = %v, wantErr %v", err, tt.wantErr) } @@ -186,6 +216,12 @@ func TestDelete(t *testing.T) { if !sliceEquals(gotDeleted, tt.wantDeleted) { t.Errorf("deleted %q, want %q", gotDeleted, tt.wantDeleted) } + if out := stdout.String(); out != tt.wantStdout { + t.Errorf("stdout = %q, want %q", out, tt.wantStdout) + } + if out := stderr.String(); out != tt.wantStderr { + t.Errorf("stderr = %q, want %q", out, tt.wantStderr) + } }) } }