github.com/wmuizelaar/kpt@v0.0.0-20221018115725-bd564717b2ed/thirdparty/cmdconfig/commands/runner/runner_test.go (about) 1 // Copyright 2019 The Kubernetes Authors. 2 // SPDX-License-Identifier: Apache-2.0 3 4 package runner 5 6 import ( 7 "bytes" 8 "io" 9 "os" 10 "path/filepath" 11 "strings" 12 "testing" 13 14 "github.com/stretchr/testify/assert" 15 "sigs.k8s.io/kustomize/kyaml/errors" 16 ) 17 18 func TestExecuteCmdOnPkgs(t *testing.T) { 19 var tests = []struct { 20 name string 21 recurse bool 22 pkgPath string 23 needOpenAPI bool 24 errMsg string 25 expectedOut string 26 }{ 27 { 28 name: "need_Kptfile_error", 29 recurse: true, 30 needOpenAPI: true, 31 pkgPath: "subpkg1/subdir1", 32 errMsg: `unable to find "Kptfile" in package`, 33 }, 34 { 35 name: "Kptfile_not_needed_no_err", 36 recurse: true, 37 needOpenAPI: false, 38 pkgPath: "subpkg1/subdir1", 39 expectedOut: `${baseDir}/subpkg1/subdir1/ 40 `, 41 }, 42 { 43 name: "executeCmd_returns_error", 44 recurse: true, 45 needOpenAPI: false, 46 pkgPath: "subpkg4", 47 expectedOut: `${baseDir}/subpkg4/ 48 `, 49 errMsg: `this command returns an error if package has error.txt file`, 50 }, 51 { 52 name: "executeCmd_prints_pkgpaths", 53 recurse: true, 54 needOpenAPI: false, 55 pkgPath: "subpkg2", 56 expectedOut: `${baseDir}/subpkg2/ 57 58 ${baseDir}/subpkg2/subpkg3/ 59 `, 60 }, 61 } 62 63 dir, err := os.MkdirTemp("", "") 64 if !assert.NoError(t, err) { 65 t.FailNow() 66 } 67 defer os.RemoveAll(dir) 68 err = createTestDirStructure(dir) 69 if !assert.NoError(t, err) { 70 t.FailNow() 71 } 72 73 for i := range tests { 74 test := tests[i] 75 t.Run(test.name, func(t *testing.T) { 76 actual := &bytes.Buffer{} 77 r := &TestRunner{} 78 e := ExecuteCmdOnPkgs{ 79 NeedOpenAPI: test.needOpenAPI, 80 Writer: actual, 81 RootPkgPath: filepath.Join(dir, test.pkgPath), 82 RecurseSubPackages: test.recurse, 83 CmdRunner: r, 84 } 85 err := e.Execute() 86 if test.errMsg == "" { 87 if !assert.NoError(t, err) { 88 t.FailNow() 89 } 90 } else { 91 if !assert.Error(t, err) { 92 t.FailNow() 93 } 94 if !assert.Contains(t, err.Error(), test.errMsg) { 95 t.FailNow() 96 } 97 } 98 99 // normalize path format for windows 100 actualNormalized := strings.ReplaceAll( 101 strings.ReplaceAll(actual.String(), "\\", "/"), 102 "//", "/") 103 104 expected := strings.ReplaceAll(test.expectedOut, "${baseDir}", dir+"/") 105 expectedNormalized := strings.ReplaceAll( 106 strings.ReplaceAll(expected, "\\", "/"), 107 "//", "/") 108 if !assert.Equal(t, expectedNormalized, actualNormalized) { 109 t.FailNow() 110 } 111 }) 112 } 113 } 114 115 func createTestDirStructure(dir string) error { 116 /* 117 Adds the folders to the input dir with following structure 118 dir 119 ├── subpkg1 120 │ ├── Kptfile 121 │ └── subdir1 122 ├── subpkg4 123 │ ├── Kptfile 124 │ └── error.txt 125 └── subpkg2 126 ├── subpkg3 127 │ ├── Kptfile 128 │ └── subdir2 129 └── Kptfile 130 */ 131 err := os.MkdirAll(filepath.Join(dir, "subpkg1/subdir1"), 0777|os.ModeDir) 132 if err != nil { 133 return err 134 } 135 err = os.MkdirAll(filepath.Join(dir, "subpkg2/subpkg3/subdir2"), 0777|os.ModeDir) 136 if err != nil { 137 return err 138 } 139 err = os.MkdirAll(filepath.Join(dir, "subpkg4"), 0777|os.ModeDir) 140 if err != nil { 141 return err 142 } 143 err = os.WriteFile(filepath.Join(dir, "subpkg1", "Kptfile"), []byte(""), 0777) 144 if err != nil { 145 return err 146 } 147 err = os.WriteFile(filepath.Join(dir, "subpkg2", "Kptfile"), []byte(""), 0777) 148 if err != nil { 149 return err 150 } 151 err = os.WriteFile(filepath.Join(dir, "subpkg2/subpkg3", "Kptfile"), []byte(""), 0777) 152 if err != nil { 153 return err 154 } 155 err = os.WriteFile(filepath.Join(dir, "subpkg4", "error.txt"), []byte(""), 0777) 156 if err != nil { 157 return err 158 } 159 err = os.WriteFile(filepath.Join(dir, "subpkg4", "Kptfile"), []byte(""), 0777) 160 if err != nil { 161 return err 162 } 163 err = os.WriteFile(filepath.Join(dir, "Kptfile"), []byte(""), 0777) 164 if err != nil { 165 return err 166 } 167 return nil 168 } 169 170 type TestRunner struct{} 171 172 func (r *TestRunner) ExecuteCmd(w io.Writer, pkgPath string) error { 173 children, err := os.ReadDir(pkgPath) 174 if err != nil { 175 return err 176 } 177 for _, child := range children { 178 if child.Name() == "error.txt" { 179 return errors.Errorf("this command returns an error if package has error.txt file") 180 } 181 } 182 return nil 183 }