1package query
 2
 3import (
 4	"testing"
 5
 6	"github.com/stretchr/testify/assert"
 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		{"gibberish", nil},
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		{`status:open author:"René Descartes" participant:leonhard label:hello label:"Good first issue" sort:edit-desc`,
66			&Query{
67				Filters: Filters{
68					Status:      []bug.Status{bug.OpenStatus},
69					Author:      []string{"René Descartes"},
70					Participant: []string{"leonhard"},
71					Label:       []string{"hello", "Good first issue"},
72				},
73				OrderBy:        OrderByEdit,
74				OrderDirection: OrderDescending,
75			},
76		},
77	}
78
79	for _, tc := range tests {
80		t.Run(tc.input, func(t *testing.T) {
81			query, err := Parse(tc.input)
82			if tc.output == nil {
83				assert.Error(t, err)
84				assert.Nil(t, query)
85			} else {
86				assert.NoError(t, err)
87				if tc.output.OrderBy != 0 {
88					assert.Equal(t, tc.output.OrderBy, query.OrderBy)
89				}
90				if tc.output.OrderDirection != 0 {
91					assert.Equal(t, tc.output.OrderDirection, query.OrderDirection)
92				}
93				assert.Equal(t, tc.output.Filters, query.Filters)
94			}
95		})
96	}
97}