Files
kustomize/kyaml/kio/ignorefilesmatcher_test.go
2021-06-16 17:16:20 -07:00

269 lines
6.5 KiB
Go

// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package kio
import (
"io/ioutil"
"path/filepath"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"sigs.k8s.io/kustomize/kyaml/filesys"
)
func TestIgnoreFilesMatcher_readIgnoreFile(t *testing.T) {
testCases := []struct {
name string
writeIgnoreFile bool
isMatch bool
}{
{
name: "has .krmignore file",
writeIgnoreFile: true,
isMatch: true,
},
{
name: "no .krmignore file",
writeIgnoreFile: false,
isMatch: false,
},
}
const (
ignoreFileName = ".krmignore"
testFileName = "testfile.yaml"
ignoreFileBody = "\n" + testFileName + "\n"
)
fsMakers := map[string]func(bool) (string, filesys.FileSystem){
// onDisk creates a temp directory and returns a nil FileSystem, testing
// the normal conditions under which ignoreFileMatcher is used.
"onDisk": func(writeIgnoreFile bool) (string, filesys.FileSystem) {
dir, err := ioutil.TempDir("", "kyaml-test")
require.NoError(t, err)
if writeIgnoreFile {
ignoreFilePath := filepath.Join(dir, ignoreFileName)
require.NoError(t, ioutil.WriteFile(ignoreFilePath, []byte(ignoreFileBody), 0600))
}
testFilePath := filepath.Join(dir, testFileName)
require.NoError(t, ioutil.WriteFile(testFilePath, []byte{}, 0600))
return dir, nil
},
// inMem creates an in-memory FileSystem and returns it.
"inMem": func(writeIgnoreFile bool) (string, filesys.FileSystem) {
fs := filesys.MakeEmptyDirInMemory()
if writeIgnoreFile {
require.NoError(t, fs.WriteFile(ignoreFileName, []byte(ignoreFileBody)))
}
require.NoError(t, fs.WriteFile(testFileName, nil))
return ".", fs
},
}
for name, fsMaker := range fsMakers {
t.Run(name, func(t *testing.T) {
fsMaker := fsMaker
for i := range testCases {
test := testCases[i]
dir, fs := fsMaker(test.writeIgnoreFile)
t.Run(test.name, func(t *testing.T) {
m := ignoreFilesMatcher{}
m.fs.Set(fs)
require.NoError(t, m.readIgnoreFile(dir))
require.Equal(t, test.isMatch, m.matchFile(filepath.Join(dir, testFileName)))
})
}
})
}
}
var (
readFileA = []byte(`
a: a
---
c: c
`)
readFileB = []byte(`
b: b
`)
)
func TestLocalPackageReader_Read_ignoreFile(t *testing.T) {
testCases := []struct {
name string
directories []string
files map[string][]byte
expected []string
}{
{
name: "ignore file",
directories: []string{
filepath.Join("a", "b"),
filepath.Join("a", "c"),
},
files: map[string][]byte{
filepath.Join("pkgFile"): {},
filepath.Join("a", "b", "a_test.yaml"): readFileA,
filepath.Join("a", "c", "c_test.yaml"): readFileB,
filepath.Join(".krmignore"): []byte(`
a/c/c_test.yaml
`,
),
},
expected: []string{
`a: a`,
`c: c`,
},
},
{
name: "ignore folder",
directories: []string{
filepath.Join("a", "b"),
filepath.Join("a", "c"),
},
files: map[string][]byte{
filepath.Join("pkgFile"): {},
filepath.Join("a", "b", "a_test.yaml"): readFileA,
filepath.Join("a", "c", "c_test.yaml"): readFileB,
filepath.Join(".krmignore"): []byte(`
a/c
`,
),
},
expected: []string{
`a: a`,
`c: c`,
},
},
{
name: "krmignore file in subpackage",
directories: []string{
filepath.Join("a", "c"),
},
files: map[string][]byte{
filepath.Join("pkgFile"): {},
filepath.Join("a", "c", "a_test.yaml"): readFileA,
filepath.Join("a", "c", "c_test.yaml"): readFileB,
filepath.Join(".krmignore"): []byte(`
d/e/f.yaml
`,
),
filepath.Join("a", "c", "pkgFile"): {},
filepath.Join("a", "c", ".krmignore"): []byte(`
a_test.yaml
`),
},
expected: []string{
`b: b`,
},
},
{
name: "krmignore files does not affect subpackages",
directories: []string{
filepath.Join("a", "c"),
},
files: map[string][]byte{
filepath.Join("pkgFile"): {},
filepath.Join("a", "c", "a_test.yaml"): readFileA,
filepath.Join("a", "c", "c_test.yaml"): readFileB,
filepath.Join(".krmignore"): []byte(`
a/c/c_test.yaml
`,
),
filepath.Join("a", "c", "pkgFile"): {},
filepath.Join("a", "c", ".krmignore"): []byte(`
a_test.yaml
`),
},
expected: []string{
`b: b`,
},
},
{
name: "handles a combination of packages and directories",
directories: []string{
filepath.Join("a"),
filepath.Join("d", "e"),
filepath.Join("f"),
},
files: map[string][]byte{
filepath.Join("pkgFile"): {},
filepath.Join("d", "pkgFile"): {},
filepath.Join("d", "e", "pkgFile"): {},
filepath.Join("f", "pkgFile"): {},
filepath.Join("manifest.yaml"): []byte(`root: root`),
filepath.Join("a", "manifest.yaml"): []byte(`a: a`),
filepath.Join("d", "manifest.yaml"): []byte(`d: d`),
filepath.Join("d", "e", "manifest.yaml"): []byte(`e: e`),
filepath.Join("f", "manifest.yaml"): []byte(`f: f`),
filepath.Join("d", ".krmignore"): []byte(`
manifest.yaml
`),
},
expected: []string{
`a: a`,
`e: e`,
`f: f`,
`root: root`,
},
},
{
name: "ignore file can exclude subpackages",
directories: []string{
filepath.Join("a"),
},
files: map[string][]byte{
filepath.Join("pkgFile"): {},
filepath.Join("a", "pkgFile"): {},
filepath.Join("manifest.yaml"): []byte(`root: root`),
filepath.Join("a", "manifest.yaml"): []byte(`a: a`),
filepath.Join(".krmignore"): []byte(`
a
`),
},
expected: []string{
`root: root`,
},
},
}
for i := range testCases {
test := testCases[i]
t.Run(test.name, func(t *testing.T) {
s := SetupDirectories(t, test.directories...)
defer s.Clean()
for path, content := range test.files {
s.WriteFile(t, path, content)
}
// empty path
rfr := LocalPackageReader{
PackagePath: s.Root,
IncludeSubpackages: true,
PackageFileName: "pkgFile",
OmitReaderAnnotations: true,
}
nodes, err := rfr.Read()
if !assert.NoError(t, err) {
assert.FailNow(t, err.Error())
}
if !assert.Len(t, nodes, len(test.expected)) {
assert.FailNow(t, "wrong number items")
}
for i, node := range nodes {
val, err := node.String()
assert.NoError(t, err)
want := strings.ReplaceAll(test.expected[i], "${SEP}", string(filepath.Separator))
assert.Equal(t, strings.TrimSpace(want), strings.TrimSpace(val))
}
})
}
}