test(product): add cart behavior tests for ProductDetailPage

Covers: Add to Cart, Add to Cart twice (quantity increment), Buy Now
standalone, and Add to Cart followed by Buy Now (no duplication).
This commit is contained in:
2026-05-19 16:04:55 +02:00
parent 8bfd7afdcb
commit c966797073
@@ -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(<ProductDetailPage />)
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(<ProductDetailPage />)
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(<ProductDetailPage />)
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(<ProductDetailPage />)
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')
})
})