mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 10:11:13 -05:00
139 lines
4.7 KiB
TypeScript
139 lines
4.7 KiB
TypeScript
/**
|
|
* Park Creation E2E Tests
|
|
*
|
|
* Tests the complete park submission flow through the UI.
|
|
*/
|
|
|
|
import { test, expect } from '@playwright/test';
|
|
import { ParkCreationPage } from '../../helpers/page-objects/ParkCreationPage';
|
|
import { generateParkData, generateTestId } from '../../fixtures/test-data';
|
|
import { queryDatabase, cleanupTestData } from '../../fixtures/database';
|
|
|
|
test.describe('Park Creation Flow', () => {
|
|
let parkCreationPage: ParkCreationPage;
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
parkCreationPage = new ParkCreationPage(page);
|
|
await parkCreationPage.goto();
|
|
});
|
|
|
|
test.afterAll(async () => {
|
|
// Clean up test data
|
|
await cleanupTestData();
|
|
});
|
|
|
|
test('should create park submission successfully', async ({ page }) => {
|
|
const parkData = generateParkData({
|
|
name: `Test Park ${generateTestId()}`,
|
|
});
|
|
|
|
// Fill form
|
|
await parkCreationPage.fillBasicInfo(parkData.name, parkData.description);
|
|
await parkCreationPage.selectParkType(parkData.park_type);
|
|
await parkCreationPage.selectStatus(parkData.status);
|
|
await parkCreationPage.setOpeningDate(parkData.opened_date);
|
|
|
|
// Submit
|
|
await parkCreationPage.submitForm();
|
|
await parkCreationPage.expectSuccess();
|
|
|
|
// Verify submission created in database
|
|
const submissions = await queryDatabase('content_submissions', (qb) =>
|
|
qb.select('*').eq('entity_type', 'park').eq('is_test_data', true).order('created_at', { ascending: false }).limit(1)
|
|
);
|
|
|
|
expect(submissions).toHaveLength(1);
|
|
expect(submissions[0].status).toBe('pending');
|
|
|
|
// Verify NO park created yet (should be in moderation queue)
|
|
const parks = await queryDatabase('parks', (qb) =>
|
|
qb.select('*').eq('slug', parkData.slug)
|
|
);
|
|
|
|
expect(parks).toHaveLength(0);
|
|
});
|
|
|
|
test('should validate required fields', async ({ page }) => {
|
|
// Try to submit empty form
|
|
await parkCreationPage.submitForm();
|
|
|
|
// Should show validation errors
|
|
await parkCreationPage.expectValidationError('Name is required');
|
|
});
|
|
|
|
test('should auto-generate slug from name', async ({ page }) => {
|
|
const parkName = `Amazing Theme Park ${generateTestId()}`;
|
|
|
|
await page.fill('input[name="name"]', parkName);
|
|
|
|
// Wait for slug to auto-generate
|
|
await page.waitForTimeout(500);
|
|
|
|
const slugValue = await page.inputValue('input[name="slug"]');
|
|
expect(slugValue).toContain('amazing-theme-park');
|
|
expect(slugValue).not.toContain(' '); // No spaces
|
|
});
|
|
|
|
test('should support custom date precision', async ({ page }) => {
|
|
const parkData = generateParkData({
|
|
name: `Test Park ${generateTestId()}`,
|
|
});
|
|
|
|
await parkCreationPage.fillBasicInfo(parkData.name, parkData.description);
|
|
await parkCreationPage.setOpeningDate('2020-01-01', 'year');
|
|
|
|
await parkCreationPage.submitForm();
|
|
await parkCreationPage.expectSuccess();
|
|
|
|
// Verify date precision in submission
|
|
const submissions = await queryDatabase('content_submissions', (qb) =>
|
|
qb.select('submission_data').eq('entity_type', 'park').eq('is_test_data', true).order('created_at', { ascending: false }).limit(1)
|
|
);
|
|
|
|
const submissionData = submissions[0].submission_data;
|
|
expect(submissionData.opened_date_precision).toBe('year');
|
|
});
|
|
|
|
test('should display submission in user profile', async ({ page }) => {
|
|
const parkData = generateParkData({
|
|
name: `Test Park ${generateTestId()}`,
|
|
});
|
|
|
|
// Create submission
|
|
await parkCreationPage.fillBasicInfo(parkData.name, parkData.description);
|
|
await parkCreationPage.submitForm();
|
|
await parkCreationPage.expectSuccess();
|
|
|
|
// Navigate to user profile
|
|
await page.click('[data-testid="user-menu"]').or(page.click('button:has-text("Profile")'));
|
|
await page.click('text=My Submissions');
|
|
|
|
// Verify submission appears
|
|
await expect(page.getByText(parkData.name)).toBeVisible();
|
|
await expect(page.getByText(/pending/i)).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test.describe('Park Form Validation', () => {
|
|
let parkCreationPage: ParkCreationPage;
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
parkCreationPage = new ParkCreationPage(page);
|
|
await parkCreationPage.goto();
|
|
});
|
|
|
|
test('should enforce minimum description length', async ({ page }) => {
|
|
await page.fill('input[name="name"]', 'Test Park');
|
|
await page.fill('textarea[name="description"]', 'Too short');
|
|
|
|
await parkCreationPage.submitForm();
|
|
|
|
await expect(page.getByText(/description.*too short/i)).toBeVisible();
|
|
});
|
|
|
|
test('should prevent duplicate slugs', async ({ page }) => {
|
|
// This test would require creating a park first, then trying to create another with same slug
|
|
// Left as TODO - requires more complex setup
|
|
});
|
|
});
|