git-lfs/filepathfilter/filepathfilter_test.go

143 lines
3.9 KiB
Go

package filepathfilter
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPatternMatch(t *testing.T) {
for _, wildcard := range []string{`*`, `.`, `./`, `.\`} {
assertPatternMatch(t, wildcard,
"a",
"a/",
"a.a",
"a/b",
"a/b/",
"a/b.b",
"a/b/c",
"a/b/c/",
"a/b/c.c",
)
}
assertPatternMatch(t, "filename.txt", "filename.txt")
assertPatternMatch(t, "*.txt", "filename.txt")
refutePatternMatch(t, "*.tx", "filename.txt")
assertPatternMatch(t, "f*.txt", "filename.txt")
refutePatternMatch(t, "g*.txt", "filename.txt")
assertPatternMatch(t, "file*", "filename.txt")
refutePatternMatch(t, "file", "filename.txt")
// With no path separators, should match in subfolders
assertPatternMatch(t, "*.txt", "sub/filename.txt")
refutePatternMatch(t, "*.tx", "sub/filename.txt")
assertPatternMatch(t, "f*.txt", "sub/filename.txt")
refutePatternMatch(t, "g*.txt", "sub/filename.txt")
assertPatternMatch(t, "file*", "sub/filename.txt")
refutePatternMatch(t, "file", "sub/filename.txt")
// matches only in subdir
assertPatternMatch(t, "sub/*.txt", "sub/filename.txt")
refutePatternMatch(t, "sub/*.txt",
"top/sub/filename.txt",
"sub/filename.dat",
"other/filename.txt",
)
// Needs wildcard for exact filename
assertPatternMatch(t, "**/filename.txt", "sub/sub/sub/filename.txt")
// Should not match dots to subparts
refutePatternMatch(t, "*.ign", "sub/shouldignoreme.txt")
// Path specific
assertPatternMatch(t, "sub",
"sub/",
"sub",
"sub/filename.txt",
"top/sub/",
"top/sub",
"top/sub/filename.txt",
)
assertPatternMatch(t, "sub/", "sub/filename.txt", "top/sub/filename.txt")
assertPatternMatch(t, "/sub", "sub/", "sub", "sub/filename.txt")
assertPatternMatch(t, "/sub/", "sub/filename.txt")
refutePatternMatch(t, "/sub", "subfilename.txt", "top/sub/", "top/sub", "top/sub/filename.txt")
refutePatternMatch(t, "sub", "subfilename.txt")
refutePatternMatch(t, "sub/", "subfilename.txt")
refutePatternMatch(t, "/sub/", "subfilename.txt", "top/sub/filename.txt")
// nested path
assertPatternMatch(t, "top/sub",
"top/sub/filename.txt",
"top/sub/",
"top/sub",
"root/top/sub/filename.txt",
"root/top/sub/",
"root/top/sub",
)
assertPatternMatch(t, "top/sub/", "top/sub/filename.txt")
assertPatternMatch(t, "top/sub/", "root/top/sub/filename.txt")
assertPatternMatch(t, "/top/sub", "top/sub/", "top/sub", "top/sub/filename.txt")
assertPatternMatch(t, "/top/sub/", "top/sub/filename.txt")
refutePatternMatch(t, "top/sub", "top/subfilename.txt")
refutePatternMatch(t, "top/sub/", "top/subfilename.txt")
refutePatternMatch(t, "/top/sub",
"top/subfilename.txt",
"root/top/sub/filename.txt",
"root/top/sub/",
"root/top/sub",
)
refutePatternMatch(t, "/top/sub/",
"root/top/sub/filename.txt",
"top/subfilename.txt",
)
// Absolute
assertPatternMatch(t, "*.dat", "/path/to/sub/.git/test.dat")
assertPatternMatch(t, "**/.git", "/path/to/sub/.git")
// Match anything
assertPatternMatch(t, ".", "path.txt")
assertPatternMatch(t, "./", "path.txt")
assertPatternMatch(t, ".\\", "path.txt")
}
func assertPatternMatch(t *testing.T, pattern string, filenames ...string) {
p := NewPattern(pattern)
for _, filename := range filenames {
assert.True(t, p.Match(filename), "%q should match pattern %q", filename, pattern)
}
}
func refutePatternMatch(t *testing.T, pattern string, filenames ...string) {
p := NewPattern(pattern)
for _, filename := range filenames {
assert.False(t, p.Match(filename), "%q should not match pattern %q", filename, pattern)
}
}
type filterTest struct {
expectedResult bool
expectedPattern string
includes []string
excludes []string
}
func TestFilterReportsIncludePatterns(t *testing.T) {
filter := New([]string{"*.foo", "*.bar"}, nil)
assert.Equal(t, []string{"*.foo", "*.bar"}, filter.Include())
}
func TestFilterReportsExcludePatterns(t *testing.T) {
filter := New(nil, []string{"*.baz", "*.quux"})
assert.Equal(t, []string{"*.baz", "*.quux"}, filter.Exclude())
}