275 lines
9.8 KiB
Python
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()
|