github.com/jakewarren/define@v1.0.1-0.20230216022724-0146b4213218/integration/cli_test.go (about)

     1  // nolint:scopelint,gosec
     2  package integration
     3  
     4  import (
     5  	"flag"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"os/exec"
    10  	"path"
    11  	"path/filepath"
    12  	"reflect"
    13  	"runtime"
    14  	"testing"
    15  )
    16  
    17  var update = flag.Bool("update", false, "update golden files")
    18  
    19  var binaryName = "define"
    20  
    21  func fixturePath(t *testing.T, fixture string) string {
    22  	_, filename, _, ok := runtime.Caller(0)
    23  	if !ok {
    24  		t.Fatalf("problems recovering caller information")
    25  	}
    26  
    27  	return filepath.Join(filepath.Dir(filename), fixture)
    28  }
    29  
    30  func writeFixture(t *testing.T, fixture string, content []byte) {
    31  	err := ioutil.WriteFile(fixturePath(t, fixture), content, 0644)
    32  	if err != nil {
    33  		t.Fatal(err)
    34  	}
    35  }
    36  
    37  func loadFixture(t *testing.T, fixture string) string {
    38  	content, err := ioutil.ReadFile(fixturePath(t, fixture))
    39  	if err != nil {
    40  		t.Fatal(err)
    41  	}
    42  
    43  	return string(content)
    44  }
    45  
    46  func TestCliArgs(t *testing.T) {
    47  	tests := []struct {
    48  		name    string
    49  		args    []string
    50  		fixture string
    51  	}{
    52  		{"one argument", []string{"definition"}, "one-argument.golden"},
    53  	}
    54  
    55  	for _, tt := range tests {
    56  		t.Run(tt.name, func(t *testing.T) {
    57  			dir, err := os.Getwd()
    58  			if err != nil {
    59  				t.Fatal(err)
    60  			}
    61  
    62  			cmd := exec.Command(path.Join(dir, "bin", binaryName), tt.args...)
    63  			output, err := cmd.CombinedOutput()
    64  			if err != nil {
    65  				fmt.Printf("debug: dir: %s\n", dir)
    66  				fmt.Printf("debug: cmd: %s\n", path.Join(dir, "bin", binaryName))
    67  				fmt.Printf("debug: args: %v\n", tt.args)
    68  				fmt.Printf("debug: output: %s\n", output)
    69  				fmt.Printf("debug: error: %s\n", err)
    70  				t.Fatal(err)
    71  			}
    72  
    73  			if *update {
    74  				writeFixture(t, tt.fixture, output)
    75  			}
    76  
    77  			actual := string(output)
    78  
    79  			expected := loadFixture(t, tt.fixture)
    80  
    81  			if !reflect.DeepEqual(actual, expected) {
    82  				t.Fatalf("actual = %s, expected = %s", actual, expected)
    83  			}
    84  		})
    85  	}
    86  }
    87  
    88  func TestMain(m *testing.M) {
    89  	err := os.Chdir("..")
    90  	if err != nil {
    91  		fmt.Printf("could not change dir: %v", err)
    92  		os.Exit(1)
    93  	}
    94  	makeCmd := exec.Command("make", "build")
    95  	err = makeCmd.Run()
    96  	if err != nil {
    97  		fmt.Printf("could not make binary for %s: %v", binaryName, err)
    98  		os.Exit(1)
    99  	}
   100  
   101  	os.Exit(m.Run())
   102  }