import request from 'supertest'; import { createApp } from '../../app'; import db from '../../db/connection'; import { createTestUser, cleanupTestData } from '../helpers'; import { signToken } from '../../utils/jwt'; const app = createApp(); let userId: string; let token: string; beforeEach(async () => { await cleanupTestData(); const { user } = await createTestUser(); userId = user.id; token = signToken(userId).token; }); afterAll(async () => { await cleanupTestData(); await db.destroy(); }); describe('GET /v1/sync', () => { it('returns delta since epoch (full sync)', async () => { // Add a pantry item await db('pantry_items').insert({ user_id: userId, item_name: 'Flour', item_name_lower: 'flour', quantity: 5, }); const res = await request(app) .get('/v1/sync?since=1970-01-01T00:00:00.000Z') .set('Authorization', `Bearer ${token}`); expect(res.status).toBe(200); expect(res.body.server_timestamp).toBeDefined(); expect(res.body.pantry.updated.length).toBe(1); expect(res.body.pantry.updated[0].item_name).toBe('Flour'); expect(Array.isArray(res.body.pantry.deleted)).toBe(true); expect(Array.isArray(res.body.shopping_lists.updated)).toBe(true); expect(Array.isArray(res.body.shopping_lists.deleted)).toBe(true); }); it('returns only items modified since timestamp', async () => { const since = new Date().toISOString(); // Wait a tick then add item await new Promise((r) => setTimeout(r, 10)); await db('pantry_items').insert({ user_id: userId, item_name: 'Sugar', item_name_lower: 'sugar', quantity: 2, }); const res = await request(app) .get(`/v1/sync?since=${encodeURIComponent(since)}`) .set('Authorization', `Bearer ${token}`); expect(res.status).toBe(200); expect(res.body.pantry.updated.length).toBe(1); expect(res.body.pantry.updated[0].item_name).toBe('Sugar'); }); it('returns 400 for missing since parameter', async () => { const res = await request(app) .get('/v1/sync') .set('Authorization', `Bearer ${token}`); expect(res.status).toBe(400); }); it('returns 400 for invalid since parameter', async () => { const res = await request(app) .get('/v1/sync?since=not-a-date') .set('Authorization', `Bearer ${token}`); expect(res.status).toBe(400); }); it('returns 401 without token', async () => { const res = await request(app).get('/v1/sync?since=1970-01-01T00:00:00.000Z'); expect(res.status).toBe(401); }); });