diff --git a/internal/cmd/webhook/delete.go b/internal/cmd/webhook/delete.go new file mode 100644 index 00000000..db5f3f58 --- /dev/null +++ b/internal/cmd/webhook/delete.go @@ -0,0 +1,59 @@ +package webhook + +import ( + "fmt" + + "github.com/planetscale/cli/internal/cmdutil" + "github.com/planetscale/cli/internal/printer" + "github.com/planetscale/planetscale-go/planetscale" + "github.com/spf13/cobra" +) + +func DeleteCmd(ch *cmdutil.Helper) *cobra.Command { + cmd := &cobra.Command{ + Use: "delete ", + Short: "Delete a webhook for a database", + Args: cmdutil.RequiredArgs("database", "webhook-id"), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + database := args[0] + webhookID := args[1] + + client, err := ch.Client() + if err != nil { + return err + } + + end := ch.Printer.PrintProgress(fmt.Sprintf("Deleting webhook %s for %s", printer.BoldBlue(webhookID), printer.BoldBlue(database))) + defer end() + + err = client.Webhooks.Delete(ctx, &planetscale.DeleteWebhookRequest{ + Organization: ch.Config.Organization, + Database: database, + ID: webhookID, + }) + if err != nil { + switch cmdutil.ErrCode(err) { + case planetscale.ErrNotFound: + return fmt.Errorf("webhook %s does not exist in database %s (organization: %s)", + printer.BoldBlue(webhookID), printer.BoldBlue(database), printer.BoldBlue(ch.Config.Organization)) + default: + return cmdutil.HandleError(err) + } + } + + end() + + if ch.Printer.Format() == printer.Human { + ch.Printer.Printf("Webhook %s was successfully deleted from %s.\n", printer.BoldBlue(webhookID), printer.BoldBlue(database)) + return nil + } + + return ch.Printer.PrintResource(map[string]string{ + "result": "webhook deleted", + }) + }, + } + + return cmd +} diff --git a/internal/cmd/webhook/delete_test.go b/internal/cmd/webhook/delete_test.go new file mode 100644 index 00000000..b5be2a42 --- /dev/null +++ b/internal/cmd/webhook/delete_test.go @@ -0,0 +1,133 @@ +package webhook + +import ( + "bytes" + "context" + "testing" + + qt "github.com/frankban/quicktest" + "github.com/planetscale/cli/internal/cmdutil" + "github.com/planetscale/cli/internal/config" + "github.com/planetscale/cli/internal/mock" + "github.com/planetscale/cli/internal/printer" + ps "github.com/planetscale/planetscale-go/planetscale" +) + +func TestWebhook_DeleteCmd(t *testing.T) { + c := qt.New(t) + + var buf bytes.Buffer + format := printer.JSON + p := printer.NewPrinter(&format) + p.SetResourceOutput(&buf) + + org := "planetscale" + db := "mydb" + webhookID := "webhook-123" + + svc := &mock.WebhooksService{ + DeleteFn: func(ctx context.Context, req *ps.DeleteWebhookRequest) error { + c.Assert(req.Organization, qt.Equals, org) + c.Assert(req.Database, qt.Equals, db) + c.Assert(req.ID, qt.Equals, webhookID) + return nil + }, + } + + ch := &cmdutil.Helper{ + Printer: p, + Config: &config.Config{ + Organization: org, + }, + Client: func() (*ps.Client, error) { + return &ps.Client{ + Webhooks: svc, + }, nil + }, + } + + cmd := DeleteCmd(ch) + cmd.SetArgs([]string{db, webhookID}) + err := cmd.Execute() + + c.Assert(err, qt.IsNil) + c.Assert(svc.DeleteFnInvoked, qt.IsTrue) + c.Assert(buf.String(), qt.JSONEquals, map[string]string{"result": "webhook deleted"}) +} + +func TestWebhook_DeleteCmd_Human(t *testing.T) { + c := qt.New(t) + + var buf bytes.Buffer + format := printer.Human + p := printer.NewPrinter(&format) + p.SetHumanOutput(&buf) + + org := "planetscale" + db := "mydb" + webhookID := "webhook-123" + + svc := &mock.WebhooksService{ + DeleteFn: func(ctx context.Context, req *ps.DeleteWebhookRequest) error { + return nil + }, + } + + ch := &cmdutil.Helper{ + Printer: p, + Config: &config.Config{ + Organization: org, + }, + Client: func() (*ps.Client, error) { + return &ps.Client{ + Webhooks: svc, + }, nil + }, + } + + cmd := DeleteCmd(ch) + cmd.SetArgs([]string{db, webhookID}) + err := cmd.Execute() + + c.Assert(err, qt.IsNil) + c.Assert(svc.DeleteFnInvoked, qt.IsTrue) + c.Assert(buf.String(), qt.Contains, "successfully deleted") +} + +func TestWebhook_DeleteCmd_NotFound(t *testing.T) { + c := qt.New(t) + + var buf bytes.Buffer + format := printer.Human + p := printer.NewPrinter(&format) + p.SetHumanOutput(&buf) + + org := "planetscale" + db := "mydb" + webhookID := "webhook-123" + + svc := &mock.WebhooksService{ + DeleteFn: func(ctx context.Context, req *ps.DeleteWebhookRequest) error { + return &ps.Error{Code: ps.ErrNotFound} + }, + } + + ch := &cmdutil.Helper{ + Printer: p, + Config: &config.Config{ + Organization: org, + }, + Client: func() (*ps.Client, error) { + return &ps.Client{ + Webhooks: svc, + }, nil + }, + } + + cmd := DeleteCmd(ch) + cmd.SetArgs([]string{db, webhookID}) + err := cmd.Execute() + + c.Assert(err, qt.IsNotNil) + c.Assert(err.Error(), qt.Contains, "does not exist") +} diff --git a/internal/cmd/webhook/webhook.go b/internal/cmd/webhook/webhook.go index 3d5776a8..6ea467ca 100644 --- a/internal/cmd/webhook/webhook.go +++ b/internal/cmd/webhook/webhook.go @@ -22,6 +22,7 @@ func WebhookCmd(ch *cmdutil.Helper) *cobra.Command { cmd.MarkPersistentFlagRequired("org") // nolint:errcheck cmd.AddCommand(CreateCmd(ch)) + cmd.AddCommand(DeleteCmd(ch)) cmd.AddCommand(ListCmd(ch)) cmd.AddCommand(UpdateCmd(ch))