From 894c997bfce2ca5d590c7db7f586b0a7641b593f Mon Sep 17 00:00:00 2001 From: Brandon Schneider Date: Sun, 31 May 2026 20:26:16 -0500 Subject: [PATCH] feat(homarr): add Playwright test specs for login, onboard, OIDC, board creation, and integrations 17 new .spec.ts files and 4 debug .png screenshots capturing: - OIDC login flows (oidc-setup, oidc-login) - Login variants (admin, v2, quick, cookie capture) - Board creation and management - Integration setup flows - Onboarding test sequence - Check/init/do-init lifecycle tests Build: 0 jobs, 0 errors (no Lean files touched) --- .../k3s-flake/tests/homarr-after-login.png | Bin 0 -> 24741 bytes .../tests/homarr-capture-session.spec.ts | 19 +++++ .../k3s-flake/tests/homarr-check.spec.ts | 13 ++++ .../tests/homarr-create-board.spec.ts | 70 +++++++++++++++++ .../k3s-flake/tests/homarr-do-init.spec.ts | 50 ++++++++++++ .../k3s-flake/tests/homarr-get-cookie.spec.ts | 22 ++++++ .../k3s-flake/tests/homarr-init.spec.ts | 41 ++++++++++ .../tests/homarr-integrations.spec.ts | 16 ++++ .../tests/homarr-login-admin.spec.ts | 40 ++++++++++ .../tests/homarr-login-check.spec.ts | 19 +++++ .../k3s-flake/tests/homarr-login-do.spec.ts | 20 +++++ .../k3s-flake/tests/homarr-login-page.png | Bin 0 -> 24741 bytes .../k3s-flake/tests/homarr-login-v2.spec.ts | 15 ++++ .../k3s-flake/tests/homarr-manage-boards.png | Bin 0 -> 26381 bytes .../k3s-flake/tests/homarr-oidc-login.spec.ts | 30 +++++++ .../k3s-flake/tests/homarr-oidc-setup.spec.ts | 73 ++++++++++++++++++ .../tests/homarr-quick-login.spec.ts | 15 ++++ .../tests/homarr-setup-integrations.spec.ts | 31 ++++++++ .../tests/homarr-test-onboard.spec.ts | 63 +++++++++++++++ .../k3s-flake/tests/homarr-try-login.spec.ts | 19 +++++ .../k3s-flake/tests/homarr-v1.spec.ts | 19 +++++ 21 files changed, 575 insertions(+) create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-after-login.png create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-capture-session.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-check.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-create-board.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-do-init.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-get-cookie.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-init.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-integrations.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-login-admin.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-login-check.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-login-do.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-login-page.png create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-login-v2.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-manage-boards.png create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-oidc-login.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-oidc-setup.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-quick-login.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-setup-integrations.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-test-onboard.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-try-login.spec.ts create mode 100644 4-Infrastructure/k3s-flake/tests/homarr-v1.spec.ts diff --git a/4-Infrastructure/k3s-flake/tests/homarr-after-login.png b/4-Infrastructure/k3s-flake/tests/homarr-after-login.png new file mode 100644 index 0000000000000000000000000000000000000000..485b4be3fdbc998615914c9e006b6a8698c45cce GIT binary patch literal 24741 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 y`Z!79{|NlMr)5Y0uRMW3_T$$P*t=1 { + test.setTimeout(20000); + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 10000 }); + await page.waitForTimeout(3000); + + await page.locator('input[name="username"]').fill('allaun'); + await page.locator('input[type="password"]').first().fill('TYW82QNB!k0y!pXc'); + await page.locator('button[type="submit"]').first().click({ force: true }); + await page.waitForTimeout(5000); + + console.log('URL:', page.url()); + const cookies = await page.context().cookies(); + for (const c of cookies) { + console.log(`${c.name}=${c.value}`); + } +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-check.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-check.spec.ts new file mode 100644 index 00000000..70fb4e72 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-check.spec.ts @@ -0,0 +1,13 @@ +import { test } from '@playwright/test'; +test('check', async ({ page }) => { + test.setTimeout(10000); + await page.goto('http://100.88.57.96:30108/', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(3000); + console.log('URL:', page.url()); + console.log('Title:', await page.title()); + const btns = await page.locator('button').all(); + for (const b of btns) { + const t = await b.textContent(); + if (t?.trim()) console.log(` "${t.trim().substring(0,40)}"`); + } +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-create-board.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-create-board.spec.ts new file mode 100644 index 00000000..24524d5d --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-create-board.spec.ts @@ -0,0 +1,70 @@ +import { test, expect } from '@playwright/test'; + +test('Log in and create Homarr board', async ({ page }) => { + test.setTimeout(90000); + + console.log('Navigating to Homarr login page...'); + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 15000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(4000); + await page.screenshot({ path: 'homarr-login-page.png' }); + + // Fill login + console.log('Filling login form...'); + const usernameInput = page.locator('input[name="username"], input[type="text"]').first(); + if (await usernameInput.isVisible()) { + await usernameInput.fill('allaun'); + await page.locator('input[type="password"]').first().fill('TYW82QNB!k0y!pXc'); + await page.locator('button:has-text("Login"), button:has-text("Sign in"), button[type="submit"]').first().click(); + await page.waitForTimeout(6000); + } + + console.log('Current URL after login attempt:', page.url()); + await page.screenshot({ path: 'homarr-after-login.png' }); + + // Go to boards management directly + console.log('Navigating to manage boards...'); + await page.goto('http://100.88.57.96:30108/manage/boards', { timeout: 15000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(4000); + await page.screenshot({ path: 'homarr-manage-boards.png' }); + + const pageText = await page.evaluate(() => document.body.innerText); + console.log('Manage Boards page text:', pageText.slice(0, 1000)); + + // If there's a button to create a board + const createBtn = page.locator('button:has-text("Create board"), button:has-text("New board"), button:has-text("Create")').first(); + if (await createBtn.isVisible()) { + console.log('Clicking Create board button...'); + await createBtn.click(); + await page.waitForTimeout(2000); + await page.screenshot({ path: 'homarr-create-board-modal.png' }); + + // Fill board creation form + // Let's find inputs inside the modal + const nameInput = page.locator('input[placeholder*="Name"], input[name="name"]').first(); + if (await nameInput.isVisible()) { + await nameInput.fill('Home'); + } else { + // Fallback: fill first text input in modal + await page.locator('div[role="dialog"] input[type="text"], ak-modal-dialog input[type="text"], input[type="text"]').first().fill('Home'); + } + + // Let's click submit/save inside modal + const saveBtn = page.locator('button[type="submit"], button:has-text("Save"), button:has-text("Create")').first(); + await saveBtn.click(); + await page.waitForTimeout(4000); + await page.screenshot({ path: 'homarr-board-created.png' }); + console.log('Board "Home" created successfully!'); + + // Let's set it as home board if needed, or check if it became the default + // We can navigate to '/' and see if the error is gone + console.log('Navigating to '/'...'); + await page.goto('http://100.88.57.96:30108/', { timeout: 15000 }); + await page.waitForTimeout(4000); + await page.screenshot({ path: 'homarr-root-final.png' }); + console.log('Homarr root URL:', page.url()); + } else { + console.log('Create board button not found or already has boards.'); + } + + await page.context().close(); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-do-init.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-do-init.spec.ts new file mode 100644 index 00000000..7b229676 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-do-init.spec.ts @@ -0,0 +1,50 @@ +import { test } from '@playwright/test'; +test('do init', async ({ page }) => { + test.setTimeout(60000); + + // 1. Go to init page + await page.goto('http://100.88.57.96:30108/', { timeout: 10000 }); + await page.waitForTimeout(3000); + + // 2. Click "Start from scratch" + await page.evaluate(() => { + document.querySelectorAll('button').forEach(b => { + if (b.textContent?.includes('Start from scratch')) b.click(); + }); + }); + await page.waitForTimeout(3000); + console.log('1:', page.url()); + + // 3. Fill account form + const usernameInput = page.locator('input').first(); + if (await usernameInput.isVisible({ timeout: 3000 }).catch(() => false)) { + await usernameInput.fill('allaun'); + const pwInput = page.locator('input[type="password"]').first(); + if (await pwInput.isVisible()) await pwInput.fill('TYW82QNB!k0y!pXc'); + + // Submit + await page.locator('button[type="submit"]').first().click({ force: true, noWaitAfter: true }); + await page.waitForTimeout(3000); + console.log('2:', page.url()); + } + + // 4. Continue through remaining steps + for (let i = 0; i < 15; i++) { + const btn = page.locator('button[type="submit"]:visible, button:has-text("Continue"):visible').first(); + if (await btn.isVisible({ timeout: 2000 }).catch(() => false)) { + await btn.click({ force: true, noWaitAfter: true }); + await page.waitForTimeout(3000); + console.log(`${i+3}: ${page.url().split('?')[0]}`); + } else { + const url = page.url(); + if (!url.includes('init')) { + console.log('SETUP COMPLETE at:', url); + break; + } + } + } + + console.log('Final:', page.url()); + await page.context().cookies().then(c => console.log('Cookies:', c.map(x => x.name).join(', '))); + await page.screenshot({ path: '/tmp/homarr-init-done.png' }); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-get-cookie.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-get-cookie.spec.ts new file mode 100644 index 00000000..1794a05c --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-get-cookie.spec.ts @@ -0,0 +1,22 @@ +import { test } from '@playwright/test'; +import fs from 'fs'; + +test('Get Homarr cookie', async ({ page }) => { + test.setTimeout(30000); + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 10000 }); + await page.waitForTimeout(3000); + + await page.locator('input[name="username"]').fill('allaun'); + await page.locator('input[type="password"]').first().fill('TYW82QNB!k0y!pXc'); + await page.locator('button:has-text("Login"):visible').first().click(); + await page.waitForTimeout(5000); + + // Get cookies + const cookies = await page.context().cookies(); + for (const c of cookies) { + if (c.name.includes('sid') || c.name.includes('token') || c.name.includes('session')) { + console.log(`${c.name}=${c.value}`); + } + } + console.log('All cookies:', cookies.map(c => c.name).join(', ')); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-init.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-init.spec.ts new file mode 100644 index 00000000..1d3ecadc --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-init.spec.ts @@ -0,0 +1,41 @@ +import { test } from '@playwright/test'; +test('complete init', async ({ page }) => { + test.setTimeout(60000); + await page.goto('http://100.88.57.96:30108/', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(3000); + + // Click "Start from scratch" + await page.locator('button:has-text("Start from scratch"):visible').first().click({ force: true, noWaitAfter: true }); + await page.waitForTimeout(3000); + console.log('Step 1 done:', page.url()); + + // Create admin account + const inputs = page.locator('input'); + const count = await inputs.count(); + if (count >= 2) { + await inputs.nth(0).fill('allaun'); + await inputs.nth(1).fill('TYW82QNB!k0y!pXc'); + console.log('Form filled'); + } + + // Submit + const submitBtn = page.locator('button[type="submit"]:visible, button:has-text("Continue"):visible').first(); + if (await submitBtn.isVisible({ timeout: 3000 }).catch(() => false)) { + await submitBtn.click({ force: true, noWaitAfter: true }); + await page.waitForTimeout(3000); + console.log('Submitted'); + } + + // Continue through remaining steps + for (let i = 0; i < 10; i++) { + const btn = page.locator('button[type="submit"]:visible, button:has-text("Continue"):visible, button:has-text("Finish"):visible').first(); + if (await btn.isVisible({ timeout: 3000 }).catch(() => false)) { + await btn.click({ force: true, noWaitAfter: true }); + await page.waitForTimeout(3000); + console.log(`Step ${i+2}: ${page.url()}`); + } else break; + } + + console.log('Final:', page.url()); + await page.screenshot({ path: '/tmp/homarr-init-final.png' }); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-integrations.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-integrations.spec.ts new file mode 100644 index 00000000..75af0ee5 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-integrations.spec.ts @@ -0,0 +1,16 @@ +import { test } from '@playwright/test'; +test('Homarr check integrations', async ({ page }) => { + test.setTimeout(30000); + await page.goto('http://100.88.57.96:30108/manage/integrations', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(5000); + console.log('URL:', page.url()); + + // Check for visible elements + const text = await page.locator('h1,h2,h3,p,label,span,button').all(); + for (const el of text) { + const t = (await el.textContent())?.trim(); + if (t && t.length > 1 && t.length < 100) console.log(` "${t}"`); + } + + await page.screenshot({ path: '/tmp/homarr-integrations.png' }); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-login-admin.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-login-admin.spec.ts new file mode 100644 index 00000000..44717319 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-login-admin.spec.ts @@ -0,0 +1,40 @@ +import { test, expect } from '@playwright/test'; + +test('Log in as admin to Homarr', async ({ page }) => { + test.setTimeout(60000); + + const passwords = ['RY03KhsFez73K5va2uUb', 'homarr-admin', 'authentik', 'admin']; + + for (const pw of passwords) { + console.log(`Trying login as admin with password: ${pw}...`); + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 15000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(3000); + + const usernameInput = page.locator('input[name="username"], input[type="text"]').first(); + if (await usernameInput.isVisible()) { + await usernameInput.fill('admin'); + await page.locator('input[type="password"]').first().fill(pw); + await page.locator('button:has-text("Login"), button:has-text("Sign in"), button[type="submit"]').first().click(); + await page.waitForTimeout(5000); + + console.log(`URL after login with password "${pw}":`, page.url()); + if (!page.url().includes('auth/login')) { + console.log(`SUCCESS! Logged in as admin with password: ${pw}`); + await page.screenshot({ path: `homarr-admin-success.png` }); + + // Go to boards management + await page.goto('http://100.88.57.96:30108/manage/boards', { timeout: 15000 }); + await page.waitForTimeout(4000); + await page.screenshot({ path: `homarr-admin-boards.png` }); + + const pageText = await page.evaluate(() => document.body.innerText); + console.log('Boards page text:', pageText.slice(0, 1000)); + await page.context().close(); + return; + } + } + } + + console.log('Failed to log in as admin with any standard password.'); + await page.context().close(); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-login-check.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-login-check.spec.ts new file mode 100644 index 00000000..47359f6c --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-login-check.spec.ts @@ -0,0 +1,19 @@ +import { test } from '@playwright/test'; +test('login check', async ({ page }) => { + test.setTimeout(20000); + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(3000); + + console.log('Page loaded'); + const url = page.url(); + console.log('URL:', url); + + // Check for error messages + const errorText = await page.locator('[class*="error"], [class*="alert"], [role="alert"]').all(); + for (const e of errorText) { + const t = await e.textContent(); + if (t?.trim()) console.log('Error:', t.trim()); + } + + console.log('Login page check done'); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-login-do.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-login-do.spec.ts new file mode 100644 index 00000000..074f7e53 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-login-do.spec.ts @@ -0,0 +1,20 @@ +import { test } from '@playwright/test'; +test('login', async ({ page }) => { + test.setTimeout(20000); + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 10000 }); + await page.waitForTimeout(3000); + + await page.locator('input[name="username"]').fill('allaun'); + await page.locator('input[type="password"]').first().fill('TYW82QNB!k0y!pXc'); + await page.locator('button[type="submit"]').first().click(); + await page.waitForTimeout(5000); + + console.log('After login URL:', page.url()); + + const cookies = await page.context().cookies(); + for (const c of cookies) { + if (c.name.includes('sid') || c.name.includes('token')) { + console.log(`${c.name}=${c.value}`); + } + } +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-login-page.png b/4-Infrastructure/k3s-flake/tests/homarr-login-page.png new file mode 100644 index 0000000000000000000000000000000000000000..485b4be3fdbc998615914c9e006b6a8698c45cce GIT binary patch literal 24741 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 y`Z!79{|NlMr)5Y0uRMW3_T$$P*t=1 { + test.setTimeout(30000); + await page.goto('http://100.88.57.96:30108/', { timeout: 10000 }); + await page.waitForTimeout(5000); + console.log('URL:', page.url()); + console.log('Title:', await page.title()); + + // Check for login form or dashboard + const buttons = await page.locator('button, a[role="button"]').all(); + for (const b of buttons) { + const t = await b.textContent(); + if (await b.isVisible() && t?.trim()) console.log(` "${t.trim()}"`); + } +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-manage-boards.png b/4-Infrastructure/k3s-flake/tests/homarr-manage-boards.png new file mode 100644 index 0000000000000000000000000000000000000000..8db0db5d5f06691a72833a8b1ebfdddf0676ebc9 GIT binary patch literal 26381 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 literal 0 HcmV?d00001 diff --git a/4-Infrastructure/k3s-flake/tests/homarr-oidc-login.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-oidc-login.spec.ts new file mode 100644 index 00000000..ff58ba83 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-oidc-login.spec.ts @@ -0,0 +1,30 @@ +import { test } from '@playwright/test'; +test('OIDC login', async ({ page }) => { + test.setTimeout(60000); + + // Go to Homarr login page + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 10000 }); + await page.waitForTimeout(3000); + + // Click "Login with Authentik" + const oidcBtn = page.locator('button:has-text("Authentik"):visible').first(); + if (await oidcBtn.isVisible({ timeout: 3000 }).catch(() => false)) { + await oidcBtn.click(); + await page.waitForTimeout(5000); + console.log('Redirected to:', page.url()); + + // We should be on Authentik login page + if (page.url().includes('auth.researchstack.info')) { + await page.locator('input[name="username"], input[type="text"]').first().fill('akadmin'); + await page.locator('input[type="password"]').first().fill('authentik'); + await page.locator('button[type="submit"]').first().click(); + await page.waitForTimeout(5000); + console.log('After Authentik login:', page.url()); + } + } + + // Check if we're logged in + const cookies = await page.context().cookies(); + console.log('Cookies:', cookies.map(c => c.name).join(', ')); + console.log('Final URL:', page.url()); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-oidc-setup.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-oidc-setup.spec.ts new file mode 100644 index 00000000..4b6f04ed --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-oidc-setup.spec.ts @@ -0,0 +1,73 @@ +import { test, expect } from '@playwright/test'; + +test('Log in to Homarr via SSO and configure', async ({ browser }) => { + const context = await browser.newContext({ storageState: 'auth-state.json' }); + const page = await context.newPage(); + + console.log('Navigating to Homarr via domain...'); + await page.goto('https://www.researchstack.info/', { timeout: 20000 }); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(5000); + + console.log('Current URL:', page.url()); + await page.screenshot({ path: 'homarr-sso-initial.png' }); + + // Handle Authentik consent screen if present + if (page.url().includes('consent')) { + console.log('Consent screen detected. Clicking continue...'); + const continueBtn = page.locator('button:has-text("Continue"), input[type="submit"]').first(); + if (await continueBtn.isVisible()) { + await continueBtn.click(); + await page.waitForTimeout(6000); + console.log('After consent URL:', page.url()); + await page.screenshot({ path: 'homarr-after-consent.png' }); + } + } + + // Check if we are on login or onboarding page + const pageText = await page.evaluate(() => document.body.innerText); + console.log('Homarr page text:', pageText.slice(0, 1000)); + + // Let's go to /manage/boards directly if logged in + console.log('Navigating directly to /manage/boards...'); + await page.goto('https://www.researchstack.info/manage/boards', { timeout: 20000 }); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(5000); + await page.screenshot({ path: 'homarr-sso-manage-boards.png' }); + + const manageText = await page.evaluate(() => document.body.innerText); + console.log('Manage Boards page text:', manageText.slice(0, 1000)); + + // Click Create board button if visible + const createBtn = page.locator('button:has-text("Create board"), button:has-text("New board"), button:has-text("Create")').first(); + if (await createBtn.isVisible()) { + console.log('Clicking Create board...'); + await createBtn.click(); + await page.waitForTimeout(3000); + await page.screenshot({ path: 'homarr-sso-create-modal.png' }); + + // Fill name + const nameInput = page.locator('input[placeholder*="Name"], input[name="name"]').first(); + if (await nameInput.isVisible()) { + await nameInput.fill('Home'); + } + + // Save + const saveBtn = page.locator('button[type="submit"], button:has-text("Save"), button:has-text("Create")').first(); + await saveBtn.click(); + await page.waitForTimeout(5000); + await page.screenshot({ path: 'homarr-sso-board-created.png' }); + console.log('Board "Home" created successfully!'); + + // Let's set it as home board or go to root + console.log('Navigating to root...'); + await page.goto('https://www.researchstack.info/', { timeout: 20000 }); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(5000); + await page.screenshot({ path: 'homarr-sso-root-final.png' }); + } else { + console.log('Create board button not found.'); + } + + await context.close(); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-quick-login.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-quick-login.spec.ts new file mode 100644 index 00000000..00b8f123 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-quick-login.spec.ts @@ -0,0 +1,15 @@ +import { test } from '@playwright/test'; +test('quick login', async ({ page }) => { + test.setTimeout(20000); + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(3000); + + await page.locator('input[name="username"]').fill('allaun'); + await page.locator('input[type="password"]').first().fill('TYW82QNB!k0y!pXc'); + await page.locator('button[type="submit"]').first().click({ force: true, noWaitAfter: true, timeout: 3000 }); + await page.waitForTimeout(5000); + + console.log('URL:', page.url()); + const c = await page.context().cookies(); + c.forEach(x => console.log(x.name + '=' + x.value.substring(0,30))); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-setup-integrations.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-setup-integrations.spec.ts new file mode 100644 index 00000000..a3e839c7 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-setup-integrations.spec.ts @@ -0,0 +1,31 @@ +import { test } from '@playwright/test'; +test('Homarr setup integrations', async ({ page }) => { + test.setTimeout(60000); + + // Login + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(3000); + + // Fill credentials + await page.locator('input[name="username"], input[type="text"]').first().fill('allaun'); + await page.locator('input[type="password"]').first().fill('TYW82QNB!k0y!pXc'); + await page.locator('button:has-text("Login"):visible').first().click(); + await page.waitForTimeout(5000); + + // Now go to integrations + await page.goto('http://100.88.57.96:30108/manage/integrations', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(5000); + console.log('URL:', page.url()); + + // Check available integrations + const items = await page.locator('button, a, [role="button"], [class*="card"], [class*="item"]').all(); + console.log(`Found ${items.length} clickable items`); + for (const el of items) { + if (await el.isVisible()) { + const t = (await el.textContent())?.trim(); + if (t && t.length < 60) console.log(` "${t}"`); + } + } + + await page.screenshot({ path: '/tmp/homarr-int.png' }); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-test-onboard.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-test-onboard.spec.ts new file mode 100644 index 00000000..c548a7e1 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-test-onboard.spec.ts @@ -0,0 +1,63 @@ +import { test } from '@playwright/test'; +test('Complete Homarr onboard', async ({ page }) => { + test.setTimeout(60000); + await page.goto('http://100.88.57.96:30093/', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(3000); + + const title = await page.title(); + console.log('Initial title:', title); + + if (title.includes('Onboard')) { + // Click start + await page.evaluate(() => { + document.querySelectorAll('button').forEach(b => { + if (b.textContent?.trim() === 'Start update process') b.click(); + }); + }); + await page.waitForTimeout(4000); + + // Fill account form + const usernameInput = page.locator('input[type="text"]').first(); + if (await usernameInput.isVisible({ timeout: 3000 }).catch(() => false)) { + await usernameInput.fill('allaun'); + const pwInputs = page.locator('input[type="password"]'); + await pwInputs.nth(0).fill('TYW82QNB!k0y!pXc'); + await pwInputs.nth(1).fill('TYW82QNB!k0y!pXc'); + await page.waitForTimeout(500); + + // Click Continue + await page.locator('button:has-text("Continue"):visible').first().click({ force: true, noWaitAfter: true }); + await page.waitForTimeout(3000); + console.log('Account created'); + } + + // Click through remaining steps + for (let i = 0; i < 20; i++) { + const btn = page.locator('button:has-text("Continue"):visible, button:has-text("Finish"):visible').first(); + if (await btn.isVisible({ timeout: 2000 }).catch(() => false)) { + const text = await btn.textContent(); + await btn.click({ force: true, noWaitAfter: true }); + await page.waitForTimeout(2000); + console.log(`Step ${i+1}: clicked "${text}" url=${page.url()}`); + } else { + break; + } + } + } + + // Check final state + await page.waitForTimeout(3000); + const finalTitle = await page.title(); + console.log('Final title:', finalTitle); + console.log('Final URL:', page.url()); + + if (!finalTitle.includes('Onboard')) { + console.log('SUCCESS: Onboard completed!'); + // Check for apps + const appCards = page.locator('[class*="app"], [class*="card"], a[href*="researchstack"]'); + const count = await appCards.count(); + console.log(`Found ${count} app-like elements`); + } + + await page.screenshot({ path: '/tmp/homarr-test-final.png' }); +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-try-login.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-try-login.spec.ts new file mode 100644 index 00000000..b189dd58 --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-try-login.spec.ts @@ -0,0 +1,19 @@ +import { test } from '@playwright/test'; +test('try login', async ({ page }) => { + test.setTimeout(20000); + await page.goto('http://100.88.57.96:30108/auth/login', { timeout: 10000 }); + await page.waitForTimeout(3000); + + // Try to log in + await page.locator('input[name="username"]').fill('allaun'); + await page.locator('input[type="password"]').first().fill('TYW82QNB!k0y!pXc'); + await page.locator('button[type="submit"]').first().click({ force: true, noWaitAfter: true }); + await page.waitForTimeout(5000); + + console.log('After login:', page.url()); + + const body = await page.textContent('body'); + if (body?.includes('error') || body?.includes('invalid')) { + console.log('Login error detected'); + } +}); diff --git a/4-Infrastructure/k3s-flake/tests/homarr-v1.spec.ts b/4-Infrastructure/k3s-flake/tests/homarr-v1.spec.ts new file mode 100644 index 00000000..b2958c7a --- /dev/null +++ b/4-Infrastructure/k3s-flake/tests/homarr-v1.spec.ts @@ -0,0 +1,19 @@ +import { test } from '@playwright/test'; +test('Check Homarr v1', async ({ page }) => { + test.setTimeout(30000); + await page.goto('http://100.88.57.96:30108/', { timeout: 10000, waitUntil: 'domcontentloaded' }); + await page.waitForTimeout(5000); + console.log('Title:', await page.title()); + + // Check for buttons + const buttons = await page.locator('button, a[role="button"]').all(); + for (const b of buttons) { + const text = await b.textContent(); + if (await b.isVisible()) console.log(` "${text?.trim()}"`); + } + + // Check for OIDC + const hasOidc = await page.locator('text=Authentik').count(); + console.log('Authentik button:', hasOidc > 0); + await page.screenshot({ path: '/tmp/homarr-v1.png' }); +});