blob: 6916f83af3d4daaa72c71d1b3e2ad53d63484317 [file]
import uuid
from typing import Any, Dict, Tuple
import pytest
from django.test import AsyncClient
from trackingserver_auth.models import User
from trackingserver_projects.schema import ProjectIn, ProjectUpdate, Visibility
async def _setup_sample_project(
async_client: AsyncClient, username
) -> Tuple[int, str, Dict[str, Any]]:
user_loaded = await User.objects.aget(email=username)
project_name = str(uuid.uuid4())
project_to_create = ProjectIn(
name=project_name,
description="test project",
tags={"key": "value"},
visibility=Visibility(
user_ids_visible=[],
team_ids_visible=[],
team_ids_writable=[],
user_ids_writable=[user_loaded.id],
),
)
post_response = await async_client.post(
"/api/v1/projects",
data=project_to_create.dict(),
content_type="application/json",
headers={"test_username": username},
)
assert post_response.status_code == 200, post_response.content
post_response_data = post_response.json()
assert post_response_data["name"] == project_name
assert post_response_data["description"] == "test project"
assert post_response_data["tags"] == {"key": "value"}
return post_response_data["id"], post_response_data["name"], post_response_data
@pytest.mark.asyncio
async def test_create_and_get_project(async_client: AsyncClient, db):
username = "user_individual@no_team.com"
post_response_id, project_name, post_response_data = await _setup_sample_project(
async_client, username
)
get_response = await async_client.get(
f"/api/v1/projects/{post_response_id}", headers={"test_username": username}
)
assert get_response.status_code == 200, get_response.content
get_response_data = get_response.json()
assert get_response_data["name"] == project_name
assert get_response_data["description"] == "test project"
assert get_response_data["tags"] == {"key": "value"}
assert get_response_data["id"] == post_response_id
get_response = await async_client.get(
f"/api/v1/projects/{post_response_id}", headers={"test_username": username}
)
assert get_response.status_code == 200, get_response.content
get_response_data = get_response.json()
assert get_response_data["name"] == project_name
assert get_response_data["description"] == "test project"
assert get_response_data["tags"] == {"key": "value"}
assert get_response_data["id"] == post_response_id
@pytest.mark.asyncio
async def test_create_and_get_all_projects(async_client: AsyncClient, db):
username = "user_individual@no_team.com"
post_response_id, project_name, post_response_data = await _setup_sample_project(
async_client, username
)
get_response = await async_client.get(
"/api/v1/projects", headers={"test_username": username}, data={"offset": 0, "limit": 100}
)
ids_returned = [item["id"] for item in get_response.json()]
assert post_response_id in ids_returned
assert get_response.status_code == 200
@pytest.mark.asyncio
async def test_create_then_update_project(async_client: AsyncClient, db):
user_with_no_team = "user_individual@no_team.com"
user_loaded = await User.objects.aget(email=user_with_no_team)
user_to_share_with = "user_1_team_1@team1.com"
user_to_share_with_loaded = await User.objects.aget(email=user_to_share_with)
username = "user_individual@no_team.com"
post_response_id, project_name, post_response_data = await _setup_sample_project(
async_client, username
)
# Update the project
# We're going to update description, tags, and visibility
project_to_update = ProjectUpdate(
description="new description",
tags={"key": "new value"},
visibility=Visibility(
user_ids_visible=[user_to_share_with_loaded.id],
team_ids_visible=[],
user_ids_writable=[user_loaded.id],
team_ids_writable=[],
),
)
put_response = await async_client.put(
f"/api/v1/projects/{post_response_id}",
data={"project": project_to_update.dict(exclude_unset=True)},
content_type="application/json",
headers={"test_username": user_with_no_team},
)
assert put_response.status_code == 200
put_response_data = put_response.json()
assert put_response_data["name"] == project_name
assert put_response_data["description"] == project_to_update.description
assert put_response_data["tags"] == project_to_update.tags
assert put_response_data["id"] == post_response_id
get_response = await async_client.get(
f"/api/v1/projects/{post_response_id}", headers={"test_username": user_with_no_team}
)
assert get_response.status_code == 200
get_response_data = get_response.json()
assert get_response_data["name"] == project_name
assert get_response_data["description"] == project_to_update.description
assert get_response_data["tags"] == project_to_update.tags
assert get_response_data["id"] == post_response_id