Skip to content

Commit 5d8370e

Browse files
authored
Merge pull request #321 from shoaib050326/codex/issue-161-category-filter
[codex] Add category filtering to raffle search
2 parents c1b8c54 + 6b5ada2 commit 5d8370e

3 files changed

Lines changed: 86 additions & 0 deletions

File tree

backend/src/api/rest/search/search.controller.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,32 @@
11
import { SearchController } from './search.controller';
2+
import { SearchService } from '../../../services/search.service';
3+
4+
describe('SearchController', () => {
5+
let controller: SearchController;
6+
let searchService: { search: jest.Mock };
7+
8+
beforeEach(() => {
9+
searchService = {
10+
search: jest.fn(),
11+
};
12+
13+
controller = new SearchController(searchService as unknown as SearchService);
14+
});
15+
16+
it('passes a trimmed category filter to the search service', async () => {
17+
searchService.search.mockResolvedValue([]);
18+
19+
await controller.search('raffle', ' Art ');
20+
21+
expect(searchService.search).toHaveBeenCalledWith('raffle', 'Art');
22+
});
23+
24+
it('treats an empty category as no filter', async () => {
25+
searchService.search.mockResolvedValue([]);
26+
27+
await controller.search('raffle', ' ');
28+
29+
expect(searchService.search).toHaveBeenCalledWith('raffle', undefined);
230

331
describe('SearchController', () => {
432
it('forwards q, limit, and offset and returns the service total', async () => {
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { MetadataService } from './metadata.service';
2+
import { SUPABASE_CLIENT } from './supabase.provider';
3+
4+
describe('MetadataService', () => {
5+
let service: MetadataService;
6+
let queryBuilder: {
7+
select: jest.Mock;
8+
or: jest.Mock;
9+
ilike: jest.Mock;
10+
limit: jest.Mock;
11+
upsert: jest.Mock;
12+
};
13+
let client: { from: jest.Mock };
14+
15+
beforeEach(() => {
16+
queryBuilder = {
17+
select: jest.fn().mockReturnThis(),
18+
or: jest.fn().mockReturnThis(),
19+
ilike: jest.fn().mockReturnThis(),
20+
limit: jest.fn(),
21+
upsert: jest.fn(),
22+
};
23+
24+
client = {
25+
from: jest.fn().mockReturnValue(queryBuilder),
26+
};
27+
28+
service = new MetadataService(client as any);
29+
});
30+
31+
it('applies category filtering case-insensitively', async () => {
32+
queryBuilder.limit.mockResolvedValue({ data: [], error: null });
33+
34+
await service.searchMetadata('raffle', 'Art');
35+
36+
expect(queryBuilder.ilike).toHaveBeenCalledWith('category', 'Art');
37+
});
38+
39+
it('trims category values before upserting metadata', async () => {
40+
const selectBuilder = {
41+
single: jest.fn().mockResolvedValue({
42+
data: { raffle_id: 1, category: 'Art' },
43+
error: null,
44+
}),
45+
};
46+
queryBuilder.upsert.mockReturnValue({
47+
select: jest.fn().mockReturnValue(selectBuilder),
48+
});
49+
50+
await service.upsertMetadata(1, { category: ' Art ' });
51+
52+
expect(queryBuilder.upsert).toHaveBeenCalledWith(
53+
expect.objectContaining({ category: 'Art' }),
54+
expect.any(Object),
55+
);
56+
});
57+
});

backend/src/services/metadata.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export class MetadataService {
111111
const row = {
112112
raffle_id: raffleId,
113113
...payload,
114+
category: payload.category?.trim() || null,
114115
updated_at: new Date().toISOString(),
115116
};
116117

0 commit comments

Comments
 (0)