envfilesubst/scanner/scanner_test.go

167 lines
3.2 KiB
Go

package scanner_test
import (
"bytes"
"strings"
"testing"
"git.netflux.io/rob/envfilesubst/scanner"
"github.com/stretchr/testify/assert"
)
func TestScanner(t *testing.T) {
envfile := `FOO=bar
BAR=baz
BAZ=123
FOO_BAR=true
QUUX1=2
`
testCases := []struct {
name string
envfile string
input string
wantOutput string
wantError string
}{
{
name: "single variable",
envfile: envfile,
input: "$FOO",
wantOutput: "bar\n",
},
{
name: "input with prefix text",
envfile: envfile,
input: "baz $FOO",
wantOutput: "baz bar\n",
},
{
name: "input with suffix text",
envfile: envfile,
input: "$FOO baz",
wantOutput: "bar baz\n",
},
{
name: "input with prefix and suffix text",
envfile: envfile,
input: "baz $FOO qux",
wantOutput: "baz bar qux\n",
},
{
name: "input with prefix and suffix text and whitespace",
envfile: envfile,
input: "\tbaz $FOO qux ",
wantOutput: "\tbaz bar qux \n",
},
{
name: "single variable with curly brackets",
envfile: envfile,
input: "${FOO}",
wantOutput: "bar\n",
},
{
name: "multiple variables on a single line",
envfile: envfile,
input: "qux ${FOO} quxx $BAR $BAZ",
wantOutput: "qux bar quxx baz 123\n",
},
{
name: "non-existent variable",
envfile: envfile,
input: "$NOPE",
wantOutput: "$NOPE\n",
},
{
name: "non-existent variable with curly brackets",
envfile: envfile,
input: "${NOPE}",
wantOutput: "${NOPE}\n",
},
{
name: "multiple variables including non-existent",
envfile: envfile,
input: "$FOO $BAR $NOPE $BAZ",
wantOutput: "bar baz $NOPE 123\n",
},
{
name: "variable name with an underscore",
envfile: envfile,
input: "$FOO_BAR is true",
wantOutput: "true is true\n",
},
{
name: "variable name with a number",
envfile: envfile,
input: "$QUUX1 + ${QUUX1} = 4",
wantOutput: "2 + 2 = 4\n",
},
{
name: "multiline input ending with newline",
envfile: envfile,
input: `---
metadata:
name: "$FOO"
labels:
bar: "$BAR"
baz: "$BAZ"
`,
wantOutput: `---
metadata:
name: "bar"
labels:
bar: "baz"
baz: "123"
`,
},
{
name: "multiline input not ending with newline",
envfile: envfile,
input: `---
metadata:
name: "$FOO"
labels:
bar: "$BAR"
baz: "$BAZ"`,
wantOutput: `---
metadata:
name: "bar"
labels:
bar: "baz"
baz: "123"
`,
},
{
name: "empty string",
envfile: envfile,
input: "",
wantOutput: "",
},
{
name: "multiline with only newlines",
envfile: envfile,
input: "\n\n\n\n\n",
wantOutput: "\n\n\n\n\n",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
envfile := strings.NewReader(strings.TrimSpace(tc.envfile))
input := strings.NewReader(tc.input)
var output bytes.Buffer
scanner := scanner.New(&output, input, envfile)
err := scanner.Scan()
if tc.wantError == "" {
assert.NoError(t, err)
assert.Equal(t, tc.wantOutput, output.String())
} else {
assert.EqualError(t, err, tc.wantError)
}
})
}
}