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") }