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  }