saveinmed/frontend/src/services/shippingService.test.ts

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