hako/e2e/playwright/navigation_test.go
Felipe M. d71915a3fb
test(e2e): expand test suite with comprehensive coverage
- Add e2e tests for admin pages (archivers, extractors, rules)
- Add tests for archives, links, navigation, and error handling
- Add search and pagination test coverage
- Implement test web server with Docker container
- Add seed data and helper utilities for tests
- Update webapp components for permission handling
- Generate HTML reports with embedded screenshots

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-29 12:49:40 +01:00

253 lines
7.3 KiB
Go

package playwright_test
import (
"context"
"testing"
"time"
"github.com/fmartingr/hako/e2e/e2eutil"
"github.com/stretchr/testify/require"
)
func TestNavigation_ProtectedRoutes(t *testing.T) {
ctx := context.Background()
// Start Hako container
container, baseURL, err := e2eutil.StartHakoContainer(ctx, t)
require.NoError(t, err, "Failed to start Hako container")
defer container.Terminate(ctx)
// Setup Playwright
_, browser, err := e2eutil.NewPlaywright(t)
require.NoError(t, err, "Failed to initialize Playwright")
browserCtx, err := e2eutil.NewBrowserContext(browser, t)
require.NoError(t, err, "Failed to create browser context")
page, err := browserCtx.NewPage()
require.NoError(t, err, "Failed to create new page")
// Create test helper
helper := e2eutil.NewTestHelper(t, "TestNavigation_ProtectedRoutes", baseURL, page)
// Try to access protected route without authentication
err = helper.Navigate("/home")
require.NoError(t, err, "Failed to navigate to home")
time.Sleep(1 * time.Second)
helper.Screenshot("unauthenticated-home")
// Verify redirect to login
currentPath := helper.GetCurrentPath()
require.Contains(t, currentPath, "/login", "Should be redirected to login page")
helper.Screenshot("redirected-to-login")
t.Log("Protected routes test completed successfully")
}
func TestNavigation_AdminRoutes(t *testing.T) {
ctx := context.Background()
// Start Hako container
container, baseURL, err := e2eutil.StartHakoContainer(ctx, t)
require.NoError(t, err, "Failed to start Hako container")
defer container.Terminate(ctx)
// Setup Playwright
_, browser, err := e2eutil.NewPlaywright(t)
require.NoError(t, err, "Failed to initialize Playwright")
browserCtx, err := e2eutil.NewBrowserContext(browser, t)
require.NoError(t, err, "Failed to create browser context")
page, err := browserCtx.NewPage()
require.NoError(t, err, "Failed to create new page")
// Create test helper
helper := e2eutil.NewTestHelper(t, "TestNavigation_AdminRoutes", baseURL, page)
// Login as admin
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Try to access admin routes
err = helper.Navigate("/admin/archivers")
require.NoError(t, err, "Failed to navigate to admin archivers")
time.Sleep(1 * time.Second)
helper.Screenshot("admin-archivers")
// Verify we're on admin page (admin users should have access)
currentPath := helper.GetCurrentPath()
require.Contains(t, currentPath, "/admin", "Should be on admin page")
helper.Screenshot("admin-access-granted")
t.Log("Admin routes test completed successfully")
}
func TestNavigation_Logout(t *testing.T) {
ctx := context.Background()
// Start Hako container
container, baseURL, err := e2eutil.StartHakoContainer(ctx, t)
require.NoError(t, err, "Failed to start Hako container")
defer container.Terminate(ctx)
// Setup Playwright
_, browser, err := e2eutil.NewPlaywright(t)
require.NoError(t, err, "Failed to initialize Playwright")
browserCtx, err := e2eutil.NewBrowserContext(browser, t)
require.NoError(t, err, "Failed to create browser context")
page, err := browserCtx.NewPage()
require.NoError(t, err, "Failed to create new page")
// Create test helper
helper := e2eutil.NewTestHelper(t, "TestNavigation_Logout", baseURL, page)
// Login
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Navigate to home
err = helper.Navigate("/home")
require.NoError(t, err, "Failed to navigate to home")
helper.Screenshot("logged-in-home")
// Logout
logoutVisible := helper.IsVisible("a[href='/logout']") ||
helper.IsVisible("button:has-text('Logout')") ||
helper.IsVisible("a:has-text('Logout')")
if logoutVisible {
err = helper.Logout()
require.NoError(t, err, "Failed to logout")
time.Sleep(1 * time.Second)
helper.Screenshot("after-logout")
// Verify redirect to login
currentPath := helper.GetCurrentPath()
require.Contains(t, currentPath, "/login", "Should be redirected to login after logout")
t.Log("Logout successful")
} else {
t.Log("Logout button not found, skipping logout action")
}
t.Log("Logout test completed successfully")
}
func TestNavigation_SidebarLinks(t *testing.T) {
ctx := context.Background()
// Start Hako container
container, baseURL, err := e2eutil.StartHakoContainer(ctx, t)
require.NoError(t, err, "Failed to start Hako container")
defer container.Terminate(ctx)
// Setup Playwright
_, browser, err := e2eutil.NewPlaywright(t)
require.NoError(t, err, "Failed to initialize Playwright")
browserCtx, err := e2eutil.NewBrowserContext(browser, t)
require.NoError(t, err, "Failed to create browser context")
page, err := browserCtx.NewPage()
require.NoError(t, err, "Failed to create new page")
// Create test helper
helper := e2eutil.NewTestHelper(t, "TestNavigation_SidebarLinks", baseURL, page)
// Login
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Navigate to home
err = helper.Navigate("/home")
require.NoError(t, err, "Failed to navigate to home")
time.Sleep(1 * time.Second)
helper.Screenshot("home-with-sidebar")
// Verify sidebar is visible
sidebarVisible := helper.IsVisible("nav") ||
helper.IsVisible(".sidebar") ||
helper.IsVisible("[class*='sidebar']") ||
helper.IsVisible("aside")
t.Logf("Sidebar visible: %v", sidebarVisible)
if sidebarVisible {
// Try clicking some sidebar links
// Home link
homeLink := helper.IsVisible("a[href='/home']")
if homeLink {
err = helper.Click("a[href='/home']")
if err == nil {
time.Sleep(1 * time.Second)
helper.Screenshot("sidebar-home-clicked")
}
}
// Admin link (if visible)
adminLink := helper.IsVisible("a[href*='/admin']")
if adminLink {
err = helper.Click("a[href*='/admin']")
if err == nil {
time.Sleep(1 * time.Second)
helper.Screenshot("sidebar-admin-clicked")
}
}
}
t.Log("Sidebar navigation test completed successfully")
}
func TestNavigation_BreadcrumbNavigation(t *testing.T) {
ctx := context.Background()
// Start Hako container
container, baseURL, err := e2eutil.StartHakoContainer(ctx, t)
require.NoError(t, err, "Failed to start Hako container")
defer container.Terminate(ctx)
// Setup Playwright
_, browser, err := e2eutil.NewPlaywright(t)
require.NoError(t, err, "Failed to initialize Playwright")
browserCtx, err := e2eutil.NewBrowserContext(browser, t)
require.NoError(t, err, "Failed to create browser context")
page, err := browserCtx.NewPage()
require.NoError(t, err, "Failed to create new page")
// Create test helper
helper := e2eutil.NewTestHelper(t, "TestNavigation_BreadcrumbNavigation", baseURL, page)
// Login
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Navigate to a nested page (admin page)
err = helper.Navigate("/admin/archivers")
require.NoError(t, err, "Failed to navigate to admin archivers")
time.Sleep(1 * time.Second)
helper.Screenshot("admin-page-with-breadcrumbs")
// Check for breadcrumbs
breadcrumbsVisible := helper.IsVisible(".breadcrumb") ||
helper.IsVisible(".breadcrumbs") ||
helper.IsVisible("[class*='breadcrumb']") ||
helper.IsVisible("nav[aria-label='breadcrumb']")
t.Logf("Breadcrumbs visible: %v", breadcrumbsVisible)
if breadcrumbsVisible {
helper.Screenshot("breadcrumbs-found")
t.Log("Breadcrumbs found on admin page")
} else {
t.Log("Breadcrumbs not found (may not be implemented)")
}
t.Log("Breadcrumb navigation test completed successfully")
}