package playwright_test import ( "context" "fmt" "testing" "time" "github.com/fmartingr/hako/e2e/e2eutil" "github.com/stretchr/testify/require" ) func TestQuickAdd_CreateLink(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, "TestQuickAdd_CreateLink", baseURL, page) // Login as admin err = helper.LoginAsAdmin() require.NoError(t, err, "Failed to login") helper.Screenshot("logged-in") // Navigate to home err = helper.Navigate("/home") require.NoError(t, err, "Failed to navigate to home") helper.Screenshot("home-page") // Create a link using Quick Add testURL := fmt.Sprintf("%s/index.html", testServerURL) err = helper.CreateLink(testURL) require.NoError(t, err, "Failed to create link") helper.Screenshot("link-created") // Navigate to links page (explicit navigation in case redirect didn't happen) err = helper.Navigate("/links") require.NoError(t, err, "Failed to navigate to links page") time.Sleep(1 * time.Second) helper.Screenshot("after-navigate-to-links") // Verify links list container is visible helper.AssertVisible(".links-list", "Links list container should be visible") // Verify at least one link item exists linkCount, err := helper.GetElementCount(".link-item") require.NoError(t, err, "Failed to count link items") require.Greater(t, linkCount, 0, "At least one link should be visible") t.Log("Quick Add link creation test completed successfully") } func TestLinks_List(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, "TestLinks_List", 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") helper.Screenshot("home-before-links") // Create a few test links for i := 0; i < 3; 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(1 * time.Second) } helper.Screenshot("links-created") // Navigate to links page to see all links err = helper.Navigate("/links") require.NoError(t, err, "Failed to navigate to links page") time.Sleep(1 * time.Second) helper.Screenshot("links-list") // Wait for links list to appear (it's conditionally rendered after loading) err = helper.WaitForSelector(".links-list", 5*time.Second) require.NoError(t, err, "Links list should appear") // Verify links list is visible helper.AssertVisible(".links-list", "Links list should be visible") t.Log("Links list test completed successfully") } func TestLinks_Search(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, "TestLinks_Search", 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 searchable content 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(1 * 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("before-search") // Perform search err = helper.SearchLinks("index") require.NoError(t, err, "Failed to perform search") time.Sleep(1 * time.Second) helper.Screenshot("search-results") // Verify search results contain the expected link helper.AssertVisible("a[href*='index.html']", "Search results should contain index.html") t.Log("Links search test completed successfully") } func TestLinks_SearchMinimumCharacters(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, "TestLinks_SearchMinimumCharacters", 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-page") // Try to search with less than 3 characters err = helper.WaitForSelector("input[name=\"search\"]", 5*time.Second) require.NoError(t, err, "Search input not found") err = helper.Fill("input[name=\"search\"]", "ab") require.NoError(t, err, "Failed to fill search with 2 chars") time.Sleep(1 * time.Second) helper.Screenshot("search-too-short") // Verify that search didn't execute or shows a message // (Implementation depends on actual UI behavior) // Now try with 3 characters err = helper.Fill("input[name=\"search\"]", "abc") require.NoError(t, err, "Failed to fill search with 3 chars") time.Sleep(1 * time.Second) helper.Screenshot("search-minimum-chars") t.Log("Search minimum characters test completed successfully") } func TestLinks_ViewDetails(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, "TestLinks_ViewDetails", 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(1 * time.Second) // Navigate to links page to see the created link in the list err = helper.Navigate("/links") require.NoError(t, err, "Failed to navigate to links page after creating link") time.Sleep(1 * time.Second) helper.Screenshot("link-created-details-test") // Wait for link item to appear err = helper.WaitForSelector(".link-item", 5*time.Second) require.NoError(t, err, "Link item should appear in the list") // Click on the link to view details err = helper.Click(".link-item") require.NoError(t, err, "Failed to click link to view details") time.Sleep(1 * time.Second) helper.Screenshot("link-details-page") // Verify we're on the details page currentPath := helper.GetCurrentPath() require.Contains(t, currentPath, "/links/", "Should be on link details page") // Wait for details page to load err = helper.WaitForSelector("h2", 5*time.Second) require.NoError(t, err, "Link details page should load") // Verify details are visible helper.AssertVisible("h2", "Link details should be visible") t.Log("View link details test completed successfully") } func TestLinks_EmptyState(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, "TestLinks_EmptyState", baseURL, page) // Login err = helper.LoginAsAdmin() require.NoError(t, err, "Failed to login") // Navigate to home (should have no links on fresh container) err = helper.Navigate("/home") require.NoError(t, err, "Failed to navigate to home") time.Sleep(1 * time.Second) helper.Screenshot("empty-state") // Verify empty state message or prompt to add links // The actual UI element depends on implementation emptyStateVisible := helper.IsVisible(".empty-state") || helper.IsVisible("p:has-text('No links')") t.Logf("Empty state visible: %v", emptyStateVisible) // At minimum, verify we're on the home page helper.AssertURL("/home") t.Log("Empty state test completed successfully") }