backend_test.go

 1package backend
 2
 3import (
 4	"testing"
 5	"time"
 6)
 7
 8func TestParseSearchQuery(t *testing.T) {
 9	q := ParseSearchQuery(`from:alice@example.com to:bob@example.com subject:report body:revenue since:2026-01-01 before:2026-02-01 larger:10240`)
10	if q.From != "alice@example.com" || q.To != "bob@example.com" || q.Subject != "report" || q.Body != "revenue" {
11		t.Fatalf("parsed fields = %+v", q)
12	}
13	if !q.Since.Equal(time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)) || !q.Before.Equal(time.Date(2026, 2, 1, 0, 0, 0, 0, time.UTC)) {
14		t.Fatalf("parsed dates = since:%v before:%v", q.Since, q.Before)
15	}
16	if q.LargerThan != 10240 || q.Raw == "" {
17		t.Fatalf("parsed size/raw = larger:%d raw:%q", q.LargerThan, q.Raw)
18	}
19}
20
21func TestParseSearchQueryBareTerms(t *testing.T) {
22	if got := ParseSearchQuery("quarterly revenue update").Body; got != "quarterly revenue update" {
23		t.Fatalf("Body = %q", got)
24	}
25	if got := ParseSearchQuery("from:alice@example.com quarterly revenue").Body; got != "quarterly revenue" {
26		t.Fatalf("fielded search Body = %q, want quarterly revenue", got)
27	}
28}
29
30func TestParseSearchQueryQuotedValues(t *testing.T) {
31	tests := []struct {
32		name    string
33		input   string
34		from    string
35		subject string
36		body    string
37	}{
38		{
39			name:    "double quoted subject",
40			input:   `subject:"quarterly report"`,
41			subject: "quarterly report",
42		},
43		{
44			name:  "bare terms after field",
45			input: `from:alice quarterly revenue`,
46			from:  "alice",
47			body:  "quarterly revenue",
48		},
49		{
50			name:  "body prefix wins over bare terms",
51			input: `body:foo bar baz`,
52			body:  "foo",
53		},
54		{
55			name:    "single quoted subject",
56			input:   `subject:'quarterly report'`,
57			subject: "quarterly report",
58		},
59		{
60			name:    "mixed quoted and unquoted",
61			input:   `from:alice subject:"quarterly report" revenue`,
62			from:    "alice",
63			subject: "quarterly report",
64			body:    "revenue",
65		},
66	}
67
68	for _, tt := range tests {
69		t.Run(tt.name, func(t *testing.T) {
70			q := ParseSearchQuery(tt.input)
71			if q.From != tt.from || q.Subject != tt.subject || q.Body != tt.body {
72				t.Fatalf("ParseSearchQuery(%q) = From:%q Subject:%q Body:%q, want From:%q Subject:%q Body:%q", tt.input, q.From, q.Subject, q.Body, tt.from, tt.subject, tt.body)
73			}
74		})
75	}
76}