216 lines
6.6 KiB
Python
216 lines
6.6 KiB
Python
"""
|
|
Test script for reordering custom task statuses
|
|
"""
|
|
import requests
|
|
import json
|
|
|
|
# Configuration
|
|
BASE_URL = "http://localhost:8000"
|
|
PROJECT_ID = 1 # Adjust based on your test data
|
|
|
|
# Test credentials (adjust based on your test data)
|
|
LOGIN_EMAIL = "admin@vfx.com"
|
|
LOGIN_PASSWORD = "admin123"
|
|
|
|
|
|
def login():
|
|
"""Login and get access token"""
|
|
response = requests.post(
|
|
f"{BASE_URL}/auth/login",
|
|
json={
|
|
"email": LOGIN_EMAIL,
|
|
"password": LOGIN_PASSWORD
|
|
}
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
return data["access_token"]
|
|
else:
|
|
print(f"Login failed: {response.status_code}")
|
|
print(response.text)
|
|
return None
|
|
|
|
|
|
def get_all_task_statuses(token, project_id):
|
|
"""Get all task statuses for a project"""
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
response = requests.get(
|
|
f"{BASE_URL}/projects/{project_id}/task-statuses",
|
|
headers=headers
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
return response.json()
|
|
else:
|
|
print(f"Failed to get task statuses: {response.status_code}")
|
|
print(response.text)
|
|
return None
|
|
|
|
|
|
def create_custom_status(token, project_id, name, color=None):
|
|
"""Create a custom task status"""
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
data = {"name": name}
|
|
if color:
|
|
data["color"] = color
|
|
|
|
response = requests.post(
|
|
f"{BASE_URL}/projects/{project_id}/task-statuses",
|
|
headers=headers,
|
|
json=data
|
|
)
|
|
|
|
if response.status_code == 201:
|
|
return response.json()
|
|
else:
|
|
print(f"Failed to create status: {response.status_code}")
|
|
print(response.text)
|
|
return None
|
|
|
|
|
|
def reorder_statuses(token, project_id, status_ids):
|
|
"""Reorder custom task statuses"""
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
data = {"status_ids": status_ids}
|
|
|
|
response = requests.patch(
|
|
f"{BASE_URL}/projects/{project_id}/task-statuses/reorder",
|
|
headers=headers,
|
|
json=data
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
return response.json()
|
|
else:
|
|
print(f"Failed to reorder statuses: {response.status_code}")
|
|
print(response.text)
|
|
return None
|
|
|
|
|
|
def main():
|
|
print("=" * 60)
|
|
print("Testing Custom Task Status Reordering")
|
|
print("=" * 60)
|
|
|
|
# Step 1: Login
|
|
print("\n1. Logging in...")
|
|
token = login()
|
|
if not token:
|
|
print("❌ Login failed")
|
|
return
|
|
print("✅ Login successful")
|
|
|
|
# Step 2: Get current statuses
|
|
print(f"\n2. Getting current task statuses for project {PROJECT_ID}...")
|
|
statuses_response = get_all_task_statuses(token, PROJECT_ID)
|
|
if not statuses_response:
|
|
print("❌ Failed to get task statuses")
|
|
return
|
|
|
|
custom_statuses = statuses_response.get("statuses", [])
|
|
print(f"✅ Found {len(custom_statuses)} custom statuses")
|
|
|
|
# If no custom statuses exist, create some for testing
|
|
if len(custom_statuses) < 3:
|
|
print("\n3. Creating test custom statuses...")
|
|
test_statuses = [
|
|
("Review", "#9333EA"),
|
|
("Blocked", "#DC2626"),
|
|
("Ready for Delivery", "#059669")
|
|
]
|
|
|
|
for name, color in test_statuses:
|
|
if len(custom_statuses) >= 3:
|
|
break
|
|
print(f" Creating status: {name}")
|
|
result = create_custom_status(token, PROJECT_ID, name, color)
|
|
if result:
|
|
custom_statuses = result.get("all_statuses", {}).get("statuses", [])
|
|
print(f" ✅ Created: {name}")
|
|
else:
|
|
print(f" ❌ Failed to create: {name}")
|
|
|
|
# Refresh statuses
|
|
statuses_response = get_all_task_statuses(token, PROJECT_ID)
|
|
custom_statuses = statuses_response.get("statuses", [])
|
|
|
|
# Display current order
|
|
print("\n4. Current status order:")
|
|
for idx, status in enumerate(custom_statuses):
|
|
print(f" {idx + 1}. {status['name']} (ID: {status['id']}, Order: {status['order']})")
|
|
|
|
if len(custom_statuses) < 2:
|
|
print("\n⚠️ Need at least 2 custom statuses to test reordering")
|
|
return
|
|
|
|
# Step 3: Test reordering - reverse the order
|
|
print("\n5. Testing reorder (reversing order)...")
|
|
status_ids = [s['id'] for s in custom_statuses]
|
|
reversed_ids = list(reversed(status_ids))
|
|
|
|
print(f" Original order: {status_ids}")
|
|
print(f" New order: {reversed_ids}")
|
|
|
|
result = reorder_statuses(token, PROJECT_ID, reversed_ids)
|
|
if not result:
|
|
print("❌ Reorder failed")
|
|
return
|
|
|
|
print("✅ Reorder successful")
|
|
|
|
# Step 4: Verify the new order
|
|
print("\n6. Verifying new order...")
|
|
statuses_response = get_all_task_statuses(token, PROJECT_ID)
|
|
custom_statuses = statuses_response.get("statuses", [])
|
|
|
|
print(" New status order:")
|
|
for idx, status in enumerate(custom_statuses):
|
|
print(f" {idx + 1}. {status['name']} (ID: {status['id']}, Order: {status['order']})")
|
|
|
|
# Verify order field matches position
|
|
order_correct = all(status['order'] == idx for idx, status in enumerate(custom_statuses))
|
|
if order_correct:
|
|
print("✅ Order field correctly updated")
|
|
else:
|
|
print("❌ Order field mismatch")
|
|
|
|
# Step 5: Test error cases
|
|
print("\n7. Testing error cases...")
|
|
|
|
# Test with missing status ID
|
|
print(" a) Testing with missing status ID...")
|
|
invalid_ids = reversed_ids[:-1] # Remove last ID
|
|
result = reorder_statuses(token, PROJECT_ID, invalid_ids)
|
|
if result is None:
|
|
print(" ✅ Correctly rejected incomplete status list")
|
|
else:
|
|
print(" ❌ Should have rejected incomplete status list")
|
|
|
|
# Test with invalid status ID
|
|
print(" b) Testing with invalid status ID...")
|
|
invalid_ids = reversed_ids.copy()
|
|
invalid_ids[0] = "invalid_id_12345"
|
|
result = reorder_statuses(token, PROJECT_ID, invalid_ids)
|
|
if result is None:
|
|
print(" ✅ Correctly rejected invalid status ID")
|
|
else:
|
|
print(" ❌ Should have rejected invalid status ID")
|
|
|
|
# Test with duplicate status IDs
|
|
print(" c) Testing with duplicate status IDs...")
|
|
duplicate_ids = [reversed_ids[0]] * len(reversed_ids)
|
|
result = reorder_statuses(token, PROJECT_ID, duplicate_ids)
|
|
if result is None:
|
|
print(" ✅ Correctly rejected duplicate status IDs")
|
|
else:
|
|
print(" ❌ Should have rejected duplicate status IDs")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("✅ All tests completed!")
|
|
print("=" * 60)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|