create script for test data
This commit is contained in:
200
backend/cleanup_test_data.py
Normal file
200
backend/cleanup_test_data.py
Normal file
@@ -0,0 +1,200 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to clean up all test data from the Grocery Tracker application.
|
||||
This will delete all shopping events, groceries, and shops.
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
from typing import List, Dict, Any
|
||||
|
||||
BASE_URL = "http://localhost:8000"
|
||||
|
||||
def delete_all_shopping_events() -> int:
|
||||
"""Delete all shopping events and return the count of deleted events."""
|
||||
print("🛒 Deleting all shopping events...")
|
||||
|
||||
try:
|
||||
# Get all shopping events
|
||||
response = requests.get(f"{BASE_URL}/shopping-events/")
|
||||
if response.status_code != 200:
|
||||
print(f" ❌ Failed to fetch shopping events: {response.status_code}")
|
||||
return 0
|
||||
|
||||
events = response.json()
|
||||
deleted_count = 0
|
||||
|
||||
for event in events:
|
||||
try:
|
||||
delete_response = requests.delete(f"{BASE_URL}/shopping-events/{event['id']}")
|
||||
if delete_response.status_code == 200:
|
||||
deleted_count += 1
|
||||
print(f" ✅ Deleted event #{event['id']} from {event['shop']['name']}")
|
||||
else:
|
||||
print(f" ❌ Failed to delete event #{event['id']}: {delete_response.status_code}")
|
||||
except Exception as e:
|
||||
print(f" ❌ Error deleting event #{event['id']}: {e}")
|
||||
|
||||
print(f" 📊 Deleted {deleted_count} shopping events total\n")
|
||||
return deleted_count
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ Error fetching shopping events: {e}")
|
||||
return 0
|
||||
|
||||
def delete_all_groceries() -> int:
|
||||
"""Delete all groceries and return the count of deleted groceries."""
|
||||
print("🥬 Deleting all groceries...")
|
||||
|
||||
try:
|
||||
# Get all groceries
|
||||
response = requests.get(f"{BASE_URL}/groceries/")
|
||||
if response.status_code != 200:
|
||||
print(f" ❌ Failed to fetch groceries: {response.status_code}")
|
||||
return 0
|
||||
|
||||
groceries = response.json()
|
||||
deleted_count = 0
|
||||
|
||||
for grocery in groceries:
|
||||
try:
|
||||
delete_response = requests.delete(f"{BASE_URL}/groceries/{grocery['id']}")
|
||||
if delete_response.status_code == 200:
|
||||
deleted_count += 1
|
||||
organic_label = "🌱" if grocery['organic'] else "🌾"
|
||||
print(f" ✅ Deleted grocery: {organic_label} {grocery['name']}")
|
||||
else:
|
||||
print(f" ❌ Failed to delete grocery {grocery['name']}: {delete_response.status_code}")
|
||||
except Exception as e:
|
||||
print(f" ❌ Error deleting grocery {grocery['name']}: {e}")
|
||||
|
||||
print(f" 📊 Deleted {deleted_count} groceries total\n")
|
||||
return deleted_count
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ Error fetching groceries: {e}")
|
||||
return 0
|
||||
|
||||
def delete_all_shops() -> int:
|
||||
"""Delete all shops and return the count of deleted shops."""
|
||||
print("🏪 Deleting all shops...")
|
||||
|
||||
try:
|
||||
# Get all shops
|
||||
response = requests.get(f"{BASE_URL}/shops/")
|
||||
if response.status_code != 200:
|
||||
print(f" ❌ Failed to fetch shops: {response.status_code}")
|
||||
return 0
|
||||
|
||||
shops = response.json()
|
||||
deleted_count = 0
|
||||
|
||||
for shop in shops:
|
||||
try:
|
||||
delete_response = requests.delete(f"{BASE_URL}/shops/{shop['id']}")
|
||||
if delete_response.status_code == 200:
|
||||
deleted_count += 1
|
||||
print(f" ✅ Deleted shop: {shop['name']} ({shop['city']})")
|
||||
else:
|
||||
print(f" ❌ Failed to delete shop {shop['name']}: {delete_response.status_code}")
|
||||
except Exception as e:
|
||||
print(f" ❌ Error deleting shop {shop['name']}: {e}")
|
||||
|
||||
print(f" 📊 Deleted {deleted_count} shops total\n")
|
||||
return deleted_count
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ Error fetching shops: {e}")
|
||||
return 0
|
||||
|
||||
def get_current_data_summary():
|
||||
"""Get a summary of current data in the database."""
|
||||
print("📊 CURRENT DATA SUMMARY")
|
||||
print("=" * 30)
|
||||
|
||||
try:
|
||||
# Get counts
|
||||
shops_response = requests.get(f"{BASE_URL}/shops/")
|
||||
groceries_response = requests.get(f"{BASE_URL}/groceries/")
|
||||
events_response = requests.get(f"{BASE_URL}/shopping-events/")
|
||||
|
||||
shops_count = len(shops_response.json()) if shops_response.status_code == 200 else 0
|
||||
groceries_count = len(groceries_response.json()) if groceries_response.status_code == 200 else 0
|
||||
events_count = len(events_response.json()) if events_response.status_code == 200 else 0
|
||||
|
||||
print(f"🏪 Shops: {shops_count}")
|
||||
print(f"🥬 Groceries: {groceries_count}")
|
||||
print(f"🛒 Shopping Events: {events_count}")
|
||||
|
||||
if events_count > 0 and events_response.status_code == 200:
|
||||
events = events_response.json()
|
||||
total_spent = sum(event.get('total_amount', 0) for event in events)
|
||||
print(f"💰 Total spent: ${total_spent:.2f}")
|
||||
|
||||
print()
|
||||
return shops_count, groceries_count, events_count
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error getting data summary: {e}")
|
||||
return 0, 0, 0
|
||||
|
||||
def main():
|
||||
"""Main function to clean up all test data."""
|
||||
print("🧹 GROCERY TRACKER DATA CLEANUP")
|
||||
print("=" * 40)
|
||||
print("This script will delete ALL data from the Grocery Tracker app.")
|
||||
print("Make sure the backend server is running on http://localhost:8000\n")
|
||||
|
||||
try:
|
||||
# Test connection
|
||||
response = requests.get(f"{BASE_URL}/")
|
||||
if response.status_code != 200:
|
||||
print("❌ Cannot connect to the API server. Make sure it's running!")
|
||||
return
|
||||
|
||||
print("✅ Connected to API server\n")
|
||||
|
||||
# Show current data
|
||||
shops_count, groceries_count, events_count = get_current_data_summary()
|
||||
|
||||
if shops_count == 0 and groceries_count == 0 and events_count == 0:
|
||||
print("✅ Database is already empty. Nothing to clean up!")
|
||||
return
|
||||
|
||||
# Confirm deletion
|
||||
print("⚠️ WARNING: This will permanently delete all data!")
|
||||
confirmation = input("Type 'DELETE' to confirm: ")
|
||||
|
||||
if confirmation != 'DELETE':
|
||||
print("❌ Cleanup cancelled.")
|
||||
return
|
||||
|
||||
print("\n🧹 Starting cleanup process...\n")
|
||||
|
||||
# Delete in order: events -> groceries -> shops
|
||||
# (due to foreign key constraints)
|
||||
deleted_events = delete_all_shopping_events()
|
||||
deleted_groceries = delete_all_groceries()
|
||||
deleted_shops = delete_all_shops()
|
||||
|
||||
# Final summary
|
||||
print("📋 CLEANUP SUMMARY")
|
||||
print("=" * 30)
|
||||
print(f"🛒 Shopping Events deleted: {deleted_events}")
|
||||
print(f"🥬 Groceries deleted: {deleted_groceries}")
|
||||
print(f"🏪 Shops deleted: {deleted_shops}")
|
||||
print(f"📊 Total items deleted: {deleted_events + deleted_groceries + deleted_shops}")
|
||||
|
||||
print("\n🎉 Cleanup completed successfully!")
|
||||
print("The database is now empty and ready for fresh data.")
|
||||
|
||||
except requests.exceptions.ConnectionError:
|
||||
print("❌ Could not connect to the API server.")
|
||||
print(" Make sure the backend server is running on http://localhost:8000")
|
||||
except KeyboardInterrupt:
|
||||
print("\n❌ Cleanup cancelled by user.")
|
||||
except Exception as e:
|
||||
print(f"❌ Unexpected error: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user