You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
6.4 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. from django.utils.http import urlencode
  2. from rest_framework import status
  3. from rest_framework.reverse import reverse
  4. from .utils import make_assignment, make_doc, make_example_state
  5. from api.tests.utils import CRUDMixin
  6. from projects.models import ProjectType
  7. from projects.tests.utils import prepare_project
  8. from users.tests.utils import make_user
  9. class TestExampleListAPI(CRUDMixin):
  10. def setUp(self):
  11. self.project = prepare_project(task=ProjectType.DOCUMENT_CLASSIFICATION)
  12. self.non_member = make_user()
  13. self.example = make_doc(self.project.item)
  14. for member in self.project.members:
  15. make_assignment(self.project.item, self.example, member)
  16. self.data = {"text": "example"}
  17. self.url = reverse(viewname="example_list", args=[self.project.item.id])
  18. def test_allows_project_member_to_list_examples(self):
  19. for member in self.project.members:
  20. response = self.assert_fetch(member, status.HTTP_200_OK)
  21. self.assertEqual(response.data["count"], 1)
  22. self.assertIn("results", response.data)
  23. for item in response.data["results"]:
  24. self.assertIn("text", item)
  25. def test_denies_non_project_member_to_list_examples(self):
  26. self.assert_fetch(self.non_member, status.HTTP_403_FORBIDDEN)
  27. def test_denies_unauthenticated_user_to_list_examples(self):
  28. self.assert_fetch(expected=status.HTTP_403_FORBIDDEN)
  29. def test_allows_project_admin_to_create_example(self):
  30. response = self.assert_create(self.project.admin, status.HTTP_201_CREATED)
  31. self.assertEqual(response.data["text"], self.data["text"])
  32. def test_denies_non_admin_to_create_example(self):
  33. for member in self.project.staffs:
  34. self.assert_create(member, status.HTTP_403_FORBIDDEN)
  35. def test_denies_unauthenticated_user_to_create_example(self):
  36. self.assert_create(expected=status.HTTP_403_FORBIDDEN)
  37. def test_example_is_not_approved_if_another_user_approve_it(self):
  38. make_example_state(self.example, self.project.admin)
  39. response = self.assert_fetch(self.project.annotator, status.HTTP_200_OK)
  40. self.assertFalse(response.data["results"][0]["is_confirmed"])
  41. class TestExampleListCollaborative(CRUDMixin):
  42. def setUp(self):
  43. self.project = prepare_project(task=ProjectType.DOCUMENT_CLASSIFICATION, collaborative_annotation=True)
  44. self.example = make_doc(self.project.item)
  45. for member in self.project.members:
  46. make_assignment(self.project.item, self.example, member)
  47. self.url = reverse(viewname="example_list", args=[self.project.item.id])
  48. def test_example_is_approved_if_someone_approve_it(self):
  49. admin = self.project.admin
  50. approver = self.project.approver
  51. make_example_state(self.example, admin)
  52. response = self.assert_fetch(admin, status.HTTP_200_OK)
  53. self.assertTrue(response.data["results"][0]["is_confirmed"])
  54. response = self.assert_fetch(approver, status.HTTP_200_OK)
  55. self.assertTrue(response.data["results"][0]["is_confirmed"])
  56. class TestExampleListFilter(CRUDMixin):
  57. def setUp(self):
  58. self.project = prepare_project(task=ProjectType.DOCUMENT_CLASSIFICATION)
  59. example1 = make_doc(self.project.item)
  60. example2 = make_doc(self.project.item)
  61. example3 = make_doc(self.project.item)
  62. for member in self.project.members:
  63. make_assignment(self.project.item, example1, member)
  64. make_assignment(self.project.item, example2, member)
  65. make_assignment(self.project.item, example3, member)
  66. make_example_state(example1, self.project.admin)
  67. def reverse(self, query_kwargs=None):
  68. base_url = reverse(viewname="example_list", args=[self.project.item.id])
  69. self.url = "{}?{}".format(base_url, urlencode(query_kwargs))
  70. def assert_filter(self, data, user, expected):
  71. self.reverse(query_kwargs=data)
  72. response = self.assert_fetch(user, status.HTTP_200_OK)
  73. self.assertEqual(response.data["count"], expected)
  74. def test_returns_only_approved_examples(self):
  75. user = self.project.admin
  76. self.assert_filter(data={"confirmed": "True"}, user=user, expected=1)
  77. def test_returns_only_non_approved_examples(self):
  78. user = self.project.admin
  79. self.assert_filter(data={"confirmed": "False"}, user=user, expected=2)
  80. def test_returns_all_examples(self):
  81. user = self.project.admin
  82. self.assert_filter(data={"confirmed": ""}, user=user, expected=3)
  83. def test_does_not_return_approved_example_to_another_user(self):
  84. user = self.project.approver
  85. self.assert_filter(data={"confirmed": "True"}, user=user, expected=0)
  86. class TestExampleDetail(CRUDMixin):
  87. def setUp(self):
  88. self.project = prepare_project(task=ProjectType.DOCUMENT_CLASSIFICATION)
  89. self.non_member = make_user()
  90. example = make_doc(self.project.item)
  91. self.data = {"text": "example"}
  92. self.url = reverse(viewname="example_detail", args=[self.project.item.id, example.id])
  93. def test_allows_project_member_to_get_example(self):
  94. for member in self.project.members:
  95. response = self.assert_fetch(member, status.HTTP_200_OK)
  96. self.assertIn("text", response.data)
  97. def test_denies_non_project_member_to_get_example(self):
  98. self.assert_fetch(self.non_member, status.HTTP_403_FORBIDDEN)
  99. def test_denies_unauthenticated_user_to_get_example(self):
  100. self.assert_fetch(expected=status.HTTP_403_FORBIDDEN)
  101. def test_allows_project_admin_to_update_example(self):
  102. response = self.assert_update(self.project.admin, status.HTTP_200_OK)
  103. self.assertEqual(response.data["text"], self.data["text"])
  104. def test_denies_non_admin_to_update_example(self):
  105. for member in self.project.staffs:
  106. self.assert_update(member, status.HTTP_403_FORBIDDEN)
  107. def test_denies_non_project_member_to_update_example(self):
  108. self.assert_update(self.non_member, status.HTTP_403_FORBIDDEN)
  109. def test_allows_project_admin_to_delete_example(self):
  110. self.assert_delete(self.project.admin, status.HTTP_204_NO_CONTENT)
  111. def test_denies_non_admin_to_delete_example(self):
  112. for member in self.project.staffs:
  113. self.assert_delete(member, status.HTTP_403_FORBIDDEN)
  114. def test_denies_non_project_member_to_delete_example(self):
  115. self.assert_delete(self.non_member, status.HTTP_403_FORBIDDEN)