github.com/ryicoh/gitignore@v0.0.0-20220510063239-92217ecbc0c1/gitignore_test.go (about)

     1  package gitignore
     2  
     3  import (
     4  	"github.com/stretchr/testify/assert"
     5  	"io/fs"
     6  	"os"
     7  	"path/filepath"
     8  	"sort"
     9  	"strings"
    10  	"testing"
    11  )
    12  
    13  func giFromStr(root string, s string) (*Gitignore, error) {
    14  	builder, err := NewGitignoreBuilder(root)
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  	if err := builder.AddString(nil, s); err != nil {
    19  		return nil, err
    20  	}
    21  	return builder.Build()
    22  }
    23  
    24  const ROOT = "/home/foobar/rust/rg"
    25  
    26  func TestIgnored(t *testing.T) {
    27  	testCases := []struct {
    28  		desc     string
    29  		root     string
    30  		gi       string
    31  		path     string
    32  		isDir    bool
    33  		expected bool
    34  	}{
    35  		{"ig1", ROOT, "months", "months", false, true},
    36  		{"ig2", ROOT, "*.lock", "Cargo.lock", false, true},
    37  		{"ig3", ROOT, "*.rs", "src/main.rs", false, true},
    38  		{"ig4", ROOT, "src/*.rs", "src/main.rs", false, true},
    39  		{"ig5", ROOT, "/*.c", "cat-file.c", false, true},
    40  		{"ig6", ROOT, "/src/*.rs", "src/main.rs", false, true},
    41  		{"ig7", ROOT, "!src/main.rs\n*.rs", "src/main.rs", false, true},
    42  		{"ig8", ROOT, "foo/", "foo", true, true},
    43  		{"ig9", ROOT, "**/foo", "foo", false, true},
    44  		{"ig10", ROOT, "**/foo", "src/foo", false, true},
    45  		{"ig11", ROOT, "**/foo/**", "src/foo/bar", false, true},
    46  		{"ig12", ROOT, "**/foo/**", "wat/src/foo/bar/baz", false, true},
    47  		{"ig13", ROOT, "**/foo/bar", "foo/bar", false, true},
    48  		{"ig14", ROOT, "**/foo/bar", "src/foo/bar", false, true},
    49  		{"ig15", ROOT, "abc/**", "abc/x", false, true},
    50  		{"ig16", ROOT, "abc/**", "abc/x/y", false, true},
    51  		{"ig17", ROOT, "abc/**", "abc/x/y/z", false, true},
    52  		{"ig18", ROOT, "a/**/b", "a/b", false, true},
    53  		{"ig19", ROOT, "a/**/b", "a/x/b", false, true},
    54  		{"ig20", ROOT, "a/**/b", "a/x/y/b", false, true},
    55  		{"ig21", ROOT, "\\!xy", "!xy", false, true},
    56  		{"ig22", ROOT, "\\#foo", "#foo", false, true},
    57  		{"ig23", ROOT, "foo", "./foo", false, true},
    58  		{"ig24", ROOT, "target", "grep/target", false, true},
    59  		{"ig25", ROOT, "Cargo.lock", "./tabwriter-bin/Cargo.lock", false, true},
    60  		{"ig26", ROOT, "/foo/bar/baz", "./foo/bar/baz", false, true},
    61  		{"ig27", ROOT, "foo/", "xyz/foo", true, true},
    62  		{"ig28", "./src", "/llvm/", "./src/llvm", true, true},
    63  		{"ig29", ROOT, "node_modules/ ", "node_modules", true, true},
    64  		{"ig30", ROOT, "**/", "foo/bar", true, true},
    65  		{"ig31", ROOT, "path1/*", "path1/foo", false, true},
    66  		{"ig32", ROOT, ".a/b", ".a/b", false, true},
    67  		{"ig33", "./", ".a/b", ".a/b", false, true},
    68  		{"ig34", ".", ".a/b", ".a/b", false, true},
    69  		{"ig35", "./.", ".a/b", ".a/b", false, true},
    70  		{"ig36", "././", ".a/b", ".a/b", false, true},
    71  		{"ig37", "././.", ".a/b", ".a/b", false, true},
    72  		{"ig38", ROOT, "\\[", "[", false, true},
    73  		{"ig39", ROOT, "\\?", "?", false, true},
    74  		{"ig40", ROOT, "\\*", "*", false, true},
    75  		{"ig41", ROOT, "\\a", "a", false, true},
    76  		{"ig42", ROOT, "s*.rs", "sfoo.rs", false, true},
    77  		{"ig43", ROOT, "**", "foo.rs", false, true},
    78  		{"ig44", ROOT, "**/**/*", "a/foo.rs", false, true},
    79  		{"ignot1", ROOT, "amonths", "months", false, false},
    80  		{"ignot2", ROOT, "monthsa", "months", false, false},
    81  		{"ignot3", ROOT, "/src/*.rs", "src/grep/src/main.rs", false, false},
    82  		{"ignot4", ROOT, "/*.c", "mozilla-sha1/sha1.c", false, false},
    83  		{"ignot5", ROOT, "/src/*.rs", "src/grep/src/main.rs", false, false},
    84  		{"ignot6", ROOT, "*.rs\n!src/main.rs", "src/main.rs", false, false},
    85  		{"ignot7", ROOT, "foo/", "foo", false, false},
    86  		{"ignot8", ROOT, "**/foo/**", "wat/src/afoo/bar/baz", false, false},
    87  		{"ignot9", ROOT, "**/foo/**", "wat/src/fooa/bar/baz", false, false},
    88  		{"ignot10", ROOT, "**/foo/bar", "foo/src/bar", false, false},
    89  		{"ignot11", ROOT, "#foo", "#foo", false, false},
    90  		{"ignot12", ROOT, "\n\n\n", "foo", false, false},
    91  		{"ignot13", ROOT, "foo/**", "foo", true, false},
    92  		{"ignot14", "./third_party/protobuf", "m4/ltoptions.m4", "./third_party/protobuf/csharp/src/packages/repositories.config", false, false},
    93  		{"ignot15", ROOT, "!/bar", "foo/bar", false, false},
    94  		{"ignot16", ROOT, "*\n!**/", "foo", true, false},
    95  		{"ignot17", ROOT, "src/*.rs", "src/grep/src/main.rs", false, false},
    96  		{"ignot18", ROOT, "path1/*", "path2/path1/foo", false, false},
    97  		{"ignot19", ROOT, "s*.rs", "src/foo.rs", false, false},
    98  	}
    99  
   100  	for _, tC := range testCases {
   101  		t.Run(tC.desc, func(t *testing.T) {
   102  			gi, err := giFromStr(tC.root, tC.gi)
   103  			if err != nil {
   104  				t.Fatal(err)
   105  			}
   106  			actual := gi.Ignored(tC.path, tC.isDir)
   107  			if actual != tC.expected {
   108  				t.Fatalf("%s: root(%s), gi(%s), path(%s) actual(%v), expect(%v)\n",
   109  					tC.desc, tC.root, tC.gi, tC.path, actual, tC.expected)
   110  			}
   111  		})
   112  	}
   113  }
   114  
   115  func TestIgnoredRails(t *testing.T) {
   116  	testIgnoredRepo(t, "testdata/railsapp", "../railsapp_ignored.txt")
   117  }
   118  
   119  func TestIgnoredReact(t *testing.T) {
   120  	testIgnoredRepo(t, "testdata/reactapp", "../reactapp_ignored.txt")
   121  }
   122  
   123  func TestIgnoredRepo1(t *testing.T) {
   124  	testIgnoredRepo(t, "testdata/repo1", "../repo1_ignored.txt")
   125  }
   126  
   127  func testIgnoredRepo(t *testing.T, dir, expectedFile string) {
   128  	undo := move(t, dir)
   129  	defer undo()
   130  
   131  	gitignore, err := NewGitignoreFromDir(".")
   132  	if err != nil {
   133  		t.Fatal(err)
   134  	}
   135  
   136  	ignoredFiles := make([]string, 0)
   137  	err = filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error {
   138  		if err != nil {
   139  			return err
   140  		}
   141  		if d.IsDir() {
   142  			return err
   143  		}
   144  
   145  		if gitignore.Ignored(path, d.IsDir()) {
   146  			ignoredFiles = append(ignoredFiles, path)
   147  		}
   148  
   149  		return nil
   150  	})
   151  
   152  	if err != nil {
   153  		t.Fatal(err)
   154  	}
   155  
   156  	bytes, err := os.ReadFile(expectedFile)
   157  	if err != nil {
   158  		t.Fatal(err)
   159  	}
   160  
   161  	var expects []string
   162  	for _, str := range strings.Split(string(bytes), "\n") {
   163  		if str != "" {
   164  			expects = append(expects, str)
   165  		}
   166  	}
   167  	sort.Strings(ignoredFiles)
   168  	sort.Strings(expects)
   169  
   170  	assert.Equal(t, expects, ignoredFiles)
   171  }
   172  
   173  func move(t *testing.T, dir string) func() {
   174  	wd, err := os.Getwd()
   175  	if err != nil {
   176  		t.Fatal(err)
   177  	}
   178  	if err := os.Chdir(dir); err != nil {
   179  		t.Fatal(err)
   180  	}
   181  	return func() {
   182  		if err := os.Chdir(wd); err != nil {
   183  			t.Fatal(err)
   184  		}
   185  	}
   186  }