diff --git a/tests/e2e/admin/admin-b2b-submissions.spec.ts b/tests/e2e/admin/admin-b2b-submissions.spec.ts index 5c276d3..8ff1228 100644 --- a/tests/e2e/admin/admin-b2b-submissions.spec.ts +++ b/tests/e2e/admin/admin-b2b-submissions.spec.ts @@ -124,4 +124,110 @@ test.describe('سناریوی مدیریت درخواست‌های B2B و فرم await expect(page.locator('span').filter({ hasText: 'کلینیک تخصصی دامپزشکی پایتخت' }).first()).toBeVisible({ timeout: 10000 }); }); + + test('راستی‌آزمایی رندر امن و عدم اجرای پیلود XSS در پنل ادمین (Admin Safe XSS Rendering)', async ({ page }) => { + let adminDialogFired = false; + page.on('dialog', () => { + adminDialogFired = true; + }); + + const xssSenderName = ' دکتر تست'; + const xssMessageBody = ' متن پیام تستی با پیلود مخرب'; + + await page.route('**/api/auth/admin-login*', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + success: true, + data: { + accessToken: 'mock_e2e_admin_jwt_token', + user: { id: 'admin-1', email: 'admin@canina.ir', role: 'SUPER_ADMIN' }, + }, + }), + }); + }); + + await page.route('**/api/auth/refresh*', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + success: true, + data: { + accessToken: 'mock_e2e_admin_jwt_token', + user: { id: 'admin-1', email: 'admin@canina.ir', role: 'SUPER_ADMIN' }, + }, + }), + }); + }); + + await page.route('**/api/users/profile*', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + success: true, + data: { id: 'admin-1', email: 'admin@canina.ir', role: 'SUPER_ADMIN' }, + }), + }); + }); + + await page.route('**/api/contact/submissions*', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + success: true, + items: [ + { + id: 'contact-xss-1', + name: xssSenderName, + phone: '09121112233', + subject: 'تست امنیت XSS در ادمین', + message: xssMessageBody, + status: 'PENDING', + createdAt: new Date().toISOString(), + }, + ], + }), + }); + }); + + await page.route('**/api/contact/info*', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify([]), + }); + }); + + // 1. لاگین ادمین + await page.goto('/login', { waitUntil: 'domcontentloaded' }); + const emailInput = page.locator('input[type="email"]'); + const passwordInput = page.locator('input[type="password"]'); + await expect(emailInput).toBeVisible({ timeout: 10000 }); + await emailInput.fill('admin@canina.ir'); + await passwordInput.fill('Admin@123456'); + + const submitBtn = page.getByRole('button', { name: /ورود با رمز عبور|ورود به پنل|ورود/i }).first(); + await submitBtn.click(); + await page.waitForTimeout(500); + + // 2. ورود به صفحه پیام‌های تماس در پنل ادمین + await page.goto('/contact', { waitUntil: 'domcontentloaded' }); + await expect(page).toHaveURL(/\/contact/); + + // 3. راستی‌آزمایی رندر امن نام فرستنده به عنوان متن خام در جدول + const senderCell = page.locator('td').filter({ hasText: xssSenderName }).first(); + await expect(senderCell).toBeVisible({ timeout: 15000 }); + + // 4. باز کردن جزئیات پیام و راستی‌آزمایی نمایش متن پیام + const detailsBtn = page.getByRole('button', { name: /مشاهده و پاسخ|مشاهده/i }).first(); + await expect(detailsBtn).toBeVisible({ timeout: 10000 }); + await detailsBtn.click(); + + // 5. راستی‌آزمایی قطعی عدم اجرای آلرت جاوااسکریپتی در پنل ادمین + expect(adminDialogFired).toBe(false); + }); });