Files
TimeTracker/test_client_system.py
Dries Peeters 8a378b7078 feat(clients,license,db): add client management, enhanced DB init, and tests
- Clients: add model, routes, and templates
  - app/models/client.py
  - app/routes/clients.py
  - templates/clients/{create,edit,list,view}.html
  - docs/CLIENT_MANAGEMENT_README.md
- Database: add enhanced init/verify scripts, migrations, and docs
  - docker/{init-database-enhanced.py,start-enhanced.py,verify-database.py}
  - docs/ENHANCED_DATABASE_STARTUP.md
  - migrations/{add_analytics_column.sql,add_analytics_setting.py,migrate_to_client_model.py}
- Scripts: add version manager and docker network test helpers
  - scripts/version-manager.{bat,ps1,py,sh}
  - scripts/test-docker-network.{bat,sh}
  - docs/VERSION_MANAGEMENT.md
- UI: tweak base stylesheet
  - app/static/base.css
- Tests: add client system test
  - test_client_system.py
2025-09-01 11:34:45 +02:00

187 lines
7.5 KiB
Python

#!/usr/bin/env python3
"""
Test script for the new client management system
This script will test:
1. Client creation
2. Project creation with client selection
3. Rate auto-population
4. Client management operations
"""
import os
import sys
from pathlib import Path
# Add the current directory to the path so we can import app modules
sys.path.insert(0, str(Path(__file__).parent))
from app import create_app, db
from app.models import User, Project, Client
def test_client_system():
"""Test the client management system"""
app = create_app()
with app.app_context():
print("Testing Client Management System...")
print("=" * 50)
try:
# Check if clients table exists
inspector = db.inspect(db.engine)
existing_tables = inspector.get_table_names()
if 'clients' not in existing_tables:
print("❌ Clients table does not exist. Please run the migration first.")
return False
print("✅ Clients table exists")
# Check if projects table has client_id column
project_columns = [col['name'] for col in inspector.get_columns('projects')]
if 'client_id' not in project_columns:
print("❌ Projects table missing client_id column. Please run the migration first.")
return False
print("✅ Projects table has client_id column")
# Test client creation
print("\nTesting Client Creation...")
# Check if test client already exists
test_client = Client.query.filter_by(name='Test Client Corp').first()
if test_client:
print(f"✅ Test client already exists (ID: {test_client.id})")
else:
# Create test client
test_client = Client(
name='Test Client Corp',
description='Test client for system verification',
contact_person='John Doe',
email='john@testclient.com',
phone='+1 (555) 123-4567',
address='123 Test Street, Test City, TC 12345',
default_hourly_rate=85.00
)
db.session.add(test_client)
db.session.commit()
print(f"✅ Test client created (ID: {test_client.id})")
# Test project creation with client
print("\nTesting Project Creation with Client...")
# Check if test project already exists
test_project = Project.query.filter_by(name='Test Project - Client System').first()
if test_project:
print(f"✅ Test project already exists (ID: {test_project.id})")
else:
# Create test project
test_project = Project(
name='Test Project - Client System',
client_id=test_client.id,
description='Test project to verify client integration',
billable=True,
hourly_rate=85.00, # Should match client default
billing_ref='TEST-001'
)
db.session.add(test_project)
db.session.commit()
print(f"✅ Test project created (ID: {test_project.id})")
# Test client properties
print("\nTesting Client Properties...")
print(f"Client name: {test_client.name}")
print(f"Client description: {test_client.description}")
print(f"Client default rate: {test_client.default_hourly_rate}")
print(f"Client status: {test_client.status}")
print(f"Client total projects: {test_client.total_projects}")
print(f"Client active projects: {test_client.active_projects}")
print(f"Client total hours: {test_client.total_hours}")
print(f"Client estimated cost: {test_client.estimated_total_cost}")
# Test project properties
print("\nTesting Project Properties...")
print(f"Project name: {test_project.name}")
print(f"Project client: {test_project.client}") # Using backward compatibility property
print(f"Project client_id: {test_project.client_id}")
print(f"Project hourly rate: {test_project.hourly_rate}")
print(f"Project billable: {test_project.billable}")
# Test client relationships
print("\nTesting Client Relationships...")
client_projects = test_client.projects.all()
print(f"Client has {len(client_projects)} projects:")
for project in client_projects:
print(f" - {project.name} (ID: {project.id})")
# Test client management methods
print("\nTesting Client Management Methods...")
active_clients = Client.get_active_clients()
print(f"Active clients: {len(active_clients)}")
all_clients = Client.get_all_clients()
print(f"All clients: {len(all_clients)}")
# Test client archiving (create a test client to archive)
print("\nTesting Client Archiving...")
archive_test_client = Client.query.filter_by(name='Archive Test Client').first()
if not archive_test_client:
archive_test_client = Client(
name='Archive Test Client',
description='Client to test archiving functionality'
)
db.session.add(archive_test_client)
db.session.commit()
print(f"✅ Archive test client created (ID: {archive_test_client.id})")
if archive_test_client.status == 'active':
archive_test_client.archive()
db.session.commit()
print(f"✅ Client '{archive_test_client.name}' archived")
else:
print(f"✅ Client '{archive_test_client.name}' already archived")
# Test client activation
if archive_test_client.status == 'inactive':
archive_test_client.activate()
db.session.commit()
print(f"✅ Client '{archive_test_client.name}' activated")
# Clean up test data (optional)
print("\nCleaning up test data...")
# Delete test project
if test_project:
db.session.delete(test_project)
print("✅ Test project deleted")
# Delete test clients
if test_client:
db.session.delete(test_client)
print("✅ Test client deleted")
if archive_test_client:
db.session.delete(archive_test_client)
print("✅ Archive test client deleted")
db.session.commit()
print("\n🎉 All tests passed! Client management system is working correctly.")
return True
except Exception as e:
print(f"\n❌ Test failed: {e}")
import traceback
traceback.print_exc()
return False
if __name__ == '__main__':
success = test_client_system()
sys.exit(0 if success else 1)