* Add pagination to smart views * fixup! Add pagination to smart views * fixup! fixup! Add pagination to smart views * fixup! fixup! fixup! Add pagination to smart views
133 lines
4.6 KiB
JavaScript
133 lines
4.6 KiB
JavaScript
const request = require('supertest');
|
|
const app = require('../../app');
|
|
const { Task } = require('../../models');
|
|
const { createTestUser } = require('../helpers/testUtils');
|
|
|
|
describe('Tasks Pagination', () => {
|
|
let user, agent;
|
|
|
|
beforeEach(async () => {
|
|
user = await createTestUser({
|
|
email: 'pagination-test@example.com',
|
|
});
|
|
|
|
// Create authenticated agent
|
|
agent = request.agent(app);
|
|
await agent.post('/api/login').send({
|
|
email: 'pagination-test@example.com',
|
|
password: 'password123',
|
|
});
|
|
});
|
|
|
|
describe('GET /api/tasks with pagination', () => {
|
|
it('should return all tasks when no pagination params provided', async () => {
|
|
// Create 5 tasks
|
|
for (let i = 1; i <= 5; i++) {
|
|
await Task.create({
|
|
user_id: user.id,
|
|
name: `Test Task ${i}`,
|
|
status: 0,
|
|
});
|
|
}
|
|
|
|
const response = await agent.get('/api/tasks');
|
|
|
|
expect(response.status).toBe(200);
|
|
expect(response.body.tasks).toBeDefined();
|
|
expect(response.body.tasks.length).toBeGreaterThanOrEqual(5);
|
|
// Should NOT include pagination metadata when no params provided
|
|
expect(response.body.pagination).toBeUndefined();
|
|
});
|
|
|
|
it('should paginate tasks with limit and offset', async () => {
|
|
// Create 25 tasks
|
|
for (let i = 1; i <= 25; i++) {
|
|
await Task.create({
|
|
user_id: user.id,
|
|
name: `Paginated Task ${i}`,
|
|
status: 0,
|
|
});
|
|
}
|
|
|
|
// First page
|
|
const response1 = await agent.get('/api/tasks').query({
|
|
limit: 10,
|
|
offset: 0,
|
|
});
|
|
|
|
expect(response1.status).toBe(200);
|
|
expect(response1.body.tasks).toBeDefined();
|
|
expect(response1.body.pagination).toBeDefined();
|
|
expect(response1.body.pagination.total).toBeGreaterThanOrEqual(25);
|
|
expect(response1.body.pagination.limit).toBe(10);
|
|
expect(response1.body.pagination.offset).toBe(0);
|
|
expect(response1.body.tasks.length).toBe(10);
|
|
expect(response1.body.pagination.hasMore).toBe(true);
|
|
|
|
// Second page
|
|
const response2 = await agent.get('/api/tasks').query({
|
|
limit: 10,
|
|
offset: 10,
|
|
});
|
|
|
|
expect(response2.status).toBe(200);
|
|
expect(response2.body.pagination.offset).toBe(10);
|
|
expect(response2.body.tasks.length).toBe(10);
|
|
expect(response2.body.pagination.hasMore).toBe(true);
|
|
|
|
// Third page
|
|
const response3 = await agent.get('/api/tasks').query({
|
|
limit: 10,
|
|
offset: 20,
|
|
});
|
|
|
|
expect(response3.status).toBe(200);
|
|
expect(response3.body.pagination.offset).toBe(20);
|
|
expect(response3.body.tasks.length).toBeGreaterThanOrEqual(5);
|
|
});
|
|
|
|
it('should work with other query params', async () => {
|
|
// Create tasks with different priorities
|
|
for (let i = 1; i <= 15; i++) {
|
|
await Task.create({
|
|
user_id: user.id,
|
|
name: `Task ${i}`,
|
|
status: 0,
|
|
priority: i % 3, // 0, 1, 2
|
|
});
|
|
}
|
|
|
|
// Get first page of high priority tasks
|
|
const response = await agent.get('/api/tasks').query({
|
|
priority: 'high',
|
|
limit: 3,
|
|
offset: 0,
|
|
});
|
|
|
|
expect(response.status).toBe(200);
|
|
expect(response.body.pagination).toBeDefined();
|
|
expect(response.body.tasks.length).toBeLessThanOrEqual(3);
|
|
});
|
|
|
|
it('should handle offset beyond total results', async () => {
|
|
// Create 5 tasks
|
|
for (let i = 1; i <= 5; i++) {
|
|
await Task.create({
|
|
user_id: user.id,
|
|
name: `Task ${i}`,
|
|
status: 0,
|
|
});
|
|
}
|
|
|
|
const response = await agent.get('/api/tasks').query({
|
|
limit: 10,
|
|
offset: 100,
|
|
});
|
|
|
|
expect(response.status).toBe(200);
|
|
expect(response.body.pagination).toBeDefined();
|
|
expect(response.body.tasks.length).toBe(0);
|
|
expect(response.body.pagination.hasMore).toBe(false);
|
|
});
|
|
});
|
|
});
|