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  }