Files
bakery-ia/services/inventory/tests/test_weighted_average_cost.py
2025-10-27 16:33:26 +01:00

149 lines
4.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()