import { test, expect } from '../../fixtures'; function parsePersianPrice(text: string): number { const english = text.replace(/[۰-۹]/g, (d) => '۰۱۲۳۴۵۶۷۸۹'.indexOf(d).toString()); const clean = english.replace(/[^0-9]/g, ''); return parseInt(clean, 10); } test.describe('سناریوی عملیات پیشرفته سبد خرید (Cart Operations & Exact Math Calculation)', () => { test('ورود به صفحه محصول -> افزودن به سبد -> راستی‌آزمایی محاسبه دقیق قیمت و تغییر تعداد -> حذف کالا', async ({ page, isMobile }) => { // 1. ورود مستقیم به صفحه فروشگاه await page.goto('/shop', { waitUntil: 'domcontentloaded' }); await expect(page).toHaveURL(/\/shop/); const productCard = page.locator('a[href^="/shop/"]').first(); await expect(productCard).toBeVisible({ timeout: 20000 }); const productHref = await productCard.getAttribute('href'); expect(productHref).toBeTruthy(); await page.goto(productHref!, { waitUntil: 'domcontentloaded' }); // 2. افزودن محصول به سبد خرید if (isMobile) { const mobileAddBtn = page.locator('div.fixed.bottom-0 button').filter({ hasText: /افزودن به سبد/i }).first(); await expect(mobileAddBtn).toBeVisible({ timeout: 15000 }); await mobileAddBtn.click(); } else { const desktopAddBtn = page.locator('button').filter({ hasText: /افزودن به سبد/i }).first(); await expect(desktopAddBtn).toBeVisible({ timeout: 15000 }); await desktopAddBtn.click(); } // 3. باز کردن دراور سبد خرید از هدر const cartHeaderBtn = page.locator('[data-testid="cart-header-btn"]').first(); await expect(cartHeaderBtn).toBeVisible({ timeout: 15000 }); await cartHeaderBtn.click(); // 4. دریافت قیمت اولیه سبد خرید برای ۱ عدد و محاسبه ریاضی دقیق const initialPriceElement = page.locator('[data-testid="cart-total-price"]').first(); await expect(initialPriceElement).toBeVisible({ timeout: 15000 }); const initialPriceText = await initialPriceElement.innerText(); const unitPrice = parsePersianPrice(initialPriceText); expect(unitPrice).toBeGreaterThan(0); // 5. افزایش تعداد با دکمه + و راستی‌آزمایی برابری ریاضی با دقیقا دو برابر const plusBtn = page.locator('[data-testid="plus-btn"]').first(); await expect(plusBtn).toBeVisible({ timeout: 15000 }); await plusBtn.click(); const itemQty = page.locator('[data-testid="cart-item-quantity"]').first(); await expect(itemQty).toBeVisible({ timeout: 10000 }); await expect(itemQty).toHaveText('۲'); // راستی‌آزمایی ریاضی دقیق اینکه مجموع مبلغ دقیقاً برابر ۲ برابر قیمت واحد است const updatedPriceElement = page.locator('[data-testid="cart-total-price"]').first(); await expect(updatedPriceElement).toBeVisible({ timeout: 10000 }); await expect.poll(async () => { const text = await updatedPriceElement.innerText(); return parsePersianPrice(text); }, { timeout: 10000 }).toBe(unitPrice * 2); // 6. حذف کالا از سبد خرید const trashBtn = page.locator('[data-testid="cart-item-delete-btn"]').first(); await expect(trashBtn).toBeVisible({ timeout: 10000 }); await trashBtn.click(); const confirmDeleteModal = page.locator('h3').filter({ hasText: 'حذف از سبد خرید' }); await expect(confirmDeleteModal).toBeVisible({ timeout: 10000 }); const confirmBtn = page.locator('button').filter({ hasText: 'بله، حذف شود' }); await expect(confirmBtn).toBeVisible(); await confirmBtn.click(); // 7. راستی‌آزمایی قطعی وضعیت سبد خرید خالی (Empty State) const emptyStateText = page.locator('p').filter({ hasText: 'سبد خرید شما خالی است' }); await expect(emptyStateText).toBeVisible({ timeout: 10000 }); }); });