- scope no-cache headers to non-static routes (restore immutable asset caching) - reset cached rejected MongoDB promise so retries can succeed - use last X-Forwarded-For entry in Content Editor rate limiter (anti-spoofing) - remove weak Mongo defaults from compose files (fail loudly on missing env) - move staging banner text to common.json content - read APP_PORT from env file in deploy.sh healthcheck - filter network noise from staging smoke console assertions Closes MITHOME-48, MITHOME-49, MITHOME-50, MITHOME-51, MITHOME-52, MITHOME-53, MITHOME-54
61 lines
2.5 KiB
TypeScript
61 lines
2.5 KiB
TypeScript
import { expect, test } from '@playwright/test'
|
|
|
|
test('SMOKE-01: health endpoint is available', async ({ request }) => {
|
|
const response = await request.get('/api/health')
|
|
expect(response.status()).toBe(200)
|
|
await expect(response).toBeOK()
|
|
await expect(response.json()).resolves.toMatchObject({ status: 'ok' })
|
|
})
|
|
|
|
test('SMOKE-02: homepage renders its critical shell without console errors', async ({ page }) => {
|
|
const consoleErrors: string[] = []
|
|
page.on('console', message => {
|
|
if (message.type() !== 'error') return
|
|
// Chromium logs failed resource loads (e.g. favicon 404) as console errors.
|
|
// Those are network noise here; real JS errors must still fail the test.
|
|
if (message.text().startsWith('Failed to load resource')) return
|
|
consoleErrors.push(message.text())
|
|
})
|
|
|
|
await page.goto('/')
|
|
await expect(page.getByRole('heading', { level: 1 })).toBeVisible()
|
|
await expect(page.getByRole('navigation')).toBeVisible()
|
|
await expect(page.getByRole('link', { name: /beszéljük át/i })).toBeVisible()
|
|
await expect(page.locator('footer')).toBeVisible()
|
|
expect(consoleErrors).toEqual([])
|
|
})
|
|
|
|
test('SMOKE-03: main navigation opens every public core page', async ({ page }) => {
|
|
const targets = [
|
|
['Kezdőlap', '/'],
|
|
['Rólunk', '/rolunk'],
|
|
['Szolgáltatások', '/szolgaltatasok'],
|
|
['Kapcsolat', '/kapcsolat'],
|
|
] as const
|
|
|
|
await page.goto('/')
|
|
for (const [label, expectedPath] of targets) {
|
|
await page.getByRole('navigation').getByRole('link', { name: label }).click()
|
|
await expect(page).toHaveURL(new RegExp(`${expectedPath.replace('/', '\\/')}$`))
|
|
await expect(page.getByRole('heading', { level: 1 })).toHaveCount(1)
|
|
}
|
|
})
|
|
|
|
test('SMOKE-04: service content and contact CTA are visible', async ({ page }) => {
|
|
await page.goto('/')
|
|
await expect(page.getByRole('heading', { name: 'Szolgáltatásaink' })).toBeVisible()
|
|
await expect(page.getByRole('link', { name: /kérjen ajánlatot/i })).toHaveAttribute('href', '/kapcsolat')
|
|
})
|
|
|
|
test('SMOKE-05: empty contact form is blocked client-side without API submission', async ({ page }) => {
|
|
let contactPostCount = 0
|
|
page.on('request', request => {
|
|
if (request.method() === 'POST' && new URL(request.url()).pathname === '/api/contact') contactPostCount++
|
|
})
|
|
|
|
await page.goto('/kapcsolat')
|
|
await page.getByRole('button', { name: 'Üzenet küldése' }).click()
|
|
await expect(page.getByRole('textbox', { name: 'Név *' })).toBeVisible()
|
|
await expect.poll(() => contactPostCount).toBe(0)
|
|
})
|