diff --git a/frontend/e2e/admin-dashboard.spec.ts b/frontend/e2e/admin-dashboard.spec.ts index ccb7dee..aaadb25 100644 --- a/frontend/e2e/admin-dashboard.spec.ts +++ b/frontend/e2e/admin-dashboard.spec.ts @@ -43,8 +43,8 @@ test.describe('Admin dashboard', () => { await page.goto('/admin') await expect(page.locator('.admin-dashboard__plate').first()).toBeVisible() - await expect(page.getByText('DEF456')).toBeVisible() - await expect(page.getByText('GHI789')).toBeVisible() + await expect(page.getByText('DEF456').first()).toBeVisible() + await expect(page.getByText('GHI789').first()).toBeVisible() }) test('click row expands letter content', async ({ page }) => { @@ -109,7 +109,7 @@ test.describe('Admin dashboard', () => { test('hides PostNord link when trackingId is null', async ({ page }) => { await page.goto('/admin') - const defRow = page.locator('.admin-dashboard__row', { hasText: 'DEF456' }) + const defRow = page.locator('.admin-dashboard__row', { hasText: 'DEF456' }).first() await defRow.click() const trackingLink = page.locator('.admin-dashboard__tracking-link') diff --git a/frontend/e2e/compose.spec.ts b/frontend/e2e/compose.spec.ts index 38c2ba3..554558f 100644 --- a/frontend/e2e/compose.spec.ts +++ b/frontend/e2e/compose.spec.ts @@ -48,7 +48,7 @@ test.describe('Compose flow', () => { await expect(button).toBeDisabled() }) - test('can create order and navigate to orders page', async ({ page }) => { + test('can create order and navigate to payment page', async ({ page }) => { await page.goto('/logga-in') await page.getByLabel('E-postadress').fill('test@bilhalsning.se') await page.getByLabel('Lösenord').fill('test1234') @@ -62,10 +62,9 @@ test.describe('Compose flow', () => { await expect(button).toBeEnabled() await button.click() - await expect(page).toHaveURL('/orders') - await expect( - page.getByRole('heading', { name: 'Mina beställningar' }), - ).toBeVisible() + await expect(page).toHaveURL(/\/betalning\//) + await expect(page.getByRole('heading', { name: 'Betalning' })).toBeVisible() + await expect(page.getByText('49 kr')).toBeVisible() }) test('preview shows letter content and GDPR footer', async ({ page }) => { diff --git a/frontend/e2e/order-history.spec.ts b/frontend/e2e/order-history.spec.ts index 4ba3daa..82c3033 100644 --- a/frontend/e2e/order-history.spec.ts +++ b/frontend/e2e/order-history.spec.ts @@ -36,8 +36,8 @@ test.describe('Order history', () => { await expect(page.getByRole('heading', { name: 'Mina beställningar' })).toBeVisible() await expect(page.getByText('ABC123').first()).toBeVisible() - await expect(page.getByText('DEF456')).toBeVisible() - await expect(page.getByText('GHI789')).toBeVisible() + await expect(page.getByText('DEF456').first()).toBeVisible() + await expect(page.getByText('GHI789').first()).toBeVisible() }) test('shows correct status badges', async ({ page }) => { @@ -50,7 +50,7 @@ test.describe('Order history', () => { await page.goto('/orders') await expect(page.getByText('Skickat')).toBeVisible() - await expect(page.getByText('Väntar på betalning')).toBeVisible() + await expect(page.getByText('Väntar på betalning').first()).toBeVisible() await expect(page.getByText('Levererat').first()).toBeVisible() }) diff --git a/frontend/e2e/payment-redirect.spec.ts b/frontend/e2e/payment-redirect.spec.ts new file mode 100644 index 0000000..6b67437 --- /dev/null +++ b/frontend/e2e/payment-redirect.spec.ts @@ -0,0 +1,52 @@ +import { test, expect } from '@playwright/test' + +test.describe('Payment redirect', () => { + test.beforeEach(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('/') + }) + + test('can navigate to payment page from compose', async ({ page }) => { + await page.goto('/compose?plate=ABC123') + await page.getByLabel('Ditt meddelande').fill('Hej fin bil!') + await page.getByRole('button', { name: 'Skicka brev (49 kr)' }).click() + + await expect(page).toHaveURL(/\/betalning\//) + await expect(page.getByRole('heading', { name: 'Betalning' })).toBeVisible() + await expect(page.getByText('49 kr')).toBeVisible() + await expect(page.getByText('ABC123')).toBeVisible() + }) + + test('Betalt button marks order as paid and redirects to orders', async ({ + page, + }) => { + await page.goto('/compose?plate=DEF456') + await page.getByLabel('Ditt meddelande').fill('Vill köpa din bil.') + await page.getByRole('button', { name: 'Skicka brev (49 kr)' }).click() + + await page.waitForURL(/\/betalning\//) + await page.getByRole('button', { name: 'Betalt' }).click() + + await expect(page).toHaveURL('/orders') + await expect(page.getByText('DEF456').first()).toBeVisible() + }) + + test('payment page requires authentication', async ({ page }) => { + await page.evaluate(() => localStorage.clear()) + await page.goto('/betalning/some-id') + + await expect(page).toHaveURL(/\/logga-in/) + }) + + test('shows mock payment note', async ({ page }) => { + await page.goto('/compose?plate=GHI789') + await page.getByLabel('Ditt meddelande').fill('Hej!') + await page.getByRole('button', { name: 'Skicka brev (49 kr)' }).click() + + await page.waitForURL(/\/betalning\//) + await expect(page.getByText(/mock-betalning/i)).toBeVisible() + }) +}) diff --git a/frontend/src/__tests__/ComposePage.spec.ts b/frontend/src/__tests__/ComposePage.spec.ts index 3c1fc76..61d478c 100644 --- a/frontend/src/__tests__/ComposePage.spec.ts +++ b/frontend/src/__tests__/ComposePage.spec.ts @@ -3,6 +3,7 @@ import { mount } from '@vue/test-utils' import { createPinia, setActivePinia } from 'pinia' import { createRouter, createMemoryHistory } from 'vue-router' import ComposePage from '@/pages/ComposePage.vue' +import PaymentRedirect from '@/pages/PaymentRedirect.vue' vi.mock('@/api/orders', () => ({ createOrder: vi.fn(), @@ -31,6 +32,11 @@ function createTestRouter() { name: 'orders', component: { template: '