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 {"label:\"foo:bar\"", &Query{
66 Filters: Filters{Label: []string{"foo:bar"}},
67 }},
68
69 // KVV
70 {`metadata:key:"https://www.example.com/"`, &Query{
71 Filters: Filters{Metadata: []StringPair{{"key", "https://www.example.com/"}}},
72 }},
73
74 // Search
75 {"search", &Query{
76 Search: []string{"search"},
77 }},
78 {"search \"more terms\"", &Query{
79 Search: []string{"search", "more terms"},
80 }},
81
82 // Complex
83 {`status:open author:"René Descartes" search participant:leonhard label:hello label:"Good first issue" sort:edit-desc "more terms"`,
84 &Query{
85 Search: []string{"search", "more terms"},
86 Filters: Filters{
87 Status: []bug.Status{bug.OpenStatus},
88 Author: []string{"René Descartes"},
89 Participant: []string{"leonhard"},
90 Label: []string{"hello", "Good first issue"},
91 },
92 OrderBy: OrderByEdit,
93 OrderDirection: OrderDescending,
94 },
95 },
96 }
97
98 for _, tc := range tests {
99 t.Run(tc.input, func(t *testing.T) {
100 query, err := Parse(tc.input)
101 if tc.output == nil {
102 require.Error(t, err)
103 require.Nil(t, query)
104 } else {
105 require.NoError(t, err)
106 if tc.output.OrderBy != 0 {
107 require.Equal(t, tc.output.OrderBy, query.OrderBy)
108 }
109 if tc.output.OrderDirection != 0 {
110 require.Equal(t, tc.output.OrderDirection, query.OrderDirection)
111 }
112 require.Equal(t, tc.output.Filters, query.Filters)
113 }
114 })
115 }
116}