pp-planer/tests/e2e/ccli-bookmarklet.spec.ts

78 lines
3.3 KiB
TypeScript

import { test, expect } from '@playwright/test';
test.describe('CCLI Bookmarklet', () => {
test('Settings page shows CCLI section with bookmarklet drag link', async ({ page }) => {
await page.goto('/settings');
await page.waitForLoadState('networkidle');
const ccliBtn = page.locator('[data-testid="settings-submenu-ccli"]').first();
await ccliBtn.waitFor({ state: 'visible', timeout: 10000 });
await ccliBtn.click();
await page.waitForTimeout(500);
await expect(page.getByTestId('default-translation-language')).toBeVisible();
await expect(page.getByTestId('ccli-bookmarklet-drag-link')).toBeVisible();
});
test('bookmarklet endpoint returns valid JS', async ({ request }) => {
const res = await request.get('/bookmarklets/ccli-import.js');
expect(res.status()).toBe(200);
expect(res.headers()['content-type']).toContain('text/javascript');
const body = await res.text();
expect(body).toMatch(/^javascript:/);
expect(body).toContain('import-from-ccli-paste');
expect(body).toContain('songselect.ccli.com');
});
test('bookmarklet redirect page renders with valid base64 prefill', async ({ page }) => {
const payload = JSON.stringify({
title: 'Amazing Grace',
author: 'John Newton',
ccliId: '4760',
sourceUrl: 'https://songselect.ccli.com/Songs/4760',
rawText: 'Amazing Grace\nJohn Newton\n\nVerse 1\nAmazing grace how sweet the sound\n\n© 1779\nCCLI # 4760',
});
const encoded = Buffer.from(payload).toString('base64');
await page.goto(`/songs/import-from-ccli-paste?prefill=${encoded}`);
await page.waitForLoadState('networkidle');
await expect(page.getByTestId('ccli-paste-textarea')).toBeVisible();
});
test('bookmarklet redirect page shows error for invalid base64', async ({ page }) => {
await page.goto('/songs/import-from-ccli-paste?prefill=NOT_VALID_BASE64!!!');
await page.waitForLoadState('networkidle');
await expect(page.getByTestId('ccli-prefill-error-message')).toBeVisible();
await expect(page.getByTestId('ccli-paste-textarea')).toBeVisible();
});
test('default language dropdown persists selection', async ({ page }) => {
await page.goto('/settings');
await page.waitForLoadState('networkidle');
const ccliBtn = page.locator('[data-testid="settings-submenu-ccli"]').first();
await ccliBtn.waitFor({ state: 'visible', timeout: 10000 });
await ccliBtn.click();
await page.waitForTimeout(500);
const select = page.getByTestId('default-translation-language');
await select.selectOption('EN');
await page.waitForTimeout(1000);
await page.reload();
await page.waitForLoadState('networkidle');
const ccliBtn2 = page.locator('[data-testid="settings-submenu-ccli"]').first();
await ccliBtn2.waitFor({ state: 'visible', timeout: 10000 });
await ccliBtn2.click();
await page.waitForTimeout(500);
await expect(page.getByTestId('default-translation-language')).toHaveValue('EN');
await page.getByTestId('default-translation-language').selectOption('DE');
await page.waitForTimeout(500);
});
});