- 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>
432 lines
13 KiB
Go
432 lines
13 KiB
Go
package playwright_test
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/fmartingr/hako/e2e/e2eutil"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestPagination_NextPage(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, "TestPagination_NextPage", 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 multiple links to trigger pagination (typically 10+ items)
|
|
for i := 0; i < 15; i++ {
|
|
testURL := fmt.Sprintf("%s/test-page-%d.html", testServerURL, i)
|
|
err = helper.CreateLink(testURL)
|
|
require.NoError(t, err, "Failed to create link %d", i)
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
|
|
// Refresh to see all links
|
|
err = helper.Navigate("/home")
|
|
require.NoError(t, err, "Failed to navigate to home")
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("first-page")
|
|
|
|
// Look for next page button
|
|
nextButtonVisible := helper.IsVisible("a:has-text('Next')") ||
|
|
helper.IsVisible("button:has-text('Next')") ||
|
|
helper.IsVisible("[aria-label='Next page']") ||
|
|
helper.IsVisible(".pagination-next")
|
|
|
|
if nextButtonVisible {
|
|
// Click next page
|
|
err = helper.Click("a:has-text('Next'), button:has-text('Next'), [aria-label='Next page']")
|
|
if err == nil {
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("second-page")
|
|
|
|
// Verify URL changed (might have ?page=2 or similar)
|
|
currentURL := helper.GetURL()
|
|
t.Logf("Current URL after next: %s", currentURL)
|
|
|
|
t.Log("Next page navigation successful")
|
|
} else {
|
|
t.Logf("Failed to click next button: %v", err)
|
|
}
|
|
} else {
|
|
t.Log("Next button not visible (pagination may not be active yet)")
|
|
}
|
|
|
|
t.Log("Pagination next page test completed successfully")
|
|
}
|
|
|
|
func TestPagination_PreviousPage(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, "TestPagination_PreviousPage", 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 multiple links
|
|
for i := 0; i < 15; i++ {
|
|
testURL := fmt.Sprintf("%s/test-page-%d.html", testServerURL, i)
|
|
err = helper.CreateLink(testURL)
|
|
require.NoError(t, err, "Failed to create link %d", i)
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
|
|
// Navigate to page 2 first
|
|
err = helper.Navigate("/home?page=2")
|
|
require.NoError(t, err, "Failed to navigate to page 2")
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("on-page-2")
|
|
|
|
// Look for previous page button
|
|
prevButtonVisible := helper.IsVisible("a:has-text('Previous')") ||
|
|
helper.IsVisible("button:has-text('Previous')") ||
|
|
helper.IsVisible("[aria-label='Previous page']") ||
|
|
helper.IsVisible(".pagination-prev")
|
|
|
|
if prevButtonVisible {
|
|
// Click previous page
|
|
err = helper.Click("a:has-text('Previous'), button:has-text('Previous'), [aria-label='Previous page']")
|
|
if err == nil {
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("back-to-first-page")
|
|
|
|
t.Log("Previous page navigation successful")
|
|
} else {
|
|
t.Logf("Failed to click previous button: %v", err)
|
|
}
|
|
} else {
|
|
t.Log("Previous button not visible")
|
|
}
|
|
|
|
t.Log("Pagination previous page test completed successfully")
|
|
}
|
|
|
|
func TestPagination_FirstPage(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, "TestPagination_FirstPage", 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 multiple links
|
|
for i := 0; i < 15; i++ {
|
|
testURL := fmt.Sprintf("%s/test-page-%d.html", testServerURL, i)
|
|
err = helper.CreateLink(testURL)
|
|
require.NoError(t, err, "Failed to create link %d", i)
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
|
|
// Navigate to a later page
|
|
err = helper.Navigate("/home?page=3")
|
|
require.NoError(t, err, "Failed to navigate to page 3")
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("on-page-3")
|
|
|
|
// Look for first page button
|
|
firstButtonVisible := helper.IsVisible("a:has-text('First')") ||
|
|
helper.IsVisible("button:has-text('First')") ||
|
|
helper.IsVisible("[aria-label='First page']") ||
|
|
helper.IsVisible("a:has-text('1')")
|
|
|
|
if firstButtonVisible {
|
|
// Click first page
|
|
err = helper.Click("a:has-text('First'), a:has-text('1')")
|
|
if err == nil {
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("jumped-to-first-page")
|
|
|
|
t.Log("First page navigation successful")
|
|
}
|
|
} else {
|
|
t.Log("First page button not visible")
|
|
}
|
|
|
|
t.Log("Pagination first page test completed successfully")
|
|
}
|
|
|
|
func TestPagination_LastPage(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, "TestPagination_LastPage", 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 multiple links
|
|
for i := 0; i < 15; i++ {
|
|
testURL := fmt.Sprintf("%s/test-page-%d.html", testServerURL, i)
|
|
err = helper.CreateLink(testURL)
|
|
require.NoError(t, err, "Failed to create link %d", i)
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
|
|
// Refresh to see pagination
|
|
err = helper.Navigate("/home")
|
|
require.NoError(t, err, "Failed to navigate to home")
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("first-page-pagination")
|
|
|
|
// Look for last page button
|
|
lastButtonVisible := helper.IsVisible("a:has-text('Last')") ||
|
|
helper.IsVisible("button:has-text('Last')") ||
|
|
helper.IsVisible("[aria-label='Last page']")
|
|
|
|
if lastButtonVisible {
|
|
// Click last page
|
|
err = helper.Click("a:has-text('Last')")
|
|
if err == nil {
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("jumped-to-last-page")
|
|
|
|
t.Log("Last page navigation successful")
|
|
}
|
|
} else {
|
|
t.Log("Last page button not visible")
|
|
}
|
|
|
|
t.Log("Pagination last page test completed successfully")
|
|
}
|
|
|
|
func TestPagination_PageNumbers(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, "TestPagination_PageNumbers", 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 multiple links
|
|
for i := 0; i < 15; i++ {
|
|
testURL := fmt.Sprintf("%s/test-page-%d.html", testServerURL, i)
|
|
err = helper.CreateLink(testURL)
|
|
require.NoError(t, err, "Failed to create link %d", i)
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
|
|
// Refresh
|
|
err = helper.Navigate("/home")
|
|
require.NoError(t, err, "Failed to navigate to home")
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("pagination-with-numbers")
|
|
|
|
// Check if pagination controls are visible
|
|
paginationVisible := helper.IsVisible(".pagination") ||
|
|
helper.IsVisible("[class*='pagination']") ||
|
|
helper.IsVisible("nav[aria-label*='pagination']")
|
|
|
|
t.Logf("Pagination visible: %v", paginationVisible)
|
|
|
|
if paginationVisible {
|
|
helper.Screenshot("pagination-controls")
|
|
}
|
|
|
|
t.Log("Pagination page numbers test completed successfully")
|
|
}
|
|
|
|
func TestPagination_ItemCount(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, "TestPagination_ItemCount", 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 exactly 12 links
|
|
for i := 0; i < 12; i++ {
|
|
testURL := fmt.Sprintf("%s/test-page-%d.html", testServerURL, i)
|
|
err = helper.CreateLink(testURL)
|
|
require.NoError(t, err, "Failed to create link %d", i)
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
|
|
// Refresh
|
|
err = helper.Navigate("/home")
|
|
require.NoError(t, err, "Failed to navigate to home")
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("all-items-page-1")
|
|
|
|
// Count items on first page (typically 10 per page)
|
|
itemCount, err := helper.GetElementCount(".link-item, tr.link-row, [class*='link']")
|
|
if err == nil {
|
|
t.Logf("Items on page 1: %d", itemCount)
|
|
}
|
|
|
|
// Navigate to page 2 if pagination exists
|
|
page2Visible := helper.IsVisible("a[href*='page=2']")
|
|
if page2Visible {
|
|
err = helper.Navigate("/home?page=2")
|
|
require.NoError(t, err, "Failed to navigate to page 2")
|
|
time.Sleep(1 * time.Second)
|
|
helper.Screenshot("items-page-2")
|
|
|
|
// Count items on second page
|
|
itemCount2, err := helper.GetElementCount(".link-item, tr.link-row, [class*='link']")
|
|
if err == nil {
|
|
t.Logf("Items on page 2: %d", itemCount2)
|
|
}
|
|
}
|
|
|
|
t.Log("Pagination item count test completed successfully")
|
|
}
|