1package search
2
3import (
4 "context"
5 "testing"
6
7 "github.com/bluesky-social/indigo/atproto/identity"
8 "github.com/bluesky-social/indigo/atproto/syntax"
9
10 "github.com/stretchr/testify/assert"
11)
12
13func TestParseQuery(t *testing.T) {
14 ctx := context.Background()
15 assert := assert.New(t)
16 dir := identity.NewMockDirectory()
17 ident := identity.Identity{
18 Handle: syntax.Handle("known.example.com"),
19 DID: syntax.DID("did:plc:abc222"),
20 }
21 dir.Insert(ident)
22
23 var p PostSearchParams
24
25 p = ParsePostQuery(ctx, &dir, "", nil)
26 assert.Equal("*", p.Query)
27 assert.Empty(p.Filters())
28
29 q1 := "some +test \"with phrase\" -ok"
30 p = ParsePostQuery(ctx, &dir, q1, nil)
31 assert.Equal(q1, p.Query)
32 assert.Empty(p.Filters())
33
34 q2 := "missing from:missing.example.com"
35 p = ParsePostQuery(ctx, &dir, q2, nil)
36 assert.Equal("missing", p.Query)
37 assert.Empty(p.Filters())
38
39 q3 := "known from:known.example.com"
40 p = ParsePostQuery(ctx, &dir, q3, nil)
41 assert.Equal("known", p.Query)
42 assert.NotNil(p.Author)
43 if p.Author != nil {
44 assert.Equal("did:plc:abc222", p.Author.String())
45 }
46
47 q4 := "from:known.example.com"
48 p = ParsePostQuery(ctx, &dir, q4, nil)
49 assert.Equal("*", p.Query)
50 assert.Equal(1, len(p.Filters()))
51
52 q5 := `from:known.example.com "multi word phrase" coolio blorg`
53 p = ParsePostQuery(ctx, &dir, q5, nil)
54 assert.Equal(`"multi word phrase" coolio blorg`, p.Query)
55 assert.NotNil(p.Author)
56 if p.Author != nil {
57 assert.Equal("did:plc:abc222", p.Author.String())
58 }
59 assert.Equal(1, len(p.Filters()))
60
61 q6 := `from:known.example.com #cool_tag some other stuff`
62 p = ParsePostQuery(ctx, &dir, q6, nil)
63 assert.Equal(`some other stuff`, p.Query)
64 assert.NotNil(p.Author)
65 if p.Author != nil {
66 assert.Equal("did:plc:abc222", p.Author.String())
67 }
68 assert.Equal([]string{"cool_tag"}, p.Tags)
69 assert.Equal(2, len(p.Filters()))
70
71 q7 := "known from:@known.example.com"
72 p = ParsePostQuery(ctx, &dir, q7, nil)
73 assert.Equal("known", p.Query)
74 assert.NotNil(p.Author)
75 if p.Author != nil {
76 assert.Equal("did:plc:abc222", p.Author.String())
77 }
78 assert.Equal(1, len(p.Filters()))
79
80 q8 := "known from:me"
81 p = ParsePostQuery(ctx, &dir, q8, &ident.DID)
82 assert.Equal("known", p.Query)
83 assert.NotNil(p.Author)
84 if p.Author != nil {
85 assert.Equal("did:plc:abc222", p.Author.String())
86 }
87 assert.Equal(1, len(p.Filters()))
88
89 q9 := "did:plc:abc222"
90 p = ParsePostQuery(ctx, &dir, q9, nil)
91 assert.Equal("*", p.Query)
92 assert.Equal(1, len(p.Filters()))
93 if p.Author != nil {
94 assert.Equal("did:plc:abc222", p.Author.String())
95 }
96
97 // TODO: more parsing tests: bare handles, to:, since:, until:, URL, domain:, lang
98}