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