import { test, expect, registerUser, loginSeedAdmin } from '../fixtures'; import { createListing } from '../fixtures/listings.fixture'; test.describe('User-to-admin listing moderation flow', () => { test('user creates listing, submits review, admin approves, and listing becomes active', async ({ request }) => { const { accessToken: userToken } = await registerUser(request); const title = `E2E User Admin Flow ${Date.now()}`; const { listing } = await createListing(request, userToken, { title, address: `${Date.now()} Nguyễn Huệ`, }); const listingId = listing.listingId as string; expect(listingId).toBeTruthy(); expect(listing.status).toBe('DRAFT'); const submitRes = await request.patch(`listings/${listingId}/status`, { data: { status: 'PENDING_REVIEW' }, headers: { Authorization: `Bearer ${userToken}` }, }); expect(submitRes.status()).toBe(200); const submitBody = await submitRes.json(); expect(submitBody).toEqual(expect.objectContaining({ status: 'PENDING_REVIEW' })); const { accessToken: adminToken } = await loginSeedAdmin(request); const queueRes = await request.get('admin/moderation', { params: { page: 1, limit: 100 }, headers: { Authorization: `Bearer ${adminToken}` }, }); expect(queueRes.status()).toBe(200); const queue = await queueRes.json(); expect(queue.data).toEqual( expect.arrayContaining([ expect.objectContaining({ listingId, propertyTitle: title, }), ]), ); const approveRes = await request.post('admin/moderation/approve', { data: { listingId, moderationNotes: 'E2E admin approval', }, headers: { Authorization: `Bearer ${adminToken}` }, }); expect(approveRes.status()).toBe(201); const approveBody = await approveRes.json(); expect(approveBody).toEqual(expect.objectContaining({ listingId, status: 'ACTIVE' })); const detailRes = await request.get(`listings/${listingId}`); expect(detailRes.status()).toBe(200); const detail = await detailRes.json(); expect(detail.id).toBe(listingId); expect(detail.status).toBe('ACTIVE'); const queueAfterApproveRes = await request.get('admin/moderation', { params: { page: 1, limit: 100 }, headers: { Authorization: `Bearer ${adminToken}` }, }); expect(queueAfterApproveRes.status()).toBe(200); const queueAfterApprove = await queueAfterApproveRes.json(); expect(queueAfterApprove.data).not.toEqual( expect.arrayContaining([expect.objectContaining({ listingId })]), ); }); });