package handlers import ( "fmt" "testing" "github.com/playwright-community/playwright-go" "github.com/stretchr/testify/assert" ) func TestQuestionFlow(t *testing.T) { assert := assert.New(t) // Use running server serverURL := "http://localhost:9000" // Setup Playwright pw, err := playwright.Run() assert.NoError(err) defer pw.Stop() browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{ Headless: playwright.Bool(true), // Change to false for debugging }) assert.NoError(err) defer browser.Close() page, err := browser.NewPage() assert.NoError(err) // Test 1: Load page and verify question _, err = page.Goto(serverURL, playwright.PageGotoOptions{ WaitUntil: playwright.WaitUntilStateDomcontentloaded, Timeout: playwright.Float(2000), }) assert.NoError(err, "Failed to load page") // Wait for main content to load err = page.Locator("body").WaitFor(playwright.LocatorWaitForOptions{ State: playwright.WaitForSelectorStateVisible, Timeout: playwright.Float(2000), }) assert.NoError(err, "Page content did not load") // Verify question text exists and contains expected content questionLocator := page.Locator("[data-testid='question']") visible, err := questionLocator.IsVisible() if err != nil || !visible { assert.FailNow("Question text not visible", err) } questionText, err := questionLocator.TextContent() if err != nil { assert.FailNow("Failed to get question text", err) } assert.Contains(questionText, "___ du keine Zweifel daran?", "Question text should match database entry") assert.Contains(questionText, "(Test Question)", "Question text should contain test indicator") // Set longer timeout for CI environment page.SetDefaultTimeout(5000) // Verify options using test IDs - first wait for them to be visible for i := 1; i <= 4; i++ { testID := fmt.Sprintf("option%d", i) locator := page.Locator(fmt.Sprintf("[data-testid='%s']", testID)) visible, err := locator.IsVisible() if err != nil { assert.FailNowf("Option check failed", "Option %d: %v", i, err) } assert.True(visible, "Option %d not visible", i) } // Test correct answer (option1 is correct per DB data based on correct_index=0) // First wait for option to be clickable err = page.Locator("[data-testid='option1']").WaitFor(playwright.LocatorWaitForOptions{ State: playwright.WaitForSelectorStateVisible, Timeout: playwright.Float(5000), }) assert.NoError(err, "Option 1 not visible") page.Locator("[data-testid='option1']").Click() // Verify feedback contains expected explanation err = page.Locator("#feedback:has-text('zu welchem Zeitpunkt')").WaitFor() assert.NoError(err, "Correct answer feedback not shown") // Test wrong answer (option3 is incorrect) err = page.Locator("[data-testid='option3']").WaitFor(playwright.LocatorWaitForOptions{ State: playwright.WaitForSelectorStateVisible, Timeout: playwright.Float(5000), }) assert.NoError(err, "Option 3 not visible") page.Locator("[data-testid='option3']").Click() // Verify feedback contains expected explanation err = page.Locator("#feedback:has-text('zu welchem Zeitpunkt')").WaitFor() assert.NoError(err, "Wrong answer feedback not shown") } type MockRepo struct{} func (m *MockRepo) DBGetDefaultsMap() (map[string]string, error) { return map[string]string{}, nil }