import { test, expect } from '@playwright/test' test.describe('Models (KBX Foundation)', () => { test.beforeEach(async ({ page }) => { // Navigate to models list await page.goto('/model-ops/models', { waitUntil: 'networkidle', }) // Wait for component to hydrate await page.waitForTimeout(500) }) test('should display models list with grid', async ({ page }) => { // Check page title const title = page.locator('h1') await expect(title).toContainText('Model Management') // Check grid visibility const grid = page.locator('.ks-grid') await expect(grid).toBeVisible() // Check summary badges const summaryItems = page.locator('.ks-list-page__footer > span') await expect(summaryItems).toHaveCount(4) }) test('should filter models by phase', async ({ page }) => { // Get phase filter select const phaseFilter = page.locator('select.phase-filter') await expect(phaseFilter).toBeVisible() // Select a phase await phaseFilter.selectOption('Mature') // Wait for filter await page.waitForTimeout(300) // Grid should still be visible const grid = page.locator('.ks-grid') await expect(grid).toBeVisible() }) test('should filter models by active status', async ({ page }) => { // Get active filter select const activeFilter = page.locator('select.active-filter') await expect(activeFilter).toBeVisible() // Select active only await activeFilter.selectOption('active') // Wait for filter await page.waitForTimeout(300) // Grid should update const grid = page.locator('.ks-grid') await expect(grid).toBeVisible() }) test('should navigate to model detail', async ({ page }) => { // Wait for data await page.waitForTimeout(500) // Click first model row const firstRow = page.locator('.ag-row').first() await expect(firstRow).toBeVisible() await firstRow.click() // Should navigate to detail page await page.waitForURL('**/models/*', { timeout: 5000 }) expect(page.url()).toMatch(/\/model-ops\/models\/.+/) // Verify detail page structure const detailHeader = page.locator('.detail-header h1') await expect(detailHeader).toBeVisible() }) test('should display model activation requirements', async ({ page }) => { // Navigate to detail const firstRow = page.locator('.ag-row').first() await expect(firstRow).toBeVisible() await firstRow.click() await page.waitForURL('**/models/*') // Check requirements section const requirementsSection = page.locator('.requirements-section') await expect(requirementsSection).toBeVisible() // Check requirement cards const requirementCards = page.locator('.requirement-card') await expect(requirementCards.first()).toBeVisible() }) test('should display model lifecycle phases', async ({ page }) => { // Navigate to detail const firstRow = page.locator('.ag-row').first() await expect(firstRow).toBeVisible() await firstRow.click() await page.waitForURL('**/models/*') // Check phase timeline const phaseTimeline = page.locator('.phase-timeline') await expect(phaseTimeline).toBeVisible() // Check individual phase items const phaseItems = page.locator('.phase-item') await expect(phaseItems.first()).toBeVisible() }) test('should display model configuration', async ({ page }) => { // Navigate to detail const firstRow = page.locator('.ag-row').first() await expect(firstRow).toBeVisible() await firstRow.click() await page.waitForURL('**/models/*') // Check config section const configSection = page.locator('.config-section') await expect(configSection).toBeVisible() // Check config items const configItems = page.locator('.config-item') await expect(configItems.first()).toBeVisible() }) test('should display validation history table', async ({ page }) => { // Navigate to detail const firstRow = page.locator('.ag-row').first() await expect(firstRow).toBeVisible() await firstRow.click() await page.waitForURL('**/models/*') // Check history table const historySection = page.locator('.history-section') await expect(historySection).toBeVisible() // Check table rows const tableRows = page.locator('.table-row') await expect(tableRows.first()).toBeVisible() }) test('should use F3 keyboard shortcut for search', async ({ page }) => { const searchInput = page.locator('input[placeholder*="Search"]').first() // Press F3 await page.keyboard.press('F3') // Should trigger search await page.waitForTimeout(300) // Verify no error await expect(page).not.toHaveTitle('Error') }) test('should use Ctrl+N shortcut to create new model', async ({ page }) => { // Press Ctrl+N await page.keyboard.press('Control+N') // Should navigate to new model page await page.waitForTimeout(500) // Verify navigation occurred await expect(page).not.toHaveTitle('Error') }) test('should show model status as active or inactive', async ({ page }) => { // Navigate to detail await page.waitForTimeout(500) const firstRow = page.locator('tbody tr').first() if (await firstRow.isVisible()) { await firstRow.click() await page.waitForURL('**/models/*') } // Check status display const statusDisplay = page.locator('[class*="active"]').first() await expect(statusDisplay).toBeVisible() }) test('should display quick filter badges', async ({ page }) => { // Check for quick filters with badges const quickFilters = page.locator('[class*="quick-filter"]') await expect(quickFilters.first()).toBeVisible() // Check for badge elements const badges = page.locator('.badge') if (await badges.count() > 0) { await expect(badges.first()).toBeVisible() } }) test('should navigate back from detail to list', async ({ page }) => { // Navigate to detail await page.waitForTimeout(500) const firstRow = page.locator('tbody tr').first() if (await firstRow.isVisible()) { await firstRow.click() await page.waitForURL('**/models/*') // Click back button (Escape key or Back button) await page.keyboard.press('Escape') // Should navigate back await page.waitForURL('**/models$', { timeout: 5000 }) expect(page.url()).toMatch(/\/model-ops\/models$/) } }) })