96 lines
3.2 KiB
TypeScript
96 lines
3.2 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
import { shippingService } from './shippingService'
|
|
import { apiClient } from './apiClient'
|
|
import type { ShippingSettings } from '../types/shipping'
|
|
|
|
// Mock apiClient
|
|
vi.mock('./apiClient', () => ({
|
|
apiClient: {
|
|
get: vi.fn(),
|
|
post: vi.fn()
|
|
}
|
|
}))
|
|
|
|
describe('shippingService', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
describe('getSettings', () => {
|
|
it('should fetch shipping settings for a vendor', async () => {
|
|
const mockSettings: ShippingSettings = {
|
|
vendor_id: 'vendor-123',
|
|
active: true,
|
|
max_radius_km: 50,
|
|
price_per_km_cents: 150,
|
|
min_fee_cents: 1000,
|
|
pickup_active: true,
|
|
pickup_address: 'Rua Test, 123',
|
|
pickup_hours: '08:00-18:00',
|
|
latitude: -23.55,
|
|
longitude: -46.63
|
|
}
|
|
|
|
vi.mocked(apiClient.get).mockResolvedValue(mockSettings)
|
|
|
|
const result = await shippingService.getSettings('vendor-123')
|
|
|
|
expect(apiClient.get).toHaveBeenCalledWith('/v1/shipping/settings/vendor-123')
|
|
expect(result).toEqual(mockSettings)
|
|
expect(result.active).toBe(true)
|
|
expect(result.pickup_active).toBe(true)
|
|
})
|
|
|
|
it('should handle vendor not found', async () => {
|
|
vi.mocked(apiClient.get).mockRejectedValue(new Error('Vendor not found'))
|
|
|
|
await expect(shippingService.getSettings('invalid-vendor'))
|
|
.rejects.toThrow('Vendor not found')
|
|
})
|
|
})
|
|
|
|
describe('calculate', () => {
|
|
it('should calculate shipping cost', async () => {
|
|
const mockCalculation = {
|
|
options: [
|
|
{
|
|
seller_id: 'seller-1',
|
|
delivery_fee_cents: 2500,
|
|
distance_km: 15.5,
|
|
estimated_days: 2,
|
|
pickup_available: true,
|
|
pickup_address: 'Rua Test, 123',
|
|
pickup_hours: '08:00-18:00'
|
|
}
|
|
]
|
|
}
|
|
|
|
vi.mocked(apiClient.post).mockResolvedValue(mockCalculation)
|
|
|
|
const result = await shippingService.calculate({
|
|
buyer_id: 'buyer-123',
|
|
order_total_cents: 15000,
|
|
items: [
|
|
{ seller_id: 'seller-1', product_id: 'prod-1', quantity: 2, price_cents: 7500 }
|
|
]
|
|
})
|
|
|
|
expect(apiClient.post).toHaveBeenCalledWith('/v1/shipping/calculate', expect.objectContaining({
|
|
buyer_id: 'buyer-123',
|
|
order_total_cents: 15000
|
|
}))
|
|
expect(result.options).toHaveLength(1)
|
|
expect(result.options[0].delivery_fee_cents).toBe(2500)
|
|
})
|
|
|
|
it('should handle API error', async () => {
|
|
vi.mocked(apiClient.post).mockRejectedValue(new Error('Server error'))
|
|
|
|
await expect(shippingService.calculate({
|
|
buyer_id: 'buyer-123',
|
|
order_total_cents: 15000,
|
|
items: []
|
|
})).rejects.toThrow('Server error')
|
|
})
|
|
})
|
|
})
|