fix: repair all test fixtures - add missing solution fields and fix httpx API

- Add missing `solution` field to solution-type nodes in test tree structures
  (required by `can_publish_tree` validation for published trees)
- Fix `AsyncClient(app=...)` → `ASGITransport(app=...)` in test_save_session_as_tree
  (httpx deprecated the `app` parameter in favor of transport)
- All 189 tests now pass (was 84 passed, 1 failed)

Files fixed: conftest.py, test_permissions_account.py, test_subscription_limits.py,
test_trees.py, test_save_session_as_tree.py

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chihlasm
2026-02-08 14:21:29 -05:00
parent b97596d286
commit a027e683e3
5 changed files with 25 additions and 16 deletions

View File

@@ -174,13 +174,15 @@ async def test_tree(client, auth_headers):
"id": "solution1",
"type": "solution",
"title": "Test Confirmed",
"description": "This is a test tree"
"description": "This is a test tree",
"solution": "Test confirmed - this is a test tree"
},
{
"id": "solution2",
"type": "solution",
"title": "Not a Test",
"description": "This should not happen"
"description": "This should not happen",
"solution": "Not a test - this should not happen"
}
]
}

View File

@@ -39,7 +39,7 @@ class TestAccountPermissions:
# Try to create tree
response = await client.post("/api/v1/trees", json={
"name": "Viewer Tree",
"tree_structure": {"id": "root", "type": "solution", "title": "Test", "description": "Test"}
"tree_structure": {"id": "root", "type": "solution", "title": "Test", "description": "Test", "solution": "Test solution"}
}, headers=viewer_headers)
assert response.status_code == 403
@@ -53,7 +53,7 @@ class TestAccountPermissions:
# Create a public tree as the regular user first
await client.post("/api/v1/trees", json={
"name": "Public Tree",
"tree_structure": {"id": "root", "type": "solution", "title": "T", "description": "T"},
"tree_structure": {"id": "root", "type": "solution", "title": "T", "description": "T", "solution": "Test solution"},
"is_public": True
}, headers=auth_headers)
@@ -119,7 +119,7 @@ class TestAccountPermissions:
# Engineer creates a tree
tree_resp = await client.post("/api/v1/trees", json={
"name": "Engineer's Tree",
"tree_structure": {"id": "root", "type": "solution", "title": "T", "description": "T"}
"tree_structure": {"id": "root", "type": "solution", "title": "T", "description": "T", "solution": "Test solution"}
}, headers=eng_headers)
assert tree_resp.status_code == 201
tree_id = tree_resp.json()["id"]
@@ -143,7 +143,7 @@ class TestAccountPermissions:
# Owner creates a private tree
tree_resp = await client.post("/api/v1/trees", json={
"name": "Private Account Tree",
"tree_structure": {"id": "root", "type": "solution", "title": "T", "description": "T"},
"tree_structure": {"id": "root", "type": "solution", "title": "T", "description": "T", "solution": "Test solution"},
"is_public": False
}, headers=auth_headers)
assert tree_resp.status_code == 201
@@ -181,7 +181,7 @@ class TestAccountPermissions:
# Owner creates a private tree
tree_resp = await client.post("/api/v1/trees", json={
"name": "Secret Tree",
"tree_structure": {"id": "root", "type": "solution", "title": "T", "description": "T"},
"tree_structure": {"id": "root", "type": "solution", "title": "T", "description": "T", "solution": "Test solution"},
"is_public": False
}, headers=auth_headers)
assert tree_resp.status_code == 201

View File

@@ -362,8 +362,8 @@ class TestSaveSessionAsTreeAPI:
await test_db.refresh(session)
# Try to save the session as test_user (should fail - filtered by user_id)
from httpx import AsyncClient
async with AsyncClient(app=client._transport.app, base_url="http://test") as test_client: # type: ignore
from httpx import AsyncClient, ASGITransport
async with AsyncClient(transport=ASGITransport(app=client._transport.app), base_url="http://test") as test_client: # type: ignore
# Login as test_user
login_response = await test_client.post(
"/api/v1/auth/login",

View File

@@ -18,7 +18,8 @@ class TestSubscriptionLimits:
"id": "root",
"type": "solution",
"title": "Test",
"description": "Test tree"
"description": "Test tree",
"solution": "Test solution"
}
}
@@ -50,7 +51,8 @@ class TestSubscriptionLimits:
"id": "root",
"type": "solution",
"title": "Test",
"description": "Test"
"description": "Test",
"solution": "Test solution"
}
}
create_resp = await client.post("/api/v1/trees", json=tree_data, headers=auth_headers)
@@ -73,7 +75,8 @@ class TestSubscriptionLimits:
"id": "root",
"type": "solution",
"title": "Test",
"description": "Test tree"
"description": "Test tree",
"solution": "Test solution"
},
"is_default": True # Default trees skip limit check
}

View File

@@ -38,7 +38,8 @@ class TestTrees:
"id": "check_cable",
"type": "solution",
"title": "Check Network Cable",
"description": "Verify the network cable is connected"
"description": "Verify the network cable is connected",
"solution": "Check and reseat the network cable"
}
]
}
@@ -189,7 +190,8 @@ class TestTrees:
"id": "root",
"type": "solution",
"title": "Private",
"description": "Private tree"
"description": "Private tree",
"solution": "Private solution"
},
"is_public": False,
"is_default": False
@@ -220,7 +222,8 @@ class TestTrees:
"id": "root",
"type": "solution",
"title": "Test",
"description": "Test tree"
"description": "Test tree",
"solution": "Test solution"
}
}
create_resp = await client.post("/api/v1/trees", json=tree_data, headers=auth_headers)
@@ -337,7 +340,8 @@ class TestTrees:
"id": "root",
"type": "solution",
"title": "Test",
"description": "Test tree"
"description": "Test tree",
"solution": "Test solution"
}
response = await client.post("/api/v1/trees", json=tree_data, headers=auth_headers)
assert response.status_code == 201