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

258 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 TestSearch_FullText(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, "TestSearch_FullText", 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 test links with different content
testURL1 := fmt.Sprintf("%s/index.html", testServerURL)
testURL2 := fmt.Sprintf("%s/page-with-og.html", testServerURL)
testURL3 := fmt.Sprintf("%s/large-page.html", testServerURL)
err = helper.CreateLink(testURL1)
require.NoError(t, err, "Failed to create first link")
time.Sleep(1 * time.Second)
err = helper.CreateLink(testURL2)
require.NoError(t, err, "Failed to create second link")
time.Sleep(1 * time.Second)
err = helper.CreateLink(testURL3)
require.NoError(t, err, "Failed to create third link")
time.Sleep(2 * time.Second)
// Navigate to links page to perform search
err = helper.Navigate("/links")
require.NoError(t, err, "Failed to navigate to links")
time.Sleep(1 * time.Second)
helper.Screenshot("links-created-for-search")
// Perform full-text search
err = helper.SearchLinks("OpenGraph")
require.NoError(t, err, "Failed to perform search")
time.Sleep(1 * time.Second)
helper.Screenshot("search-results-opengraph")
// Verify search input contains the query
searchInput := helper.IsVisible("input[name='search']")
require.True(t, searchInput, "Search input should be visible")
t.Log("Full-text search test completed successfully")
}
func TestSearch_NoResults(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, "TestSearch_NoResults", baseURL, page)
// Login
err = helper.LoginAsAdmin()
require.NoError(t, err, "Failed to login")
// Navigate to links page (where search input is located)
err = helper.Navigate("/links")
require.NoError(t, err, "Failed to navigate to links")
helper.Screenshot("links-before-search")
// Search for something that doesn't exist
err = helper.SearchLinks("nonexistentquery12345")
require.NoError(t, err, "Failed to perform search")
time.Sleep(1 * time.Second)
helper.Screenshot("no-results")
// Verify no results message or empty state
noResultsVisible := helper.IsVisible(".no-results") ||
helper.IsVisible("p:has-text('No results')") ||
helper.IsVisible("p:has-text('No links found')")
t.Logf("No results message visible: %v", noResultsVisible)
t.Log("No results search test completed successfully")
}
func TestSearch_SpecialCharacters(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, "TestSearch_SpecialCharacters", 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 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)
// Navigate to links page to perform search
err = helper.Navigate("/links")
require.NoError(t, err, "Failed to navigate to links")
time.Sleep(1 * time.Second)
helper.Screenshot("link-created")
// Search with special characters
err = helper.SearchLinks("test & special")
require.NoError(t, err, "Failed to search with special characters")
time.Sleep(1 * time.Second)
helper.Screenshot("search-special-chars")
// Verify search doesn't break the page
helper.AssertURL("/links")
t.Log("Special characters search test completed successfully")
}
func TestSearch_ClearSearch(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, "TestSearch_ClearSearch", 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 test links
testURL1 := fmt.Sprintf("%s/index.html", testServerURL)
testURL2 := fmt.Sprintf("%s/page-with-og.html", testServerURL)
err = helper.CreateLink(testURL1)
require.NoError(t, err, "Failed to create first link")
time.Sleep(1 * time.Second)
err = helper.CreateLink(testURL2)
require.NoError(t, err, "Failed to create second link")
time.Sleep(2 * time.Second)
// Navigate to links page to perform search
err = helper.Navigate("/links")
require.NoError(t, err, "Failed to navigate to links")
time.Sleep(1 * time.Second)
// Perform search
err = helper.SearchLinks("index")
require.NoError(t, err, "Failed to perform search")
time.Sleep(1 * time.Second)
helper.Screenshot("search-active")
// Clear search
err = helper.WaitForSelector("input[name='search']", 5*time.Second)
require.NoError(t, err, "Search input not found")
// Clear by filling with empty string
err = helper.Fill("input[name='search']", "")
require.NoError(t, err, "Failed to clear search")
time.Sleep(1 * time.Second)
helper.Screenshot("search-cleared")
// Verify we're back to showing all links
helper.AssertURL("/links")
t.Log("Clear search test completed successfully")
}