This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

test: profile tabs, landing page, settings redirect,

+136 -30
+18 -22
src/webapp/e2e/auth-redirect.spec.ts
··· 1 1 import { test, expect } from '@playwright/test'; 2 2 3 - test('unauthenticated /settings visit redirects to /login', async ({ 4 - page, 5 - }) => { 6 - const response = await page.goto('/settings'); 7 - console.log('status:', response?.status(), 'final url:', page.url()); 8 - 9 - await expect(page).toHaveURL('/login'); 10 - }); 11 - 12 - test('unauthenticated /notifications visit redirects to /login', async ({ 13 - page, 14 - }) => { 15 - const response = await page.goto('/notifications'); 16 - console.log('status:', response?.status(), 'final url:', page.url()); 17 - 18 - await expect(page).toHaveURL('/login'); 19 - }); 3 + /** 4 + * Auth redirect tests. 5 + * 6 + * /home and /notifications have server-side guards (verifySessionOnServer). 7 + * /settings/* and /profile (bare) redirect via the client-side useAuth fallback. 8 + */ 20 9 21 - test('unauthenticated /home visit redirects to /login', async ({ page }) => { 22 - const response = await page.goto('/home'); 23 - console.log('status:', response?.status(), 'final url:', page.url()); 10 + const protectedRoutes = [ 11 + '/home', 12 + '/notifications', 13 + '/settings', 14 + '/profile', 15 + ]; 24 16 25 - await expect(page).toHaveURL('/login'); 26 - }); 17 + for (const route of protectedRoutes) { 18 + test(`unauthenticated ${route} redirects to /login`, async ({ page }) => { 19 + await page.goto(route); 20 + await expect(page).toHaveURL('/login'); 21 + }); 22 + }
+46
src/webapp/e2e/landing-page.spec.ts
··· 1 + import { test, expect } from '@playwright/test'; 2 + 3 + test.describe('Landing page', () => { 4 + test.beforeEach(async ({ page }) => { 5 + await page.goto('/'); 6 + }); 7 + 8 + test('renders hero section with title and subtitle', async ({ page }) => { 9 + const heading = page.getByRole('heading', { level: 1 }); 10 + await expect(heading).toBeVisible(); 11 + await expect(heading).toContainText('A social knowledge network for'); 12 + }); 13 + 14 + test('shows sign up and log in buttons for unauthenticated users', async ({ 15 + page, 16 + }) => { 17 + const signUp = page.getByRole('link', { name: 'Sign up' }); 18 + const logIn = page.getByRole('link', { name: 'Log in' }); 19 + 20 + await expect(signUp).toBeVisible(); 21 + await expect(logIn).toBeVisible(); 22 + 23 + await expect(signUp).toHaveAttribute('href', '/signup'); 24 + await expect(logIn).toHaveAttribute('href', '/login'); 25 + }); 26 + 27 + test('renders community highlights section', async ({ page }) => { 28 + await expect( 29 + page.getByText('Highlights from our community'), 30 + ).toBeVisible(); 31 + 32 + await expect( 33 + page.getByRole('link', { name: 'Explore' }), 34 + ).toBeVisible(); 35 + }); 36 + 37 + 38 + test('renders footer with social and doc links', async ({ page }) => { 39 + await expect( 40 + page.getByRole('link', { name: 'Follow our blog' }), 41 + ).toBeVisible(); 42 + await expect( 43 + page.getByRole('link', { name: 'Semble Docs' }), 44 + ).toBeVisible(); 45 + }); 46 + });
+64
src/webapp/e2e/profile-tabs.spec.ts
··· 1 + import { test, expect } from '@playwright/test'; 2 + 3 + const HANDLE = 'alice.bsky.social'; 4 + const BASE = `/profile/${HANDLE}`; 5 + 6 + test.describe('Profile tab navigation', () => { 7 + test.beforeEach(async ({ page }) => { 8 + const response = await page.goto(BASE); 9 + expect(response?.status()).toBe(200); 10 + 11 + // Wait for the tab bar to be present 12 + await expect(page.getByRole('tab', { name: /Profile/ })).toBeVisible(); 13 + }); 14 + 15 + test('Profile tab is active by default', async ({ page }) => { 16 + const profileTab = page.getByRole('tab', { name: /Profile/ }); 17 + await expect(profileTab).toHaveAttribute('data-active', 'true'); 18 + await expect(page).toHaveURL(new RegExp(`${BASE}$`)); 19 + }); 20 + 21 + test('can navigate to Cards tab', async ({ page }) => { 22 + const tab = page.getByRole('tab', { name: /Cards/ }); 23 + await tab.click(); 24 + 25 + await expect(page).toHaveURL(`${BASE}/cards`); 26 + await expect(tab).toHaveAttribute('data-active', 'true'); 27 + }); 28 + 29 + test('can navigate to Collections tab', async ({ page }) => { 30 + const tab = page.getByRole('tab', { name: /Collections/ }); 31 + await tab.click(); 32 + 33 + await expect(page).toHaveURL(`${BASE}/collections`); 34 + await expect(tab).toHaveAttribute('data-active', 'true'); 35 + }); 36 + 37 + test('can navigate to Connections tab', async ({ page }) => { 38 + const tab = page.getByRole('tab', { name: /Connections/ }); 39 + await tab.click(); 40 + 41 + await expect(page).toHaveURL(`${BASE}/connections`); 42 + await expect(tab).toHaveAttribute('data-active', 'true'); 43 + }); 44 + 45 + test('can navigate to Network tab', async ({ page }) => { 46 + const tab = page.getByRole('tab', { name: /Network/ }); 47 + await tab.click(); 48 + 49 + await expect(page).toHaveURL(`${BASE}/network`); 50 + await expect(tab).toHaveAttribute('data-active', 'true'); 51 + }); 52 + 53 + test('tabs do not redirect to /login (profile is public)', async ({ 54 + page, 55 + }) => { 56 + const tabRoutes = ['cards', 'collections', 'connections', 'network']; 57 + 58 + for (const route of tabRoutes) { 59 + const response = await page.goto(`${BASE}/${route}`); 60 + expect(response?.status()).toBe(200); 61 + await expect(page).toHaveURL(`${BASE}/${route}`); 62 + } 63 + }); 64 + });
+8 -8
src/webapp/playwright.config.ts
··· 39 39 use: { ...devices['Desktop Chrome'] }, 40 40 }, 41 41 42 - { 43 - name: 'firefox', 44 - use: { ...devices['Desktop Firefox'] }, 45 - }, 42 + // { 43 + // name: 'firefox', 44 + // use: { ...devices['Desktop Firefox'] }, 45 + // }, 46 46 47 - { 48 - name: 'webkit', 49 - use: { ...devices['Desktop Safari'] }, 50 - }, 47 + // { 48 + // name: 'webkit', 49 + // use: { ...devices['Desktop Safari'] }, 50 + // }, 51 51 52 52 /* Test against mobile viewports. */ 53 53 // {