123 lines
4.3 KiB
TypeScript
123 lines
4.3 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
test.describe('Playlists Management', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
// Login first
|
|
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 navigate to playlists page', async ({ page }) => {
|
|
await page.goto('http://localhost:5173/playlists');
|
|
await expect(page.locator('h1')).toContainText('Playlists');
|
|
});
|
|
|
|
test('should create a new playlist', async ({ page }) => {
|
|
await page.goto('http://localhost:5173/playlists');
|
|
|
|
// Click "New Playlist" button
|
|
await page.click('button:has-text("New Playlist")');
|
|
|
|
// Fill playlist form
|
|
await page.fill('input[id="name"]', 'E2E Test Playlist');
|
|
await page.fill('textarea[id="description"]', 'Created by automated test');
|
|
await page.check('input[id="isPublic"]');
|
|
|
|
// Submit
|
|
await page.click('button:has-text("Create")');
|
|
|
|
// Verify toast message
|
|
await expect(page.locator('text=Playlist created')).toBeVisible({ timeout: 5000 });
|
|
|
|
// Verify playlist appears in list
|
|
await expect(page.locator('text=E2E Test Playlist')).toBeVisible();
|
|
});
|
|
|
|
test('should edit playlist', async ({ page }) => {
|
|
await page.goto('http://localhost:5173/playlists');
|
|
|
|
// Find first playlist and click edit
|
|
const firstPlaylist = page.locator('[data-testid="playlist-card"]').first();
|
|
await firstPlaylist.hover();
|
|
await firstPlaylist.locator('button[title="Edit"]').click();
|
|
|
|
// Modify name
|
|
await page.fill('input[id="name"]', 'Updated Playlist Name');
|
|
await page.click('button:has-text("Update")');
|
|
|
|
// Verify update
|
|
await expect(page.locator('text=Playlist updated')).toBeVisible({ timeout: 5000 });
|
|
});
|
|
|
|
test('should add tracks to playlist', async ({ page }) => {
|
|
await page.goto('http://localhost:5173/playlists');
|
|
|
|
// Click on first playlist to open detail
|
|
await page.click('[data-testid="playlist-card"]');
|
|
|
|
// Click "Add Tracks"
|
|
await page.click('button:has-text("Add Tracks")');
|
|
|
|
// Search for a track
|
|
await page.fill('input[placeholder*="Search tracks"]', 'test');
|
|
await page.waitForTimeout(500); // Debounce
|
|
|
|
// Click "+" on first result
|
|
const firstResult = page.locator('[data-testid="track-search-result"]').first();
|
|
if (await firstResult.isVisible()) {
|
|
await firstResult.locator('button').click();
|
|
|
|
// Verify track added
|
|
await expect(page.locator('text=Track added')).toBeVisible({ timeout: 5000 });
|
|
}
|
|
});
|
|
|
|
test('should delete playlist', async ({ page }) => {
|
|
await page.goto('http://localhost:5173/playlists');
|
|
|
|
// Create a temporary playlist first
|
|
await page.click('button:has-text("New Playlist")');
|
|
await page.fill('input[id="name"]', 'To Delete');
|
|
await page.click('button:has-text("Create")');
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Find and delete it
|
|
const playlist = page.locator('text=To Delete').locator('..');
|
|
await playlist.hover();
|
|
|
|
// Handle confirm dialog
|
|
page.on('dialog', dialog => dialog.accept());
|
|
await playlist.locator('button[title="Delete"]').click();
|
|
|
|
// Verify deletion
|
|
await expect(page.locator('text=Playlist deleted')).toBeVisible({ timeout: 5000 });
|
|
});
|
|
|
|
test('should search playlists', async ({ page }) => {
|
|
await page.goto('http://localhost:5173/playlists');
|
|
|
|
// Type in search
|
|
await page.fill('input[placeholder*="Search playlists"]', 'test');
|
|
await page.waitForTimeout(500);
|
|
|
|
// Verify filtered results
|
|
const playlists = page.locator('[data-testid="playlist-card"]');
|
|
const count = await playlists.count();
|
|
|
|
// At least some filtering should happen
|
|
expect(count).toBeGreaterThanOrEqual(0);
|
|
});
|
|
|
|
test('should display playlist statistics', async ({ page }) => {
|
|
await page.goto('http://localhost:5173/playlists');
|
|
|
|
// Check stats section exists
|
|
await expect(page.locator('text=Total Playlists')).toBeVisible();
|
|
await expect(page.locator('text=Public')).toBeVisible();
|
|
await expect(page.locator('text=Total Tracks')).toBeVisible();
|
|
});
|
|
});
|
|
|