tests: add frontend tests

This commit is contained in:
2025-11-11 00:16:03 +03:00
parent e8e26c91e8
commit 3345d4eb94
11 changed files with 1236 additions and 17 deletions

View File

@@ -0,0 +1,118 @@
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();
});
});