A count type beside the existing hours, text and choice readers. resolveHours would have worked — it is parseFloat with a positive guard — but calling a submission ceiling an "hours" setting is a lie in the type name that every later reader has to decode. Whole numbers only, so a ceiling of 12.5 is a typo rather than a preference, and a malformed value falls back rather than yielding a NaN that compares false against everything and silently disables the limit. resetDb is widened to clear intake_ settings as well as email_ ones. It deliberately does not truncate admin_settings, so a ceiling of 1 left behind by one suite would make every later suite's submissions refuse with a 503, in files that never mention a ceiling. The comment there already records that exact failure happening once with an email template subject, which reached the favorite-alert tests and failed five of them somewhere else entirely. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 lines
2.1 KiB
TypeScript
Executable File
54 lines
2.1 KiB
TypeScript
Executable File
import { Pool } from 'pg';
|
|
import { runner } from 'node-pg-migrate';
|
|
import path from 'path';
|
|
|
|
export const testPool = new Pool({
|
|
host: process.env.TEST_PGHOST || 'localhost',
|
|
port: parseInt(process.env.TEST_PGPORT || '55432', 10),
|
|
user: process.env.TEST_PGUSER || 'redefined_test',
|
|
password: process.env.TEST_PGPASSWORD || 'redefined_test',
|
|
database: process.env.TEST_PGDATABASE || 'redefined_test'
|
|
});
|
|
|
|
export async function migrate(): Promise<void> {
|
|
await runner({
|
|
databaseUrl: {
|
|
host: process.env.TEST_PGHOST || 'localhost',
|
|
port: parseInt(process.env.TEST_PGPORT || '55432', 10),
|
|
user: process.env.TEST_PGUSER || 'redefined_test',
|
|
password: process.env.TEST_PGPASSWORD || 'redefined_test',
|
|
database: process.env.TEST_PGDATABASE || 'redefined_test'
|
|
},
|
|
dir: path.resolve(__dirname, '..', '..', '..', 'migrations'),
|
|
direction: 'up',
|
|
migrationsTable: 'pgmigrations',
|
|
count: Infinity
|
|
});
|
|
}
|
|
|
|
export async function resetDb(): Promise<void> {
|
|
await testPool.query(`
|
|
TRUNCATE TABLE item_drafts, upload_links, orders, checkout_items, checkouts,
|
|
shipping_addresses, cart_items, carts, customer_tokens, customer_sessions, favorites,
|
|
customers, item_tags, item_images, items, tags, categories
|
|
RESTART IDENTITY CASCADE
|
|
`);
|
|
|
|
// admin_settings is not truncated — it holds the seeded cart_expiry_hours
|
|
// default that other suites read. But the email template rows in it are test
|
|
// data like any other, and a stored template outliving the suite that wrote
|
|
// it silently changes the mail every later suite asserts on. That is not
|
|
// hypothetical: a subject of "Gone" written by the template tests reached the
|
|
// favorite-alert tests and made five of them fail somewhere else entirely.
|
|
//
|
|
// Same reasoning, same failure, for the intake settings (#227): a ceiling of
|
|
// 1 left behind by the ceiling suite makes every later submission refuse with
|
|
// a 503, in files that never mention a ceiling.
|
|
await testPool.query(
|
|
`DELETE FROM admin_settings WHERE key LIKE 'email\_%' OR key LIKE 'intake\_%'`
|
|
);
|
|
}
|
|
|
|
export async function closeDb(): Promise<void> {
|
|
await testPool.end();
|
|
} |