@@ -16,15 +16,30 @@ package gcpspanner
16
16
17
17
import (
18
18
"context"
19
+ "errors"
19
20
"testing"
20
21
21
22
"cloud.google.com/go/spanner"
22
23
)
23
24
25
+ func assertUserSearchSearchWithBookmarkStatus (
26
+ ctx context.Context , t * testing.T , expectedSavedSearch * UserSavedSearch , savedSearchID * string , userID string ) {
27
+ actual , err := spannerClient .GetUserSavedSearch (ctx , * savedSearchID , valuePtr (userID ))
28
+ if err != nil {
29
+ t .Errorf ("expected nil error. received %s" , err )
30
+ }
31
+ if ! userSavedSearchEquality (expectedSavedSearch , actual ) {
32
+ t .Errorf ("different saved searches\n expected: %+v\n received: %v" , expectedSavedSearch , actual )
33
+ }
34
+ }
35
+
24
36
func TestUserSearchBookmark (t * testing.T ) {
25
37
restartDatabaseContainer (t )
26
38
ctx := context .Background ()
27
39
40
+ // Reset the max bookmarks to 1.
41
+ spannerClient .searchCfg .maxBookmarksPerUser = 1
42
+
28
43
savedSearchID , err := spannerClient .CreateNewUserSavedSearch (ctx , CreateUserSavedSearchRequest {
29
44
Name : "my little search" ,
30
45
Query : "group:css" ,
@@ -38,35 +53,24 @@ func TestUserSearchBookmark(t *testing.T) {
38
53
t .Fatal ("expected non-nil id." )
39
54
}
40
55
41
- const testUser = "test-user"
42
-
43
- // user initially does not have a bookmark
44
- expectedSavedSearch := & UserSavedSearch {
45
- IsBookmarked : valuePtr (false ),
46
- Role : nil ,
47
- SavedSearch : SavedSearch {
48
- ID : * savedSearchID ,
49
- Name : "my little search" ,
50
- Query : "group:css" ,
51
- Scope : "USER_PUBLIC" ,
52
- AuthorID : "userID1" ,
53
- Description : nil ,
54
- // Don't actually compare the last two values.
55
- CreatedAt : spanner .CommitTimestamp ,
56
- UpdatedAt : spanner .CommitTimestamp ,
57
- },
58
- }
59
- actual , err := spannerClient .GetUserSavedSearch (ctx , * savedSearchID , valuePtr (testUser ))
56
+ savedSearchID2 , err := spannerClient .CreateNewUserSavedSearch (ctx , CreateUserSavedSearchRequest {
57
+ Name : "my big search" ,
58
+ Query : "group:html" ,
59
+ OwnerUserID : "userID1" ,
60
+ Description : nil ,
61
+ })
60
62
if err != nil {
61
63
t .Errorf ("expected nil error. received %s" , err )
62
64
}
63
- if ! userSavedSearchEquality ( expectedSavedSearch , actual ) {
64
- t .Errorf ( "different saved searches \n expected: %+v \n received: %v" , expectedSavedSearch , actual )
65
+ if savedSearchID2 == nil {
66
+ t .Fatal ( "expected non-nil id." )
65
67
}
66
68
67
- // user can successfully have a bookmark added
68
- expectedSavedSearchAfter := & UserSavedSearch {
69
- IsBookmarked : valuePtr (true ),
69
+ var testUserSavedSearchID * string
70
+ const testUser = "test-user"
71
+ // user initially does not have a bookmark
72
+ expectedSavedSearchBeforeBookmark := & UserSavedSearch {
73
+ IsBookmarked : valuePtr (false ),
70
74
Role : nil ,
71
75
SavedSearch : SavedSearch {
72
76
ID : * savedSearchID ,
@@ -80,35 +84,106 @@ func TestUserSearchBookmark(t *testing.T) {
80
84
UpdatedAt : spanner .CommitTimestamp ,
81
85
},
82
86
}
83
- err = spannerClient .AddUserSearchBookmark (ctx , UserSavedSearchBookmark {
84
- UserID : testUser ,
85
- SavedSearchID : * savedSearchID ,
87
+ t .Run ("the test user can see they don't have bookmark status" , func (t * testing.T ) {
88
+ assertUserSearchSearchWithBookmarkStatus (ctx , t , expectedSavedSearchBeforeBookmark , savedSearchID , testUser )
86
89
})
87
- if err != nil {
88
- t .Errorf ("expected nil error. received %s" , err )
89
- }
90
- actual , err = spannerClient .GetUserSavedSearch (ctx , * savedSearchID , valuePtr (testUser ))
91
- if err != nil {
92
- t .Errorf ("expected nil error. received %s" , err )
93
- }
94
- if ! userSavedSearchEquality (expectedSavedSearchAfter , actual ) {
95
- t .Errorf ("different saved searches\n expected: %+v\n received: %v" , expectedSavedSearchAfter , actual )
96
- }
97
90
98
- // user can successfully have a bookmark removed
99
- err = spannerClient .DeleteUserSearchBookmark (ctx , UserSavedSearchBookmark {
100
- UserID : testUser ,
101
- SavedSearchID : * savedSearchID ,
91
+ t .Run ("the test user can bookmark it" , func (t * testing.T ) {
92
+ // user can successfully have a bookmark added
93
+ expectedSavedSearchAfter := & UserSavedSearch {
94
+ IsBookmarked : valuePtr (true ),
95
+ Role : nil ,
96
+ SavedSearch : SavedSearch {
97
+ ID : * savedSearchID ,
98
+ Name : "my little search" ,
99
+ Query : "group:css" ,
100
+ Scope : "USER_PUBLIC" ,
101
+ AuthorID : "userID1" ,
102
+ Description : nil ,
103
+ // Don't actually compare the last two values.
104
+ CreatedAt : spanner .CommitTimestamp ,
105
+ UpdatedAt : spanner .CommitTimestamp ,
106
+ },
107
+ }
108
+ err = spannerClient .AddUserSearchBookmark (ctx , UserSavedSearchBookmark {
109
+ UserID : testUser ,
110
+ SavedSearchID : * savedSearchID ,
111
+ })
112
+ if err != nil {
113
+ t .Errorf ("expected nil error. received %s" , err )
114
+ }
115
+
116
+ assertUserSearchSearchWithBookmarkStatus (ctx , t , expectedSavedSearchAfter , savedSearchID , testUser )
102
117
})
103
- if err != nil {
104
- t .Errorf ("expected nil error. received %s" , err )
105
- }
106
- actual , err = spannerClient .GetUserSavedSearch (ctx , * savedSearchID , valuePtr (testUser ))
107
- if err != nil {
108
- t .Errorf ("expected nil error. received %s" , err )
109
- }
110
- if ! userSavedSearchEquality (expectedSavedSearch , actual ) {
111
- t .Errorf ("different saved searches\n expected: %+v\n received: %v" , expectedSavedSearch , actual )
112
- }
113
118
119
+ t .Run ("the test user gets a limit error once it tries to bookmark too many" , func (t * testing.T ) {
120
+ err = spannerClient .AddUserSearchBookmark (ctx , UserSavedSearchBookmark {
121
+ UserID : testUser ,
122
+ SavedSearchID : * savedSearchID2 ,
123
+ })
124
+ if ! errors .Is (err , ErrUserSearchBookmarkLimitExceeded ) {
125
+ t .Errorf ("expected ErrUserSearchBookmarkLimitExceeded error. received %s" , err )
126
+ }
127
+ })
128
+
129
+ // Assuming they have not hit the saved search limit. (That is tested in create_user_saved_search_test.go)
130
+ t .Run ("the test user can still make saved searches even after hitting the bookmark limit" , func (t * testing.T ) {
131
+ var err error
132
+ testUserSavedSearchID , err = spannerClient .CreateNewUserSavedSearch (ctx , CreateUserSavedSearchRequest {
133
+ Name : "my really big search" ,
134
+ Query : "group:html OR group:css" ,
135
+ OwnerUserID : testUser ,
136
+ Description : nil ,
137
+ })
138
+ if err != nil {
139
+ t .Errorf ("expected nil error. received %s" , err )
140
+ }
141
+ if testUserSavedSearchID == nil {
142
+ t .Fatal ("expected non-nil id." )
143
+ }
144
+ })
145
+
146
+ t .Run ("the test user can remove a bookmark for a saved search they don't own" , func (t * testing.T ) {
147
+ err = spannerClient .DeleteUserSearchBookmark (ctx , UserSavedSearchBookmark {
148
+ UserID : testUser ,
149
+ SavedSearchID : * savedSearchID ,
150
+ })
151
+ if err != nil {
152
+ t .Errorf ("expected nil error. received %s" , err )
153
+ }
154
+
155
+ assertUserSearchSearchWithBookmarkStatus (ctx , t , expectedSavedSearchBeforeBookmark , savedSearchID , testUser )
156
+ })
157
+
158
+ t .Run ("the test user gets ErrQueryReturnedNoResults when trying to remove bookmark that does not exist (anymore)" ,
159
+ func (t * testing.T ) {
160
+ err = spannerClient .DeleteUserSearchBookmark (ctx , UserSavedSearchBookmark {
161
+ UserID : testUser ,
162
+ SavedSearchID : * savedSearchID ,
163
+ })
164
+ if ! errors .Is (err , ErrQueryReturnedNoResults ) {
165
+ t .Errorf ("expected ErrQueryReturnedNoResults error. received %s" , err )
166
+ }
167
+ })
168
+
169
+ t .Run ("the test user gets ErrQueryReturnedNoResults when trying to add a bookmark for search that does not exist" ,
170
+ func (t * testing.T ) {
171
+ err = spannerClient .AddUserSearchBookmark (ctx , UserSavedSearchBookmark {
172
+ UserID : testUser ,
173
+ SavedSearchID : "fake-uuid" ,
174
+ })
175
+ if ! errors .Is (err , ErrQueryReturnedNoResults ) {
176
+ t .Errorf ("expected ErrQueryReturnedNoResults error. received %s" , err )
177
+ }
178
+ })
179
+
180
+ t .Run ("the test user cannot remove a bookmark for a saved search they own" , func (t * testing.T ) {
181
+ err = spannerClient .DeleteUserSearchBookmark (ctx , UserSavedSearchBookmark {
182
+ UserID : testUser ,
183
+ SavedSearchID : * testUserSavedSearchID ,
184
+ })
185
+ if ! errors .Is (err , ErrOwnerCannotDeleteBookmark ) {
186
+ t .Errorf ("expected ErrOwnerCannotDeleteBookmark error. received %s" , err )
187
+ }
188
+ })
114
189
}
0 commit comments