import { pool } from '../../src/db'; import { resetDb, closeDb } from './setup/testDb'; beforeEach(async () => { await resetDb(); }); afterAll(async () => { await pool.end(); await closeDb(); }); /** An item with a draft row and one image, which is what a submission leaves. */ export async function seedSubmission( imagePath = '/uploads/photo.jpg' ): Promise<{ itemId: number; imageId: number }> { const item = await pool.query<{ id: number }>( `INSERT INTO items (name, status) VALUES ('Submission placeholder', 'pending') RETURNING id` ); const itemId = item.rows[0]!.id; await pool.query(`INSERT INTO item_drafts (item_id) VALUES ($1)`, [itemId]); const image = await pool.query<{ id: number }>( `INSERT INTO item_images (item_id, image_path, sort_order) VALUES ($1, $2, 0) RETURNING id`, [itemId, imagePath] ); return { itemId, imageId: image.rows[0]!.id }; } describe('the background-removal columns', () => { // Default true because the submitter's checkbox is ticked by default, and // because a row written by any path that does not mention the column should // behave like the new default rather than needing a backfill. it('defaults remove_background to true', async () => { const { itemId } = await seedSubmission(); const { rows } = await pool.query<{ remove_background: boolean }>( `SELECT remove_background FROM item_drafts WHERE item_id = $1`, [itemId] ); expect(rows[0]?.remove_background).toBe(true); }); // Null is also the answer to "can this be restored?", which is why there is // no separate flag: one fact, one place. it('leaves original_image_path null until a photo has been cut out', async () => { const { imageId } = await seedSubmission(); const { rows } = await pool.query<{ original_image_path: string | null }>( `SELECT original_image_path FROM item_images WHERE id = $1`, [imageId] ); expect(rows[0]?.original_image_path).toBeNull(); }); });