test_template.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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, Slot, 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. {"title": "1st template", "comment": "55"},
  32. ],
  33. )
  34. async def test_create_template(
  35. client: AsyncClient,
  36. default_user_headers: dict,
  37. session: Session,
  38. default_public_project: Project,
  39. payload: dict,
  40. ):
  41. url = app.url_path_for("create_template", project_id=default_public_project.id)
  42. response = await client.post(url, json=payload, headers=default_user_headers)
  43. assert response.status_code == 200
  44. template = session.get(SlotTemplate, response.json()["id"])
  45. assert template is not None
  46. for k in ["title", "description", "place", "responsible_contact"]:
  47. val = template.__getattribute__(k)
  48. if k in payload:
  49. assert val == payload[k]
  50. else:
  51. assert val == ""
  52. async def test_update_template_fail(
  53. client: AsyncClient,
  54. default_user_headers: dict,
  55. session: Session,
  56. default_public_project: Project,
  57. ):
  58. payload = {"title": "1st template"}
  59. project = session.get(Project, default_public_project.id)
  60. assert project is not None
  61. template_id = project.templates[0].id
  62. url = app.url_path_for(
  63. "update_template", project_id=default_public_project.id, template_id="12"
  64. )
  65. response = await client.post(url, json=payload)
  66. assert response.status_code == 401
  67. response = await client.post(url, json=payload, headers=default_user_headers)
  68. assert response.status_code == 422
  69. url = app.url_path_for(
  70. "update_template", project_id=default_public_project.id, template_id=uuid4()
  71. )
  72. response = await client.post(url, json=payload, headers=default_user_headers)
  73. assert response.status_code == 404
  74. url = app.url_path_for("update_template", project_id=uuid4(), template_id=template_id)
  75. response = await client.post(url, json=payload, headers=default_user_headers)
  76. assert response.status_code == 404
  77. @pytest.mark.parametrize(
  78. "code,payload",
  79. [
  80. (422, {"title": [1.001, 2]}),
  81. (422, {"responsible_contact": {"t": None}}),
  82. (422, {"place": [1, 2]}),
  83. (422, {"tags": ["1", "2"]}),
  84. # (422, {"slots": "1"}),
  85. (400, {"tags": [default_slot_id]}),
  86. (422, {"comment": 1235}),
  87. ],
  88. )
  89. async def test_update_template_fail_payload_validation(
  90. client: AsyncClient,
  91. default_user_headers: dict,
  92. session: Session,
  93. default_public_project: Project,
  94. payload: dict,
  95. code: int,
  96. ):
  97. url = app.url_path_for(
  98. "update_template",
  99. project_id=default_public_project.id,
  100. template_id=default_template_id,
  101. )
  102. response = await client.post(url, json=payload, headers=default_user_headers)
  103. assert response.status_code == code
  104. @pytest.mark.parametrize(
  105. "payload",
  106. [
  107. {"title": "1st template"},
  108. {"title": "1st template", "place": "echo"},
  109. {"title": "1st template", "responsible_contact": "echo"},
  110. {"title": "1st template", "description": "&é'(-è_çecho"},
  111. {
  112. "title": "1st template",
  113. "place": "Ḽơᶉëᶆ ȋṕšᶙṁ",
  114. "description": "&é'(-è_çecho",
  115. },
  116. {"title": "1st template", "place": "3", "description": "&é'(-è_çecho"},
  117. {"title": "1st template", "comment": "&é'(-è_çecho"},
  118. ],
  119. )
  120. async def test_update_template(
  121. client: AsyncClient,
  122. default_user_headers: dict,
  123. session: Session,
  124. default_public_project: Project,
  125. payload: dict,
  126. ):
  127. url = app.url_path_for(
  128. "update_template",
  129. project_id=default_public_project.id,
  130. template_id=default_template_id,
  131. )
  132. response = await client.post(url, json=payload, headers=default_user_headers)
  133. assert response.status_code == 200
  134. template = session.get(SlotTemplate, default_template_id)
  135. assert template is not None
  136. for k in ["title", "description", "place", "responsible_contact", "comment"]:
  137. val = template.__getattribute__(k)
  138. if k in payload:
  139. assert val == payload[k]
  140. else:
  141. assert val == ""
  142. async def test_update_template_lists(
  143. client: AsyncClient,
  144. default_user_headers: dict,
  145. session: Session,
  146. default_public_project: Project,
  147. ):
  148. url = app.url_path_for(
  149. "update_template",
  150. project_id=default_public_project.id,
  151. template_id=default_template_id,
  152. )
  153. payload = {"tags": [default_tag_id]}
  154. response = await client.post(url, json=payload, headers=default_user_headers)
  155. assert response.status_code == 200
  156. template = session.get(SlotTemplate, default_template_id)
  157. assert template is not None
  158. assert len(template.tags) == 1
  159. assert template.tags[0].id == default_tag_id
  160. response = await client.post(url, json={"tags": []}, headers=default_user_headers)
  161. assert response.status_code == 200
  162. session.refresh(template)
  163. assert len(template.tags) == 0
  164. async def test_delete_template_fail(
  165. client: AsyncClient,
  166. default_user_headers: dict,
  167. session: Session,
  168. default_public_project: Project,
  169. ):
  170. # Proper deletion
  171. project_id = default_public_project.id
  172. # no authent
  173. url = app.url_path_for(
  174. "delete_template", project_id=project_id, template_id=default_template_id
  175. )
  176. response = await client.delete(url)
  177. assert response.status_code == 401
  178. # invalid tag
  179. url = app.url_path_for("delete_template", project_id=project_id, template_id="default_tag_id")
  180. response = await client.delete(url, headers=default_user_headers)
  181. assert response.status_code == 422
  182. # invalid project_id
  183. url = app.url_path_for("delete_template", project_id="ded", template_id=default_template_id)
  184. response = await client.delete(url, headers=default_user_headers)
  185. assert response.status_code == 422
  186. async def test_delete_template(
  187. client: AsyncClient,
  188. default_user_headers: dict,
  189. session: Session,
  190. default_public_project: Project,
  191. ):
  192. # Proper deletion
  193. url = app.url_path_for(
  194. "delete_template",
  195. project_id=default_public_project.id,
  196. template_id=default_template_id,
  197. )
  198. response = await client.delete(url, headers=default_user_headers)
  199. assert response.status_code == 200
  200. result = session.execute(select(SlotTemplate).where(SlotTemplate.id == default_tag_id))
  201. slot = result.scalars().first()
  202. assert slot is None
  203. # can delete random uuid
  204. url = app.url_path_for("delete_tag", project_id=default_public_project.id, tag_id=uuid4())
  205. response = await client.delete(url, headers=default_user_headers)
  206. assert response.status_code == 200
  207. async def test_delete_template_not_slot(
  208. client: AsyncClient,
  209. default_user_headers: dict,
  210. session: Session,
  211. default_public_project: Project,
  212. ):
  213. # Proper deletion
  214. url = app.url_path_for(
  215. "delete_template",
  216. project_id=default_public_project.id,
  217. template_id=default_template_id,
  218. )
  219. slot = session.get(Slot, default_slot_id)
  220. assert slot is not None
  221. slot.template_id = default_template_id
  222. session.commit()
  223. response = await client.delete(url, headers=default_user_headers)
  224. assert response.status_code == 200
  225. slot = session.get(Slot, default_slot_id)
  226. assert slot is not None