70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
from decimal import Decimal
|
|
from app.services import product_service
|
|
from app.services import stock_service
|
|
from app.schemas.product import ProductCreate
|
|
from app.schemas.stock_movement import StockMoveRequest
|
|
|
|
|
|
def test_stock_increase(db):
|
|
prod = product_service.create_product(
|
|
db,
|
|
ProductCreate(sku="STOCK-001", name="Test", price=Decimal("10.00"), current_stock=5),
|
|
)
|
|
req = StockMoveRequest(product_id=prod.id, type="IN", quantity=10, reason="Compra")
|
|
mov, err = stock_service.register_movement(db, req)
|
|
assert err == ""
|
|
assert mov is not None
|
|
db.refresh(prod)
|
|
assert prod.current_stock == 15
|
|
|
|
|
|
def test_stock_decrease(db):
|
|
prod = product_service.create_product(
|
|
db,
|
|
ProductCreate(sku="STOCK-002", name="Test", price=Decimal("10.00"), current_stock=20),
|
|
)
|
|
req = StockMoveRequest(product_id=prod.id, type="OUT", quantity=5, reason="Venta")
|
|
mov, err = stock_service.register_movement(db, req)
|
|
assert err == ""
|
|
db.refresh(prod)
|
|
assert prod.current_stock == 15
|
|
|
|
|
|
def test_stock_insufficient(db):
|
|
prod = product_service.create_product(
|
|
db,
|
|
ProductCreate(sku="STOCK-003", name="Test", price=Decimal("10.00"), current_stock=3),
|
|
)
|
|
req = StockMoveRequest(product_id=prod.id, type="OUT", quantity=10, reason="Over sale")
|
|
mov, err = stock_service.register_movement(db, req)
|
|
assert err == "Stock insuficiente"
|
|
assert mov is None
|
|
|
|
|
|
def test_stock_adjust(db):
|
|
prod = product_service.create_product(
|
|
db,
|
|
ProductCreate(sku="STOCK-004", name="Test", price=Decimal("10.00"), current_stock=50),
|
|
)
|
|
req = StockMoveRequest(product_id=prod.id, type="ADJUST", quantity=100, reason="Inventario")
|
|
mov, err = stock_service.register_movement(db, req)
|
|
assert err == ""
|
|
db.refresh(prod)
|
|
assert prod.current_stock == 100
|
|
|
|
|
|
def test_stock_summary(db):
|
|
prod1 = product_service.create_product(
|
|
db,
|
|
ProductCreate(sku="SUM-001", name="Prod 1", price=Decimal("1.00"), min_stock=10, current_stock=5),
|
|
)
|
|
prod2 = product_service.create_product(
|
|
db,
|
|
ProductCreate(sku="SUM-002", name="Prod 2", price=Decimal("2.00"), min_stock=5, current_stock=20),
|
|
)
|
|
summary = stock_service.get_stock_summary(db)
|
|
assert len(summary) == 2
|
|
low_stock = [s for s in summary if s["is_low_stock"]]
|
|
assert len(low_stock) == 1
|
|
assert low_stock[0]["product_id"] == prod1.id
|