265 lines
5.8 KiB
Go
265 lines
5.8 KiB
Go
//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
|
|
}
|