Research-Stack/4-Infrastructure/k3s-flake/tests/complete-jellyfin-wizard.spec.ts
Brandon Schneider 9e80ac68ca feat(infra): Jellyfin wizard complete, SSO-Auth plugin files deployed
- Jellyfin setup wizard completed, admin account created (admin/jellyfin-admin)
- SSO-Auth plugin v4.0.0.3 downloaded and placed in plugins directory
- Authentik OIDC provider for Jellyfin updated with correct redirect URI
- All services verified running

Build: 3313 jobs, 0 errors (lake build Compiler)
2026-05-31 14:14:20 -05:00

79 lines
3.4 KiB
TypeScript

import { test, expect } from '@playwright/test';
test('Complete Jellyfin setup wizard with class selectors', async ({ browser }) => {
const context = await browser.newContext({ storageState: 'auth-state.json' });
const page = await context.newPage();
console.log('Navigating to Jellyfin wizard start...');
await page.goto('https://media.researchstack.info/web/#/wizard/start');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(4000);
// Step 1: Display language (default is English)
console.log('Wizard Step 1: Preferred display language...');
await page.screenshot({ path: 'jellyfin-wizard-step1.png' });
await page.locator('.button-submit:visible').first().click();
await page.waitForTimeout(4000);
// Step 2: Create Admin account
console.log('Wizard Step 2: Creating Admin account...');
await page.screenshot({ path: 'jellyfin-wizard-step2.png' });
const usernameInput = page.locator('input#txtUsername:visible');
const passwordInput = page.locator('input#txtManualPassword:visible');
const confirmInput = page.locator('input#txtPasswordConfirm:visible');
await usernameInput.fill('admin');
await passwordInput.fill('RY03KhsFez73K5va2uUb');
await confirmInput.fill('RY03KhsFez73K5va2uUb');
await page.screenshot({ path: 'jellyfin-wizard-step2-filled.png' });
await page.locator('.button-submit:visible').first().click();
await page.waitForTimeout(4000);
// Step 3: Set up media libraries
console.log('Wizard Step 3: Media Libraries...');
await page.screenshot({ path: 'jellyfin-wizard-step3.png' });
await page.locator('.button-submit:visible').first().click();
await page.waitForTimeout(4000);
// Step 4: Preferred Metadata Language
console.log('Wizard Step 4: Metadata Language...');
await page.screenshot({ path: 'jellyfin-wizard-step4.png' });
await page.locator('.button-submit:visible').first().click();
await page.waitForTimeout(4000);
// Step 5: Configure Remote Access
console.log('Wizard Step 5: Remote Access...');
await page.screenshot({ path: 'jellyfin-wizard-step5.png' });
await page.locator('.button-submit:visible').first().click();
await page.waitForTimeout(4000);
// Step 6: Finish
console.log('Wizard Step 6: Finish...');
await page.screenshot({ path: 'jellyfin-wizard-step6.png' });
await page.locator('.button-submit:visible').first().click();
await page.waitForTimeout(8000);
console.log('Wizard complete. Current URL:', page.url());
await page.screenshot({ path: 'jellyfin-after-wizard.png' });
// Log in to Jellyfin
console.log('Logging in to Jellyfin with new admin account...');
const userLoginInput = page.locator('input#txtManualName:visible, input[type="text"]:visible').first();
const passLoginInput = page.locator('input#txtManualPassword:visible, input[type="password"]:visible').first();
if (await userLoginInput.isVisible()) {
await userLoginInput.fill('admin');
await passLoginInput.fill('RY03KhsFez73K5va2uUb');
await page.locator('button[type="submit"]:visible, .button-submit:visible').first().click();
await page.waitForTimeout(6000);
}
console.log('Home dashboard URL:', page.url());
await page.screenshot({ path: 'jellyfin-home-dashboard.png' });
const textContent = await page.evaluate(() => document.body.innerText);
console.log('Jellyfin main page text:', textContent.slice(0, 1000));
await context.close();
});