Files
GOV_QR_Codes_Management/user_management_test.py
T
2025-07-29 17:02:08 -04:00

493 lines
18 KiB
Python
Raw 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
"""
User Management Test Script
Test all user management functionalities to ensure they work correctly
"""
import requests
import json
from datetime import datetime
class UserManagementTester:
def __init__(self, base_url="http://localhost:5000"):
self.base_url = base_url
self.session = requests.Session()
self.admin_session_id = None
def login_as_admin(self, username="admin", password="admin123"):
"""Login as admin to test admin functions"""
print("🔐 Testing admin login...")
response = self.session.post(f"{self.base_url}/login", data={
'username': username,
'password': password
})
if response.status_code == 200 and "Welcome" in response.text:
print("✅ Admin login successful")
return True
else:
print("❌ Admin login failed")
return False
def test_create_user(self):
"""Test user creation functionality"""
print("\n👤 Testing user creation...")
test_user_data = {
'full_name': 'Test User',
'email': 'testuser@example.com',
'username': 'testuser',
'password': 'testpass123',
'role': 'staff'
}
response = self.session.post(f"{self.base_url}/users/create", data=test_user_data)
if response.status_code == 200:
if "created successfully" in response.text or response.url.endswith('/users'):
print("✅ User creation successful")
return True
print("❌ User creation failed")
print(f"Response status: {response.status_code}")
return False
def test_users_page_access(self):
"""Test access to users management page"""
print("\n📋 Testing users page access...")
response = self.session.get(f"{self.base_url}/users")
if response.status_code == 200 and "User Management" in response.text:
print("✅ Users page accessible")
return True
else:
print("❌ Users page access failed")
print(f"Response status: {response.status_code}")
return False
def get_test_user_id(self):
"""Get the ID of the test user for further testing"""
print("\n🔍 Finding test user ID...")
response = self.session.get(f"{self.base_url}/users")
if response.status_code == 200:
# Parse HTML to find user ID - this is a simple approach
# In a real test, you'd use BeautifulSoup or similar
content = response.text
if "testuser" in content:
print("✅ Test user found in users list")
# For demo purposes, we'll assume user ID 2 (after admin)
return 2
print("❌ Could not find test user")
return None
def test_user_promotion(self, user_id):
"""Test promoting a user to admin"""
print(f"\n⬆️ Testing user promotion (ID: {user_id})...")
response = self.session.get(f"{self.base_url}/users/{user_id}/promote")
if response.status_code == 200 or response.status_code == 302:
print("✅ User promotion request successful")
return True
else:
print("❌ User promotion failed")
print(f"Response status: {response.status_code}")
return False
def test_user_demotion(self, user_id):
"""Test demoting a user from admin to staff"""
print(f"\n⬇️ Testing user demotion (ID: {user_id})...")
response = self.session.get(f"{self.base_url}/users/{user_id}/demote")
if response.status_code == 200 or response.status_code == 302:
print("✅ User demotion request successful")
return True
else:
print("❌ User demotion failed")
print(f"Response status: {response.status_code}")
return False
def test_user_deactivation(self, user_id):
"""Test deactivating a user"""
print(f"\n🚫 Testing user deactivation (ID: {user_id})...")
response = self.session.get(f"{self.base_url}/users/{user_id}/delete")
if response.status_code == 200 or response.status_code == 302:
print("✅ User deactivation request successful")
return True
else:
print("❌ User deactivation failed")
print(f"Response status: {response.status_code}")
return False
def test_user_reactivation(self, user_id):
"""Test reactivating a user"""
print(f"\n✅ Testing user reactivation (ID: {user_id})...")
response = self.session.get(f"{self.base_url}/users/{user_id}/reactivate")
if response.status_code == 200 or response.status_code == 302:
print("✅ User reactivation request successful")
return True
else:
print("❌ User reactivation failed")
print(f"Response status: {response.status_code}")
return False
def test_user_edit(self, user_id):
"""Test editing user information"""
print(f"\n✏️ Testing user edit (ID: {user_id})...")
# First get the edit page
response = self.session.get(f"{self.base_url}/users/{user_id}/edit")
if response.status_code == 200:
print("✅ User edit page accessible")
# Test submitting updated user data
updated_data = {
'full_name': 'Updated Test User',
'email': 'updated_testuser@example.com',
'role': 'staff'
}
response = self.session.post(f"{self.base_url}/users/{user_id}/edit", data=updated_data)
if response.status_code == 200 or response.status_code == 302:
print("✅ User edit submission successful")
return True
print("❌ User edit failed")
print(f"Response status: {response.status_code}")
return False
def test_bulk_operations(self):
"""Test bulk user operations"""
print("\n📦 Testing bulk operations...")
# Test bulk deactivate API
test_data = {'user_ids': [2]} # Assuming test user has ID 2
response = self.session.post(
f"{self.base_url}/users/bulk/deactivate",
json=test_data,
headers={'Content-Type': 'application/json'}
)
if response.status_code == 200:
try:
result = response.json()
if result.get('success'):
print("✅ Bulk deactivate API works")
# Test bulk activate
response = self.session.post(
f"{self.base_url}/users/bulk/activate",
json=test_data,
headers={'Content-Type': 'application/json'}
)
if response.status_code == 200:
result = response.json()
if result.get('success'):
print("✅ Bulk activate API works")
return True
except json.JSONDecodeError:
pass
print("❌ Bulk operations failed")
return False
def test_admin_protections(self):
"""Test admin protection mechanisms"""
print("\n🛡️ Testing admin protection mechanisms...")
# Try to deactivate admin user (should fail)
response = self.session.get(f"{self.base_url}/users/1/delete") # Assuming admin is ID 1
# This should either redirect or show an error
if response.status_code in [200, 302]:
print("✅ Admin self-deactivation protection works")
return True
else:
print("❌ Admin protection test inconclusive")
return False
def run_all_tests(self):
"""Run comprehensive user management tests"""
print("🧪 Starting User Management Tests")
print("=" * 50)
results = []
# Test 1: Admin Login
results.append(("Admin Login", self.login_as_admin()))
if not results[-1][1]:
print("\n❌ Cannot proceed without admin login")
return False
# Test 2: Users Page Access
results.append(("Users Page Access", self.test_users_page_access()))
# Test 3: User Creation
results.append(("User Creation", self.test_create_user()))
# Get test user ID for further tests
test_user_id = self.get_test_user_id()
if test_user_id:
# Test 4: User Edit
results.append(("User Edit", self.test_user_edit(test_user_id)))
# Test 5: User Promotion
results.append(("User Promotion", self.test_user_promotion(test_user_id)))
# Test 6: User Demotion
results.append(("User Demotion", self.test_user_demotion(test_user_id)))
# Test 7: User Deactivation
results.append(("User Deactivation", self.test_user_deactivation(test_user_id)))
# Test 8: User Reactivation
results.append(("User Reactivation", self.test_user_reactivation(test_user_id)))
# Test 9: Bulk Operations
results.append(("Bulk Operations", self.test_bulk_operations()))
# Test 10: Admin Protections
results.append(("Admin Protections", self.test_admin_protections()))
# Print Results Summary
print("\n" + "=" * 50)
print("📊 TEST RESULTS SUMMARY")
print("=" * 50)
passed = 0
total = len(results)
for test_name, result in results:
status = "✅ PASS" if result else "❌ FAIL"
print(f"{test_name:<25} {status}")
if result:
passed += 1
print("-" * 50)
print(f"Total Tests: {total}")
print(f"Passed: {passed}")
print(f"Failed: {total - passed}")
print(f"Success Rate: {(passed/total)*100:.1f}%")
if passed == total:
print("\n🎉 ALL TESTS PASSED! User management is working correctly.")
elif passed >= total * 0.8:
print("\n⚠️ Most tests passed, but some issues need attention.")
else:
print("\n❌ Multiple tests failed. User management needs debugging.")
return passed == total
def manual_test_instructions():
"""Print manual testing instructions"""
print("\n" + "=" * 60)
print("📋 MANUAL TESTING INSTRUCTIONS")
print("=" * 60)
print("""
To manually test user management functionalities:
1. 🔐 Login as Admin:
- Go to /login
- Use: admin / admin123
- Verify you can access admin features
2. 👥 Access User Management:
- Go to /users
- Verify you see the user management page
- Check that statistics are displayed correctly
3. Create New User:
- Click "Add New User"
- Fill in: Name, Email, Username, Password, Role
- Submit and verify user appears in list
4. ✏️ Edit User:
- Click dropdown next to any user (not yourself)
- Select "Edit User"
- Change name/email/role and save
- Verify changes appear in users list
5. ⬆️ Promote User:
- Find a staff user in the list
- Click dropdown → "Promote to Admin"
- Confirm the action
- Verify user role changes to Admin
6. ⬇️ Demote User:
- Find an admin user (not yourself)
- Click dropdown → "Demote to Staff"
- Confirm the action
- Verify user role changes to Staff
7. 🚫 Deactivate User:
- Find any user (not yourself)
- Click dropdown → "Deactivate User"
- Confirm the action
- Verify user status changes to Inactive
8. ✅ Reactivate User:
- Find an inactive user
- Click dropdown → "Reactivate User"
- Confirm the action
- Verify user status changes to Active
9. 📦 Bulk Operations:
- Click "Bulk Actions" button
- Select multiple users with checkboxes
- Try "Activate Selected" or "Deactivate Selected"
- Verify changes are applied to all selected users
10. 🛡️ Admin Protection Tests:
- Try to deactivate yourself (should fail with error)
- Try to demote the last admin (should fail with error)
- Verify these protections work as expected
🔍 What to Look For:
- Flash messages appear for success/error states
- Page redirects work correctly after actions
- User list updates to reflect changes
- Protection mechanisms prevent dangerous actions
- Statistics update correctly after changes
- Search and filtering work properly
""")
def quick_setup_guide():
"""Print setup guide for user management"""
print("\n" + "=" * 60)
print("🚀 QUICK SETUP GUIDE")
print("=" * 60)
print("""
If user management functions are not working, check:
1. 📂 File Updates:
- Replace user management routes in app.py
- Update users.html template
- Ensure admin_required decorator is properly implemented
2. 🗄️ Database Check:
- Verify users table exists
- Check that admin user exists with correct role
- Ensure foreign key relationships are set up
3. 🔧 Code Integration:
- Add the enhanced routes to your app.py
- Import required modules (datetime, etc.)
- Ensure session management is working
4. 🎨 Template Updates:
- Replace templates/users.html with enhanced version
- Verify CSS variables are defined in style.css
- Check JavaScript functions are loading
5. ⚙️ Configuration:
- Ensure Flask app has proper secret key
- Database connection is working
- Session configuration is correct
6. 🧪 Testing:
- Start with manual testing first
- Check browser console for JavaScript errors
- Verify network requests in browser dev tools
- Check Flask console for Python errors
Common Issues & Solutions:
- 404 errors: Routes not properly registered
- 500 errors: Database connection or Python syntax issues
- Permission denied: admin_required decorator not working
- JavaScript errors: Check for missing functions in templates
- CSS issues: Verify CSS variables are defined
""")
def run_database_check():
"""Check if database is properly set up for user management"""
print("\n🗄️ DATABASE SETUP CHECK")
print("=" * 40)
try:
import sqlite3
import os
# This is a basic check - adjust based on your database setup
print("✅ Database modules available")
# You could add actual database connectivity tests here
print("📝 To verify your database:")
print(" 1. Check that users table exists")
print(" 2. Verify admin user exists")
print(" 3. Test database connectivity")
print(" 4. Check foreign key constraints")
return True
except Exception as e:
print(f"❌ Database check failed: {e}")
return False
if __name__ == "__main__":
print("🧪 QR Code Management - User Management Tester")
print("=" * 60)
# Check if Flask app is running
tester = UserManagementTester()
try:
# Quick connectivity test
response = tester.session.get(f"{tester.base_url}/")
if response.status_code in [200, 302, 404]: # Any response means server is running
print("✅ Flask application appears to be running")
# Ask user what they want to do
print("\nSelect testing mode:")
print("1. 🤖 Run automated tests")
print("2. 📋 Show manual testing instructions")
print("3. 🚀 Show setup guide")
print("4. 🗄️ Check database setup")
choice = input("\nEnter choice (1-4): ").strip()
if choice == "1":
print("\n🤖 Running automated tests...")
success = tester.run_all_tests()
if not success:
print("\n💡 If tests failed, try the manual testing instructions.")
elif choice == "2":
manual_test_instructions()
elif choice == "3":
quick_setup_guide()
elif choice == "4":
run_database_check()
else:
print("Invalid choice. Showing manual instructions...")
manual_test_instructions()
else:
print("❌ Cannot connect to Flask application")
print("Make sure your app is running on http://localhost:5000")
except Exception as e:
print(f"❌ Connection failed: {e}")
print("\n🔧 Troubleshooting:")
print("1. Make sure Flask app is running: python app.py")
print("2. Check the URL is correct: http://localhost:5000")
print("3. Verify no firewall is blocking the connection")
print("\n📋 Showing manual testing instructions instead...")
manual_test_instructions()