test_template.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. from uuid import uuid4
  2. from httpx import AsyncClient
  3. import pytest
  4. from sqlalchemy import select
  5. from sqlalchemy.orm import Session
  6. from app.main import app
  7. from app.models import Project, SlotTemplate
  8. from app.tests.conftest import default_slot_id, default_template_id, default_tag_id
  9. async def test_create_template_fail(
  10. client: AsyncClient,
  11. default_user_headers: dict,
  12. session: Session,
  13. default_public_project: Project,
  14. ):
  15. url = app.url_path_for("create_template", project_id=default_public_project.id)
  16. response = await client.post(url, json={"title": "1st template"})
  17. assert response.status_code == 401
  18. response = await client.post(url, json={}, headers=default_user_headers)
  19. assert response.status_code == 422
  20. url = app.url_path_for("create_template", project_id=uuid4())
  21. response = await client.post(url, json={"title": "1st template"}, headers=default_user_headers)
  22. assert response.status_code == 404
  23. @pytest.mark.parametrize(
  24. "payload",
  25. [
  26. {"title": "1st template"},
  27. {"title": "1𝖘ҭ ṥ٥ι𝙪𝓉ìóη", "place": "echo"},
  28. {"title": "1st template", "responsible_contact": "echo"},
  29. {"title": "1st template", "description": "&é'(-è_çecho"},
  30. {"title": "1st template", "place": "3", "description": "&é'(-è_çecho"},
  31. ],
  32. )
  33. async def test_create_template(
  34. client: AsyncClient,
  35. default_user_headers: dict,
  36. session: Session,
  37. default_public_project: Project,
  38. payload: dict,
  39. ):
  40. url = app.url_path_for("create_template", project_id=default_public_project.id)
  41. response = await client.post(url, json=payload, headers=default_user_headers)
  42. assert response.status_code == 200
  43. template = session.get(SlotTemplate, response.json()["id"])
  44. assert template is not None
  45. for k in ["title", "description", "place", "responsible_contact"]:
  46. val = template.__getattribute__(k)
  47. if k in payload:
  48. assert val == payload[k]
  49. else:
  50. assert val == ""
  51. async def test_update_template_fail(
  52. client: AsyncClient,
  53. default_user_headers: dict,
  54. session: Session,
  55. default_public_project: Project,
  56. ):
  57. payload = {"title": "1st template"}
  58. project = session.get(Project, default_public_project.id)
  59. assert project is not None
  60. template_id = project.templates[0].id
  61. url = app.url_path_for(
  62. "update_template", project_id=default_public_project.id, template_id="12"
  63. )
  64. response = await client.post(url, json=payload)
  65. assert response.status_code == 401
  66. response = await client.post(url, json=payload, headers=default_user_headers)
  67. assert response.status_code == 422
  68. url = app.url_path_for(
  69. "update_template", project_id=default_public_project.id, template_id=uuid4()
  70. )
  71. response = await client.post(url, json=payload, headers=default_user_headers)
  72. assert response.status_code == 404
  73. url = app.url_path_for("update_template", project_id=uuid4(), template_id=template_id)
  74. response = await client.post(url, json=payload, headers=default_user_headers)
  75. assert response.status_code == 404
  76. @pytest.mark.parametrize(
  77. "code,payload",
  78. [
  79. (422, {"title": [1.001, 2]}),
  80. (422, {"responsible_contact": {"t": None}}),
  81. (422, {"place": [1, 2]}),
  82. (422, {"tags": ["1", "2"]}),
  83. # (422, {"slots": "1"}),
  84. (400, {"tags": [default_slot_id]}),
  85. ],
  86. )
  87. async def test_update_template_fail_payload_validation(
  88. client: AsyncClient,
  89. default_user_headers: dict,
  90. session: Session,
  91. default_public_project: Project,
  92. payload: dict,
  93. code: int,
  94. ):
  95. url = app.url_path_for(
  96. "update_template", project_id=default_public_project.id, template_id=default_template_id
  97. )
  98. response = await client.post(url, json=payload, headers=default_user_headers)
  99. assert response.status_code == code
  100. @pytest.mark.parametrize(
  101. "payload",
  102. [
  103. {"title": "1st template"},
  104. {"title": "1st template", "place": "echo"},
  105. {"title": "1st template", "responsible_contact": "echo"},
  106. {"title": "1st template", "description": "&é'(-è_çecho"},
  107. {"title": "1st template", "place": "Ḽơᶉëᶆ ȋṕšᶙṁ", "description": "&é'(-è_çecho"},
  108. {"title": "1st template", "place": "3", "description": "&é'(-è_çecho"},
  109. ],
  110. )
  111. async def test_update_template(
  112. client: AsyncClient,
  113. default_user_headers: dict,
  114. session: Session,
  115. default_public_project: Project,
  116. payload: dict,
  117. ):
  118. url = app.url_path_for(
  119. "update_template", project_id=default_public_project.id, template_id=default_template_id
  120. )
  121. response = await client.post(url, json=payload, headers=default_user_headers)
  122. assert response.status_code == 200
  123. template = session.get(SlotTemplate, default_template_id)
  124. assert template is not None
  125. for k in ["title", "description", "place", "responsible_contact"]:
  126. val = template.__getattribute__(k)
  127. if k in payload:
  128. assert val == payload[k]
  129. else:
  130. assert val == ""
  131. async def test_update_template_lists(
  132. client: AsyncClient,
  133. default_user_headers: dict,
  134. session: Session,
  135. default_public_project: Project,
  136. ):
  137. url = app.url_path_for(
  138. "update_template", project_id=default_public_project.id, template_id=default_template_id
  139. )
  140. payload = {"tags": [default_tag_id]}
  141. response = await client.post(url, json=payload, headers=default_user_headers)
  142. assert response.status_code == 200
  143. template = session.get(SlotTemplate, default_template_id)
  144. assert template is not None
  145. assert len(template.tags) == 1
  146. assert template.tags[0].id == default_tag_id
  147. response = await client.post(url, json={"tags": []}, headers=default_user_headers)
  148. assert response.status_code == 200
  149. session.refresh(template)
  150. assert len(template.tags) == 0
  151. async def test_delete_template_fail(
  152. client: AsyncClient,
  153. default_user_headers: dict,
  154. session: Session,
  155. default_public_project: Project,
  156. ):
  157. # Proper deletion
  158. project_id = default_public_project.id
  159. # no authent
  160. url = app.url_path_for(
  161. "delete_template", project_id=project_id, template_id=default_template_id
  162. )
  163. response = await client.delete(url)
  164. assert response.status_code == 401
  165. # invalid tag
  166. url = app.url_path_for("delete_template", project_id=project_id, template_id="default_tag_id")
  167. response = await client.delete(url, headers=default_user_headers)
  168. assert response.status_code == 422
  169. # invalid project_id
  170. url = app.url_path_for("delete_template", project_id="ded", template_id=default_template_id)
  171. response = await client.delete(url, headers=default_user_headers)
  172. assert response.status_code == 422
  173. async def test_delete_template(
  174. client: AsyncClient,
  175. default_user_headers: dict,
  176. session: Session,
  177. default_public_project: Project,
  178. ):
  179. # Proper deletion
  180. url = app.url_path_for(
  181. "delete_template", project_id=default_public_project.id, template_id=default_template_id
  182. )
  183. response = await client.delete(url, headers=default_user_headers)
  184. assert response.status_code == 200
  185. result = session.execute(select(SlotTemplate).where(SlotTemplate.id == default_tag_id))
  186. slot = result.scalars().first()
  187. assert slot is None
  188. # can delete random uuid
  189. url = app.url_path_for("delete_tag", project_id=default_public_project.id, tag_id=uuid4())
  190. response = await client.delete(url, headers=default_user_headers)
  191. assert response.status_code == 200