70 lines
2.6 KiB
TypeScript
70 lines
2.6 KiB
TypeScript
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 })]),
|
|
);
|
|
});
|
|
});
|