@wernerthiago/teo
Version:
Test Execution Optimizer
126 lines (100 loc) • 3.72 kB
JavaScript
// Tests for product service
import { jest } from '@jest/globals'
import ProductService from '../../src/products/product-service.js'
describe('ProductService', () => {
let productService
beforeEach(() => {
productService = new ProductService()
})
describe('createProduct', () => {
test('should create product successfully', async () => {
const result = await productService.createProduct(
'Test Product',
'A test product',
29.99,
'category1'
)
expect(result).toHaveProperty('id')
expect(result).toHaveProperty('name', 'Test Product')
expect(result).toHaveProperty('price', 29.99)
})
})
describe('updateProduct', () => {
let productId
beforeEach(async () => {
const product = await productService.createProduct(
'Test Product',
'A test product',
29.99,
'category1'
)
productId = product.id
})
test('should update product successfully', async () => {
const result = await productService.updateProduct(productId, {
name: 'Updated Product',
price: 39.99
})
expect(result).toHaveProperty('name', 'Updated Product')
expect(result).toHaveProperty('price', 39.99)
})
test('should throw error for non-existent product', async () => {
await expect(
productService.updateProduct('invalid-id', { name: 'Updated' })
).rejects.toThrow('Product not found')
})
})
describe('searchProducts', () => {
beforeEach(async () => {
await productService.createProduct('Laptop', 'Gaming laptop', 999.99, 'electronics')
await productService.createProduct('Mouse', 'Gaming mouse', 49.99, 'electronics')
await productService.createProduct('Book', 'Programming book', 29.99, 'books')
})
test('should search by query', async () => {
const results = await productService.searchProducts('gaming')
expect(results).toHaveLength(2)
expect(results.every(p =>
p.name.toLowerCase().includes('gaming') ||
p.description.toLowerCase().includes('gaming')
)).toBe(true)
})
test('should search by category', async () => {
const results = await productService.searchProducts(null, 'electronics')
expect(results).toHaveLength(2)
expect(results.every(p => p.categoryId === 'electronics')).toBe(true)
})
test('should search by price range', async () => {
const results = await productService.searchProducts(null, null, { min: 30, max: 100 })
expect(results).toHaveLength(1)
expect(results[0].name).toBe('Mouse')
})
})
describe('inventory management', () => {
let productId
beforeEach(async () => {
const product = await productService.createProduct(
'Test Product',
'A test product',
29.99,
'category1'
)
productId = product.id
})
test('should update inventory', async () => {
const result = await productService.updateInventory(productId, 100)
expect(result).toHaveProperty('quantity', 100)
expect(result).toHaveProperty('reserved', 0)
})
test('should reserve inventory', async () => {
await productService.updateInventory(productId, 100)
const result = await productService.reserveInventory(productId, 10)
expect(result).toHaveProperty('reserved', 10)
})
test('should throw error for insufficient inventory', async () => {
await productService.updateInventory(productId, 5)
await expect(
productService.reserveInventory(productId, 10)
).rejects.toThrow('Insufficient inventory')
})
})
})