github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/db/branch/create/create_test.go (about)

     1  package create
     2  
     3  import (
     4  	"context"
     5  	"net/http"
     6  	"testing"
     7  
     8  	"github.com/docker/docker/api/types"
     9  	"github.com/docker/docker/client"
    10  	"github.com/spf13/afero"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  	"github.com/Redstoneguy129/cli/internal/testing/apitest"
    14  	"github.com/Redstoneguy129/cli/internal/utils"
    15  	"gopkg.in/h2non/gock.v1"
    16  )
    17  
    18  func TestBranchValidation(t *testing.T) {
    19  	t.Run("branch name is valid", func(t *testing.T) {
    20  		assert.NoError(t, assertNewBranchIsValid("test-branch", afero.NewMemMapFs()))
    21  	})
    22  
    23  	t.Run("branch name is reserved", func(t *testing.T) {
    24  		assert.Error(t, assertNewBranchIsValid("main", afero.NewMemMapFs()))
    25  	})
    26  
    27  	t.Run("branch name is invalid", func(t *testing.T) {
    28  		assert.Error(t, assertNewBranchIsValid("@", afero.NewMemMapFs()))
    29  	})
    30  
    31  	t.Run("branch not a directory", func(t *testing.T) {
    32  		// Setup in-memory fs
    33  		fsys := afero.NewMemMapFs()
    34  		path := "/supabase/.branches/test-branch"
    35  		_, err := fsys.Create(path)
    36  		require.NoError(t, err)
    37  		// Run test
    38  		assert.Error(t, assertNewBranchIsValid(path, fsys))
    39  	})
    40  
    41  	t.Run("branch already exists", func(t *testing.T) {
    42  		// Setup in-memory fs
    43  		fsys := afero.NewMemMapFs()
    44  		path := "/supabase/.branches/test-branch"
    45  		require.NoError(t, fsys.MkdirAll(path, 0755))
    46  		// Run test
    47  		assert.Error(t, assertNewBranchIsValid(path, fsys))
    48  	})
    49  }
    50  
    51  func TestBranchCreation(t *testing.T) {
    52  	const version = "1.41"
    53  	utils.DbId = "test-db"
    54  
    55  	t.Run("docker exec failure", func(t *testing.T) {
    56  		// Setup mock docker
    57  		require.NoError(t, client.WithHTTPClient(http.DefaultClient)(utils.Docker))
    58  		defer gock.OffAll()
    59  		gock.New("http:///var/run/docker.sock").
    60  			Head("/_ping").
    61  			Reply(http.StatusOK).
    62  			SetHeader("API-Version", version).
    63  			SetHeader("OSType", "linux")
    64  		gock.New("http:///var/run/docker.sock").
    65  			Post("/v" + version + "/containers/" + utils.DbId + "/exec").
    66  			Reply(http.StatusServiceUnavailable)
    67  		// Run test
    68  		assert.Error(t, createBranch(context.Background(), "test-branch"))
    69  		// Validate api
    70  		assert.Empty(t, apitest.ListUnmatchedRequests())
    71  	})
    72  
    73  	t.Run("docker attach failure", func(t *testing.T) {
    74  		// Setup mock docker
    75  		require.NoError(t, client.WithHTTPClient(http.DefaultClient)(utils.Docker))
    76  		defer gock.OffAll()
    77  		gock.New("http:///var/run/docker.sock").
    78  			Head("/_ping").
    79  			Reply(http.StatusOK).
    80  			SetHeader("API-Version", version).
    81  			SetHeader("OSType", "linux")
    82  		gock.New("http:///var/run/docker.sock").
    83  			Post("/v" + version + "/containers/" + utils.DbId + "/exec").
    84  			Reply(http.StatusCreated).
    85  			JSON(types.ContainerJSON{})
    86  		// Run test
    87  		assert.Error(t, createBranch(context.Background(), "test-branch"))
    88  		// Validate api
    89  		assert.Empty(t, apitest.ListUnmatchedRequests())
    90  	})
    91  }
    92  
    93  func TestCreateCommand(t *testing.T) {
    94  	const (
    95  		version = "1.41"
    96  		branch  = "test-branch"
    97  	)
    98  
    99  	t.Run("throws error on missing config", func(t *testing.T) {
   100  		assert.Error(t, Run(branch, afero.NewMemMapFs()))
   101  	})
   102  
   103  	t.Run("throws error on stopped db", func(t *testing.T) {
   104  		// Setup in-memory fs
   105  		fsys := &afero.MemMapFs{}
   106  		require.NoError(t, utils.WriteConfig(fsys, false))
   107  		// Setup mock docker
   108  		require.NoError(t, client.WithHTTPClient(http.DefaultClient)(utils.Docker))
   109  		defer gock.OffAll()
   110  		gock.New("http:///var/run/docker.sock").
   111  			Head("/_ping").
   112  			Reply(http.StatusOK).
   113  			SetHeader("API-Version", version).
   114  			SetHeader("OSType", "linux")
   115  		gock.New("http:///var/run/docker.sock").
   116  			Get("/v" + version + "/containers").
   117  			Reply(http.StatusServiceUnavailable)
   118  		// Run test
   119  		assert.Error(t, Run(branch, fsys))
   120  		// Validate api
   121  		assert.Empty(t, apitest.ListUnmatchedRequests())
   122  	})
   123  }