69 lines
3.3 KiB
JavaScript
69 lines
3.3 KiB
JavaScript
// @ts-check
|
|
import { test, expect } from '@playwright/test';
|
|
import { loadTestUser } from '../utils/testUser.js';
|
|
|
|
test.describe('@p1 Milestones — create (modal), edit, delete', () => {
|
|
test.setTimeout(60000);
|
|
|
|
test('ensure scenario, open Milestones, add + edit + delete', async ({ page }) => {
|
|
const u = loadTestUser();
|
|
await page.route('**/api/premium/subscription/status', async route => {
|
|
await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ is_premium: 1, is_pro_premium: 0 }) });
|
|
});
|
|
|
|
await page.context().clearCookies();
|
|
await page.goto('/signin', { waitUntil: 'networkidle' });
|
|
await page.getByPlaceholder('Username', { exact: true }).fill(u.username);
|
|
await page.getByPlaceholder('Password', { exact: true }).fill(u.password);
|
|
await page.getByRole('button', { name: /^Sign In$/ }).click();
|
|
await page.waitForURL('**/signin-landing**', { timeout: 15000 });
|
|
|
|
const scen = await page.request.post('/api/premium/career-profile', {
|
|
data: { career_name: 'QA Milestones', status: 'planned', start_date: '2025-09-01' }
|
|
});
|
|
const { career_profile_id } = await scen.json();
|
|
|
|
await page.goto(`/career-roadmap/${career_profile_id}`, { waitUntil: 'networkidle' });
|
|
// Milestones section anchor
|
|
await expect(page.getByRole('heading', { name: /^Milestones$/ })).toBeVisible({ timeout: 20000 });
|
|
|
|
// Open MilestoneEditModal via "Add Details" (missing banner) or panel button
|
|
const addDetails = page.getByRole('button', { name: /Add Details/i });
|
|
if (await addDetails.isVisible().catch(() => false)) {
|
|
await addDetails.click();
|
|
} else {
|
|
// Fallback: open the modal through any visible “Milestones” action button
|
|
const anyBtn = page.getByRole('button', { name: /Add|Edit|Milestone/i }).first();
|
|
await anyBtn.click().catch(() => {});
|
|
}
|
|
|
|
// Modal header
|
|
await expect(page.getByRole('heading', { name: /^Milestones$/ })).toBeVisible({ timeout: 15000 });
|
|
|
|
// Add new milestone section
|
|
await page.getByText(/Add new milestone/i).click();
|
|
await page.getByLabel(/^Title$/i).first().fill('QA Milestone A');
|
|
await page.getByLabel(/^Date$/i).first().fill('2026-04-01');
|
|
await page.getByRole('button', { name: /\+ Add impact/i }).click();
|
|
await page.getByLabel(/^Type$/i).first().selectOption('ONE_TIME');
|
|
await page.getByLabel(/^Amount$/i).first().fill('123');
|
|
await page.getByLabel(/^Start$/i).first().fill('2026-03-01');
|
|
await page.getByRole('button', { name: /\+ Add task/i }).click();
|
|
await page.getByLabel(/^Title$/i).nth(1).fill('Prepare docs');
|
|
await page.getByLabel(/^Due Date$/i).first().fill('2026-03-15');
|
|
|
|
await page.getByRole('button', { name: /Save milestone/i }).click();
|
|
await expect(page.getByText(/QA Milestone A/i)).toBeVisible({ timeout: 20000 });
|
|
|
|
// Edit existing milestone: open accordion by its title
|
|
await page.getByRole('button', { name: /QA Milestone A/i }).click();
|
|
await page.getByLabel(/Description/i).fill('Short description');
|
|
await page.getByRole('button', { name: /^Save$/ }).click();
|
|
|
|
// Delete milestone
|
|
await page.getByRole('button', { name: /Delete milestone/i }).click();
|
|
// Close modal
|
|
await page.getByRole('button', { name: /^Close$/ }).click();
|
|
});
|
|
});
|