refactor: Convert to UV Python project with proper package structure
- Restructured project to use src/stocktool package layout - Migrated to UV for dependency management - Added pyproject.toml with all dependencies (sv-ttk, pillow, requests, pyyaml) - Organized test files into tests/ directory - Updated .gitignore for UV projects - Comprehensive README with installation and usage instructions - Removed old unused files (main.py, stock_tool_gui.py, duplicate copy) - Added CLI entry point: stock-tool command 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
106
tests/test_duplicate_handling.py
Normal file
106
tests/test_duplicate_handling.py
Normal file
@@ -0,0 +1,106 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test script to demonstrate the updated _add_stock logic.
|
||||
This shows how duplicates are prevented by updating existing stock items.
|
||||
"""
|
||||
|
||||
def simulate_add_stock(part_id, location_id, quantity, existing_stock_items):
|
||||
"""
|
||||
Simulate the add stock workflow.
|
||||
|
||||
Args:
|
||||
part_id: Part ID
|
||||
location_id: Location ID
|
||||
quantity: Quantity to add
|
||||
existing_stock_items: List of existing stock items (for simulation)
|
||||
|
||||
Returns:
|
||||
Tuple of (action, stock_id, old_stock, new_stock)
|
||||
"""
|
||||
# Find existing stock item for this part at this location
|
||||
existing = None
|
||||
for item in existing_stock_items:
|
||||
if item['part'] == part_id and item['location'] == location_id:
|
||||
existing = item
|
||||
break
|
||||
|
||||
if existing:
|
||||
# Stock item exists - add to it
|
||||
stock_id = existing['pk']
|
||||
old_stock = existing['quantity']
|
||||
new_stock = old_stock + quantity
|
||||
|
||||
# Update the existing item (simulate)
|
||||
existing['quantity'] = new_stock
|
||||
|
||||
return ('updated', stock_id, old_stock, new_stock)
|
||||
else:
|
||||
# No existing stock - create new item
|
||||
new_item = {
|
||||
'pk': len(existing_stock_items) + 100, # Simulate new ID
|
||||
'part': part_id,
|
||||
'location': location_id,
|
||||
'quantity': quantity
|
||||
}
|
||||
existing_stock_items.append(new_item)
|
||||
|
||||
return ('created', new_item['pk'], 0, quantity)
|
||||
|
||||
|
||||
print("Testing Add Stock Duplicate Prevention\n")
|
||||
print("=" * 60)
|
||||
|
||||
# Simulate existing stock items
|
||||
stock_items = []
|
||||
|
||||
print("\nScenario 1: Adding stock when NO existing item exists")
|
||||
print("-" * 60)
|
||||
action, sid, old, new = simulate_add_stock(part_id=456, location_id=476, quantity=150, existing_stock_items=stock_items)
|
||||
print(f"Action: {action}")
|
||||
print(f"Stock ID: {sid}")
|
||||
print(f"Stock change: {old} -> {new} (+{new - old})")
|
||||
print(f"Total stock items: {len(stock_items)}")
|
||||
print(f"Expected: Created new stock item PASS" if action == 'created' else "FAIL")
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("\nScenario 2: Adding MORE stock to EXISTING item (should UPDATE, not duplicate)")
|
||||
print("-" * 60)
|
||||
print(f"Current stock items before scan: {len(stock_items)}")
|
||||
action, sid, old, new = simulate_add_stock(part_id=456, location_id=476, quantity=100, existing_stock_items=stock_items)
|
||||
print(f"Action: {action}")
|
||||
print(f"Stock ID: {sid}")
|
||||
print(f"Stock change: {old} -> {new} (+{new - old})")
|
||||
print(f"Total stock items: {len(stock_items)}")
|
||||
print(f"Expected: Updated existing item, NO duplicate PASS" if action == 'updated' and len(stock_items) == 1 else "FAIL")
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("\nScenario 3: Adding stock AGAIN (should continue to UPDATE)")
|
||||
print("-" * 60)
|
||||
print(f"Current stock items before scan: {len(stock_items)}")
|
||||
action, sid, old, new = simulate_add_stock(part_id=456, location_id=476, quantity=50, existing_stock_items=stock_items)
|
||||
print(f"Action: {action}")
|
||||
print(f"Stock ID: {sid}")
|
||||
print(f"Stock change: {old} -> {new} (+{new - old})")
|
||||
print(f"Total stock items: {len(stock_items)}")
|
||||
print(f"Expected: Updated existing item, still NO duplicate PASS" if action == 'updated' and len(stock_items) == 1 else "FAIL")
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("\nScenario 4: Adding same part to DIFFERENT location (should create new)")
|
||||
print("-" * 60)
|
||||
print(f"Current stock items before scan: {len(stock_items)}")
|
||||
action, sid, old, new = simulate_add_stock(part_id=456, location_id=999, quantity=75, existing_stock_items=stock_items)
|
||||
print(f"Action: {action}")
|
||||
print(f"Stock ID: {sid}")
|
||||
print(f"Stock change: {old} -> {new} (+{new - old})")
|
||||
print(f"Total stock items: {len(stock_items)}")
|
||||
print(f"Expected: Created new item for different location PASS" if action == 'created' and len(stock_items) == 2 else "FAIL")
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("\nFinal Summary:")
|
||||
print("-" * 60)
|
||||
for i, item in enumerate(stock_items, 1):
|
||||
print(f"Stock Item {i}: ID={item['pk']}, Part={item['part']}, Location={item['location']}, Qty={item['quantity']}")
|
||||
|
||||
print("\nSUCCESS All scenarios demonstrate proper duplicate prevention!")
|
||||
print(" - Same part + same location = UPDATE existing")
|
||||
print(" - Same part + different location = CREATE new")
|
||||
Reference in New Issue
Block a user