- 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>
252 lines
7.7 KiB
Go
252 lines
7.7 KiB
Go
package playwright_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/fmartingr/hako/e2e/e2eutil"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestError_InvalidURL(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, "TestError_InvalidURL", 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")
|
|
|
|
// Try to create a link with invalid URL
|
|
err = helper.WaitForSelector("input[name=\"url\"]", 5*time.Second)
|
|
require.NoError(t, err, "URL input not found")
|
|
|
|
// Fill with invalid URL
|
|
err = helper.Fill("input[name=\"url\"]", "not-a-valid-url")
|
|
require.NoError(t, err, "Failed to fill invalid URL")
|
|
helper.Screenshot("invalid-url-entered")
|
|
|
|
// Submit form
|
|
err = helper.Click("button[type=\"submit\"]")
|
|
require.NoError(t, err, "Failed to click submit")
|
|
time.Sleep(1 * time.Second)
|
|
|
|
helper.Screenshot("after-invalid-url-submit")
|
|
|
|
// Verify error message is shown
|
|
errorVisible := helper.IsVisible(".error") ||
|
|
helper.IsVisible(".alert-error") ||
|
|
helper.IsVisible("[class*='error']") ||
|
|
helper.IsVisible("input:invalid")
|
|
|
|
t.Logf("Error indicator visible: %v", errorVisible)
|
|
|
|
t.Log("Invalid URL error test completed successfully")
|
|
}
|
|
|
|
func TestError_NetworkFailure(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, "TestError_NetworkFailure", 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")
|
|
|
|
// Try to create a link with non-existent domain
|
|
err = helper.CreateLink("http://this-domain-does-not-exist-12345.com")
|
|
require.NoError(t, err, "Failed to submit URL")
|
|
time.Sleep(3 * time.Second)
|
|
|
|
helper.Screenshot("network-failure-test")
|
|
|
|
// The link might be created but archiving should fail
|
|
// Check for failure status later when viewing the link
|
|
|
|
t.Log("Network failure error test completed successfully")
|
|
}
|
|
|
|
func TestError_ArchivalFailure(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, "TestError_ArchivalFailure", 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")
|
|
|
|
// Create a link that will fail to archive
|
|
err = helper.CreateLink("http://localhost:1/nonexistent")
|
|
require.NoError(t, err, "Failed to submit URL")
|
|
time.Sleep(2 * time.Second)
|
|
|
|
helper.Screenshot("archival-failure-link-created")
|
|
|
|
// Navigate to link details
|
|
err = helper.Click("a[href*='/links/']")
|
|
if err == nil {
|
|
time.Sleep(5 * time.Second)
|
|
helper.Screenshot("archival-failure-details")
|
|
|
|
// Wait for archive to process and fail
|
|
time.Sleep(10 * time.Second)
|
|
helper.Screenshot("archival-failure-status")
|
|
|
|
// Look for failed status
|
|
failedVisible := helper.IsVisible(".status-failed") ||
|
|
helper.IsVisible("[class*='failed']") ||
|
|
helper.IsVisible("td:has-text('failed')")
|
|
|
|
t.Logf("Failed status visible: %v", failedVisible)
|
|
}
|
|
|
|
t.Log("Archival failure error test completed successfully")
|
|
}
|
|
|
|
func TestError_PermissionDenied(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, "TestError_PermissionDenied", baseURL, page)
|
|
|
|
// Try to access admin page without logging in
|
|
err = helper.Navigate("/admin/archivers")
|
|
require.NoError(t, err, "Failed to navigate to admin page")
|
|
|
|
// Wait for redirect to login page (Vue router guard redirects unauthenticated users)
|
|
// Give it up to 10 seconds for Vue app to load and router guard to execute
|
|
err = helper.WaitForPath("/login", 10*time.Second)
|
|
require.NoError(t, err, "Should be redirected to login page")
|
|
|
|
helper.Screenshot("permission-denied-redirected")
|
|
|
|
// Verify we're on login page
|
|
currentPath := helper.GetCurrentPath()
|
|
t.Logf("Current path after redirect: %s", currentPath)
|
|
require.Contains(t, currentPath, "/login", "Should be redirected to login when accessing admin without auth")
|
|
|
|
t.Log("Permission denied error test completed successfully")
|
|
}
|
|
|
|
func TestError_404NotFound(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, "TestError_404NotFound", baseURL, page)
|
|
|
|
// Login
|
|
err = helper.LoginAsAdmin()
|
|
require.NoError(t, err, "Failed to login")
|
|
|
|
// Try to access a non-existent link
|
|
err = helper.Navigate("/links/nonexistent-id-12345")
|
|
require.NoError(t, err, "Failed to navigate to non-existent link")
|
|
time.Sleep(1 * time.Second)
|
|
|
|
helper.Screenshot("404-error")
|
|
|
|
// Look for 404 error message or page
|
|
errorVisible := helper.IsVisible("h1:has-text('404')") ||
|
|
helper.IsVisible("h1:has-text('Not Found')") ||
|
|
helper.IsVisible(".error-404") ||
|
|
helper.IsVisible("[class*='not-found']")
|
|
|
|
t.Logf("404 error visible: %v", errorVisible)
|
|
|
|
// Alternatively, we might be redirected to home or error page
|
|
currentPath := helper.GetCurrentPath()
|
|
t.Logf("Current path after 404: %s", currentPath)
|
|
|
|
t.Log("404 Not Found error test completed successfully")
|
|
}
|