github.com/sudo-bmitch/version-bump@v0.0.0-20240503123857-70b0e3f646dd/internal/filesearch/filesearch_test.go (about)

     1  package filesearch
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/sudo-bmitch/version-bump/internal/config"
    10  )
    11  
    12  func TestPattern(t *testing.T) {
    13  	tests := []struct {
    14  		name     string
    15  		expr     string
    16  		newErr   error
    17  		filename string
    18  		prefix   bool
    19  		expect   bool
    20  	}{
    21  		{
    22  			name:     "empty",
    23  			expr:     "",
    24  			filename: "./filename.txt",
    25  			prefix:   false,
    26  			expect:   false,
    27  		},
    28  		{
    29  			name:     "match file",
    30  			expr:     "filename",
    31  			filename: "filename",
    32  			prefix:   false,
    33  			expect:   true,
    34  		},
    35  		{
    36  			name:     "match path",
    37  			expr:     "path/to/file.txt",
    38  			filename: "path/to/file.txt",
    39  			prefix:   false,
    40  			expect:   true,
    41  		},
    42  		{
    43  			name:     "mismatch",
    44  			expr:     "path/to/file.txt",
    45  			filename: "path/from/file.csv",
    46  			prefix:   false,
    47  			expect:   false,
    48  		},
    49  		{
    50  			name:     "prefix",
    51  			expr:     "path/to/file.txt",
    52  			filename: "path/to",
    53  			prefix:   true,
    54  			expect:   true,
    55  		},
    56  		{
    57  			name:     "not prefix",
    58  			expr:     "path/to/file.txt",
    59  			filename: "path/from",
    60  			prefix:   true,
    61  			expect:   false,
    62  		},
    63  		{
    64  			name:     "wildcard name",
    65  			expr:     "path/to/*.txt",
    66  			filename: "path/to/file.txt",
    67  			prefix:   false,
    68  			expect:   true,
    69  		},
    70  		{
    71  			name:     "wildcard ext",
    72  			expr:     "file*",
    73  			filename: "file",
    74  			prefix:   false,
    75  			expect:   true,
    76  		},
    77  		{
    78  			name:     "wildcard ext path",
    79  			expr:     "path/to/file.*",
    80  			filename: "path/to/file.txt",
    81  			prefix:   false,
    82  			expect:   true,
    83  		},
    84  		{
    85  			name:     "wildcard file",
    86  			expr:     "path/to/*",
    87  			filename: "path/to/file.txt",
    88  			prefix:   false,
    89  			expect:   true,
    90  		},
    91  		{
    92  			name:     "wildcard path",
    93  			expr:     "path/*/file.txt",
    94  			filename: "path/to/file.txt",
    95  			prefix:   false,
    96  			expect:   true,
    97  		},
    98  		{
    99  			name:     "wildcard path prefix",
   100  			expr:     "path/*/file.txt",
   101  			filename: "path/to",
   102  			prefix:   true,
   103  			expect:   true,
   104  		},
   105  		{
   106  			name:     "wildcard path not prefix",
   107  			expr:     "path/*/file.txt",
   108  			filename: "path/to/subdir/file.txt",
   109  			prefix:   true,
   110  			expect:   false,
   111  		},
   112  		{
   113  			name:     "wildcard file not prefix",
   114  			expr:     "path/to/*",
   115  			filename: "path/to/subdir/file.txt",
   116  			prefix:   true,
   117  			expect:   false,
   118  		},
   119  		{
   120  			name:     "double star path",
   121  			expr:     "**/file.txt",
   122  			filename: "path/to/file.txt",
   123  			prefix:   false,
   124  			expect:   true,
   125  		},
   126  		{
   127  			name:     "double star root",
   128  			expr:     "**/file.txt",
   129  			filename: "file.txt",
   130  			prefix:   false,
   131  			expect:   true,
   132  		},
   133  		{
   134  			name:     "double star prefix",
   135  			expr:     "**/file.txt",
   136  			filename: "path/to",
   137  			prefix:   true,
   138  			expect:   true,
   139  		},
   140  		{
   141  			name:     "double star mid nil",
   142  			expr:     "path/**/file.txt",
   143  			filename: "path/file.txt",
   144  			prefix:   false,
   145  			expect:   true,
   146  		},
   147  		{
   148  			name:     "double star mid multiple",
   149  			expr:     "path/**/file.txt",
   150  			filename: "path/to/sub/file.txt",
   151  			prefix:   false,
   152  			expect:   true,
   153  		},
   154  		{
   155  			name:     "escape star",
   156  			expr:     "path/to/star\\*file.txt",
   157  			filename: "path/to/star*file.txt",
   158  			prefix:   false,
   159  			expect:   true,
   160  		},
   161  		{
   162  			name:     "escape star wild",
   163  			expr:     "path/to/*\\*file.txt",
   164  			filename: "path/to/star*file.txt",
   165  			prefix:   false,
   166  			expect:   true,
   167  		},
   168  		{
   169  			name:     "escape star prefix",
   170  			expr:     "path/to/star\\*file.txt",
   171  			filename: "path/to",
   172  			prefix:   true,
   173  			expect:   true,
   174  		},
   175  	}
   176  	for _, tt := range tests {
   177  		t.Run(tt.name, func(t *testing.T) {
   178  			p, err := newPattern(tt.expr)
   179  			if tt.newErr != nil {
   180  				if err == nil {
   181  					t.Errorf("newPattern expected %v, err was nil", tt.newErr)
   182  				} else if !errors.Is(err, tt.newErr) && err.Error() != tt.newErr.Error() {
   183  					t.Errorf("newPattern expected %v, received %v", tt.newErr, err)
   184  				}
   185  				return
   186  			}
   187  			if err != nil {
   188  				t.Errorf("newPattern failed with %v", err)
   189  				return
   190  			}
   191  			result := p.match(tt.filename, tt.prefix)
   192  			if result != tt.expect {
   193  				t.Errorf("p.match expected %v, received %v", tt.expect, result)
   194  			}
   195  		})
   196  	}
   197  }
   198  
   199  func TestWalk(t *testing.T) {
   200  	curdir, err := os.Getwd()
   201  	if err != nil {
   202  		t.Errorf("current directory cannot be determined: %v", err)
   203  	}
   204  	defer os.Chdir(curdir)
   205  	err = os.Chdir("../../testdata")
   206  	if err != nil {
   207  		t.Errorf("failed to chdir to testdata: %v", err)
   208  		return
   209  	}
   210  	conf, err := config.LoadFile("ex-conf.yaml")
   211  	if err != nil {
   212  		t.Errorf("failed to load config: %v", err)
   213  		return
   214  	}
   215  	w, err := New([]string{}, conf.Files)
   216  	if err != nil {
   217  		t.Errorf("failed to create walk: %v", err)
   218  	}
   219  	list := []struct {
   220  		filename string
   221  		confName string
   222  	}{}
   223  	for {
   224  		filename, confName, err := w.Next()
   225  		if err != nil {
   226  			if !errors.Is(err, io.EOF) {
   227  				t.Errorf("failed with error other than eof: %v", err)
   228  			}
   229  			break
   230  		}
   231  		list = append(list, struct {
   232  			filename string
   233  			confName string
   234  		}{filename: filename, confName: confName})
   235  	}
   236  	if len(list) < 2 ||
   237  		list[0].filename != "01-example.sh" || list[0].confName != "**/*.sh" ||
   238  		list[1].filename != "01-example.sh" || list[1].confName != "01-example.sh" {
   239  		t.Errorf("expected 2 entries for 01-example.sh, received: %v", list)
   240  	}
   241  }