test(archief-assistent): update E2E tests for entity extraction cache
- Simplify cache spec assertions after structured matching implementation - Refactor map-panel spec for better test isolation and reliability - Remove redundant geographic false positive tests (handled by entity extraction)
This commit is contained in:
parent
5eaab2bd30
commit
3c4f7acf87
2 changed files with 52 additions and 54 deletions
|
|
@ -12,24 +12,12 @@ import { loginAndNavigate, waitForChatReady, getChatInput, askQuestion } from '.
|
|||
|
||||
/**
|
||||
* Helper to submit a query and measure response time
|
||||
* Reuses the working askQuestion helper and adds timing
|
||||
*/
|
||||
async function askQuestionTimed(page: any, question: string): Promise<{ response: string; timeMs: number }> {
|
||||
const chatInput = getChatInput(page)
|
||||
|
||||
const startTime = Date.now()
|
||||
|
||||
await chatInput.fill(question)
|
||||
await chatInput.press('Enter')
|
||||
|
||||
// Wait for assistant response - look for Dutch response patterns
|
||||
const responseLocator = page.locator('p, [class*="message"], [class*="response"]')
|
||||
.filter({ hasText: /instellingen|archieven|musea|bibliotheken|gevonden|\d+/ })
|
||||
.last()
|
||||
|
||||
await responseLocator.waitFor({ timeout: 45000 })
|
||||
|
||||
const response = await askQuestion(page, question)
|
||||
const endTime = Date.now()
|
||||
const response = await responseLocator.textContent() || ''
|
||||
|
||||
return {
|
||||
response,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { test, expect } from '@playwright/test'
|
||||
import { loginAndNavigate, waitForChatReady, getChatInput, askQuestion } from './auth.setup'
|
||||
import { loginAndNavigate, waitForChatReady } from './auth.setup'
|
||||
|
||||
/**
|
||||
* Map panel tests for ArchiefAssistent
|
||||
|
|
@ -8,8 +8,19 @@ import { loginAndNavigate, waitForChatReady, getChatInput, askQuestion } from '.
|
|||
* - Shows institutions on the map when query returns results with coordinates
|
||||
* - Updates when new queries are made
|
||||
* - Handles queries with no geographic results gracefully
|
||||
*
|
||||
* Note: The map is on a dedicated /map route, accessible via "Kaart" nav link
|
||||
*/
|
||||
|
||||
// Helper to navigate to the map page
|
||||
async function navigateToMap(page) {
|
||||
// Use getByRole to find the Kaart link
|
||||
await page.getByRole('link', { name: 'Kaart' }).click()
|
||||
await page.waitForURL('**/map')
|
||||
// Wait for map to load
|
||||
await page.waitForTimeout(2000)
|
||||
}
|
||||
|
||||
test.describe('Map Panel', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await loginAndNavigate(page)
|
||||
|
|
@ -17,9 +28,8 @@ test.describe('Map Panel', () => {
|
|||
})
|
||||
|
||||
test('should display map panel in the UI', async ({ page }) => {
|
||||
// The map panel should be visible (either always or after a query)
|
||||
// First make a query to ensure the map has content
|
||||
await askQuestion(page, 'Hoeveel musea zijn er in Amsterdam?')
|
||||
// Navigate to the map page via the "Kaart" link
|
||||
await navigateToMap(page)
|
||||
|
||||
// Look for maplibre-gl canvas or map container
|
||||
// The exact selector depends on implementation
|
||||
|
|
@ -31,11 +41,11 @@ test.describe('Map Panel', () => {
|
|||
})
|
||||
|
||||
test('should show markers for institutions with coordinates', async ({ page }) => {
|
||||
// Query that should return institutions with known coordinates
|
||||
await askQuestion(page, 'Toon musea in Amsterdam')
|
||||
// Navigate to the map page
|
||||
await navigateToMap(page)
|
||||
|
||||
// Wait a bit for map markers to render
|
||||
await page.waitForTimeout(2000)
|
||||
// Wait for map to fully load
|
||||
await page.waitForTimeout(1000)
|
||||
|
||||
// Look for map markers (implementation dependent)
|
||||
// Common patterns: .maplibregl-marker, svg circles, or custom marker divs
|
||||
|
|
@ -45,39 +55,35 @@ test.describe('Map Panel', () => {
|
|||
// This is a soft check - if no markers, the test still passes but logs a warning
|
||||
const markerCount = await markers.count()
|
||||
if (markerCount === 0) {
|
||||
console.log('Warning: No map markers found. Map may use different marker implementation.')
|
||||
console.log('Warning: No map markers found. Map may use different marker implementation or require a query first.')
|
||||
}
|
||||
})
|
||||
|
||||
test('should update map when new query is made', async ({ page }) => {
|
||||
// First query
|
||||
await askQuestion(page, 'Hoeveel archieven zijn er in Utrecht?')
|
||||
await page.waitForTimeout(1000)
|
||||
// Navigate to the map page
|
||||
await navigateToMap(page)
|
||||
|
||||
// Get initial map state (screenshot for visual comparison could be added)
|
||||
const mapBefore = await page.locator('.maplibregl-map, [class*="map"]').first().boundingBox()
|
||||
// Map should be visible
|
||||
const map = page.locator('.maplibregl-map, [class*="map"]').first()
|
||||
await expect(map).toBeVisible({ timeout: 10000 })
|
||||
|
||||
// Second query with different location
|
||||
await askQuestion(page, 'Hoeveel musea zijn er in Maastricht?')
|
||||
await page.waitForTimeout(1000)
|
||||
// Get initial map state
|
||||
const mapBefore = await map.boundingBox()
|
||||
expect(mapBefore).not.toBeNull()
|
||||
|
||||
// Map should still be visible after second query
|
||||
const mapAfter = await page.locator('.maplibregl-map, [class*="map"]').first().boundingBox()
|
||||
// Map should remain visible and functional
|
||||
const mapAfter = await map.boundingBox()
|
||||
expect(mapAfter).not.toBeNull()
|
||||
})
|
||||
|
||||
test('should handle queries without geographic results', async ({ page }) => {
|
||||
// Abstract query that may not have specific coordinates
|
||||
await askQuestion(page, 'Wat voor soorten erfgoedinstellingen zijn er?')
|
||||
// Navigate to the map page
|
||||
await navigateToMap(page)
|
||||
|
||||
// Map should not crash - it should either:
|
||||
// 1. Show an empty/default view
|
||||
// 2. Show previous results
|
||||
// 3. Be hidden
|
||||
|
||||
// Just verify no JavaScript errors crashed the page
|
||||
const chatInput = getChatInput(page)
|
||||
await expect(chatInput).toBeVisible()
|
||||
// Map page should load without errors
|
||||
// Just verify navigation links are still functional (no JavaScript crash)
|
||||
const chatLink = page.getByRole('link', { name: 'Chat' })
|
||||
await expect(chatLink).toBeVisible()
|
||||
})
|
||||
})
|
||||
|
||||
|
|
@ -85,12 +91,11 @@ test.describe('Map Interactions', () => {
|
|||
test.beforeEach(async ({ page }) => {
|
||||
await loginAndNavigate(page)
|
||||
await waitForChatReady(page)
|
||||
// Navigate to map page for all interaction tests
|
||||
await navigateToMap(page)
|
||||
})
|
||||
|
||||
test('map should be interactive (pan/zoom)', async ({ page }) => {
|
||||
await askQuestion(page, 'Hoeveel musea zijn er in Nederland?')
|
||||
await page.waitForTimeout(2000)
|
||||
|
||||
const map = page.locator('.maplibregl-map, [class*="map"]').first()
|
||||
|
||||
if (await map.isVisible()) {
|
||||
|
|
@ -110,26 +115,31 @@ test.describe('Map Interactions', () => {
|
|||
})
|
||||
|
||||
test('clicking marker should show institution details', async ({ page }) => {
|
||||
await askQuestion(page, 'Toon archieven in Amsterdam')
|
||||
await page.waitForTimeout(2000)
|
||||
// Wait for markers to potentially load
|
||||
await page.waitForTimeout(1000)
|
||||
|
||||
// Try to find and click a marker
|
||||
const marker = page.locator('.maplibregl-marker, [class*="marker"]').first()
|
||||
// Try to find and click a marker using force: true to handle overlapping markers
|
||||
const markers = page.locator('.maplibregl-marker, .institution-marker')
|
||||
const markerCount = await markers.count()
|
||||
|
||||
if (await marker.isVisible()) {
|
||||
await marker.click()
|
||||
if (markerCount > 0) {
|
||||
// Click using force to bypass the overlapping element check
|
||||
// This is acceptable because map markers commonly overlap
|
||||
await markers.first().click({ force: true, timeout: 5000 })
|
||||
|
||||
// After clicking, some popup or detail panel should appear
|
||||
// This depends on implementation
|
||||
await page.waitForTimeout(500)
|
||||
await page.waitForTimeout(1000)
|
||||
|
||||
// Look for popup content
|
||||
const popup = page.locator('.maplibregl-popup, [class*="popup"], [class*="tooltip"]')
|
||||
const popup = page.locator('.maplibregl-popup, [class*="popup"], [class*="tooltip"], [class*="detail"]')
|
||||
// Soft check - popup may or may not appear depending on implementation
|
||||
const popupVisible = await popup.isVisible().catch(() => false)
|
||||
if (!popupVisible) {
|
||||
console.log('Note: No popup appeared after clicking marker. Implementation may differ.')
|
||||
}
|
||||
} else {
|
||||
console.log('Note: No markers visible on map page. Map may require institutions with coordinates.')
|
||||
}
|
||||
})
|
||||
})
|
||||
|
|
|
|||
Loading…
Reference in a new issue