LinkDesk/backend/test_default_asset_tasks.py

275 lines
9.8 KiB
Python

#!/usr/bin/env python3
"""
Test script for default asset task creation functionality.
Tests Requirements: 17.1, 17.2, 17.3, 17.4, 17.5, 17.6, 17.7
"""
import requests
import json
# Configuration
BASE_URL = "http://localhost:8000"
LOGIN_URL = f"{BASE_URL}/auth/login"
ASSETS_URL = f"{BASE_URL}/assets/"
TASKS_URL = f"{BASE_URL}/tasks/"
def test_default_asset_tasks():
print("Testing Default Asset Task Creation")
print("=" * 60)
# Login first
print("\n1. Logging in as coordinator...")
login_data = {
"email": "admin@vfx.com",
"password": "admin123"
}
response = requests.post(LOGIN_URL, json=login_data)
if response.status_code != 200:
print(f"❌ Login failed: {response.status_code}")
print(response.text)
return
token_data = response.json()
token = token_data["access_token"]
headers = {"Authorization": f"Bearer {token}"}
print("✅ Login successful")
# Get projects
print("\n2. Getting projects...")
projects_response = requests.get(f"{BASE_URL}/projects/", headers=headers)
if projects_response.status_code != 200:
print(f"❌ Failed to get projects: {projects_response.status_code}")
return
projects = projects_response.json()
if not projects:
print("❌ No projects found")
return
project_id = projects[0]["id"]
print(f"✅ Using project ID: {project_id}")
# Test 1: Get default tasks for each category (Requirement 17.1, 17.2)
print("\n3. Testing default task templates for each category...")
categories = ["characters", "props", "sets", "vehicles"]
expected_tasks = {
"characters": ["modeling", "surfacing", "rigging"],
"props": ["modeling", "surfacing"],
"sets": ["modeling", "surfacing"],
"vehicles": ["modeling", "surfacing", "rigging"]
}
for category in categories:
response = requests.get(
f"{ASSETS_URL}default-tasks/{category}",
params={"project_id": project_id},
headers=headers
)
if response.status_code == 200:
tasks = response.json()
expected = expected_tasks[category]
if set(tasks[:len(expected)]) == set(expected):
print(f"{category.capitalize()}: {tasks}")
else:
print(f"{category.capitalize()}: Expected {expected}, got {tasks}")
else:
print(f"❌ Failed to get default tasks for {category}: {response.status_code}")
# Test 2: Create asset with default tasks (Requirement 17.1, 17.4, 17.6)
print("\n4. Creating character asset with default tasks...")
import time
timestamp = int(time.time())
asset_data = {
"name": f"Test Character Hero {timestamp}",
"category": "characters",
"description": "Test character for default task creation",
"status": "not_started",
"create_default_tasks": True
}
response = requests.post(
f"{ASSETS_URL}?project_id={project_id}",
json=asset_data,
headers=headers
)
if response.status_code == 201:
asset = response.json()
asset_id = asset["id"]
task_count = asset.get("task_count", 0)
print(f"✅ Asset created with ID: {asset_id}")
print(f" Task count: {task_count}")
if task_count == 3: # Characters should have 3 tasks
print("✅ Correct number of default tasks created")
else:
print(f"❌ Expected 3 tasks, got {task_count}")
else:
print(f"❌ Failed to create asset: {response.status_code}")
print(response.text)
return
# Test 3: Verify tasks were created with correct naming (Requirement 17.6)
print("\n5. Verifying created tasks...")
response = requests.get(
f"{ASSETS_URL}{asset_id}/task-status",
headers=headers
)
if response.status_code == 200:
task_details = response.json()
print(f"✅ Found {len(task_details)} tasks for asset")
expected_task_types = ["modeling", "surfacing", "rigging"]
found_task_types = [task["task_type"] for task in task_details]
# Get full task details to verify naming
for task_info in task_details:
task_id = task_info["task_id"]
task_response = requests.get(f"{TASKS_URL}{task_id}", headers=headers)
if task_response.status_code == 200:
task = task_response.json()
print(f" - {task['name']} ({task['task_type']}) - Status: {task['status']}")
# Verify naming convention (Requirement 17.6)
expected_name = f"{asset_data['name']} - {task['task_type'].title()}"
if task['name'] == expected_name:
print(f" ✅ Correct naming convention")
else:
print(f" ❌ Expected name: {expected_name}, got: {task['name']}")
# Verify unassigned (Requirement 17.7)
if task.get('assigned_user_id') is None:
print(f" ✅ Task is unassigned")
else:
print(f" ❌ Task should be unassigned")
if set(found_task_types) == set(expected_task_types):
print("✅ All expected task types created")
else:
print(f"❌ Expected {expected_task_types}, got {found_task_types}")
else:
print(f"❌ Failed to get tasks: {response.status_code}")
# Test 4: Create asset with custom task selection (Requirement 17.3, 17.5)
print("\n6. Creating prop asset with custom task selection...")
timestamp = int(time.time())
asset_data = {
"name": f"Test Prop Sword {timestamp}",
"category": "props",
"description": "Test prop with custom task selection",
"status": "not_started",
"create_default_tasks": True,
"selected_task_types": ["modeling"] # Only modeling, skip surfacing
}
response = requests.post(
f"{ASSETS_URL}?project_id={project_id}",
json=asset_data,
headers=headers
)
if response.status_code == 201:
asset = response.json()
asset_id = asset["id"]
task_count = asset.get("task_count", 0)
print(f"✅ Asset created with ID: {asset_id}")
print(f" Task count: {task_count}")
if task_count == 1: # Only modeling task
print("✅ Custom task selection works correctly")
else:
print(f"❌ Expected 1 task, got {task_count}")
# Verify only modeling task was created
response = requests.get(
f"{ASSETS_URL}{asset_id}/task-status",
headers=headers
)
if response.status_code == 200:
task_details = response.json()
if len(task_details) == 1 and task_details[0]["task_type"] == "modeling":
print("✅ Only selected task type was created")
else:
print(f"❌ Expected only modeling task, got: {[t['task_type'] for t in task_details]}")
else:
print(f"❌ Failed to create asset: {response.status_code}")
print(response.text)
# Test 5: Create asset without default tasks
print("\n7. Creating asset without default tasks...")
timestamp = int(time.time())
asset_data = {
"name": f"Test Set Environment {timestamp}",
"category": "sets",
"description": "Test set without default tasks",
"status": "not_started",
"create_default_tasks": False
}
response = requests.post(
f"{ASSETS_URL}?project_id={project_id}",
json=asset_data,
headers=headers
)
if response.status_code == 201:
asset = response.json()
asset_id = asset["id"]
task_count = asset.get("task_count", 0)
print(f"✅ Asset created with ID: {asset_id}")
print(f" Task count: {task_count}")
if task_count == 0:
print("✅ No tasks created when create_default_tasks is False")
else:
print(f"❌ Expected 0 tasks, got {task_count}")
else:
print(f"❌ Failed to create asset: {response.status_code}")
print(response.text)
# Test 6: Verify different categories have correct default tasks
print("\n8. Testing default tasks for vehicle category...")
timestamp = int(time.time())
asset_data = {
"name": f"Test Vehicle Spaceship {timestamp}",
"category": "vehicles",
"description": "Test vehicle with default tasks",
"status": "not_started",
"create_default_tasks": True
}
response = requests.post(
f"{ASSETS_URL}?project_id={project_id}",
json=asset_data,
headers=headers
)
if response.status_code == 201:
asset = response.json()
task_count = asset.get("task_count", 0)
if task_count == 3: # Vehicles should have modeling, surfacing, rigging
print("✅ Vehicle category has correct default tasks (3)")
else:
print(f"❌ Expected 3 tasks for vehicle, got {task_count}")
else:
print(f"❌ Failed to create vehicle asset: {response.status_code}")
print("\n" + "=" * 60)
print("✅ All default asset task creation tests completed!")
print("\nRequirements tested:")
print(" ✅ 17.1 - Automatic task generation based on asset category")
print(" ✅ 17.2 - Default task templates for each category")
print(" ✅ 17.3 - Customizable task creation options")
print(" ✅ 17.4 - Default task naming conventions")
print(" ✅ 17.5 - API endpoint for retrieving default tasks")
print(" ✅ 17.6 - Proper task naming")
print(" ✅ 17.7 - Unassigned task creation")
if __name__ == "__main__":
test_default_asset_tasks()