diff --git a/pkg/cmd/gist/delete/delete.go b/pkg/cmd/gist/delete/delete.go index ad1e0a48b..8b8a47540 100644 --- a/pkg/cmd/gist/delete/delete.go +++ b/pkg/cmd/gist/delete/delete.go @@ -107,6 +107,10 @@ func deleteRun(opts *DeleteOptions) error { if err != nil { return err } + if gist.ID == "" { + fmt.Fprintln(opts.IO.Out, "No gists found.") + return nil + } if !opts.Confirmed { confirmed, err := opts.Prompter.Confirm(fmt.Sprintf("Delete %q gist?", gist.Filename()), false) diff --git a/pkg/cmd/gist/delete/delete_test.go b/pkg/cmd/gist/delete/delete_test.go index 359e73a59..97a7e11d3 100644 --- a/pkg/cmd/gist/delete/delete_test.go +++ b/pkg/cmd/gist/delete/delete_test.go @@ -122,6 +122,7 @@ func Test_deleteRun(t *testing.T) { cancel bool httpStubs func(*httpmock.Registry) mockPromptGists bool + noGists bool wantErr bool wantStdout string wantStderr string @@ -137,9 +138,7 @@ func Test_deleteRun(t *testing.T) { reg.Register(httpmock.REST("DELETE", "gists/1234"), httpmock.StatusStringResponse(200, "{}")) }, - wantErr: false, wantStdout: "✓ Gist \"cool.txt\" deleted\n", - wantStderr: "", }, { name: "successfully delete with prompt", @@ -151,9 +150,7 @@ func Test_deleteRun(t *testing.T) { httpmock.StatusStringResponse(200, "{}")) }, mockPromptGists: true, - wantErr: false, wantStdout: "✓ Gist \"cool.txt\" deleted\n", - wantStderr: "", }, { name: "successfully delete with --yes", @@ -167,9 +164,7 @@ func Test_deleteRun(t *testing.T) { reg.Register(httpmock.REST("DELETE", "gists/1234"), httpmock.StatusStringResponse(200, "{}")) }, - wantErr: false, wantStdout: "✓ Gist \"cool.txt\" deleted\n", - wantStderr: "", }, { name: "successfully delete with prompt and --yes", @@ -182,9 +177,7 @@ func Test_deleteRun(t *testing.T) { httpmock.StatusStringResponse(200, "{}")) }, mockPromptGists: true, - wantErr: false, wantStdout: "✓ Gist \"cool.txt\" deleted\n", - wantStderr: "", }, { name: "cancel delete with id", @@ -195,10 +188,8 @@ func Test_deleteRun(t *testing.T) { reg.Register(httpmock.REST("GET", "gists/1234"), httpmock.JSONResponse(shared.Gist{ID: "1234", Files: map[string]*shared.GistFile{"cool.txt": {Filename: "cool.txt"}}})) }, - cancel: true, - wantErr: true, - wantStdout: "", - wantStderr: "", + cancel: true, + wantErr: true, }, { name: "cancel delete with url", @@ -209,10 +200,8 @@ func Test_deleteRun(t *testing.T) { reg.Register(httpmock.REST("GET", "gists/1234"), httpmock.JSONResponse(shared.Gist{ID: "1234", Files: map[string]*shared.GistFile{"cool.txt": {Filename: "cool.txt"}}})) }, - cancel: true, - wantErr: true, - wantStdout: "", - wantStderr: "", + cancel: true, + wantErr: true, }, { name: "cancel delete with prompt", @@ -223,8 +212,6 @@ func Test_deleteRun(t *testing.T) { mockPromptGists: true, cancel: true, wantErr: true, - wantStdout: "", - wantStderr: "", }, { name: "not found", @@ -238,9 +225,18 @@ func Test_deleteRun(t *testing.T) { httpmock.StatusStringResponse(404, "{}")) }, wantErr: true, - wantStdout: "", wantStderr: "unable to delete gist \"cool.txt\": either the gist is not found or it is not owned by you", }, + { + name: "no gists", + opts: &DeleteOptions{ + Selector: "", + }, + httpStubs: func(reg *httpmock.Registry) {}, + mockPromptGists: true, + noGists: true, + wantStdout: "No gists found.\n", + }, } for _, tt := range tests { @@ -254,26 +250,34 @@ func Test_deleteRun(t *testing.T) { reg := &httpmock.Registry{} tt.httpStubs(reg) if tt.mockPromptGists { - sixHours, _ := time.ParseDuration("6h") - sixHoursAgo := time.Now().Add(-sixHours) - reg.Register( - httpmock.GraphQL(`query GistList\b`), - httpmock.StringResponse(fmt.Sprintf( - `{ "data": { "viewer": { "gists": { "nodes": [ - { - "name": "1234", - "files": [{ "name": "cool.txt" }], - "updatedAt": "%s", - "isPublic": true - } - ] } } } }`, - sixHoursAgo.Format(time.RFC3339), - )), - ) + if tt.noGists { + reg.Register( + httpmock.GraphQL(`query GistList\b`), + httpmock.StringResponse( + `{ "data": { "viewer": { "gists": { "nodes": [] }} } }`), + ) + } else { + sixHours, _ := time.ParseDuration("6h") + sixHoursAgo := time.Now().Add(-sixHours) + reg.Register( + httpmock.GraphQL(`query GistList\b`), + httpmock.StringResponse(fmt.Sprintf( + `{ "data": { "viewer": { "gists": { "nodes": [ + { + "name": "1234", + "files": [{ "name": "cool.txt" }], + "updatedAt": "%s", + "isPublic": true + } + ] } } } }`, + sixHoursAgo.Format(time.RFC3339), + )), + ) + pm.RegisterSelect("Select a gist", []string{"cool.txt about 6 hours ago"}, func(_, _ string, _ []string) (int, error) { + return 0, nil + }) + } - pm.RegisterSelect("Select a gist", []string{"cool.txt about 6 hours ago"}, func(_, _ string, _ []string) (int, error) { - return 0, nil - }) } tt.opts.Prompter = pm