Add dedicated data-e2e selectors (configure-btn, verify-btn, prepare-btn) to StudioPage toggle buttons and update E2E tests to use waitFor + click on these selectors instead of locateAll index tricks. Fixes timeout in rechunk.feature caused by race with async feature flag loading. Closes #176
78 lines
2.7 KiB
Gherkin
78 lines
2.7 KiB
Gherkin
@ui
|
|
Feature: UI — Full happy path via browser
|
|
|
|
Background:
|
|
* url baseUrl
|
|
|
|
Scenario: Complete workflow — upload, analyze, verify results, rechunk, delete — all via UI
|
|
# Step 1: Open Studio page
|
|
* driver uiBaseUrl + '/studio'
|
|
* waitFor('[data-e2e=upload-zone]')
|
|
|
|
# Step 2: Upload a PDF via UI
|
|
* def filePath = karate.toAbsolutePath('classpath:common/data/generated/medium.pdf')
|
|
* driver.inputFile('input[type=file]', filePath)
|
|
|
|
# Step 3: Verify document appears in doc list
|
|
* waitFor('[data-e2e=doc-item]')
|
|
* match text('[data-e2e=doc-name]') contains 'medium.pdf'
|
|
|
|
# Step 4: Select the document
|
|
* click('[data-e2e=doc-item]')
|
|
* waitFor('[data-e2e=doc-item].selected')
|
|
|
|
# Step 5: Verify Configure mode is active
|
|
* waitFor('[data-e2e=toggle-btn].active')
|
|
|
|
# Step 6: Run the analysis
|
|
* click('[data-e2e=run-btn]')
|
|
|
|
# Step 7: Wait for analysis to complete
|
|
* call read('classpath:common/helpers/ui-wait-analysis.feature')
|
|
|
|
# Step 8: Verify results — tabs and content
|
|
* waitFor('[data-e2e=result-tabs]')
|
|
* match karate.sizeOf(locateAll('[data-e2e=tab-btn]')) == 3
|
|
|
|
# Check Elements tab has content
|
|
* def tabs = locateAll('[data-e2e=tab-btn]')
|
|
* tabs[0].click()
|
|
* waitFor('[data-e2e=elements-list]')
|
|
* assert karate.sizeOf(locateAll('[data-e2e=element-card]')) > 0
|
|
|
|
# Check Markdown tab has content
|
|
* tabs[1].click()
|
|
* waitFor('[data-e2e=raw-markdown]')
|
|
* match text('[data-e2e=raw-content]') != ''
|
|
|
|
# Step 9: Switch to Préparer mode and rechunk
|
|
* waitFor('[data-e2e~=prepare-btn]')
|
|
* click('[data-e2e~=prepare-btn]')
|
|
* waitFor('[data-e2e=chunk-panel]')
|
|
|
|
# Expand config if needed
|
|
* def chevronOpen = optional('[data-e2e=config-chevron].open')
|
|
* if (!chevronOpen.present) click('[data-e2e=config-toggle]')
|
|
* waitFor('[data-e2e=config-body]')
|
|
|
|
# Set max tokens and run chunking
|
|
* clear('[data-e2e=config-input]')
|
|
* input('[data-e2e=config-input]', '512')
|
|
* click('[data-e2e=chunk-btn]')
|
|
|
|
# Wait for chunks
|
|
* retry(30, 1000).waitFor('[data-e2e=chunk-card]')
|
|
* waitFor('[data-e2e=chunk-results]')
|
|
* assert karate.sizeOf(locateAll('[data-e2e=chunk-card]')) > 0
|
|
|
|
# Step 10: Delete the document via UI
|
|
* click('[data-e2e~=configure-btn]')
|
|
* waitFor('[data-e2e=doc-item]')
|
|
|
|
# Hover and delete
|
|
* mouse('[data-e2e=doc-item]').go()
|
|
* waitFor('[data-e2e=doc-delete]')
|
|
* click('[data-e2e=doc-delete]')
|
|
|
|
# Verify document is gone from the list
|
|
* retry(10, 500).script("!document.querySelector('[data-e2e=doc-item]') || !document.querySelector('[data-e2e=doc-name]').textContent.includes('medium.pdf')")
|