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