test_library_folder_archive_scope.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. """Library folder links to archives keep to the caller's printers."""
  2. from __future__ import annotations
  3. import pytest
  4. from httpx import AsyncClient
  5. from backend.tests.integration.test_printer_scope_1727 import _admin_token, _auth, _group, _user
  6. pytestmark = [pytest.mark.asyncio, pytest.mark.integration]
  7. PERMS = ["printers:read", "library:read_all", "library:upload", "library:update_all"]
  8. async def _setup(client: AsyncClient, printer_factory, archive_factory):
  9. a, b = await printer_factory(name="A"), await printer_factory(name="B")
  10. ours = await archive_factory(a.id, print_name="Our print")
  11. theirs = await archive_factory(b.id, print_name="Their print")
  12. token = await _admin_token(client)
  13. admin = _auth(token)
  14. perms = await _group(client, token, "perms", permissions=PERMS)
  15. team = await _group(client, token, "team", printer_ids=[a.id])
  16. member = _auth((await _user(client, token, "member", [perms, team]))[0])
  17. return ours.id, theirs.id, admin, member
  18. def _link(folder: dict) -> tuple:
  19. return folder["archive_id"], folder["archive_name"]
  20. async def test_a_member_links_folders_to_archives_of_their_printers_only(
  21. async_client: AsyncClient, printer_factory, archive_factory
  22. ):
  23. ours, theirs, admin, member = await _setup(async_client, printer_factory, archive_factory)
  24. folder = (await async_client.post("/api/v1/library/folders/", headers=member, json={"name": "f"})).json()
  25. created = await async_client.post(
  26. "/api/v1/library/folders/", headers=member, json={"name": "g", "archive_id": theirs}
  27. )
  28. missing = await async_client.post(
  29. "/api/v1/library/folders/", headers=member, json={"name": "g", "archive_id": 999_999}
  30. )
  31. updated = await async_client.put(
  32. f"/api/v1/library/folders/{folder['id']}", headers=member, json={"archive_id": theirs}
  33. )
  34. linked = await async_client.put(
  35. f"/api/v1/library/folders/{folder['id']}", headers=member, json={"archive_id": ours}
  36. )
  37. assert (
  38. (created.status_code, created.json())
  39. == (missing.status_code, missing.json())
  40. == (
  41. 404,
  42. {"detail": "Archive not found"},
  43. )
  44. )
  45. assert updated.status_code == 404
  46. assert linked.status_code == 200
  47. assert _link(linked.json()) == (ours, "Our print")
  48. async def test_a_member_does_not_see_links_to_archives_of_other_printers(
  49. async_client: AsyncClient, printer_factory, archive_factory
  50. ):
  51. ours, theirs, admin, member = await _setup(async_client, printer_factory, archive_factory)
  52. ids = {}
  53. for name, archive in (("ours", ours), ("theirs", theirs)):
  54. created = await async_client.post(
  55. "/api/v1/library/folders/", headers=admin, json={"name": name, "archive_id": archive, "shared": True}
  56. )
  57. assert created.status_code == 200, created.text
  58. ids[name] = created.json()["id"]
  59. await async_client.put(f"/api/v1/library/folders/{ids[name]}", headers=admin, json={"shared": True})
  60. listed = {f["name"]: _link(f) for f in (await async_client.get("/api/v1/library/folders/", headers=member)).json()}
  61. got = await async_client.get(f"/api/v1/library/folders/{ids['theirs']}", headers=member)
  62. renamed = await async_client.put(
  63. f"/api/v1/library/folders/{ids['theirs']}", headers=member, json={"name": "theirs2"}
  64. )
  65. by_theirs = await async_client.get(f"/api/v1/library/folders/by-archive/{theirs}", headers=member)
  66. by_ours = await async_client.get(f"/api/v1/library/folders/by-archive/{ours}", headers=member)
  67. as_admin = await async_client.get(f"/api/v1/library/folders/{ids['theirs']}", headers=admin)
  68. assert listed == {"ours": (ours, "Our print"), "theirs": (None, None)}
  69. assert _link(got.json()) == (None, None)
  70. assert _link(renamed.json()) == (None, None)
  71. assert by_theirs.json() == []
  72. assert [_link(f) for f in by_ours.json()] == [(ours, "Our print")]
  73. assert _link(as_admin.json()) == (theirs, "Their print")
  74. async def test_linking_a_project_keeps_an_archive_link_the_member_cannot_see(
  75. async_client: AsyncClient, printer_factory, archive_factory
  76. ):
  77. ours, theirs, admin, member = await _setup(async_client, printer_factory, archive_factory)
  78. project = (await async_client.post("/api/v1/projects/", headers=admin, json={"name": "p"})).json()
  79. folders = {}
  80. for name, archive in (("ours", ours), ("theirs", theirs)):
  81. created = await async_client.post(
  82. "/api/v1/library/folders/", headers=admin, json={"name": name, "archive_id": archive}
  83. )
  84. folders[name] = created.json()["id"]
  85. await async_client.put(f"/api/v1/library/folders/{folders[name]}", headers=admin, json={"shared": True})
  86. for folder_id in folders.values():
  87. relinked = await async_client.put(
  88. f"/api/v1/library/folders/{folder_id}",
  89. headers=member,
  90. json={"project_id": project["id"], "archive_id": 0},
  91. )
  92. assert relinked.status_code == 200, relinked.text
  93. links = {
  94. name: (await async_client.get(f"/api/v1/library/folders/{folder_id}", headers=admin)).json()["archive_id"]
  95. for name, folder_id in folders.items()
  96. }
  97. assert links == {"ours": None, "theirs": theirs}