Init Repo
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
"""
|
||||
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()
|
||||
Reference in New Issue
Block a user