github.com/clusterize-io/tusk@v0.6.3-0.20211001020217-cfe8a8cd0d4a/runner/file_test.go (about)

     1  package runner
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  )
     9  
    10  func TestSearchForFile(t *testing.T) {
    11  	tmpdir, cleanup := useTempDir(t)
    12  	defer cleanup()
    13  
    14  	emptyDir := mkDir(t, tmpdir, "empty")
    15  
    16  	topDir := mkDir(t, tmpdir, "top")
    17  	topConfig := mkConfigFile(t, topDir, "tusk.yml")
    18  
    19  	yamlDir := mkDir(t, tmpdir, "yaml")
    20  	yamlConfig := mkConfigFile(t, yamlDir, "tusk.yaml")
    21  
    22  	nestedDir := mkDir(t, topDir, "foo", "bar")
    23  	nestedConfig := mkConfigFile(t, nestedDir, "tusk.yml")
    24  
    25  	inheritedDir := mkDir(t, topDir, "baz", "empty")
    26  
    27  	testcases := []struct {
    28  		wd   string
    29  		path string
    30  	}{
    31  		{
    32  			wd:   emptyDir,
    33  			path: "",
    34  		},
    35  		{
    36  			wd:   topDir,
    37  			path: topConfig,
    38  		},
    39  		{
    40  			wd:   yamlDir,
    41  			path: yamlConfig,
    42  		},
    43  		{
    44  			wd:   nestedDir,
    45  			path: nestedConfig,
    46  		},
    47  		{
    48  			wd:   inheritedDir,
    49  			path: topConfig,
    50  		},
    51  	}
    52  
    53  	for _, tt := range testcases {
    54  		if err := os.Chdir(tt.wd); err != nil {
    55  			t.Fatalf("failed to change directory: %v", err)
    56  		}
    57  
    58  		fullPath, err := searchForFile()
    59  		if err != nil {
    60  			t.Errorf("unexpected error: %v", err)
    61  			continue
    62  		}
    63  
    64  		if tt.path != fullPath {
    65  			t.Errorf(
    66  				"SearchForFile(): expected path: %s, actual: %s",
    67  				tt.path, fullPath,
    68  			)
    69  		}
    70  	}
    71  }
    72  
    73  func useTempDir(t *testing.T) (dirname string, cleanup func()) {
    74  	t.Helper()
    75  
    76  	tmpdir, err := ioutil.TempDir("", "tusk-test")
    77  	if err != nil {
    78  		t.Fatalf("failed to create temp dir: %v", err)
    79  	}
    80  
    81  	tmpdir, err = filepath.EvalSymlinks(tmpdir)
    82  	if err != nil {
    83  		t.Fatalf("failed to follow symlink for temp dir: %v", err)
    84  	}
    85  
    86  	oldwd, err := os.Getwd()
    87  	if err != nil {
    88  		t.Fatalf("failed to get working directory: %v", err)
    89  	}
    90  
    91  	if err := os.Chdir(tmpdir); err != nil {
    92  		t.Fatalf("failed to change directory: %v", err)
    93  	}
    94  
    95  	cleanup = func() {
    96  		if err := os.RemoveAll(tmpdir); err != nil {
    97  			t.Logf("failed to remove tmpdir: %v", err)
    98  		}
    99  		if err := os.Chdir(oldwd); err != nil {
   100  			t.Fatalf("failed to change directory: %v", err)
   101  		}
   102  	}
   103  
   104  	return tmpdir, cleanup
   105  }
   106  
   107  func mkDir(t *testing.T, elem ...string) string {
   108  	t.Helper()
   109  
   110  	fullPath := filepath.Join(elem...)
   111  	if err := os.MkdirAll(fullPath, 0750); err != nil {
   112  		t.Fatalf("failed to make directory: %v", err)
   113  	}
   114  
   115  	return fullPath
   116  }
   117  
   118  func mkConfigFile(t *testing.T, dir, fileName string) string {
   119  	t.Helper()
   120  
   121  	fullPath := filepath.Join(dir, fileName)
   122  	if err := ioutil.WriteFile(fullPath, []byte{}, 0644); err != nil {
   123  		t.Fatalf("failed to create file: %v", err)
   124  	}
   125  
   126  	return fullPath
   127  }