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

     1  package integration
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/docker/docker/client"
     9  	"github.com/spf13/viper"
    10  	"github.com/Redstoneguy129/cli/internal/utils"
    11  	"github.com/Redstoneguy129/cli/test/mocks/docker"
    12  	"github.com/Redstoneguy129/cli/test/mocks/supabase"
    13  )
    14  
    15  const (
    16  	DockerPort   = ":2375"
    17  	SupabasePort = ":2376"
    18  )
    19  
    20  var (
    21  	TempDir string
    22  )
    23  
    24  var (
    25  	Logger     *log.Logger
    26  	DockerMock *docker.Server
    27  	SupaMock   *supabase.Server
    28  )
    29  
    30  func TestMain(m *testing.M) {
    31  	Logger := log.New(os.Stdout, "", 0)
    32  
    33  	Logger.Println("Global tests setup")
    34  
    35  	DockerMock = newDockerMock(Logger)
    36  	SupaMock = newSupabaseMock(Logger)
    37  	TempDir = NewTempDir(Logger, "")
    38  
    39  	// redirect clients to mock servers
    40  	err := client.WithHost("tcp://127.0.0.1" + DockerPort)(utils.Docker)
    41  	if err != nil {
    42  		Logger.Fatal(err)
    43  	}
    44  	viper.Set("INTERNAL_API_HOST", "http://127.0.0.1"+SupabasePort)
    45  	os.Setenv("SUPABASE_ACCESS_TOKEN", supabase.AccessToken)
    46  	os.Setenv("HOME", TempDir)
    47  
    48  	// run tests
    49  	exitVal := m.Run()
    50  
    51  	Logger.Println("Global teardown")
    52  	os.RemoveAll(TempDir)
    53  
    54  	// exit process with tests exit code
    55  	os.Exit(exitVal)
    56  }
    57  
    58  func newDockerMock(Logger *log.Logger) *docker.Server {
    59  	dockerMock := docker.NewServer()
    60  	dockerRouter := dockerMock.NewRouter()
    61  	go func() {
    62  		err := dockerRouter.Run(DockerPort)
    63  		if err != nil {
    64  			Logger.Fatal(err)
    65  		}
    66  	}()
    67  
    68  	return dockerMock
    69  }
    70  
    71  func newSupabaseMock(Logger *log.Logger) *supabase.Server {
    72  	supaMock := supabase.NewServer()
    73  	supaRouter := supaMock.NewRouter()
    74  	go func() {
    75  		err := supaRouter.Run(SupabasePort)
    76  		if err != nil {
    77  			Logger.Fatal(err)
    78  		}
    79  	}()
    80  
    81  	return supaMock
    82  }
    83  
    84  func NewTempDir(Logger *log.Logger, baseDir string) string {
    85  	wd := baseDir
    86  	var err error
    87  	if baseDir == "" {
    88  		wd, err = os.Getwd()
    89  	}
    90  	if err != nil {
    91  		Logger.Fatal(err)
    92  	}
    93  	tempDir, err := os.MkdirTemp(wd, "cli-test-")
    94  	if err != nil {
    95  		Logger.Fatal(err)
    96  	}
    97  	err = os.Chdir(tempDir)
    98  	if err != nil {
    99  		Logger.Fatal(err)
   100  	}
   101  	return tempDir
   102  }