package middleware
import (
"reflect"
"testing"
)
func TestFolderMap_Apply(t *testing.T) {
tests := []struct {
name string
mapping map[string]string
order []string
input []string
want []string
}{
{
name: "strict single folder mapping",
mapping: map[string]string{"Drafts": "INBOX/Drafts"},
order: []string{"Drafts"},
input: []string{"INBOX/Drafts"},
want: []string{"Drafts"},
},
{
name: "prefix mapping with * suffix",
mapping: map[string]string{"Prefix/": "INBOX/*"},
order: []string{"Prefix/"},
input: []string{"INBOX", "INBOX/Test1", "INBOX/Test2", "Archive"},
want: []string{"INBOX", "Prefix/Test1", "Prefix/Test2", "Archive"},
},
{
name: "remove prefix with * in key",
mapping: map[string]string{"*": "INBOX/*"},
order: []string{"*"},
input: []string{"INBOX", "INBOX/Test1", "INBOX/Test2", "Archive"},
want: []string{"INBOX", "Test1", "Test2", "Archive"},
},
{
name: "remove two prefixes with * in keys",
mapping: map[string]string{
"*": "INBOX/*",
"**": "PROJECT/*",
},
order: []string{"*", "**"},
input: []string{"INBOX", "INBOX/Test1", "INBOX/Test2", "Archive", "PROJECT/sub1", "PROJECT/sub2"},
want: []string{"INBOX", "Test1", "Test2", "Archive", "sub1", "sub2"},
},
{
name: "multiple, sequential mappings",
mapping: map[string]string{
"Archive/existing": "Archive*",
"Archive": "Archivum*",
},
order: []string{"Archive/existing", "Archive"},
input: []string{"Archive", "Archive/sub", "Archivum", "Archivum/year1"},
want: []string{"Archive/existing", "Archive/existing/sub", "Archive", "Archive/year1"},
},
}
for i, test := range tests {
fm := &folderMap{
mapping: test.mapping,
order: test.order,
}
var result []string
for _, in := range test.input {
result = append(result, fm.Apply(in))
}
if !reflect.DeepEqual(result, test.want) {
t.Errorf("test (%d: %s) failed: want '%v' but got '%v'",
i, test.name, test.want, result)
}
}
}
func TestFolderMap_createFolder(t *testing.T) {
tests := []struct {
name string
table map[string]string
input string
want string
}{
{
name: "create normal folder",
table: map[string]string{"Drafts": "INBOX/Drafts"},
input: "INBOX/Drafts2",
want: "INBOX/Drafts2",
},
{
name: "create mapped folder",
table: map[string]string{"Drafts": "INBOX/Drafts"},
input: "Drafts/Sub",
want: "INBOX/Drafts/Sub",
},
}
for i, test := range tests {
result := createFolder(test.table, test.input)
if result != test.want {
t.Errorf("test (%d: %s) failed: want '%v' but got '%v'",
i, test.name, test.want, result)
}
}
}