import { describe, it, expect, vi, beforeEach } from 'vitest' import { render, screen, fireEvent, waitFor } from '@testing-library/react' import ProductDetailPage from '@/app/products/[slug]/page' const mockPush = vi.fn() vi.mock('next/navigation', () => ({ useParams: () => ({ slug: 'test-product' }), useRouter: () => ({ push: mockPush }), })) vi.mock('@/components/storefront/Navbar', () => ({ Navbar: () => null, })) const mockProduct = { product: { id: 'prod-1', title: 'Test Product', slug: 'test-product', description: 'A test product', basePrice: 1000, currency: 'EUR', stock: 10, images: [], variants: [], categories: [], reviews: [], }, } describe('ProductDetailPage - cart behavior', () => { beforeEach(() => { localStorage.clear() mockPush.mockClear() vi.stubGlobal( 'fetch', vi.fn().mockResolvedValue({ json: () => Promise.resolve(mockProduct) }) ) }) it('Add to Cart aggiunge 1 articolo al carrello', async () => { render() await waitFor(() => screen.getByText('Test Product')) fireEvent.click(screen.getByText('Add to Cart')) const cart = JSON.parse(localStorage.getItem('cart') || '[]') expect(cart).toHaveLength(1) expect(cart[0].quantity).toBe(1) expect(cart[0].productId).toBe('prod-1') }) it('Add to Cart cliccato due volte incrementa la quantità a 2', async () => { render() await waitFor(() => screen.getByText('Test Product')) fireEvent.click(screen.getByText('Add to Cart')) fireEvent.click(screen.getByText('Add to Cart')) const cart = JSON.parse(localStorage.getItem('cart') || '[]') expect(cart).toHaveLength(1) expect(cart[0].quantity).toBe(2) }) it('Buy Now aggiunge 1 articolo e naviga al carrello', async () => { render() await waitFor(() => screen.getByText('Test Product')) fireEvent.click(screen.getByText('Buy Now')) const cart = JSON.parse(localStorage.getItem('cart') || '[]') expect(cart).toHaveLength(1) expect(cart[0].quantity).toBe(1) expect(mockPush).toHaveBeenCalledWith('/cart') }) it('Add to Cart seguito da Buy Now non duplica: rimane 1 articolo con quantità 1', async () => { render() await waitFor(() => screen.getByText('Test Product')) fireEvent.click(screen.getByText('Add to Cart')) fireEvent.click(screen.getByText('Buy Now')) const cart = JSON.parse(localStorage.getItem('cart') || '[]') expect(cart).toHaveLength(1) expect(cart[0].quantity).toBe(1) expect(mockPush).toHaveBeenCalledWith('/cart') }) })