github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/db/test/test_test.go (about)

     1  package test
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"errors"
     7  	"io/fs"
     8  	"net/http"
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  	"testing"
    13  
    14  	"github.com/Redstoneguy129/cli/internal/testing/apitest"
    15  	"github.com/Redstoneguy129/cli/internal/utils"
    16  	"github.com/docker/docker/api/types"
    17  	"github.com/spf13/afero"
    18  	"github.com/stretchr/testify/assert"
    19  	"github.com/stretchr/testify/require"
    20  	"gopkg.in/h2non/gock.v1"
    21  )
    22  
    23  type MockFs struct {
    24  	afero.MemMapFs
    25  	DenyPath string
    26  }
    27  
    28  func (m *MockFs) Open(name string) (afero.File, error) {
    29  	if strings.HasPrefix(name, m.DenyPath) {
    30  		return nil, fs.ErrPermission
    31  	}
    32  	return m.MemMapFs.Open(name)
    33  }
    34  
    35  func TestTarDirectory(t *testing.T) {
    36  	t.Run("tars a given directory", func(t *testing.T) {
    37  		// Setup in-memory fs
    38  		fsys := afero.NewMemMapFs()
    39  		pgtap := "/tests/order_test.sql"
    40  		require.NoError(t, afero.WriteFile(fsys, pgtap, []byte("SELECT 0;"), 0644))
    41  		// Run test
    42  		var buf bytes.Buffer
    43  		assert.NoError(t, compress(filepath.Dir(pgtap), &buf, fsys))
    44  	})
    45  
    46  	t.Run("throws error on permission denied", func(t *testing.T) {
    47  		// Setup in-memory fs
    48  		pgtap := "/tests/order_test.sql"
    49  		fsys := &MockFs{DenyPath: pgtap}
    50  		require.NoError(t, afero.WriteFile(fsys, pgtap, []byte("SELECT 0;"), 0644))
    51  		// Run test
    52  		var buf bytes.Buffer
    53  		err := compress(filepath.Dir(pgtap), &buf, fsys)
    54  		// Check error
    55  		assert.ErrorContains(t, err, "permission denied")
    56  	})
    57  }
    58  
    59  func TestPgProve(t *testing.T) {
    60  	t.Run("throws error on copy failure", func(t *testing.T) {
    61  		utils.DbId = "test_db"
    62  		// Setup in-memory fs
    63  		fsys := afero.NewMemMapFs()
    64  		require.NoError(t, fsys.Mkdir(utils.DbTestsDir, 0755))
    65  		// Setup mock docker
    66  		require.NoError(t, apitest.MockDocker(utils.Docker))
    67  		gock.New(utils.Docker.DaemonHost()).
    68  			Put("/v" + utils.Docker.ClientVersion() + "/containers/test_db/archive").
    69  			Reply(http.StatusServiceUnavailable)
    70  		// Run test
    71  		err := pgProve(context.Background(), "/tmp", fsys)
    72  		// Check error
    73  		assert.ErrorContains(t, err, "request returned Service Unavailable for API route and version")
    74  		assert.Empty(t, apitest.ListUnmatchedRequests())
    75  	})
    76  
    77  	t.Run("throws error on exec failure", func(t *testing.T) {
    78  		utils.DbId = "test_db"
    79  		// Setup in-memory fs
    80  		fsys := afero.NewMemMapFs()
    81  		require.NoError(t, fsys.Mkdir(utils.DbTestsDir, 0755))
    82  		// Setup mock docker
    83  		require.NoError(t, apitest.MockDocker(utils.Docker))
    84  		gock.New(utils.Docker.DaemonHost()).
    85  			Put("/v" + utils.Docker.ClientVersion() + "/containers/test_db/archive").
    86  			Reply(http.StatusOK)
    87  		gock.New(utils.Docker.DaemonHost()).
    88  			Post("/v" + utils.Docker.ClientVersion() + "/containers/test_db/exec").
    89  			ReplyError(errors.New("network error"))
    90  		// Run test
    91  		err := pgProve(context.Background(), "/tmp", fsys)
    92  		// Check error
    93  		assert.ErrorContains(t, err, "network error")
    94  		assert.Empty(t, apitest.ListUnmatchedRequests())
    95  	})
    96  }
    97  
    98  func TestRunCommand(t *testing.T) {
    99  	t.Run("throws error on missing config", func(t *testing.T) {
   100  		// Setup in-memory fs
   101  		fsys := afero.NewMemMapFs()
   102  		// Run test
   103  		err := Run(context.Background(), fsys)
   104  		// Check error
   105  		assert.ErrorIs(t, err, os.ErrNotExist)
   106  	})
   107  
   108  	t.Run("throws error on missing database", func(t *testing.T) {
   109  		// Setup in-memory fs
   110  		fsys := afero.NewMemMapFs()
   111  		require.NoError(t, utils.WriteConfig(fsys, false))
   112  		// Setup mock docker
   113  		require.NoError(t, apitest.MockDocker(utils.Docker))
   114  		gock.New(utils.Docker.DaemonHost()).
   115  			Get("/v" + utils.Docker.ClientVersion() + "/containers/supabase_db_").
   116  			ReplyError(errors.New("network error"))
   117  		// Run test
   118  		err := Run(context.Background(), fsys)
   119  		// Check error
   120  		assert.ErrorContains(t, err, "supabase start is not running.")
   121  		assert.Empty(t, apitest.ListUnmatchedRequests())
   122  	})
   123  
   124  	t.Run("throws error on missing tests", func(t *testing.T) {
   125  		// Setup in-memory fs
   126  		fsys := afero.NewMemMapFs()
   127  		require.NoError(t, utils.WriteConfig(fsys, false))
   128  		// Setup mock docker
   129  		require.NoError(t, apitest.MockDocker(utils.Docker))
   130  		gock.New(utils.Docker.DaemonHost()).
   131  			Get("/v" + utils.Docker.ClientVersion() + "/containers/supabase_db_").
   132  			Reply(http.StatusOK).
   133  			JSON(types.ContainerJSON{})
   134  		// Run test
   135  		err := Run(context.Background(), fsys)
   136  		// Check error
   137  		assert.ErrorContains(t, err, "open supabase/tests: file does not exist")
   138  		assert.Empty(t, apitest.ListUnmatchedRequests())
   139  	})
   140  }