veza/veza-desktop/tests/e2e/library-enhanced.spec.ts

163 lines
5.4 KiB
TypeScript

import { test, expect } from '@playwright/test';
test.describe('Enhanced Library Features', () => {
test.beforeEach(async ({ page }) => {
await page.goto('http://localhost:5173/login');
await page.fill('input[type="email"]', 'test@example.com');
await page.fill('input[type="password"]', 'Test1234!');
await page.click('button[type="submit"]');
await page.waitForURL('**/dashboard');
});
test('should open track edit dialog', async ({ page }) => {
await page.goto('http://localhost:5173/library');
// Find first track and hover
const firstTrack = page.locator('[data-testid="track-card"]').first();
if (await firstTrack.isVisible()) {
await firstTrack.hover();
// Click edit button
await firstTrack.locator('button[title="Edit metadata"]').click();
// Verify dialog opened
await expect(page.locator('text=Edit Track Metadata')).toBeVisible();
}
});
test('should edit track metadata', async ({ page }) => {
await page.goto('http://localhost:5173/library');
const firstTrack = page.locator('[data-testid="track-card"]').first();
if (await firstTrack.isVisible()) {
await firstTrack.hover();
await firstTrack.locator('button[title="Edit metadata"]').click();
// Edit fields
await page.fill('input[id="title"]', 'Updated Track Title');
await page.fill('input[id="artist"]', 'Updated Artist');
await page.fill('input[id="album"]', 'Updated Album');
// Toggle public
await page.check('input[id="isPublic"]');
// Save
await page.click('button:has-text("Save Changes")');
// Verify
await expect(page.locator('text=Track updated')).toBeVisible({ timeout: 5000 });
}
});
test('should display waveform', async ({ page }) => {
await page.goto('http://localhost:5173/library');
const firstTrack = page.locator('[data-testid="track-card"]').first();
if (await firstTrack.isVisible()) {
await firstTrack.hover();
// Click waveform button
await firstTrack.locator('button[title="Show waveform"]').click();
// Wait for waveform to render
await page.waitForTimeout(500);
// Check canvas exists
const canvas = firstTrack.locator('canvas');
await expect(canvas).toBeVisible();
}
});
test('should toggle waveform visibility', async ({ page }) => {
await page.goto('http://localhost:5173/library');
const firstTrack = page.locator('[data-testid="track-card"]').first();
if (await firstTrack.isVisible()) {
await firstTrack.hover();
const waveformBtn = firstTrack.locator('button[title="Show waveform"]');
// Show waveform
await waveformBtn.click();
await page.waitForTimeout(300);
let canvas = firstTrack.locator('canvas');
await expect(canvas).toBeVisible();
// Hide waveform
await waveformBtn.click();
await page.waitForTimeout(300);
canvas = firstTrack.locator('canvas');
await expect(canvas).not.toBeVisible();
}
});
test('should show track statistics', async ({ page }) => {
await page.goto('http://localhost:5173/library');
// Check stats section exists
await expect(page.locator('text=Total Tracks')).toBeVisible();
await expect(page.locator('text=Public Tracks')).toBeVisible();
await expect(page.locator('text=Total Plays')).toBeVisible();
await expect(page.locator('text=Total Duration')).toBeVisible();
});
test('should filter tracks by type', async ({ page }) => {
await page.goto('http://localhost:5173/library');
// Change filter
await page.selectOption('select', 'artist');
await page.waitForTimeout(500);
// Should still show library page
await expect(page.locator('h1')).toContainText('Bibliothèque');
});
test('should switch between grid and list view', async ({ page }) => {
await page.goto('http://localhost:5173/library');
// Click list view
const listBtn = page.locator('button:has-text("List")');
if (await listBtn.isVisible()) {
await listBtn.click();
await page.waitForTimeout(200);
// Click grid view
const gridBtn = page.locator('button:has-text("Grid")');
await gridBtn.click();
await page.waitForTimeout(200);
}
});
test('should delete track with confirmation', async ({ page }) => {
await page.goto('http://localhost:5173/library');
const trackCount = await page.locator('[data-testid="track-card"]').count();
if (trackCount > 0) {
const firstTrack = page.locator('[data-testid="track-card"]').first();
await firstTrack.hover();
// Handle confirmation dialog
page.on('dialog', dialog => dialog.accept());
// Click delete
await firstTrack.locator('button[title="Delete"]').click();
// Verify deletion (or error if backend not running)
await page.waitForTimeout(1000);
}
});
test('should search tracks', async ({ page }) => {
await page.goto('http://localhost:5173/library');
// Type in search
await page.fill('input[placeholder*="Search"]', 'test');
await page.waitForTimeout(500);
// Should show filtered results or empty state
const tracks = page.locator('[data-testid="track-card"]');
const count = await tracks.count();
expect(count).toBeGreaterThanOrEqual(0);
});
});