canina/tests/e2e/storefront/cart-operations.spec.ts

81 lines
4.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 });
});
});