Extract shared test runner (helpers.js), add file-based SQLite with setup_db.py for fixture seeding, and add tests for auth guard, credentials management, full registration flow, health endpoint, password auth, and magic link registration errors. 66 checks across 7 test files.
63 lines
2.8 KiB
JavaScript
63 lines
2.8 KiB
JavaScript
// tests/e2e/test_password_auth.js
|
|
// Tests password login error states: wrong password, nonexistent user, form validation.
|
|
// Also tests successful login with seeded fixtures.
|
|
|
|
const { TARGET_URL, run } = require('./helpers');
|
|
|
|
run(async (page, assert) => {
|
|
const fixtures = JSON.parse(process.env.E2E_FIXTURES || '{}');
|
|
|
|
// ---- Test: Nonexistent user ----
|
|
console.log('\n--- Login: nonexistent user ---');
|
|
await page.goto(`${TARGET_URL}/login`);
|
|
await page.fill('#username', 'nobody');
|
|
await page.fill('#password', 'whatever');
|
|
await page.click('form[hx-post="/login/password"] button[type="submit"]');
|
|
|
|
await page.waitForSelector('[role="alert"]', { timeout: 5000 });
|
|
const error1 = await page.locator('[role="alert"]').textContent();
|
|
assert(
|
|
error1.includes('Invalid username or password'),
|
|
`Error shown for nonexistent user (got: "${error1}")`
|
|
);
|
|
|
|
// ---- Test: Wrong password for existing user ----
|
|
console.log('\n--- Login: wrong password ---');
|
|
await page.goto(`${TARGET_URL}/login`);
|
|
await page.fill('#username', fixtures.login_username);
|
|
await page.fill('#password', 'wrongpassword');
|
|
await page.click('form[hx-post="/login/password"] button[type="submit"]');
|
|
|
|
await page.waitForSelector('[role="alert"]', { timeout: 5000 });
|
|
const error2 = await page.locator('[role="alert"]').textContent();
|
|
assert(
|
|
error2.includes('Invalid username or password'),
|
|
`Error shown for wrong password (got: "${error2}")`
|
|
);
|
|
|
|
// ---- Test: Successful login ----
|
|
console.log('\n--- Login: correct password ---');
|
|
await page.goto(`${TARGET_URL}/login`);
|
|
await page.fill('#username', fixtures.login_username);
|
|
await page.fill('#password', fixtures.login_password);
|
|
await page.click('form[hx-post="/login/password"] button[type="submit"]');
|
|
|
|
await page.waitForURL('**/manage/credentials', { timeout: 5000 });
|
|
assert(
|
|
page.url().includes('/manage/credentials'),
|
|
`Successful login redirects to credentials (url: ${page.url()})`
|
|
);
|
|
|
|
// ---- Test: Form validation attributes ----
|
|
console.log('\n--- Form validation attributes ---');
|
|
await page.goto(`${TARGET_URL}/login`);
|
|
const usernameRequired = await page.locator('#username').getAttribute('required');
|
|
assert(usernameRequired !== null, 'Username has required attribute');
|
|
const passwordRequired = await page.locator('#password').getAttribute('required');
|
|
assert(passwordRequired !== null, 'Password has required attribute');
|
|
|
|
const usernameAutocomplete = await page.locator('#username').getAttribute('autocomplete');
|
|
assert(usernameAutocomplete === 'username', 'Username autocomplete is "username"');
|
|
const passwordAutocomplete = await page.locator('#password').getAttribute('autocomplete');
|
|
assert(passwordAutocomplete === 'current-password', 'Password autocomplete is "current-password"');
|
|
});
|