(t *testing.T)
| 169 | } |
| 170 | |
| 171 | func TestSearchMemories(t *testing.T) { |
| 172 | t.Parallel() |
| 173 | db := setupTestDB(t) |
| 174 | ctx := t.Context() |
| 175 | |
| 176 | testMemories := []database.UserMemory{ |
| 177 | {ID: "1", CreatedAt: time.Now().Format(time.RFC3339), Memory: "User prefers dark mode", Category: "preference"}, |
| 178 | {ID: "2", CreatedAt: time.Now().Format(time.RFC3339), Memory: "Project uses Go and React", Category: "project"}, |
| 179 | {ID: "3", CreatedAt: time.Now().Format(time.RFC3339), Memory: "User likes Go for backend", Category: "preference"}, |
| 180 | {ID: "4", CreatedAt: time.Now().Format(time.RFC3339), Memory: "Deploy to AWS us-east-1", Category: "project"}, |
| 181 | } |
| 182 | for _, m := range testMemories { |
| 183 | require.NoError(t, db.AddMemory(ctx, m)) |
| 184 | } |
| 185 | |
| 186 | t.Run("single keyword", func(t *testing.T) { |
| 187 | results, err := db.SearchMemories(ctx, "Go", "") |
| 188 | require.NoError(t, err) |
| 189 | assert.Len(t, results, 2) |
| 190 | }) |
| 191 | |
| 192 | t.Run("multi-word AND", func(t *testing.T) { |
| 193 | results, err := db.SearchMemories(ctx, "Go backend", "") |
| 194 | require.NoError(t, err) |
| 195 | assert.Len(t, results, 1) |
| 196 | assert.Equal(t, "3", results[0].ID) |
| 197 | }) |
| 198 | |
| 199 | t.Run("category filter only", func(t *testing.T) { |
| 200 | results, err := db.SearchMemories(ctx, "", "preference") |
| 201 | require.NoError(t, err) |
| 202 | assert.Len(t, results, 2) |
| 203 | }) |
| 204 | |
| 205 | t.Run("keyword plus category", func(t *testing.T) { |
| 206 | results, err := db.SearchMemories(ctx, "Go", "project") |
| 207 | require.NoError(t, err) |
| 208 | assert.Len(t, results, 1) |
| 209 | assert.Equal(t, "2", results[0].ID) |
| 210 | }) |
| 211 | |
| 212 | t.Run("empty query returns all", func(t *testing.T) { |
| 213 | results, err := db.SearchMemories(ctx, "", "") |
| 214 | require.NoError(t, err) |
| 215 | assert.Len(t, results, 4) |
| 216 | }) |
| 217 | |
| 218 | t.Run("no matches", func(t *testing.T) { |
| 219 | results, err := db.SearchMemories(ctx, "nonexistent", "") |
| 220 | require.NoError(t, err) |
| 221 | assert.Empty(t, results) |
| 222 | }) |
| 223 | |
| 224 | t.Run("case insensitive", func(t *testing.T) { |
| 225 | results, err := db.SearchMemories(ctx, "go", "") |
| 226 | require.NoError(t, err) |
| 227 | assert.Len(t, results, 2) |
| 228 | }) |
nothing calls this directly
no test coverage detected