diff --git a/test/components/storefront/ProductDetailPage.test.tsx b/test/components/storefront/ProductDetailPage.test.tsx new file mode 100644 index 0000000..532517b --- /dev/null +++ b/test/components/storefront/ProductDetailPage.test.tsx @@ -0,0 +1,90 @@ +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') + }) +})