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