78 lines
3.3 KiB
TypeScript
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);
|
|
});
|
|
});
|