170 lines
5.5 KiB
Python
170 lines
5.5 KiB
Python
"""
|
|
Test script for project settings API endpoints
|
|
Tests the complete project settings functionality
|
|
"""
|
|
import requests
|
|
import json
|
|
|
|
BASE_URL = "http://localhost:8000"
|
|
|
|
def get_auth_token():
|
|
"""Login and get authentication token"""
|
|
# Login with admin user
|
|
response = requests.post(
|
|
f"{BASE_URL}/auth/login",
|
|
json={
|
|
"email": "admin@vfx.com",
|
|
"password": "admin123"
|
|
}
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
print(f"❌ Login failed: {response.status_code}")
|
|
print(response.text)
|
|
return None
|
|
|
|
return response.json()["access_token"]
|
|
|
|
def test_project_settings():
|
|
"""Test project settings endpoints"""
|
|
print("Logging in...")
|
|
token = get_auth_token()
|
|
if not token:
|
|
return False
|
|
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
print("✓ Logged in successfully")
|
|
|
|
# Get first project
|
|
print("\nGetting projects...")
|
|
response = requests.get(f"{BASE_URL}/projects/", headers=headers)
|
|
if response.status_code != 200:
|
|
print(f"❌ Failed to get projects: {response.status_code}")
|
|
return False
|
|
|
|
projects = response.json()
|
|
if not projects:
|
|
print("❌ No projects found")
|
|
return False
|
|
|
|
project_id = projects[0]["id"]
|
|
print(f"✓ Using project: {projects[0]['name']} (ID: {project_id})")
|
|
|
|
# Test 1: Get project settings (should return defaults)
|
|
print("\n1. Testing GET /projects/{project_id}/settings...")
|
|
response = requests.get(f"{BASE_URL}/projects/{project_id}/settings", headers=headers)
|
|
|
|
if response.status_code != 200:
|
|
print(f"❌ Failed to get settings: {response.status_code}")
|
|
print(response.text)
|
|
return False
|
|
|
|
settings = response.json()
|
|
print("✓ Retrieved project settings:")
|
|
print(json.dumps(settings, indent=2))
|
|
|
|
# Verify default values
|
|
assert "upload_data_location" in settings
|
|
assert "asset_task_templates" in settings
|
|
assert "shot_task_templates" in settings
|
|
assert "enabled_asset_tasks" in settings
|
|
assert "enabled_shot_tasks" in settings
|
|
print("✓ All required fields present")
|
|
|
|
# Test 2: Update project settings
|
|
print("\n2. Testing PUT /projects/{project_id}/settings...")
|
|
new_settings = {
|
|
"upload_data_location": "/mnt/projects/test-project/uploads",
|
|
"asset_task_templates": {
|
|
"characters": ["modeling", "surfacing", "rigging"],
|
|
"props": ["modeling", "surfacing"],
|
|
"sets": ["modeling", "surfacing"],
|
|
"vehicles": ["modeling", "surfacing", "rigging"]
|
|
},
|
|
"shot_task_templates": ["layout", "animation", "lighting", "compositing"],
|
|
"enabled_asset_tasks": {
|
|
"characters": ["modeling", "rigging"],
|
|
"props": ["modeling"]
|
|
},
|
|
"enabled_shot_tasks": ["layout", "animation", "lighting"]
|
|
}
|
|
|
|
response = requests.put(
|
|
f"{BASE_URL}/projects/{project_id}/settings",
|
|
headers=headers,
|
|
json=new_settings
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
print(f"❌ Failed to update settings: {response.status_code}")
|
|
print(response.text)
|
|
return False
|
|
|
|
updated_settings = response.json()
|
|
print("✓ Settings updated successfully:")
|
|
print(json.dumps(updated_settings, indent=2))
|
|
|
|
# Verify updates
|
|
assert updated_settings["upload_data_location"] == "/mnt/projects/test-project/uploads"
|
|
assert len(updated_settings["shot_task_templates"]) == 4
|
|
print("✓ Settings values updated correctly")
|
|
|
|
# Test 3: Verify persistence
|
|
print("\n3. Verifying settings persistence...")
|
|
response = requests.get(f"{BASE_URL}/projects/{project_id}/settings", headers=headers)
|
|
|
|
if response.status_code != 200:
|
|
print(f"❌ Failed to verify settings: {response.status_code}")
|
|
return False
|
|
|
|
verified_settings = response.json()
|
|
assert verified_settings["upload_data_location"] == "/mnt/projects/test-project/uploads"
|
|
assert len(verified_settings["shot_task_templates"]) == 4
|
|
print("✓ Settings persisted correctly")
|
|
|
|
# Test 4: Partial update
|
|
print("\n4. Testing partial update...")
|
|
partial_update = {
|
|
"upload_data_location": "/new/upload/path"
|
|
}
|
|
|
|
response = requests.put(
|
|
f"{BASE_URL}/projects/{project_id}/settings",
|
|
headers=headers,
|
|
json=partial_update
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
print(f"❌ Failed partial update: {response.status_code}")
|
|
print(response.text)
|
|
return False
|
|
|
|
partial_result = response.json()
|
|
assert partial_result["upload_data_location"] == "/new/upload/path"
|
|
# Other settings should remain unchanged
|
|
assert len(partial_result["shot_task_templates"]) == 4
|
|
print("✓ Partial update successful")
|
|
|
|
# Test 5: Invalid project ID
|
|
print("\n5. Testing invalid project ID...")
|
|
response = requests.get(f"{BASE_URL}/projects/99999/settings", headers=headers)
|
|
assert response.status_code == 404
|
|
print("✓ Correctly returns 404 for invalid project")
|
|
|
|
print("\n✅ All tests passed!")
|
|
return True
|
|
|
|
if __name__ == "__main__":
|
|
print("Testing Project Settings API")
|
|
print("=" * 60)
|
|
try:
|
|
success = test_project_settings()
|
|
if not success:
|
|
print("\n❌ Tests failed")
|
|
exit(1)
|
|
except Exception as e:
|
|
print(f"\n❌ Test error: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
exit(1)
|