hako/e2e/playwright/admin_rules_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

276 lines
7.9 KiB
Go

package playwright_test
import (
"context"
"fmt"
"testing"
"time"
"github.com/fmartingr/hako/e2e/e2eutil"
"github.com/stretchr/testify/require"
)
func TestRules_ViewConfig(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, "TestRules_ViewConfig", baseURL, page)
// Login as admin
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Navigate to rules admin page
err = helper.Navigate("/admin/rules")
require.NoError(t, err, "Failed to navigate to rules page")
time.Sleep(1 * time.Second)
helper.Screenshot("rules-config-view")
// Verify we're on the rules page
helper.AssertURL("/admin/rules")
// Verify rules config is visible
configVisible := helper.IsVisible(".rules-config")
require.True(t, configVisible, "Rules configuration should be visible")
t.Log("View rules config test completed successfully")
}
func TestRules_EditConfig(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, "TestRules_EditConfig", baseURL, page)
// Login as admin
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Navigate to rules admin page
err = helper.Navigate("/admin/rules")
require.NoError(t, err, "Failed to navigate to rules page")
time.Sleep(1 * time.Second)
helper.Screenshot("rules-before-edit")
// Look for editable textarea
textareaVisible := helper.IsVisible("textarea")
if textareaVisible {
// Get current content
currentContent, err := helper.GetText("textarea")
if err == nil {
t.Logf("Current config length: %d", len(currentContent))
}
helper.Screenshot("rules-editable")
t.Log("Rules config is editable")
} else {
t.Log("Textarea not found")
}
t.Log("Edit rules config test completed successfully")
}
func TestRules_SaveConfig(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, "TestRules_SaveConfig", baseURL, page)
// Login as admin
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Navigate to rules admin page
err = helper.Navigate("/admin/rules")
require.NoError(t, err, "Failed to navigate to rules page")
time.Sleep(1 * time.Second)
helper.Screenshot("rules-save-test")
// Look for save button
saveVisible := helper.IsVisible("button:has-text('Save')") ||
helper.IsVisible("button[type='submit']")
if saveVisible {
helper.Screenshot("save-button-visible")
t.Log("Save button found")
// Optionally try to save
// err = helper.Click("button:has-text('Save')")
// if err == nil {
// time.Sleep(1 * time.Second)
// helper.Screenshot("after-save")
// }
} else {
t.Log("Save button not found")
}
t.Log("Save rules config test completed successfully")
}
func TestRules_ValidationError(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, "TestRules_ValidationError", baseURL, page)
// Login as admin
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Navigate to rules admin page
err = helper.Navigate("/admin/rules")
require.NoError(t, err, "Failed to navigate to rules page")
time.Sleep(1 * time.Second)
helper.Screenshot("rules-validation-test")
// Try to input invalid JSON
textareaVisible := helper.IsVisible("textarea")
if textareaVisible {
// Clear and fill with invalid JSON
err = helper.Fill("textarea", "{invalid: json}")
if err == nil {
helper.Screenshot("invalid-json-rules")
// Try to save
saveVisible := helper.IsVisible("button:has-text('Save')")
if saveVisible {
err = helper.Click("button:has-text('Save')")
if err == nil {
time.Sleep(1 * time.Second)
helper.Screenshot("after-invalid-save-rules")
// Look for error message
errorVisible := helper.IsVisible(".error") ||
helper.IsVisible(".alert-error") ||
helper.IsVisible("[class*='error']")
t.Logf("Error message visible: %v", errorVisible)
}
}
}
} else {
t.Log("Textarea not found for validation test")
}
t.Log("Rules validation error test completed successfully")
}
func TestRules_RuleApplication(t *testing.T) {
ctx := context.Background()
// Start test web server
testServer, testServerURL, err := e2eutil.StartTestWebServer(ctx, t)
require.NoError(t, err, "Failed to start test web server")
defer testServer.Terminate(ctx)
// 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, "TestRules_RuleApplication", baseURL, page)
// Login as admin
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// First check the rules config
err = helper.Navigate("/admin/rules")
require.NoError(t, err, "Failed to navigate to rules page")
time.Sleep(1 * time.Second)
helper.Screenshot("rules-before-test")
// Navigate to home and create a link
err = helper.Navigate("/home")
require.NoError(t, err, "Failed to navigate to home")
// Create a test link
testURL := fmt.Sprintf("%s/index.html", testServerURL)
err = helper.CreateLink(testURL)
require.NoError(t, err, "Failed to create link")
time.Sleep(2 * time.Second)
helper.Screenshot("link-created-rule-test")
// Navigate to link details to see which archiver was used
err = helper.Click(".link-item")
if err == nil {
time.Sleep(1 * time.Second)
helper.Screenshot("link-details-archiver-used")
t.Log("Link created and details viewed to verify rule application")
}
t.Log("Rule application test completed successfully")
}