# retoor import time from datetime import datetime, timezone import pytest import requests from devplacepy.database import get_table, refresh_snapshot from tests.conftest import BASE_URL JSON = {"Accept": "application/json"} _counter = [0] def _unique(prefix="wsi"): _counter[0] += 1 return f"{prefix}{int(time.time() * 1000)}{_counter[0]}" def _member(): name = _unique() session = requests.Session() session.post( f"{BASE_URL}/auth/signup", data={ "username": name, "email": f"{name}@t.dev", "password": "secret123", "confirm_password": "secret123", "birth_date": "1990-01-01", "accept_terms": "1", }, allow_redirects=True, ) refresh_snapshot() return session, name, get_table("users").find_one(username=name) def _project(session, title, private=False): data = { "title": title, "description": f"Description of {title}.", "project_type": "software", "status": "In Development", } if private: data["is_private"] = "on" response = session.post(f"{BASE_URL}/projects/create", data=data, headers=JSON) assert response.status_code == 200, response.text refresh_snapshot() return get_table("projects").find_one(slug=response.json()["data"]["slug"]) def _publish(project, owner_uid): uid = _unique("wsuid") slug = _unique("wsslug") get_table("instances").insert( { "deleted_at": None, "deleted_by": None, "uid": uid, "project_uid": project["uid"], "owner_uid": owner_uid, "name": f"workspace {slug}", "slug": slug, "ingress_slug": slug, "status": "running", "desired_state": "running", "created_at": datetime.now(timezone.utc).isoformat(), } ) refresh_snapshot() return uid, slug @pytest.fixture(scope="module") def published(app_server): session, name, user = _member() public = _project(session, f"Public {name}") private = _project(session, f"Private {name}", private=True) public_uid, public_slug = _publish(public, user["uid"]) private_uid, private_slug = _publish(private, user["uid"]) yield { "session": session, "user": user, "public": {"project": public, "uid": public_uid, "slug": public_slug}, "private": {"project": private, "uid": private_uid, "slug": private_slug}, } instances = get_table("instances") instances.delete(uid=public_uid) instances.delete(uid=private_uid) def _entries(session=None, key=None): headers = dict(JSON) if key: headers["X-API-KEY"] = key caller = session or requests response = caller.get(f"{BASE_URL}/workspaces/index", headers=headers) assert response.status_code == 200, response.text return {entry["slug"]: entry for entry in response.json()["workspaces"]} def test_the_index_is_public_and_lists_every_published_workspace(published): entries = _entries() assert published["public"]["slug"] in entries assert published["private"]["slug"] in entries def test_each_row_exposes_its_uid_and_owner_uid_field(published): entries = _entries() row = entries[published["public"]["slug"]] assert row["uid"] == published["public"]["uid"] assert "owner_uid" in row def test_a_private_projects_description_and_url_are_withheld_from_a_guest(published): entries = _entries() public_row = entries[published["public"]["slug"]] private_row = entries[published["private"]["slug"]] assert public_row["description"] == published["public"]["project"]["description"] assert public_row["project_url"] == f"/projects/{published['public']['project']['slug']}" assert private_row["description"] == "" assert private_row["project_url"] == "" def test_the_owner_still_sees_their_private_projects_fields(published): entries = _entries(key=published["user"]["api_key"]) private_row = entries[published["private"]["slug"]] assert private_row["description"] == published["private"]["project"]["description"] assert ( private_row["project_url"] == f"/projects/{published['private']['project']['slug']}" ) def test_a_stranger_is_treated_like_a_guest(published): stranger, _, user = _member() entries = _entries(session=stranger, key=user["api_key"]) assert entries[published["private"]["slug"]]["description"] == "" assert entries[published["private"]["slug"]]["project_url"] == "" def test_the_table_carries_a_report_control_column(published): reporter, _, _ = _member() html = reporter.get(f"{BASE_URL}/workspaces/index").text assert 'Report' in html assert 'data-report-type="workspace"' in html assert f'data-report-uid="{published["public"]["uid"]}"' in html assert "css/admin.css" in html assert 'class="admin-table"' in html