Initial commit

This commit is contained in:
iulian 2025-12-26 00:52:56 +00:00
commit 983cee0320
322 changed files with 57174 additions and 0 deletions

147
test_recurring_income.py Normal file
View file

@ -0,0 +1,147 @@
#!/usr/bin/env python3
"""
Test script to create backdated recurring income entries
This will test the automatic income creation feature
"""
from datetime import datetime, timedelta
from app import create_app, db
from app.models import Income, User
from app.routes.income import calculate_income_next_due_date
def create_test_income():
"""Create backdated recurring income for testing"""
app = create_app()
with app.app_context():
# Get the first user (or create test user)
user = User.query.first()
if not user:
print("No users found in database. Please create a user first.")
return
print(f"Creating test income for user: {user.username}")
print(f"User currency: {user.currency}")
# Test 1: Monthly salary - backdated 2 months (should trigger 2 auto-creations)
two_months_ago = datetime.utcnow() - timedelta(days=60)
next_due_date = calculate_income_next_due_date('monthly', None, two_months_ago)
salary_income = Income(
amount=5000.0,
currency=user.currency,
description="Monthly Salary - Test",
source="Salary",
user_id=user.id,
tags='["recurring", "salary", "test"]',
frequency='monthly',
next_due_date=next_due_date,
is_active=True,
auto_create=True,
date=two_months_ago
)
db.session.add(salary_income)
print(f"✓ Created monthly salary income backdated to {two_months_ago.date()}")
print(f" Next due date: {next_due_date.date() if next_due_date else 'None'}")
# Test 2: Biweekly freelance - backdated 4 weeks (should trigger 2 auto-creations)
four_weeks_ago = datetime.utcnow() - timedelta(days=28)
next_due_date = calculate_income_next_due_date('biweekly', None, four_weeks_ago)
freelance_income = Income(
amount=1500.0,
currency=user.currency,
description="Freelance Project - Test",
source="Freelance",
user_id=user.id,
tags='["recurring", "freelance", "test"]',
frequency='biweekly',
next_due_date=next_due_date,
is_active=True,
auto_create=True,
date=four_weeks_ago
)
db.session.add(freelance_income)
print(f"✓ Created biweekly freelance income backdated to {four_weeks_ago.date()}")
print(f" Next due date: {next_due_date.date() if next_due_date else 'None'}")
# Test 3: Weekly side gig - backdated 3 weeks (should trigger 3 auto-creations)
three_weeks_ago = datetime.utcnow() - timedelta(days=21)
next_due_date = calculate_income_next_due_date('weekly', None, three_weeks_ago)
weekly_income = Income(
amount=300.0,
currency=user.currency,
description="Side Gig - Test",
source="Freelance",
user_id=user.id,
tags='["recurring", "side-gig", "test"]',
frequency='weekly',
next_due_date=next_due_date,
is_active=True,
auto_create=True,
date=three_weeks_ago
)
db.session.add(weekly_income)
print(f"✓ Created weekly side gig income backdated to {three_weeks_ago.date()}")
print(f" Next due date: {next_due_date.date() if next_due_date else 'None'}")
# Test 4: Every 4 weeks contract - backdated 8 weeks (should trigger 2 auto-creations)
eight_weeks_ago = datetime.utcnow() - timedelta(days=56)
next_due_date = calculate_income_next_due_date('every4weeks', None, eight_weeks_ago)
contract_income = Income(
amount=2000.0,
currency=user.currency,
description="Contract Work - Test",
source="Freelance",
user_id=user.id,
tags='["recurring", "contract", "test"]',
frequency='every4weeks',
next_due_date=next_due_date,
is_active=True,
auto_create=True,
date=eight_weeks_ago
)
db.session.add(contract_income)
print(f"✓ Created every-4-weeks contract income backdated to {eight_weeks_ago.date()}")
print(f" Next due date: {next_due_date.date() if next_due_date else 'None'}")
# Test 5: Custom 10-day cycle - backdated 30 days (should trigger 3 auto-creations)
thirty_days_ago = datetime.utcnow() - timedelta(days=30)
next_due_date = calculate_income_next_due_date('custom', 10, thirty_days_ago)
custom_income = Income(
amount=500.0,
currency=user.currency,
description="Custom Cycle Income - Test",
source="Other",
user_id=user.id,
tags='["recurring", "custom", "test"]',
frequency='custom',
custom_days=10,
next_due_date=next_due_date,
is_active=True,
auto_create=True,
date=thirty_days_ago
)
db.session.add(custom_income)
print(f"✓ Created custom (10-day) income backdated to {thirty_days_ago.date()}")
print(f" Next due date: {next_due_date.date() if next_due_date else 'None'}")
db.session.commit()
print("\n" + "="*60)
print("✓ Test recurring income entries created successfully!")
print("="*60)
print("\nExpected auto-creations when scheduler runs:")
print("- Monthly Salary: ~2 entries")
print("- Biweekly Freelance: ~2 entries")
print("- Weekly Side Gig: ~3 entries")
print("- Every-4-weeks Contract: ~2 entries")
print("- Custom 10-day: ~3 entries")
print("\nTotal expected: ~12 auto-created income entries")
print("\nTo trigger scheduler manually, run:")
print("docker compose exec web python -c \"from app.scheduler import process_due_recurring_income; process_due_recurring_income()\"")
if __name__ == '__main__':
create_test_income()