73 lines
2.6 KiB
Python
Raw Normal View History

import pytest
from httpx import AsyncClient, ASGITransport
from fastapi import status
from mywebdav.main import app
from mywebdav.models import User, Folder, File, Share
from mywebdav.auth import get_password_hash
import secrets
from datetime import datetime, timedelta
@pytest.mark.asyncio
async def test_share_subfolder_navigation():
# 1. Setup: User, Parent Folder, Subfolder, File in Subfolder
user = await User.create(
username="shareuser",
email="share@example.com",
hashed_password=get_password_hash("testpass"),
is_active=True
)
parent_folder = await Folder.create(name="parent", owner=user)
subfolder = await Folder.create(name="subfolder", parent=parent_folder, owner=user)
file_in_sub = await File.create(
name="deep_file.txt",
path="parent/subfolder/deep_file.txt",
size=10,
mime_type="text/plain",
file_hash="hash",
owner=user,
parent=subfolder
)
# 2. Create Share for Parent Folder
token = secrets.token_urlsafe(16)
share = await Share.create(
token=token,
folder=parent_folder,
owner=user,
permission_level="viewer"
)
async with AsyncClient(transport=ASGITransport(app=app), base_url="http://test") as client:
# 3. Access Share Root
resp = await client.post(f"/shares/{token}/access")
assert resp.status_code == 200
data = resp.json()
assert data["type"] == "folder"
assert data["folder"]["id"] == parent_folder.id
# Should see subfolder
assert any(f["id"] == subfolder.id for f in data["folders"])
# 4. Try to Access Subfolder (Expecting this to fail or return root currently)
# We'll try passing subfolder_id as a query param, which is a common pattern
resp_sub = await client.post(f"/shares/{token}/access?subfolder_id={subfolder.id}")
# If the feature is missing, this might just ignore the param and return root,
# or fail if the param isn't expected.
# We WANT it to return the subfolder content.
assert resp_sub.status_code == 200
sub_data = resp_sub.json()
# This assertion will fail if the feature is not implemented (it will likely return parent folder again)
assert sub_data["folder"]["id"] == subfolder.id
# Should see the file inside
assert any(f["id"] == file_in_sub.id for f in sub_data["files"])
# Cleanup
await file_in_sub.delete()
await subfolder.delete()
await share.delete()
await parent_folder.delete()
await user.delete()