Initial Codes

This commit is contained in:
NguyenND
2025-07-29 17:02:08 -04:00
committed by GitHub
parent 946b18f142
commit 7459d0fd15
34 changed files with 23480 additions and 0 deletions
+493
View File
@@ -0,0 +1,493 @@
#!/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()