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}