1package query
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7)
8
9func TestTokenize(t *testing.T) {
10 var tests = []struct {
11 input string
12 tokens []token
13 }{
14 {"status:", nil},
15 {":value", nil},
16
17 {"status:open", []token{newTokenKV("status", "open")}},
18 {"status:closed", []token{newTokenKV("status", "closed")}},
19
20 {"author:rene", []token{newTokenKV("author", "rene")}},
21 {`author:"René Descartes"`, []token{newTokenKV("author", "René Descartes")}},
22
23 {
24 `status:open status:closed author:rene author:"René Descartes"`,
25 []token{
26 newTokenKV("status", "open"),
27 newTokenKV("status", "closed"),
28 newTokenKV("author", "rene"),
29 newTokenKV("author", "René Descartes"),
30 },
31 },
32
33 // quotes
34 {`key:"value value"`, []token{newTokenKV("key", "value value")}},
35 {`key:'value value'`, []token{newTokenKV("key", "value value")}},
36 // unmatched quotes
37 {`key:'value value`, nil},
38 {`key:value value'`, nil},
39
40 // sub-qualifier positive testing
41 {`key:subkey:"value:value"`, []token{newTokenKVV("key", "subkey", "value:value")}},
42
43 // sub-qualifier negative testing
44 {`key:subkey:value:value`, nil},
45 {`key:subkey:`, nil},
46 {`key:subkey:"value`, nil},
47
48 // full text search
49 {"search", []token{newTokenSearch("search")}},
50 {"search more terms", []token{
51 newTokenSearch("search"),
52 newTokenSearch("more"),
53 newTokenSearch("terms"),
54 }},
55 {"search \"more terms\"", []token{
56 newTokenSearch("search"),
57 newTokenSearch("more terms"),
58 }},
59 }
60
61 for _, tc := range tests {
62 t.Run(tc.input, func(t *testing.T) {
63 tokens, err := tokenize(tc.input)
64 if tc.tokens == nil {
65 require.Error(t, err)
66 require.Nil(t, tokens)
67 } else {
68 require.NoError(t, err)
69 require.Equal(t, tc.tokens, tokens)
70 }
71 })
72 }
73}