happy.spec.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { test, expect } from '@playwright/test';
  2. import { loadFixture, probeReadiness, readinessMessage } from './helpers';
  3. import { ensureLoggedIn, awaitSession } from './flow';
  4. declare const require: (id: string) => any;
  5. test.use({ ignoreHTTPSErrors: true });
  6. test.beforeAll(async () => {
  7. const readiness = await probeReadiness();
  8. expect(readiness.ok, readinessMessage(readiness)).toBe(true);
  9. });
  10. function loadFixtureOrSkip() {
  11. try {
  12. return loadFixture();
  13. } catch (err) {
  14. test.skip(true, `run provision first: cargo run -p provision -- bootstrap --password-file <path> (${(err as Error).message})`);
  15. throw new Error('unreachable');
  16. }
  17. }
  18. test('happy path: sign in, dashboard, refresh, logout', async ({ page }) => {
  19. const fixture = loadFixtureOrSkip();
  20. const { authenticator } = require('otplib');
  21. const totpCode = (secret: string) => authenticator.generate(secret);
  22. await page.goto('/');
  23. await expect(page.getByRole('link', { name: /sign in/i }).first()).toBeVisible();
  24. await ensureLoggedIn(page, fixture, totpCode);
  25. await page.goto('/dashboard');
  26. const session = await awaitSession(page);
  27. expect(session.subject).toBe(fixture.email);
  28. expect(session.scope).toContain('demo.read');
  29. expect(session.token_type).toBe('DPoP');
  30. expect(session.cnf?.jkt).toBeTruthy();
  31. const config = await (await page.request.get('/api/config')).json();
  32. expect(session.client_id).toBeTruthy();
  33. expect(session.client_id).toBe(config.client_id);
  34. await expect(page.getByText(fixture.email).first()).toBeVisible({ timeout: 20_000 });
  35. await page.getByRole('button', { name: 'Refresh' }).click();
  36. const afterRefresh = await awaitSession(page);
  37. expect(afterRefresh.subject).toBe(fixture.email);
  38. await page.getByRole('button', { name: 'Log out' }).click();
  39. await expect.poll(async () => (await page.request.get('/api/session')).status()).toBe(401);
  40. await expect(page.getByRole('link', { name: /sign in/i }).first()).toBeVisible();
  41. });