diff options
Diffstat (limited to 'worker/notmuch/message_test.go')
-rw-r--r-- | worker/notmuch/message_test.go | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/worker/notmuch/message_test.go b/worker/notmuch/message_test.go new file mode 100644 index 00000000..51fcdb09 --- /dev/null +++ b/worker/notmuch/message_test.go @@ -0,0 +1,264 @@ +//go:build notmuch +// +build notmuch + +package notmuch + +import ( + "testing" + + "git.sr.ht/~rjarry/aerc/worker/types" + "github.com/emersion/go-maildir" +) + +func TestFilterForStrategy(t *testing.T) { + tests := []struct { + filenames []string + strategy types.MultiFileStrategy + curDir string + expectedAct []string + expectedDel []string + expectedErr bool + }{ + // if there's only one file, always act on it + { + filenames: []string{"/h/j/m/A/cur/a.b.c:2,"}, + strategy: types.Refuse, + curDir: "/h/j/m/B", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{}, + }, + { + filenames: []string{"/h/j/m/A/cur/a.b.c:2,"}, + strategy: types.ActAll, + curDir: "/h/j/m/B", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{}, + }, + { + filenames: []string{"/h/j/m/A/cur/a.b.c:2,"}, + strategy: types.ActOne, + curDir: "/h/j/m/B", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{}, + }, + { + filenames: []string{"/h/j/m/A/cur/a.b.c:2,"}, + strategy: types.ActOneDelRest, + curDir: "/h/j/m/B", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{}, + }, + { + filenames: []string{"/h/j/m/A/cur/a.b.c:2,"}, + strategy: types.ActDir, + curDir: "/h/j/m/B", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{}, + }, + { + filenames: []string{"/h/j/m/A/cur/a.b.c:2,"}, + strategy: types.ActDirDelRest, + curDir: "/h/j/m/B", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{}, + }, + + // follow strategy for multiple files + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.Refuse, + curDir: "/h/j/m/B", + expectedErr: true, + }, + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActAll, + curDir: "/h/j/m/B", + expectedAct: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + expectedDel: []string{}, + }, + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActOne, + curDir: "/h/j/m/B", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{}, + }, + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActOneDelRest, + curDir: "/h/j/m/B", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{ + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + }, + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActDir, + curDir: "/h/j/m/B", + expectedAct: []string{ + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + }, + expectedDel: []string{}, + }, + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActDirDelRest, + curDir: "/h/j/m/B", + expectedAct: []string{ + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + }, + expectedDel: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/C/new/d.e.f", + }, + }, + + // refuse to act on multiple files for ActDir and friends if + // no current dir is provided + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActDir, + curDir: "", + expectedErr: true, + }, + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActDirDelRest, + curDir: "", + expectedErr: true, + }, + + // act on multiple files w/o current dir for other strategies + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActAll, + curDir: "", + expectedAct: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + expectedDel: []string{}, + }, + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActOne, + curDir: "", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{}, + }, + { + filenames: []string{ + "/h/j/m/A/cur/a.b.c:2,", + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + strategy: types.ActOneDelRest, + curDir: "", + expectedAct: []string{"/h/j/m/A/cur/a.b.c:2,"}, + expectedDel: []string{ + "/h/j/m/B/new/b.c.d", + "/h/j/m/B/cur/c.d.e:2,S", + "/h/j/m/C/new/d.e.f", + }, + }, + } + + for i, test := range tests { + act, del, err := filterForStrategy(test.filenames, test.strategy, + maildir.Dir(test.curDir)) + + if test.expectedErr && err == nil { + t.Errorf("[test %d] got nil, expected error", i) + } + + if !test.expectedErr && err != nil { + t.Errorf("[test %d] got %v, expected nil", i, err) + } + + if !arrEq(act, test.expectedAct) { + t.Errorf("[test %d] got %v, expected %v", i, act, test.expectedAct) + } + + if !arrEq(del, test.expectedDel) { + t.Errorf("[test %d] got %v, expected %v", i, del, test.expectedDel) + } + } +} + +func arrEq(a, b []string) bool { + if len(a) != len(b) { + return false + } + + for i := range a { + if a[i] != b[i] { + return false + } + } + + return true +} |