parser_test.go

  1package query
  2
  3import (
  4	"testing"
  5
  6	"github.com/stretchr/testify/require"
  7
  8	"github.com/MichaelMure/git-bug/entities/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}