LinkDesk/backend/test_update_status_manual.py

247 lines
8.1 KiB
Python

"""
Manual test script for update custom task status endpoint
Run this with the backend server running
"""
import requests
import json
BASE_URL = "http://localhost:8000"
def print_section(title):
print("\n" + "=" * 80)
print(title)
print("=" * 80)
def login():
"""Login and get token"""
print("\n1. Logging in...")
response = requests.post(
f"{BASE_URL}/auth/login",
json={"email": "admin@vfx.com", "password": "admin123"}
)
if response.status_code == 200:
print("✅ Login successful")
return response.json()["access_token"]
else:
print(f"❌ Login failed: {response.status_code}")
print(response.text)
return None
def create_test_status(token, project_id):
"""Create a test status"""
print("\n2. Creating test status...")
headers = {"Authorization": f"Bearer {token}"}
response = requests.post(
f"{BASE_URL}/projects/{project_id}/task-statuses",
headers=headers,
json={"name": "Test Status", "color": "#FF5733"}
)
if response.status_code == 201:
status = response.json()["status"]
print(f"✅ Created status: {status['name']} (ID: {status['id']})")
return status['id']
else:
print(f"❌ Failed to create status: {response.status_code}")
print(response.text)
return None
def update_status_name(token, project_id, status_id):
"""Test updating status name"""
print("\n3. Testing name update...")
headers = {"Authorization": f"Bearer {token}"}
response = requests.put(
f"{BASE_URL}/projects/{project_id}/task-statuses/{status_id}",
headers=headers,
json={"name": "Updated Test Status"}
)
if response.status_code == 200:
status = response.json()["status"]
print(f"✅ Name updated: {status['name']}")
return True
else:
print(f"❌ Failed to update name: {response.status_code}")
print(response.text)
return False
def update_status_color(token, project_id, status_id):
"""Test updating status color"""
print("\n4. Testing color update...")
headers = {"Authorization": f"Bearer {token}"}
response = requests.put(
f"{BASE_URL}/projects/{project_id}/task-statuses/{status_id}",
headers=headers,
json={"color": "#00FF00"}
)
if response.status_code == 200:
status = response.json()["status"]
print(f"✅ Color updated: {status['color']}")
return True
else:
print(f"❌ Failed to update color: {response.status_code}")
print(response.text)
return False
def update_both(token, project_id, status_id):
"""Test updating both name and color"""
print("\n5. Testing update of both name and color...")
headers = {"Authorization": f"Bearer {token}"}
response = requests.put(
f"{BASE_URL}/projects/{project_id}/task-statuses/{status_id}",
headers=headers,
json={"name": "Final Status", "color": "#0000FF"}
)
if response.status_code == 200:
status = response.json()["status"]
print(f"✅ Both updated - Name: {status['name']}, Color: {status['color']}")
return True
else:
print(f"❌ Failed to update both: {response.status_code}")
print(response.text)
return False
def test_duplicate_name(token, project_id, status_id):
"""Test duplicate name validation"""
print("\n6. Testing duplicate name validation...")
# Create another status
headers = {"Authorization": f"Bearer {token}"}
response = requests.post(
f"{BASE_URL}/projects/{project_id}/task-statuses",
headers=headers,
json={"name": "Another Status"}
)
if response.status_code != 201:
print(f"❌ Failed to create second status")
return False
# Try to update first status with duplicate name
response = requests.put(
f"{BASE_URL}/projects/{project_id}/task-statuses/{status_id}",
headers=headers,
json={"name": "Another Status"}
)
if response.status_code == 409:
print(f"✅ Duplicate name correctly rejected")
return True
else:
print(f"❌ Duplicate name was not rejected: {response.status_code}")
return False
def test_system_name_conflict(token, project_id, status_id):
"""Test system status name conflict"""
print("\n7. Testing system status name conflict...")
headers = {"Authorization": f"Bearer {token}"}
response = requests.put(
f"{BASE_URL}/projects/{project_id}/task-statuses/{status_id}",
headers=headers,
json={"name": "In Progress"}
)
if response.status_code == 409:
print(f"✅ System status name correctly rejected")
return True
else:
print(f"❌ System status name was not rejected: {response.status_code}")
return False
def test_set_default(token, project_id, status_id):
"""Test setting status as default"""
print("\n8. Testing set as default...")
headers = {"Authorization": f"Bearer {token}"}
response = requests.put(
f"{BASE_URL}/projects/{project_id}/task-statuses/{status_id}",
headers=headers,
json={"is_default": True}
)
if response.status_code == 200:
result = response.json()
status = result["status"]
all_statuses = result["all_statuses"]
if status["is_default"] and all_statuses["default_status_id"] == status_id:
# Check only one default
default_count = sum(1 for s in all_statuses["statuses"] if s["is_default"])
if default_count == 1:
print(f"✅ Status set as default, only one default exists")
return True
else:
print(f"❌ Multiple defaults found: {default_count}")
return False
else:
print(f"❌ Status not set as default correctly")
return False
else:
print(f"❌ Failed to set as default: {response.status_code}")
print(response.text)
return False
def main():
print_section("Manual Test for Custom Task Status Update Endpoint")
token = login()
if not token:
return
project_id = 1 # Assuming project 1 exists
# Create test status
status_id = create_test_status(token, project_id)
if not status_id:
return
# Run tests
tests_passed = 0
tests_total = 7
if update_status_name(token, project_id, status_id):
tests_passed += 1
if update_status_color(token, project_id, status_id):
tests_passed += 1
if update_both(token, project_id, status_id):
tests_passed += 1
if test_duplicate_name(token, project_id, status_id):
tests_passed += 1
if test_system_name_conflict(token, project_id, status_id):
tests_passed += 1
if test_set_default(token, project_id, status_id):
tests_passed += 1
# Test non-existent status
print("\n9. Testing non-existent status...")
headers = {"Authorization": f"Bearer {token}"}
response = requests.put(
f"{BASE_URL}/projects/{project_id}/task-statuses/nonexistent",
headers=headers,
json={"name": "Test"}
)
if response.status_code == 404:
print(f"✅ Non-existent status correctly rejected")
tests_passed += 1
else:
print(f"❌ Non-existent status was not rejected: {response.status_code}")
# Summary
print_section("Test Summary")
print(f"\nTests passed: {tests_passed}/{tests_total}")
if tests_passed == tests_total:
print("\n✅ ALL TESTS PASSED!")
print("\nImplementation verified:")
print(" ✅ Status name update (Requirement 2.1)")
print(" ✅ Status color update (Requirement 2.2)")
print(" ✅ Default status management (Requirement 2.3, 5.2)")
print(" ✅ Name uniqueness validation (Requirement 2.4)")
print(" ✅ System status name conflict detection")
print(" ✅ Only one default status at a time")
print(" ✅ Non-existent status handling")
else:
print(f"\n{tests_total - tests_passed} test(s) failed")
if __name__ == "__main__":
main()