Files
interview-demo-code/frontend/spa/tests/unit/ShoppingCart.test.js
Nikita Kiselev 3cc82e45f0
Some checks are pending
Telegram Mini App Shop Builder / Compute version metadata (push) Waiting to run
Telegram Mini App Shop Builder / Run Frontend tests (push) Waiting to run
Telegram Mini App Shop Builder / Run Backend tests (push) Waiting to run
Telegram Mini App Shop Builder / Run PHP_CodeSniffer (push) Waiting to run
Telegram Mini App Shop Builder / Build module. (push) Blocked by required conditions
Telegram Mini App Shop Builder / release (push) Blocked by required conditions
Squashed commit message
2026-03-11 23:02:54 +03:00

119 lines
3.4 KiB
JavaScript
Raw Permalink 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 { describe, it, expect, beforeEach, vi } from 'vitest';
import ShoppingCart from '@/ShoppingCart.js';
describe('ShoppingCart', () => {
let cart;
let mockStorage;
beforeEach(() => {
// Мокаем Telegram.WebApp.DeviceStorage
mockStorage = {
getItem: vi.fn((key, callback) => {
const value = localStorage.getItem(key);
callback(null, value);
}),
setItem: vi.fn((key, value) => {
localStorage.setItem(key, value);
}),
deleteItem: vi.fn((key) => {
localStorage.removeItem(key);
}),
};
global.Telegram = {
WebApp: {
DeviceStorage: mockStorage,
},
};
localStorage.clear();
});
it('должен инициализироваться с пустой корзиной', async () => {
cart = new ShoppingCart();
// Даем время на асинхронную загрузку
await new Promise(resolve => setTimeout(resolve, 10));
expect(cart.getItems()).toEqual([]);
});
it('должен загружать данные из storage при инициализации', async () => {
const savedItems = [
{ productId: 1, productName: 'Product 1', quantity: 2, options: {} },
];
localStorage.setItem('shoppingCart', JSON.stringify(savedItems));
cart = new ShoppingCart();
await new Promise(resolve => setTimeout(resolve, 10));
expect(cart.getItems()).toEqual(savedItems);
});
it('должен добавлять товар в корзину', async () => {
cart = new ShoppingCart();
await new Promise(resolve => setTimeout(resolve, 10));
await cart.addItem(1, 'Product 1', 2, { color: 'red' });
const items = cart.getItems();
expect(items).toHaveLength(1);
expect(items[0]).toEqual({
productId: 1,
productName: 'Product 1',
quantity: 2,
options: { color: 'red' },
});
});
it('должен проверять наличие товара в корзине', async () => {
cart = new ShoppingCart();
await new Promise(resolve => setTimeout(resolve, 10));
await cart.addItem(1, 'Product 1', 1);
expect(cart.has(1)).toBe(true);
expect(cart.has(999)).toBe(false);
});
it('должен получать товар по ID', async () => {
cart = new ShoppingCart();
await new Promise(resolve => setTimeout(resolve, 10));
await cart.addItem(1, 'Product 1', 2);
const item = cart.getItem(1);
expect(item).not.toBeNull();
expect(item.productId).toBe(1);
expect(item.productName).toBe('Product 1');
const notFound = cart.getItem(999);
expect(notFound).toBeNull();
});
it('должен очищать корзину', async () => {
cart = new ShoppingCart();
await new Promise(resolve => setTimeout(resolve, 10));
await cart.addItem(1, 'Product 1', 1);
cart.clear();
expect(mockStorage.deleteItem).toHaveBeenCalledWith('shoppingCart');
});
it('должен обрабатывать ошибки при загрузке', async () => {
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
mockStorage.getItem = vi.fn((key, callback) => {
callback(new Error('Storage error'), null);
});
cart = new ShoppingCart();
await new Promise(resolve => setTimeout(resolve, 10));
expect(cart.getItems()).toEqual([]);
consoleErrorSpy.mockRestore();
});
});