// routes/__tests__/products.routes.test.js
import request from 'supertest';
import { app } from '../../app.js';
import { Product } from '../../models/Product.js';
import { createTestUser, generateToken } from '../helpers.js';
describe('Products API', () => {
let authToken;
beforeAll(async () => {
const user = await createTestUser();
authToken = generateToken(user);
});
beforeEach(async () => {
await Product.deleteMany({});
});
describe('GET /api/products', () => {
it('returns list of products', async () => {
await Product.create([
{ name: 'Product 1', price: 10, sku: 'P1' },
{ name: 'Product 2', price: 20, sku: 'P2' }
]);
const response = await request(app)
.get('/api/products')
.expect(200);
expect(response.body.success).toBe(true);
expect(response.body.data).toHaveLength(2);
});
it('supports pagination', async () => {
// Create 30 products
await Product.insertMany(
Array.from({ length: 30 }, (_, i) => ({
name: `Product ${i}`, price: 10, sku: `P${i}`
}))
);
const response = await request(app)
.get('/api/products?page=2&limit=10')
.expect(200);
expect(response.body.data).toHaveLength(10);
expect(response.body.meta.page).toBe(2);
});
});
describe('POST /api/products', () => {
it('creates product with valid data', async () => {
const response = await request(app)
.post('/api/products')
.set('Authorization', `Bearer ${authToken}`)
.send({ name: 'New Product', price: 29.99, sku: 'NEW-001' })
.expect(201);
expect(response.body.data.name).toBe('New Product');
});
it('returns 401 without auth token', async () => {
await request(app)
.post('/api/products')
.send({ name: 'Test', price: 10, sku: 'T1' })
.expect(401);
});
});
});