- AdminDashboard.spec.ts (+6 tests):
- tracking input and save button visible in expanded row
- PostNord link visible when trackingId is set
- PostNord link hidden when trackingId is null
- save button fires PATCH to correct URL
- tracking error shown on failed save
- admin-dashboard.spec.ts (+4 tests):
- tracking input and save button visible after row expand
- PostNord link with postnord href visible for orders with tracking
- PostNord link hidden for orders without tracking
- fix row selector to use .last() for deterministic tracking check
(compose test creates extra ABC123 order that shifts row order)
- compose.spec.ts: fix strict mode violation — getByText('ABC123')
resolved to 2 elements (strong + preview paragraph) after admin
test expanded an ABC123 row; use .first()
- order-history.spec.ts: fix strict mode violations — ABC123 and
Levererat resolve to 2 elements due to compose test creating
an extra ABC123 order with status changed to delivered; use
.first() on affected assertions
122 lines
4.6 KiB
TypeScript
122 lines
4.6 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
|
|
test.describe('Compose flow', () => {
|
|
test('redirects unauthenticated user to login', async ({ page }) => {
|
|
await page.goto('/compose?plate=ABC123')
|
|
await expect(page).toHaveURL(/\/logga-in\?redirect=\/compose/)
|
|
await expect(page.getByRole('heading', { name: 'Logga in' })).toBeVisible()
|
|
})
|
|
|
|
test('shows error when no plate is provided', async ({ page }) => {
|
|
await page.goto('/logga-in')
|
|
await page.getByLabel('E-postadress').fill('test@bilhalsning.se')
|
|
await page.getByLabel('Lösenord').fill('test1234')
|
|
await page.getByRole('button', { name: 'Logga in' }).click()
|
|
await page.waitForURL('/')
|
|
|
|
await page.goto('/compose')
|
|
|
|
await expect(page.getByText('Inget registreringsnummer valt')).toBeVisible()
|
|
})
|
|
|
|
test('displays plate and textarea', async ({ page }) => {
|
|
await page.goto('/logga-in')
|
|
await page.getByLabel('E-postadress').fill('test@bilhalsning.se')
|
|
await page.getByLabel('Lösenord').fill('test1234')
|
|
await page.getByRole('button', { name: 'Logga in' }).click()
|
|
await page.waitForURL('/')
|
|
|
|
await page.goto('/compose?plate=ABC123')
|
|
|
|
await expect(
|
|
page.getByRole('heading', { name: 'Skriv ditt brev' }),
|
|
).toBeVisible()
|
|
await expect(page.getByText('ABC123').first()).toBeVisible()
|
|
await expect(page.getByLabel('Ditt meddelande')).toBeVisible()
|
|
})
|
|
|
|
test('submit button disabled when textarea is empty', async ({ page }) => {
|
|
await page.goto('/logga-in')
|
|
await page.getByLabel('E-postadress').fill('test@bilhalsning.se')
|
|
await page.getByLabel('Lösenord').fill('test1234')
|
|
await page.getByRole('button', { name: 'Logga in' }).click()
|
|
await page.waitForURL('/')
|
|
|
|
await page.goto('/compose?plate=ABC123')
|
|
|
|
const button = page.getByRole('button', { name: 'Skicka brev (49 kr)' })
|
|
await expect(button).toBeDisabled()
|
|
})
|
|
|
|
test('can create order and navigate to orders page', async ({ page }) => {
|
|
await page.goto('/logga-in')
|
|
await page.getByLabel('E-postadress').fill('test@bilhalsning.se')
|
|
await page.getByLabel('Lösenord').fill('test1234')
|
|
await page.getByRole('button', { name: 'Logga in' }).click()
|
|
await page.waitForURL('/')
|
|
|
|
await page.goto('/compose?plate=ABC123')
|
|
|
|
await page.getByLabel('Ditt meddelande').fill('Hej fin bil!')
|
|
const button = page.getByRole('button', { name: 'Skicka brev (49 kr)' })
|
|
await expect(button).toBeEnabled()
|
|
await button.click()
|
|
|
|
await expect(page).toHaveURL('/orders')
|
|
await expect(
|
|
page.getByRole('heading', { name: 'Mina beställningar' }),
|
|
).toBeVisible()
|
|
})
|
|
|
|
test('preview shows letter content and GDPR footer', async ({ page }) => {
|
|
await page.goto('/logga-in')
|
|
await page.getByLabel('E-postadress').fill('test@bilhalsning.se')
|
|
await page.getByLabel('Lösenord').fill('test1234')
|
|
await page.getByRole('button', { name: 'Logga in' }).click()
|
|
await page.waitForURL('/')
|
|
|
|
await page.goto('/compose?plate=ABC123')
|
|
|
|
await page.getByLabel('Ditt meddelande').fill('Testmeddelande')
|
|
|
|
await expect(
|
|
page.getByText('Detta brev skickades via BilHej.se'),
|
|
).toBeVisible()
|
|
await expect(page.getByText('Transportstyrelsens fordonsregister')).toBeVisible()
|
|
})
|
|
|
|
test('Visa mallar button opens template picker', async ({ page }) => {
|
|
await page.goto('/logga-in')
|
|
await page.getByLabel('E-postadress').fill('test@bilhalsning.se')
|
|
await page.getByLabel('Lösenord').fill('test1234')
|
|
await page.getByRole('button', { name: 'Logga in' }).click()
|
|
await page.waitForURL('/')
|
|
|
|
await page.goto('/compose?plate=ABC123')
|
|
|
|
await page.getByRole('button', { name: 'Visa mallar' }).click()
|
|
|
|
await expect(page.getByRole('heading', { name: 'Välj en mall' })).toBeVisible()
|
|
await expect(page.getByText('Komplimang')).toBeVisible()
|
|
await expect(page.getByText('Köpförfrågan')).toBeVisible()
|
|
})
|
|
|
|
test('selecting template fills textarea and closes picker', async ({
|
|
page,
|
|
}) => {
|
|
await page.goto('/logga-in')
|
|
await page.getByLabel('E-postadress').fill('test@bilhalsning.se')
|
|
await page.getByLabel('Lösenord').fill('test1234')
|
|
await page.getByRole('button', { name: 'Logga in' }).click()
|
|
await page.waitForURL('/')
|
|
|
|
await page.goto('/compose?plate=ABC123')
|
|
|
|
await page.getByRole('button', { name: 'Visa mallar' }).click()
|
|
await page.getByText('Komplimang').click()
|
|
|
|
const textarea = page.getByLabel('Ditt meddelande')
|
|
await expect(textarea).toHaveValue(/jättefin/)
|
|
await expect(page.getByRole('heading', { name: 'Välj en mall' })).not.toBeVisible()
|
|
})
|
|
})
|