stash/pkg/models/search_test.go

228 lines
3.1 KiB
Go

package models
import (
"reflect"
"testing"
)
func TestParseSearchString(t *testing.T) {
tests := []struct {
name string
q string
want SearchSpecs
}{
{
"basic",
"a b c",
SearchSpecs{
MustHave: []string{"a", "b", "c"},
},
},
{
"empty",
"",
SearchSpecs{},
},
{
"whitespace",
" ",
SearchSpecs{},
},
{
"single",
"a",
SearchSpecs{
MustHave: []string{"a"},
},
},
{
"quoted",
`"a b" c`,
SearchSpecs{
MustHave: []string{"a b", "c"},
},
},
{
"quoted double space",
`"a b" c`,
SearchSpecs{
MustHave: []string{"a b", "c"},
},
},
{
"quoted end space",
`"a b " c`,
SearchSpecs{
MustHave: []string{"a b ", "c"},
},
},
{
"no matching end quote",
`"a b c`,
SearchSpecs{
MustHave: []string{`"a`, "b", "c"},
},
},
{
"no matching start quote",
`a b c"`,
SearchSpecs{
MustHave: []string{"a", "b", `c"`},
},
},
{
"or",
"a OR b",
SearchSpecs{
AnySets: [][]string{
{"a", "b"},
},
},
},
{
"multi or",
"a OR b c OR d",
SearchSpecs{
AnySets: [][]string{
{"a", "b"},
{"c", "d"},
},
},
},
{
"lowercase or",
"a or b",
SearchSpecs{
AnySets: [][]string{
{"a", "b"},
},
},
},
{
"or symbol",
"a | b",
SearchSpecs{
AnySets: [][]string{
{"a", "b"},
},
},
},
{
"quoted or",
`a "OR" b`,
SearchSpecs{
MustHave: []string{"a", "OR", "b"},
},
},
{
"quoted or symbol",
`a "|" b`,
SearchSpecs{
MustHave: []string{"a", "|", "b"},
},
},
{
"or phrases",
`"a b" OR "c d"`,
SearchSpecs{
AnySets: [][]string{
{"a b", "c d"},
},
},
},
{
"or at start",
"OR a",
SearchSpecs{
MustHave: []string{"OR", "a"},
},
},
{
"or at end",
"a OR",
SearchSpecs{
MustHave: []string{"a", "OR"},
},
},
{
"or symbol at start",
"| a",
SearchSpecs{
MustHave: []string{"|", "a"},
},
},
{
"or symbol at end",
"a |",
SearchSpecs{
MustHave: []string{"a", "|"},
},
},
{
"nots",
"-a -b",
SearchSpecs{
MustNot: []string{"a", "b"},
},
},
{
"not or",
"-a OR b",
SearchSpecs{
AnySets: [][]string{
{"-a", "b"},
},
},
},
{
"not phrase",
`-"a b"`,
SearchSpecs{
MustNot: []string{"a b"},
},
},
{
"not in phrase",
`"-a b"`,
SearchSpecs{
MustHave: []string{"-a b"},
},
},
{
"double not",
"--a",
SearchSpecs{
MustNot: []string{"-a"},
},
},
{
"empty quote",
`"" a`,
SearchSpecs{
MustHave: []string{"a"},
},
},
{
"not empty quote",
`-"" a`,
SearchSpecs{
MustHave: []string{"a"},
},
},
{
"quote in word",
`ab"cd"`,
SearchSpecs{
MustHave: []string{`ab"cd"`},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := ParseSearchString(tt.q); !reflect.DeepEqual(got, tt.want) {
t.Errorf("FindFilterType.ParseSearchString() = %v, want %v", got, tt.want)
}
})
}
}