9c2177600c
- Replace all japan-korea-2026 URL references in test files - dailies.spec.js: update KNOWN_SLUG/TITLE/CITY/COUNTRY to first campiglia entry - accessibility.spec.js: update AX4 entry URL to campiglia entry - helpers.js: update TRACKER_DIR to italy-2026-demo dailies Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vgmzx8VTTTmCskSpQtsLTr
66 lines
2.4 KiB
JavaScript
66 lines
2.4 KiB
JavaScript
// @ts-check
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
|
|
const TRACKER_DIR = path.join(__dirname, '../../user/pages/01.trips/italy-2026-demo/01.dailies');
|
|
|
|
/**
|
|
* Wait for all filepond items to finish XHR upload.
|
|
*/
|
|
async function waitForFilePondUpload(page) {
|
|
await page.waitForFunction(() => {
|
|
const items = document.querySelectorAll('.filepond--item[data-filepond-item-state]');
|
|
return items.length > 0 && [...items].every(
|
|
el => el.getAttribute('data-filepond-item-state') === 'processing-complete'
|
|
);
|
|
}, { timeout: 20_000 });
|
|
}
|
|
|
|
/**
|
|
* Submit the post form with minimal required fields and return the unique title marker.
|
|
* Caller is responsible for cleanup via cleanupEntry().
|
|
*/
|
|
async function postEntry(page, { titleTag, content = 'Automated test. Safe to delete.', city = '', country = '' } = {}) {
|
|
const title = `UI Test ${titleTag} ${Date.now()}`;
|
|
await page.goto('/post');
|
|
await page.fill('input[name="data[title]"]', title);
|
|
await page.fill('textarea[name="data[content]"]', content);
|
|
if (city) await page.fill('input[name="data[location_city]"]', city);
|
|
if (country) await page.fill('input[name="data[location_country]"]', country);
|
|
await page.locator('.btn-post').evaluate(el => el.click());
|
|
await page.waitForSelector('.form-messages, .notices', { timeout: 15_000 });
|
|
return titleTag;
|
|
}
|
|
|
|
/**
|
|
* Find a tracker entry folder by a unique slug fragment, then delete it.
|
|
*/
|
|
function cleanupEntry(slugFragment) {
|
|
if (!slugFragment) return;
|
|
const entries = fs.readdirSync(TRACKER_DIR);
|
|
const match = entries.find(e => e.includes(slugFragment));
|
|
if (match) {
|
|
fs.rmSync(path.join(TRACKER_DIR, match), { recursive: true });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Find the first entry folder matching a slug fragment and return its full path.
|
|
*/
|
|
function findEntry(slugFragment) {
|
|
const entries = fs.readdirSync(TRACKER_DIR);
|
|
const match = entries.find(e => e.includes(slugFragment));
|
|
return match ? path.join(TRACKER_DIR, match) : null;
|
|
}
|
|
|
|
/**
|
|
* Read the entry .md file (entry.md or entry.en.md) from an entry folder.
|
|
*/
|
|
function readEntryMd(entryDir) {
|
|
const name = ['entry.md', 'entry.en.md'].find(f => fs.existsSync(path.join(entryDir, f)));
|
|
if (!name) return null;
|
|
return fs.readFileSync(path.join(entryDir, name), 'utf-8');
|
|
}
|
|
|
|
module.exports = { waitForFilePondUpload, postEntry, cleanupEntry, findEntry, readEntryMd, TRACKER_DIR };
|