Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions internal/cmd/webhook/delete.go
Original file line number Diff line number Diff line change
@@ -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 <database> <webhook-id>",
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
}
133 changes: 133 additions & 0 deletions internal/cmd/webhook/delete_test.go
Original file line number Diff line number Diff line change
@@ -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")
}
1 change: 1 addition & 0 deletions internal/cmd/webhook/webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down