diff --git a/app/pages/admin/series/index.vue b/app/pages/admin/series/index.vue index c558d3a..af961bd 100644 --- a/app/pages/admin/series/index.vue +++ b/app/pages/admin/series/index.vue @@ -604,15 +604,7 @@ const deleteSeries = (series) => { confirmAction.execute = async () => { confirmAction.running = true try { - for (const event of series.events) { - await $fetch(`/api/admin/events/${event.id}`, { - method: 'PUT', - body: { - ...event, - series: { isSeriesEvent: false, id: '', title: '', description: '', type: 'workshop_series', position: 1, totalEvents: null }, - }, - }) - } + await $fetch(`/api/admin/series/${series.id}`, { method: 'DELETE' }) confirmAction.show = false await refresh() } catch (error) { diff --git a/e2e/admin-series.spec.js b/e2e/admin-series.spec.js index ed0f6d8..f6d7b43 100644 --- a/e2e/admin-series.spec.js +++ b/e2e/admin-series.spec.js @@ -57,9 +57,34 @@ test.describe('Admin series CRUD', () => { await expect(editedCard).toContainText(editedDescription, { timeout: 10000 }) }) - // Delete is skipped: the series-management page's "Delete" button only - // unlinks events from the series via PUT /api/admin/events/:id; it does - // not call DELETE /api/admin/series/:id, so the series record remains. - // No UI affordance currently exists to remove an empty series. - test.skip('delete a series', async () => {}) + test('delete a series', async ({ adminPage }) => { + const suffix = Date.now().toString().slice(-6) + const title = `e2e-series-del-${suffix}` + + // --- Create the series to delete --- + await adminPage.goto('/admin/series/create') + await expect(adminPage.locator('h1')).toContainText('Create New Series') + await adminPage + .getByPlaceholder('e.g., Cooperative Game Development Fundamentals') + .fill(title) + await adminPage + .getByPlaceholder('Describe what the series covers and its goals') + .fill('e2e delete-me series') + await adminPage.getByRole('button', { name: 'Create Series' }).click() + await adminPage.waitForURL('**/admin/series', { timeout: 15000 }) + + const card = adminPage.locator('.series-card', { hasText: title }) + await expect(card).toBeVisible({ timeout: 10000 }) + + // --- Delete (card button → confirm modal) --- + await card.getByRole('button', { name: 'Delete' }).click() + const confirmModal = adminPage.locator('.modal-overlay', { hasText: 'Delete Series' }) + await expect(confirmModal).toBeVisible() + await confirmModal.getByRole('button', { name: 'Delete', exact: true }).click() + + // --- Series is gone --- + await expect(adminPage.locator('.series-card', { hasText: title })).toHaveCount(0, { + timeout: 10000, + }) + }) })