github.com/wuhuizuo/gomplate@v3.5.0+incompatible/tests/integration/inputdir_test.go (about) 1 //+build integration 2 3 package integration 4 5 import ( 6 "io/ioutil" 7 "os" 8 "runtime" 9 10 . "gopkg.in/check.v1" 11 12 "github.com/gotestyourself/gotestyourself/assert" 13 "github.com/gotestyourself/gotestyourself/fs" 14 "github.com/gotestyourself/gotestyourself/icmd" 15 tassert "github.com/stretchr/testify/assert" 16 ) 17 18 type InputDirSuite struct { 19 tmpDir *fs.Dir 20 } 21 22 var _ = Suite(&InputDirSuite{}) 23 24 func (s *InputDirSuite) SetUpTest(c *C) { 25 s.tmpDir = fs.NewDir(c, "gomplate-inttests", 26 fs.WithFile("config.yml", "one: eins\ntwo: deux\n"), 27 fs.WithFile("filemap.json", `{"eins.txt":"uno","deux.txt":"dos","drei.sh":"tres","vier.txt":"quatro"}`), 28 fs.WithFile("out.t", `{{- /* .in may contain a directory name - we want to preserve that */ -}} 29 {{ $f := filepath.Base .in -}} 30 out/{{ .in | strings.ReplaceAll $f (index .filemap $f) }}.out 31 `), 32 fs.WithDir("in", 33 fs.WithFile("eins.txt", `{{ (ds "config").one }}`, fs.WithMode(0644)), 34 fs.WithDir("inner", 35 fs.WithFile("deux.txt", `{{ (ds "config").two }}`, fs.WithMode(0444)), 36 ), 37 fs.WithFile("drei.sh", `#!/bin/sh\necho "hello world"\n`, fs.WithMode(0755)), 38 fs.WithFile("vier.txt", `{{ (ds "config").two }} * {{ (ds "config").two }}`, fs.WithMode(0544)), 39 ), 40 fs.WithDir("out"), 41 fs.WithDir("bad_in", 42 fs.WithFile("bad.tmpl", "{{end}}"), 43 ), 44 ) 45 } 46 47 func (s *InputDirSuite) TearDownTest(c *C) { 48 s.tmpDir.Remove() 49 } 50 51 func (s *InputDirSuite) TestInputDir(c *C) { 52 result := icmd.RunCommand(GomplateBin, 53 "--input-dir", s.tmpDir.Join("in"), 54 "--output-dir", s.tmpDir.Join("out"), 55 "-d", "config="+s.tmpDir.Join("config.yml"), 56 ) 57 result.Assert(c, icmd.Success) 58 59 files, err := ioutil.ReadDir(s.tmpDir.Join("out")) 60 assert.NilError(c, err) 61 tassert.Len(c, files, 4) 62 63 files, err = ioutil.ReadDir(s.tmpDir.Join("out", "inner")) 64 assert.NilError(c, err) 65 tassert.Len(c, files, 1) 66 67 testdata := []struct { 68 path string 69 mode os.FileMode 70 content string 71 }{ 72 {s.tmpDir.Join("out", "eins.txt"), 0644, "eins"}, 73 {s.tmpDir.Join("out", "inner", "deux.txt"), 0444, "deux"}, 74 {s.tmpDir.Join("out", "drei.sh"), 0755, `#!/bin/sh\necho "hello world"\n`}, 75 {s.tmpDir.Join("out", "vier.txt"), 0544, "deux * deux"}, 76 } 77 for _, v := range testdata { 78 info, err := os.Stat(v.path) 79 assert.NilError(c, err) 80 // chmod support on Windows is pretty weak for now 81 if runtime.GOOS != "windows" { 82 assert.Equal(c, v.mode, info.Mode(), v.path) 83 } 84 content, err := ioutil.ReadFile(v.path) 85 assert.NilError(c, err) 86 assert.Equal(c, v.content, string(content)) 87 } 88 } 89 90 func (s *InputDirSuite) TestInputDirWithModeOverride(c *C) { 91 result := icmd.RunCommand(GomplateBin, 92 "--input-dir", s.tmpDir.Join("in"), 93 "--output-dir", s.tmpDir.Join("out"), 94 "--chmod", "0601", 95 "-d", "config="+s.tmpDir.Join("config.yml"), 96 ) 97 result.Assert(c, icmd.Success) 98 99 files, err := ioutil.ReadDir(s.tmpDir.Join("out")) 100 assert.NilError(c, err) 101 tassert.Len(c, files, 4) 102 103 files, err = ioutil.ReadDir(s.tmpDir.Join("out", "inner")) 104 assert.NilError(c, err) 105 tassert.Len(c, files, 1) 106 107 testdata := []struct { 108 path string 109 mode os.FileMode 110 content string 111 }{ 112 {s.tmpDir.Join("out", "eins.txt"), 0601, "eins"}, 113 {s.tmpDir.Join("out", "inner", "deux.txt"), 0601, "deux"}, 114 {s.tmpDir.Join("out", "drei.sh"), 0601, `#!/bin/sh\necho "hello world"\n`}, 115 {s.tmpDir.Join("out", "vier.txt"), 0601, "deux * deux"}, 116 } 117 for _, v := range testdata { 118 info, err := os.Stat(v.path) 119 assert.NilError(c, err) 120 // chmod support on Windows is pretty weak for now 121 if runtime.GOOS != "windows" { 122 assert.Equal(c, v.mode, info.Mode()) 123 } 124 content, err := ioutil.ReadFile(v.path) 125 assert.NilError(c, err) 126 assert.Equal(c, v.content, string(content)) 127 } 128 } 129 130 func (s *InputDirSuite) TestOutputMapInline(c *C) { 131 result := icmd.RunCmd(icmd.Command(GomplateBin, 132 "--input-dir", s.tmpDir.Join("in"), 133 "--output-map", `OUT/{{ strings.ToUpper .in }}`, 134 "-d", "config.yml", 135 ), func(c *icmd.Cmd) { 136 c.Dir = s.tmpDir.Path() 137 }) 138 result.Assert(c, icmd.Success) 139 140 files, err := ioutil.ReadDir(s.tmpDir.Join("OUT")) 141 assert.NilError(c, err) 142 tassert.Len(c, files, 4) 143 144 files, err = ioutil.ReadDir(s.tmpDir.Join("OUT", "INNER")) 145 assert.NilError(c, err) 146 tassert.Len(c, files, 1) 147 148 testdata := []struct { 149 path string 150 mode os.FileMode 151 content string 152 }{ 153 {s.tmpDir.Join("OUT", "EINS.TXT"), 0644, "eins"}, 154 {s.tmpDir.Join("OUT", "INNER", "DEUX.TXT"), 0444, "deux"}, 155 {s.tmpDir.Join("OUT", "DREI.SH"), 0755, `#!/bin/sh\necho "hello world"\n`}, 156 {s.tmpDir.Join("OUT", "VIER.TXT"), 0544, "deux * deux"}, 157 } 158 for _, v := range testdata { 159 info, err := os.Stat(v.path) 160 assert.NilError(c, err) 161 // chmod support on Windows is pretty weak for now 162 if runtime.GOOS != "windows" { 163 assert.Equal(c, v.mode, info.Mode()) 164 } 165 content, err := ioutil.ReadFile(v.path) 166 assert.NilError(c, err) 167 assert.Equal(c, v.content, string(content)) 168 } 169 } 170 171 func (s *InputDirSuite) TestOutputMapExternal(c *C) { 172 result := icmd.RunCmd(icmd.Command(GomplateBin, 173 "--input-dir", s.tmpDir.Join("in"), 174 "--output-map", `{{ template "out" . }}`, 175 "-t", "out=out.t", 176 "-c", "filemap.json", 177 "-d", "config.yml", 178 ), func(c *icmd.Cmd) { 179 c.Dir = s.tmpDir.Path() 180 }) 181 result.Assert(c, icmd.Success) 182 183 files, err := ioutil.ReadDir(s.tmpDir.Join("out")) 184 assert.NilError(c, err) 185 tassert.Len(c, files, 4) 186 187 files, err = ioutil.ReadDir(s.tmpDir.Join("out", "inner")) 188 assert.NilError(c, err) 189 tassert.Len(c, files, 1) 190 191 testdata := []struct { 192 path string 193 mode os.FileMode 194 content string 195 }{ 196 {s.tmpDir.Join("out", "uno.out"), 0644, "eins"}, 197 {s.tmpDir.Join("out", "inner", "dos.out"), 0444, "deux"}, 198 {s.tmpDir.Join("out", "tres.out"), 0755, `#!/bin/sh\necho "hello world"\n`}, 199 {s.tmpDir.Join("out", "quatro.out"), 0544, "deux * deux"}, 200 } 201 for _, v := range testdata { 202 info, err := os.Stat(v.path) 203 assert.NilError(c, err) 204 // chmod support on Windows is pretty weak for now 205 if runtime.GOOS != "windows" { 206 assert.Equal(c, v.mode, info.Mode()) 207 } 208 content, err := ioutil.ReadFile(v.path) 209 assert.NilError(c, err) 210 assert.Equal(c, v.content, string(content)) 211 } 212 } 213 214 func (s *InputDirSuite) TestDefaultOutputDir(c *C) { 215 result := icmd.RunCmd(icmd.Command(GomplateBin, 216 "--input-dir", s.tmpDir.Join("in"), 217 "-d", "config="+s.tmpDir.Join("config.yml"), 218 ), func(c *icmd.Cmd) { 219 c.Dir = s.tmpDir.Join("out") 220 }) 221 result.Assert(c, icmd.Success) 222 223 files, err := ioutil.ReadDir(s.tmpDir.Join("out")) 224 assert.NilError(c, err) 225 tassert.Len(c, files, 4) 226 227 files, err = ioutil.ReadDir(s.tmpDir.Join("out", "inner")) 228 assert.NilError(c, err) 229 tassert.Len(c, files, 1) 230 231 content, err := ioutil.ReadFile(s.tmpDir.Join("out", "eins.txt")) 232 assert.NilError(c, err) 233 assert.Equal(c, "eins", string(content)) 234 235 content, err = ioutil.ReadFile(s.tmpDir.Join("out", "inner", "deux.txt")) 236 assert.NilError(c, err) 237 assert.Equal(c, "deux", string(content)) 238 239 content, err = ioutil.ReadFile(s.tmpDir.Join("out", "drei.sh")) 240 assert.NilError(c, err) 241 assert.Equal(c, `#!/bin/sh\necho "hello world"\n`, string(content)) 242 243 content, err = ioutil.ReadFile(s.tmpDir.Join("out", "vier.txt")) 244 assert.NilError(c, err) 245 assert.Equal(c, `deux * deux`, string(content)) 246 } 247 248 func (s *InputDirSuite) TestReportsFilenameWithBadInputFile(c *C) { 249 result := icmd.RunCommand(GomplateBin, 250 "--input-dir", s.tmpDir.Join("bad_in"), 251 "--output-dir", s.tmpDir.Join("out"), 252 "-d", "config="+s.tmpDir.Join("config.yml"), 253 ) 254 result.Assert(c, icmd.Expected{ 255 ExitCode: 1, 256 Err: "template: " + s.tmpDir.Join("bad_in", "bad.tmpl") + ":1: unexpected {{end}}", 257 }) 258 }