diff options
| -rw-r--r-- | data/datasource.go | 11 | ||||
| -rw-r--r-- | data/datasource_test.go | 44 | ||||
| -rw-r--r-- | tests/integration/datasources_file_test.go | 6 |
3 files changed, 56 insertions, 5 deletions
diff --git a/data/datasource.go b/data/datasource.go index 2073ef54..1fcccf98 100644 --- a/data/datasource.go +++ b/data/datasource.go @@ -230,7 +230,7 @@ func parseSource(value string) (source *Source, err error) { err = errors.Errorf("Invalid datasource (%s). Must provide an alias with files not in working directory", value) return nil, err } - source.URL, err = absURL(f) + source.URL, err = absFileURL(f) if err != nil { return nil, err } @@ -272,7 +272,7 @@ func parseSourceURL(value string) (*url.URL, error) { } if !srcURL.IsAbs() { - srcURL, err = absURL(value) + srcURL, err = absFileURL(value) if err != nil { return nil, err } @@ -280,7 +280,7 @@ func parseSourceURL(value string) (*url.URL, error) { return srcURL, nil } -func absURL(value string) (*url.URL, error) { +func absFileURL(value string) (*url.URL, error) { cwd, err := os.Getwd() if err != nil { return nil, errors.Wrapf(err, "can't get working directory") @@ -290,8 +290,9 @@ func absURL(value string) (*url.URL, error) { Scheme: "file", Path: urlCwd + "/", } - relURL := &url.URL{ - Path: value, + relURL, err := url.Parse(value) + if err != nil { + return nil, fmt.Errorf("can't parse value %s as URL: %w", value, err) } resolved := baseURL.ResolveReference(relURL) // deal with Windows drive letters diff --git a/data/datasource_test.go b/data/datasource_test.go index 5d627b40..cdef3945 100644 --- a/data/datasource_test.go +++ b/data/datasource_test.go @@ -3,6 +3,8 @@ package data import ( "fmt" "net/url" + "os" + "path/filepath" "runtime" "strings" "testing" @@ -303,6 +305,15 @@ func TestDefineDatasource(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "data", s.Alias) assert.Nil(t, s.URL) + + d = &Data{} + _, err = d.DefineDatasource("data", "/otherdir/foo?type=application/x-env") + s = d.Sources["data"] + assert.NoError(t, err) + assert.Equal(t, "data", s.Alias) + m, err := s.mimeType("") + assert.NoError(t, err) + assert.Equal(t, "application/x-env", m) } func TestMimeType(t *testing.T) { @@ -411,3 +422,36 @@ func TestQueryParse(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, expected, u) } + +func TestAbsFileURL(t *testing.T) { + cwd, _ := os.Getwd() + // make this pass on Windows + cwd = filepath.ToSlash(cwd) + expected := &url.URL{ + Scheme: "file", + Host: "", + Path: "/tmp/foo", + } + u, err := absFileURL("/tmp/foo") + assert.NoError(t, err) + assert.EqualValues(t, expected, u) + + expected = &url.URL{ + Scheme: "file", + Host: "", + Path: cwd + "/tmp/foo", + } + u, err = absFileURL("tmp/foo") + assert.NoError(t, err) + assert.EqualValues(t, expected, u) + + expected = &url.URL{ + Scheme: "file", + Host: "", + Path: cwd + "/tmp/foo", + RawQuery: "q=p", + } + u, err = absFileURL("tmp/foo?q=p") + assert.NoError(t, err) + assert.EqualValues(t, expected, u) +} diff --git a/tests/integration/datasources_file_test.go b/tests/integration/datasources_file_test.go index 6966393e..8304bca7 100644 --- a/tests/integration/datasources_file_test.go +++ b/tests/integration/datasources_file_test.go @@ -19,6 +19,7 @@ func (s *FileDatasourcesSuite) SetUpSuite(c *C) { s.tmpDir = fs.NewDir(c, "gomplate-inttests", fs.WithFiles(map[string]string{ "config.json": `{"foo": {"bar": "baz"}}`, + "ajsonfile": `{"foo": {"bar": "baz"}}`, "encrypted.json": `{ "_public_key": "dfcf98785869cdfc4a59273bbdfe1bfcf6c44850a11ea9d84db21c89a802c057", "password": "EJ[1:Cb1AY94Dl76xwHHrnJyh+Y+fAeovijPlFQZXSAuvZBc=:oCGZM6lbeXXOl2ONSKfLQ0AgaltrTpNU:VjegqQPPkOK1hSylMAbmcfusQImfkHCWZw==]" @@ -100,6 +101,11 @@ func (s *FileDatasourcesSuite) TestFileDatasources(c *C) { result.Assert(c, icmd.Expected{ExitCode: 0, Out: "foobarbaz"}) result = icmd.RunCommand(GomplateBin, + "-i", `foo{{defineDatasource "config" `+"`"+s.tmpDir.Join("ajsonfile")+"?type=application/json`"+`}}bar{{(datasource "config").foo.bar}}`, + ) + result.Assert(c, icmd.Expected{ExitCode: 0, Out: "foobarbaz"}) + + result = icmd.RunCommand(GomplateBin, "-d", "config="+s.tmpDir.Join("config.yml"), "-i", `{{(datasource "config").foo.bar}}`, ) |
