1package query
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7
8 "github.com/MichaelMure/git-bug/bug"
9)
10
11func TestParse(t *testing.T) {
12 var tests = []struct {
13 input string
14 output *Query
15 }{
16 // KV
17 {"status:", nil},
18 {":value", nil},
19
20 {"status:open", &Query{
21 Filters: Filters{Status: []bug.Status{bug.OpenStatus}},
22 }},
23 {"status:closed", &Query{
24 Filters: Filters{Status: []bug.Status{bug.ClosedStatus}},
25 }},
26 {"status:unknown", nil},
27
28 {"author:rene", &Query{
29 Filters: Filters{Author: []string{"rene"}},
30 }},
31 {`author:"René Descartes"`, &Query{
32 Filters: Filters{Author: []string{"René Descartes"}},
33 }},
34
35 {"actor:bernhard", &Query{
36 Filters: Filters{Actor: []string{"bernhard"}},
37 }},
38 {"participant:leonhard", &Query{
39 Filters: Filters{Participant: []string{"leonhard"}},
40 }},
41
42 {"label:hello", &Query{
43 Filters: Filters{Label: []string{"hello"}},
44 }},
45 {`label:"Good first issue"`, &Query{
46 Filters: Filters{Label: []string{"Good first issue"}},
47 }},
48
49 {"title:titleOne", &Query{
50 Filters: Filters{Title: []string{"titleOne"}},
51 }},
52 {`title:"Bug titleTwo"`, &Query{
53 Filters: Filters{Title: []string{"Bug titleTwo"}},
54 }},
55
56 {"no:label", &Query{
57 Filters: Filters{NoLabel: true},
58 }},
59
60 {"sort:edit", &Query{
61 OrderBy: OrderByEdit,
62 }},
63 {"sort:unknown", nil},
64
65 // KVV
66 {`metadata:key:"https://www.example.com/"`, &Query{
67 Filters: Filters{Metadata: []StringPair{{"key", "https://www.example.com/"}}},
68 }},
69
70 // Search
71 {"search", &Query{
72 Search: []string{"search"},
73 }},
74 {"search \"more terms\"", &Query{
75 Search: []string{"search", "more terms"},
76 }},
77
78 // Complex
79 {`status:open author:"René Descartes" search participant:leonhard label:hello label:"Good first issue" sort:edit-desc "more terms"`,
80 &Query{
81 Search: []string{"search", "more terms"},
82 Filters: Filters{
83 Status: []bug.Status{bug.OpenStatus},
84 Author: []string{"René Descartes"},
85 Participant: []string{"leonhard"},
86 Label: []string{"hello", "Good first issue"},
87 },
88 OrderBy: OrderByEdit,
89 OrderDirection: OrderDescending,
90 },
91 },
92 }
93
94 for _, tc := range tests {
95 t.Run(tc.input, func(t *testing.T) {
96 query, err := Parse(tc.input)
97 if tc.output == nil {
98 require.Error(t, err)
99 require.Nil(t, query)
100 } else {
101 require.NoError(t, err)
102 if tc.output.OrderBy != 0 {
103 require.Equal(t, tc.output.OrderBy, query.OrderBy)
104 }
105 if tc.output.OrderDirection != 0 {
106 require.Equal(t, tc.output.OrderDirection, query.OrderDirection)
107 }
108 require.Equal(t, tc.output.Filters, query.Filters)
109 }
110 })
111 }
112}