Research-Stack/4-Infrastructure/k3s-flake/tests/install-oidc-plugin.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

72 lines
3.1 KiB
TypeScript

import { test, expect } from '@playwright/test';
test('Install OIDC Plugin in Jellyfin', async ({ browser }) => {
const context = await browser.newContext({ storageState: 'auth-state.json' });
const page = await context.newPage();
console.log('Navigating to Jellyfin Plugins...');
await page.goto('https://media.researchstack.info/web/#/dashboard/plugins');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(4000);
// Login if needed
const usernameInput = page.locator('input[type="text"], input#txtManualName');
const passwordInput = page.locator('input[type="password"], input#txtManualPassword');
if (await usernameInput.isVisible()) {
console.log('Logging in...');
await usernameInput.fill('admin');
await passwordInput.fill('RY03KhsFez73K5va2uUb');
await page.locator('button[type="submit"], button.button-submit').first().click();
await page.waitForTimeout(6000);
}
// Double check we are on plugins page
if (!page.url().includes('#/dashboard/plugins')) {
await page.goto('https://media.researchstack.info/web/#/dashboard/plugins');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(4000);
}
console.log('Clicking Available tab...');
// Find the Available tab pill
const availableTab = page.locator('a:has-text("Available"), button:has-text("Available"), div:has-text("Available"), span:has-text("Available")').first();
await availableTab.click({ force: true });
await page.waitForTimeout(4000);
await page.screenshot({ path: 'jellyfin-plugins-available.png' });
// Type in the search box to find OpenID Connect
console.log('Searching for OpenID Connect in catalog...');
const searchInput = page.locator('input[type="search"], input[placeholder*="Search"]').first();
if (await searchInput.isVisible()) {
await searchInput.fill('OpenID Connect');
await page.waitForTimeout(3000);
await page.screenshot({ path: 'jellyfin-plugins-search-results.png' });
}
// Click on the OpenID Connect card
console.log('Clicking OpenID Connect card...');
const oidcCard = page.locator('a:has-text("OpenID Connect"), .card:has-text("OpenID Connect"), .cardHeader:has-text("OpenID Connect")').first();
await oidcCard.click({ force: true });
await page.waitForTimeout(4000);
await page.screenshot({ path: 'jellyfin-plugin-details.png' });
// Click Install
console.log('Clicking Install button...');
const installBtn = page.locator('button:has-text("Install"), button.button-submit').first();
await installBtn.click({ force: true });
await page.waitForTimeout(4000);
await page.screenshot({ path: 'jellyfin-plugin-install-clicked.png' });
// Handle OK button in modal dialog if any
const okBtn = page.locator('button:has-text("OK"), button:has-text("Ok"), button.button-submit').first();
if (await okBtn.isVisible()) {
console.log('Clicking OK on dialog...');
await okBtn.click({ force: true });
await page.waitForTimeout(3000);
await page.screenshot({ path: 'jellyfin-plugin-install-confirmed.png' });
}
console.log('OIDC Plugin installation completed.');
await context.close();
});