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