77 lines
3.8 KiB
TypeScript
77 lines
3.8 KiB
TypeScript
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. افزودن محصول به سبد خرید
|
||
const addBtn = isMobile
|
||
? page.locator('[data-testid="product-add-to-cart-btn"]').first()
|
||
: page.locator('[data-testid="product-desktop-add-to-cart-btn"]').first();
|
||
await expect(addBtn).toBeVisible({ timeout: 20000 });
|
||
await addBtn.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 });
|
||
});
|
||
});
|