Files
goodgo-platform/e2e/api/listings-moderate.spec.ts
Ho Ngoc Hai da10ac64c6 test(e2e): update all E2E specs for latest API and fixtures
Update 17 E2E test files including admin, auth, inquiries, listings,
payments, search, subscriptions, and MCP specs. Update listings fixture
and global setup to align with latest schema changes.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-11 01:40:45 +07:00

67 lines
1.9 KiB
TypeScript

import { test, expect, registerUser, createListing } from '../fixtures';
test.describe('PATCH /listings/:id/moderate — Listing moderation (admin only)', () => {
let accessToken: string;
let listingId: string;
test.beforeAll(async ({ request }) => {
const { accessToken: token } = await registerUser(request);
accessToken = token;
const { listing } = await createListing(request, token);
listingId = listing.id;
});
test('rejects unauthenticated moderation', async ({ request }) => {
const res = await request.patch(`listings/${listingId}/moderate`, {
data: {
action: 'approve',
moderationScore: 95,
notes: 'Looks good',
},
});
expect(res.status()).toBe(401);
});
test('rejects moderation from non-admin user', async ({ request }) => {
const res = await request.patch(`listings/${listingId}/moderate`, {
data: {
action: 'approve',
moderationScore: 95,
notes: 'Attempted non-admin moderation',
},
headers: { Authorization: `Bearer ${accessToken}` },
});
expect(res.ok()).toBeFalsy();
expect([401, 403]).toContain(res.status());
});
test('rejects moderation with invalid action', async ({ request }) => {
const res = await request.patch(`listings/${listingId}/moderate`, {
data: {
action: 'INVALID_ACTION',
notes: 'Invalid action test',
},
headers: { Authorization: `Bearer ${accessToken}` },
});
expect(res.ok()).toBeFalsy();
expect([400, 401, 403]).toContain(res.status());
});
test('rejects moderation for non-existent listing', async ({ request }) => {
const res = await request.patch('listings/non-existent-id/moderate', {
data: {
action: 'reject',
notes: 'Non-existent listing',
},
headers: { Authorization: `Bearer ${accessToken}` },
});
expect(res.ok()).toBeFalsy();
expect([400, 401, 403, 404]).toContain(res.status());
});
});