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:
@@ -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')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user