github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/test/status_test.go (about) 1 package integration 2 3 // Basic imports 4 import ( 5 "context" 6 "net/http" 7 "os" 8 "path/filepath" 9 "sync" 10 "testing" 11 12 clicmd "github.com/Redstoneguy129/cli/cmd" 13 "github.com/docker/docker/api/types" 14 "github.com/gin-gonic/gin" 15 "github.com/spf13/cobra" 16 "github.com/stretchr/testify/require" 17 "github.com/stretchr/testify/suite" 18 ) 19 20 type StatusTestSuite struct { 21 suite.Suite 22 tempDir string 23 cmd *cobra.Command 24 25 params []gin.Params 26 mtx sync.RWMutex 27 } 28 29 // test functions 30 func (suite *StatusTestSuite) TestStatus() { 31 // run command 32 status, _, err := suite.cmd.Find([]string{"status"}) 33 status.SetContext(context.Background()) 34 require.NoError(suite.T(), err) 35 36 // set stdout to write into file so we can capture cmd output 37 tmpfile, err := os.CreateTemp(suite.tempDir, "output") 38 require.NoError(suite.T(), err) 39 defer os.Remove(tmpfile.Name()) // clean up 40 oldStdout := os.Stdout 41 defer func() { os.Stdout = oldStdout }() 42 os.Stdout = tmpfile 43 44 // run command 45 require.NoError(suite.T(), status.RunE(status, []string{})) 46 47 // check request details 48 suite.mtx.RLock() 49 defer suite.mtx.RUnlock() 50 require.Contains(suite.T(), suite.params, gin.Params{ 51 gin.Param{ 52 Key: "id", 53 Value: "supabase_db_" + filepath.Base(suite.tempDir), 54 }, 55 }) 56 57 contents, err := os.ReadFile(tmpfile.Name()) 58 require.NoError(suite.T(), err) 59 require.Contains(suite.T(), string(contents), "API URL: http://localhost:54321") 60 require.Contains(suite.T(), string(contents), "DB URL: postgresql://postgres:postgres@localhost:54322/postgres") 61 require.Contains(suite.T(), string(contents), "Studio URL: http://localhost:54323") 62 require.Contains(suite.T(), string(contents), "Inbucket URL: http://localhost:54324") 63 require.Contains(suite.T(), string(contents), "JWT secret: super-secret-jwt-token-with-at-least-32-characters-long") 64 require.Contains(suite.T(), string(contents), "anon key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") 65 require.Contains(suite.T(), string(contents), "service_role key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") 66 } 67 68 // hooks 69 func (suite *StatusTestSuite) SetupTest() { 70 // init cli 71 suite.cmd = clicmd.GetRootCmd() 72 suite.tempDir = NewTempDir(Logger, TempDir) 73 74 // init supabase 75 init, _, err := suite.cmd.Find([]string{"init"}) 76 require.NoError(suite.T(), err) 77 require.NoError(suite.T(), init.RunE(init, []string{})) 78 79 // implement mocks 80 DockerMock.ContainerInspectHandler = func(c *gin.Context) { 81 suite.addParams(c.Copy()) 82 c.JSON(http.StatusOK, types.ContainerJSON{ 83 ContainerJSONBase: &types.ContainerJSONBase{ 84 State: &types.ContainerState{Running: true}, 85 }, 86 }) 87 } 88 } 89 90 func (suite *StatusTestSuite) TeardownTest() { 91 require.NoError(suite.T(), os.Chdir(TempDir)) 92 } 93 94 // In order for 'go test' to run this suite, we need to create 95 // a normal test function and pass our suite to suite.Run 96 func TestStatusTestSuite(t *testing.T) { 97 suite.Run(t, new(StatusTestSuite)) 98 } 99 100 // helper functions 101 func (suite *StatusTestSuite) addParams(c *gin.Context) { 102 suite.mtx.Lock() 103 defer suite.mtx.Unlock() 104 suite.params = append(suite.params, c.Params) 105 }