Files
bakery-ia/services/inventory/tests/test_weighted_average_cost.py

149 lines
4.9 KiB
Python
Raw Permalink Normal View History

2025-10-27 16:33:26 +01:00
#!/usr/bin/env python3
"""
Test script to demonstrate and verify the weighted average cost calculation
Location: services/inventory/tests/test_weighted_average_cost.py
"""
import sys
from decimal import Decimal
def calculate_weighted_average(current_stock: float, current_avg_cost: float,
new_quantity: float, new_unit_cost: float) -> float:
"""
Calculate weighted average cost - mirrors the implementation in ingredient_repository.py
Args:
current_stock: Current stock quantity before purchase
current_avg_cost: Current average cost per unit
new_quantity: Quantity being purchased
new_unit_cost: Unit cost of new purchase
Returns:
New average cost per unit
"""
if current_stock <= 0:
return new_unit_cost
total_cost = (current_stock * current_avg_cost) + (new_quantity * new_unit_cost)
total_quantity = current_stock + new_quantity
return total_cost / total_quantity
def print_test_case(case_num: int, title: str, current_stock: float, current_avg_cost: float,
new_quantity: float, new_unit_cost: float):
"""Print a formatted test case with calculation details"""
print(f"\nTest Case {case_num}: {title}")
print("-" * 60)
print(f"Current Stock: {current_stock} kg @ €{current_avg_cost:.2f}/kg")
print(f"New Purchase: {new_quantity} kg @ €{new_unit_cost:.2f}/kg")
new_avg_cost = calculate_weighted_average(current_stock, current_avg_cost,
new_quantity, new_unit_cost)
if current_stock > 0:
total_cost = (current_stock * current_avg_cost) + (new_quantity * new_unit_cost)
total_quantity = current_stock + new_quantity
print(f"Calculation: ({current_stock} ×{current_avg_cost:.2f} + {new_quantity} ×{new_unit_cost:.2f}) / {total_quantity}")
print(f" = (€{current_stock * current_avg_cost:.2f} + €{new_quantity * new_unit_cost:.2f}) / {total_quantity}")
print(f" = €{total_cost:.2f} / {total_quantity}")
print(f"→ New Average Cost: €{new_avg_cost:.2f}/kg")
return new_avg_cost
def test_weighted_average_calculation():
"""Run comprehensive tests of the weighted average cost calculation"""
print("=" * 80)
print("WEIGHTED AVERAGE COST CALCULATION - COMPREHENSIVE TEST SUITE")
print("=" * 80)
# Test Case 1: First Purchase (Bootstrap case)
print_test_case(
1, "First Purchase (No Existing Stock)",
current_stock=0,
current_avg_cost=0,
new_quantity=100,
new_unit_cost=5.00
)
# Test Case 2: Same Price Purchase
print_test_case(
2, "Second Purchase at Same Price",
current_stock=100,
current_avg_cost=5.00,
new_quantity=50,
new_unit_cost=5.00
)
# Test Case 3: Price Increase
avg_cost = print_test_case(
3, "Purchase at Higher Price (Inflation)",
current_stock=150,
current_avg_cost=5.00,
new_quantity=50,
new_unit_cost=6.00
)
# Test Case 4: Large Volume Discount
avg_cost = print_test_case(
4, "Large Purchase with Volume Discount",
current_stock=200,
current_avg_cost=5.25,
new_quantity=200,
new_unit_cost=4.50
)
# Test Case 5: Small Purchase After Consumption
avg_cost = print_test_case(
5, "Purchase After Heavy Consumption",
current_stock=50,
current_avg_cost=4.88,
new_quantity=100,
new_unit_cost=5.50
)
# Test Case 6: Tiny Emergency Purchase
print_test_case(
6, "Small Emergency Purchase at Premium Price",
current_stock=150,
current_avg_cost=5.29,
new_quantity=10,
new_unit_cost=8.00
)
# Summary
print("\n" + "=" * 80)
print("KEY INSIGHTS")
print("=" * 80)
print("""
The weighted average considers both QUANTITY and PRICE:
- Larger purchases have more impact on the average
- Smaller purchases have minimal impact
Behavior with price changes:
- Price increases gradually raise the average (dampened by existing stock)
- Price decreases gradually lower the average (dampened by existing stock)
- Volume discounts can significantly lower costs when buying in bulk
Business implications:
- Encourages bulk purchasing when prices are favorable
- Protects against price spike impacts (averaged over time)
- Provides accurate COGS for financial reporting
- Helps identify procurement opportunities (compare to standard_cost)
Implementation notes:
- Calculation happens automatically on every stock addition
- No user intervention required
- Logged for audit purposes
- Works with FIFO stock consumption
""")
print("=" * 80)
print("✓ All tests completed successfully!")
print("=" * 80)
if __name__ == "__main__":
test_weighted_average_calculation()