github.com/rmachuca89/go-lab@v0.0.0-20220225232501-08364e2cef7f/cmd/todo/main_test.go (about)

     1  package main_test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"os/exec"
     7  	"path/filepath"
     8  	"runtime"
     9  	"testing"
    10  )
    11  
    12  var (
    13  	binName                   = "todo"
    14  	buildOutDir, buildOutFile string
    15  )
    16  
    17  func TestMain(m *testing.M) {
    18  	fmt.Println("Building tool...")
    19  	if runtime.GOOS == "windows" {
    20  		binName += ".exe"
    21  	}
    22  
    23  	buildDir, err := os.MkdirTemp(os.TempDir(), "go-tmp-build")
    24  	if err != nil {
    25  		fmt.Fprintf(os.Stderr, "Cannot create temp build dir %s: %s", buildDir, err)
    26  		os.Exit(2)
    27  	}
    28  
    29  	buildOutDir = buildDir
    30  	buildOutFile = filepath.Join(buildDir, binName)
    31  	fmt.Println("Build File: ", buildOutFile)
    32  	build := exec.Command("go", "build", "-o", buildOutFile)
    33  
    34  	if err := build.Run(); err != nil {
    35  		fmt.Fprintf(os.Stderr, "Cannot build tool %s: %s", binName, err)
    36  		os.Exit(2)
    37  	}
    38  
    39  	fmt.Println("Running tests...")
    40  	exitStatus := m.Run()
    41  
    42  	fmt.Println("Cleaning up...")
    43  	if err := os.Remove(buildOutFile); err != nil {
    44  		fmt.Fprintf(os.Stderr, "Could not delete tool binary %s: %s", binName, err)
    45  		os.Exit(2)
    46  	}
    47  	if err := os.RemoveAll(buildDir); err != nil {
    48  		fmt.Fprintf(os.Stderr, "Could not delete temporary dir %s: %s", buildDir, err)
    49  		os.Exit(2)
    50  	}
    51  	os.Exit(exitStatus)
    52  }
    53  
    54  func TestTodoCLI(t *testing.T) {
    55  
    56  	tt := "test task number 1"
    57  
    58  	if buildOutFile == "" || buildOutDir == "" {
    59  		t.Fatalf("no built binary (%s) available", binName)
    60  	}
    61  	// Change to our temporal app testing dir.
    62  	os.Chdir(buildOutDir)
    63  
    64  	t.Run("AddNewTask", func(t *testing.T) {
    65  		args := []string{"--title", tt}
    66  		cmd := exec.Command(buildOutFile, args...)
    67  		if err := cmd.Run(); err != nil {
    68  			t.Fatal(err)
    69  		}
    70  	})
    71  
    72  	t.Run("CompleteTask", func(t *testing.T) {
    73  		args := []string{"--title", tt, "--complete"}
    74  		cmd := exec.Command(buildOutFile, args...)
    75  		if err := cmd.Run(); err != nil {
    76  			t.Fatal(err)
    77  		}
    78  	})
    79  
    80  	t.Run("ListTasks", func(t *testing.T) {
    81  		cmd := exec.Command(buildOutFile)
    82  		out, err := cmd.CombinedOutput()
    83  		if err != nil {
    84  			t.Fatal(err)
    85  		}
    86  
    87  		// Expected format provided by Tasks.String()
    88  		want := "[X] 1: " + tt + "\n"
    89  
    90  		got := string(out)
    91  		if want != got {
    92  			t.Errorf("Expected %q, got %q instead\n", want, got)
    93  		}
    94  	})
    95  }