hako/e2e/playwright/errors_test.go
Felipe M. f47010cd0f
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 11s
CI / format (pull_request) Successful in 2m38s
CI / test (pull_request) Successful in 5m0s
CI / lint (pull_request) Successful in 3m5s
CI / build (pull_request) Successful in 3m16s
CI / e2e (pull_request) Failing after 28m15s
fix(e2e): make link creation reach test web server via shared network
The test web server and Hako container previously ran on isolated Docker
networks, so Hako could not fetch URLs like http://localhost:32865 (the
host-mapped port) from inside its container. Most tests passed vacuously
because they only checked DOM containers; the Archive tests failed
because they tried to click an actual link item that was never created.

Changes:
- Add a shared Docker network so both containers can communicate by alias
- Test web server registers as hako-testserver and returns that as its URL
- Hako container joins the same network and can resolve the alias
- CreateLink now navigates to /home before each call so it can be invoked
  multiple times in a row (the form redirects to /links after submission)
- IsVisible uses .First() to avoid Playwright strict-mode errors when a
  selector matches multiple elements
- Archive tests use .link-item instead of the never-matching
  a[href*='/links/'] selector
- Bump Dockerfile.e2e Alpine to 3.23 to match the production Containerfile
2026-04-08 16:42:42 +02:00

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(".link-item")
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")
}