hako/e2e/playwright/pagination_test.go
Felipe M. d71915a3fb
test(e2e): expand test suite with comprehensive coverage
- 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>
2026-01-29 12:49:40 +01:00

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