Files
mercadodevida/project/src/modules/users/infrastructure/pg-profile-repository.test.ts
2026-08-22 08:35:46 +02:00

67 lines
2.3 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import { PgProfileRepository } from './pg-profile-repository.js';
interface QueryResult {
rows: unknown[];
}
/** F-154: mock pg.Pool returning configurable rows keyed by SQL family. */
function mockPool(countRows: unknown[], selectRows: unknown[]) {
const query = vi.fn(async (sql: string, _params: unknown[]): Promise<QueryResult> => {
if (String(sql).includes('COUNT')) return { rows: countRows };
return { rows: selectRows };
});
const pool = { query } as unknown as import('pg').Pool;
return { pool, query };
}
const CUSTOMER_ROW = {
user_id: 'c1',
email: 'ben@example.com',
role: 'customer',
display_name: 'Ben',
phone: '111',
created_at: new Date('2026-01-01T00:00:00Z'),
};
describe('PgProfileRepository.listCustomers — F-154 customers-only', () => {
it('always restricts the list query to role = customer', async () => {
const { pool, query } = mockPool([{ cnt: '1' }], [CUSTOMER_ROW]);
const repo = new PgProfileRepository(pool);
const result = await repo.listCustomers({ offset: 0, limit: 20 });
expect(result.total).toBe(1);
expect(result.items).toHaveLength(1);
expect(result.items[0]!.role).toBe('customer');
expect(result.items[0]!.email).toBe('ben@example.com');
const selectSql = query.mock.calls[1]![0] as string;
expect(selectSql).toContain("iu.role = 'customer'");
});
it('applies the customer filter to the count query too', async () => {
const { pool, query } = mockPool([{ cnt: '1' }], [CUSTOMER_ROW]);
const repo = new PgProfileRepository(pool);
await repo.listCustomers({ offset: 0, limit: 20 });
const countSql = query.mock.calls[0]![0] as string;
expect(countSql).toContain('COUNT');
expect(countSql).toContain("iu.role = 'customer'");
});
it('keeps the email search parameterized alongside the role filter', async () => {
const { pool, query } = mockPool([{ cnt: '1' }], [CUSTOMER_ROW]);
const repo = new PgProfileRepository(pool);
await repo.listCustomers({ q: 'ben', offset: 0, limit: 20 });
const selectSql = query.mock.calls[1]![0] as string;
const params = query.mock.calls[1]![1] as unknown[];
expect(selectSql).toContain("iu.role = 'customer'");
expect(selectSql).toContain('ILIKE $1');
expect(params[0]).toBe('%ben%');
});
});