github.com/supabase/cli@v1.168.1/internal/functions/delete/delete_test.go (about)

     1  package delete
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"net/http"
     7  	"testing"
     8  
     9  	"github.com/spf13/afero"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/supabase/cli/internal/testing/apitest"
    12  	"github.com/supabase/cli/internal/utils"
    13  	"gopkg.in/h2non/gock.v1"
    14  )
    15  
    16  func TestDeleteCommand(t *testing.T) {
    17  	const slug = "test-func"
    18  	// Setup valid project ref
    19  	project := apitest.RandomProjectRef()
    20  	// Setup valid access token
    21  	token := apitest.RandomAccessToken(t)
    22  	t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
    23  
    24  	t.Run("deletes function from project", func(t *testing.T) {
    25  		// Setup in-memory fs
    26  		fsys := afero.NewMemMapFs()
    27  		// Setup mock api
    28  		defer gock.OffAll()
    29  		gock.New(utils.DefaultApiHost).
    30  			Delete("/v1/projects/" + project + "/functions/" + slug).
    31  			Reply(http.StatusOK)
    32  		// Run test
    33  		assert.NoError(t, Run(context.Background(), slug, project, fsys))
    34  		// Validate api
    35  		assert.Empty(t, apitest.ListUnmatchedRequests())
    36  	})
    37  
    38  	t.Run("throws error on malformed slug", func(t *testing.T) {
    39  		// Setup in-memory fs
    40  		fsys := afero.NewMemMapFs()
    41  		// Setup valid project ref
    42  		project := apitest.RandomProjectRef()
    43  		// Run test
    44  		err := Run(context.Background(), "@", project, fsys)
    45  		// Check error
    46  		assert.ErrorContains(t, err, "Invalid Function name.")
    47  	})
    48  
    49  	t.Run("throws error on network failure", func(t *testing.T) {
    50  		// Setup in-memory fs
    51  		fsys := afero.NewMemMapFs()
    52  		// Setup mock api
    53  		defer gock.OffAll()
    54  		gock.New(utils.DefaultApiHost).
    55  			Delete("/v1/projects/" + project + "/functions/" + slug).
    56  			ReplyError(errors.New("network error"))
    57  		// Run test
    58  		err := Run(context.Background(), slug, project, fsys)
    59  		// Check error
    60  		assert.ErrorContains(t, err, "network error")
    61  		assert.Empty(t, apitest.ListUnmatchedRequests())
    62  	})
    63  
    64  	t.Run("throws error on missing function", func(t *testing.T) {
    65  		// Setup in-memory fs
    66  		fsys := afero.NewMemMapFs()
    67  		// Setup mock api
    68  		defer gock.OffAll()
    69  		gock.New(utils.DefaultApiHost).
    70  			Delete("/v1/projects/" + project + "/functions/" + slug).
    71  			Reply(http.StatusNotFound).
    72  			JSON(map[string]string{"message": "Function not found"})
    73  		// Run test
    74  		err := Run(context.Background(), slug, project, fsys)
    75  		// Check error
    76  		assert.ErrorContains(t, err, "Function test-func does not exist on the Supabase project.")
    77  		assert.Empty(t, apitest.ListUnmatchedRequests())
    78  	})
    79  
    80  	t.Run("throws error on service unavailable", func(t *testing.T) {
    81  		// Setup in-memory fs
    82  		fsys := afero.NewMemMapFs()
    83  		// Setup mock api
    84  		defer gock.OffAll()
    85  		gock.New(utils.DefaultApiHost).
    86  			Delete("/v1/projects/" + project + "/functions/" + slug).
    87  			Reply(http.StatusServiceUnavailable)
    88  		// Run test
    89  		err := Run(context.Background(), slug, project, fsys)
    90  		// Check error
    91  		assert.ErrorContains(t, err, "Failed to delete Function test-func on the Supabase project:")
    92  		assert.Empty(t, apitest.ListUnmatchedRequests())
    93  	})
    94  }