diff --git a/public/sample.pdf b/public/sample.pdf
index 95fb5af..c01805e 100644
Binary files a/public/sample.pdf and b/public/sample.pdf differ
diff --git a/src/components/doclist/DocumentListItem.tsx b/src/components/doclist/DocumentListItem.tsx
index 0435daf..01d49b9 100644
--- a/src/components/doclist/DocumentListItem.tsx
+++ b/src/components/doclist/DocumentListItem.tsx
@@ -49,7 +49,7 @@ export function DocumentListItem({
{doc.type === 'pdf' ?
:
}
diff --git a/src/components/player/TTSPlayer.tsx b/src/components/player/TTSPlayer.tsx
index 21f1b75..e60fb88 100644
--- a/src/components/player/TTSPlayer.tsx
+++ b/src/components/player/TTSPlayer.tsx
@@ -58,6 +58,7 @@ export default function TTSPlayer({ currentPage, numPages }: {
onClick={togglePlay}
className="relative p-2 rounded-full text-foreground hover:bg-offbase data-[hover]:bg-offbase data-[active]:bg-offbase/80 transition-colors duration-200 focus:outline-none"
aria-label={isPlaying ? 'Pause' : 'Play'}
+ disabled={isProcessing}
>
{isPlaying ?
:
}
diff --git a/tests/e2e.spec.ts b/tests/e2e.spec.ts
index 92ee4b7..4d23dea 100644
--- a/tests/e2e.spec.ts
+++ b/tests/e2e.spec.ts
@@ -1,14 +1,63 @@
import { test, expect, Page } from '@playwright/test';
+const DIR = './public/';
+
// Upload a sample epub or pdf
async function uploadFile(page: Page, filePath: string) {
- const fileChooserPromise = page.waitForEvent('filechooser');
- await page.getByText('Drop your file here, or click to select').click();
- const fileChooser = await fileChooserPromise;
- await fileChooser.setFiles(filePath);
+ await page.waitForSelector('input[type=file]', { timeout: 10000 });
+ await page.setInputFiles('input[type=file]', `${DIR}${filePath}`);
}
-test.describe('Document Upload and Display', () => {
+async function uploadAndDisplay(page: Page, fileName: string) {
+ // Upload the file
+ await uploadFile(page, fileName);
+
+ // Wait for link with document-link class
+ await page.waitForSelector('.document-link', { timeout: 20000 });
+ await page.getByText(fileName).click();
+
+ // Wait for the document to load
+ if (fileName.endsWith('.pdf')) {
+ await page.waitForSelector('.react-pdf__Document', { timeout: 10000 });
+ }
+ else if (fileName.endsWith('.epub')) {
+ await page.waitForSelector('.epub-container', { timeout: 10000 });
+ }
+}
+
+async function waitAndClickPlay(page: Page) {
+ // Wait for play button selector without disabled attribute
+ await page.waitForSelector('button[aria-label="Play"]:not([disabled])', { timeout: 20000 });
+ // Play the TTS by aria-label play button
+ await page.locator('button[aria-label="Play"]').click();
+
+ // Wait for buttons to be disabled
+ await Promise.all([
+ page.waitForSelector('button[aria-label="Skip forward"][disabled]'),
+ page.waitForSelector('button[aria-label="Skip backward"][disabled]'),
+ ]);
+
+ // Wait for the TTS to stop processing
+ await Promise.all([
+ page.waitForSelector('button[aria-label="Skip forward"]:not([disabled])', { timeout: 30000 }),
+ page.waitForSelector('button[aria-label="Skip backward"]:not([disabled])', { timeout: 30000 }),
+ ]);
+
+ await page.waitForFunction(() => {
+ return navigator.mediaSession?.playbackState === 'playing';
+ }, { timeout: 30000 })
+}
+
+async function playTTSAndWaitForASecond(page: Page, fileName: string) {
+ // Upload and display the document
+ await uploadAndDisplay(page, fileName);
+ // Wait for play button selector without disabled attribute
+ await waitAndClickPlay(page);
+ // play for 1s
+ await page.waitForTimeout(1000);
+}
+
+test.describe('Document flow', () => {
test.beforeEach(async ({ page }) => {
// Navigate to the home page before each test
await page.goto('/');
@@ -17,46 +66,56 @@ test.describe('Document Upload and Display', () => {
await page.getByText('Done').click();
});
- test.describe('PDF handling', () => {
- test('should upload a PDF document', async ({ page }) => {
+ test.describe('PDF check', () => {
+ test('upload a PDF document', async ({ page }) => {
// Upload the file
- await uploadFile(page, './public/sample.pdf');
+ await uploadFile(page, 'sample.pdf');
// Verify upload success
await expect(page.getByText('sample.pdf')).toBeVisible({ timeout: 10000 });
});
- test('should display a PDF document', async ({ page }) => {
- // Upload the file
- await uploadFile(page, './public/sample.pdf');
-
- // Click on the uploaded document
- await page.getByText('sample.pdf').click({ timeout: 10000 });
+ test('display a PDF document', async ({ page }) => {
+ // Upload and display the PDF document
+ await uploadAndDisplay(page, 'sample.pdf');
// Verify PDF viewer is displayed
- await expect(page.locator('.react-pdf__Document')).toBeVisible({ timeout: 10000 });
- await expect(page.locator('.react-pdf__Page')).toBeVisible({ timeout: 10000 });
+ await expect(page.locator('.react-pdf__Document')).toBeVisible();
+ await expect(page.locator('.react-pdf__Page')).toBeVisible();
+ });
+
+ test('play and pause TTS for a PDF document (naive)', async ({ page }) => {
+ // Play TTS for the PDF document
+ await playTTSAndWaitForASecond(page, 'sample.pdf');
+ // Click pause to stop playback
+ await page.locator('button[aria-label="Pause"]').click();
+ // Check for play button to be visible
+ await expect(page.locator('button[aria-label="Play"]')).toBeVisible({ timeout: 10000 });
});
});
- test.describe('EPUB handling', () => {
- test('should upload and display EPUB document', async ({ page }) => {
+ test.describe('EPUB check', () => {
+ test('upload a EPUB document', async ({ page }) => {
// Upload the file
- await uploadFile(page, './public/sample.epub');
-
+ await uploadFile(page, 'sample.epub');
// Verify upload success
await expect(page.getByText('sample.epub')).toBeVisible({ timeout: 10000 });
});
- test('should display an EPUB document', async ({ page }) => {
- // Upload the file
- await uploadFile(page, './public/sample.epub');
-
- // Click on the uploaded document
- await page.getByText('sample.epub').click({ timeout: 10000 });
-
+ test('display an EPUB document', async ({ page }) => {
+ // Upload and display the EPUB document
+ await uploadAndDisplay(page, 'sample.epub');
// Verify EPUB viewer is displayed
await expect(page.locator('.epub-container')).toBeVisible({ timeout: 10000 });
});
+
+ test('play and pause TTS for an EPUB document (naive)', async ({ page }) => {
+ // Play TTS for the EPUB document
+ await playTTSAndWaitForASecond(page, 'sample.epub');
+ // Click pause to stop playback
+ await page.locator('button[aria-label="Pause"]').click();
+ // Check for play button to be visible
+ await expect(page.locator('button[aria-label="Play"]')).toBeVisible({ timeout: 10000 });
+ });
});
});