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')
+ })
+})