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.

142 lines
4.5 KiB

2 years ago
  1. import abc
  2. from django.test import TestCase
  3. from model_mommy import mommy
  4. from api.models import SEQUENCE_LABELING, Span
  5. from .api.utils import prepare_project
  6. class TestSpanAnnotation(abc.ABC, TestCase):
  7. overlapping = False
  8. collaborative = False
  9. @classmethod
  10. def setUpTestData(cls):
  11. cls.project = prepare_project(
  12. SEQUENCE_LABELING,
  13. allow_overlapping=cls.overlapping,
  14. collaborative_annotation=cls.collaborative
  15. )
  16. cls.example = mommy.make('Example', project=cls.project.item)
  17. cls.label_type = mommy.make('SpanType', project=cls.project.item)
  18. users = cls.project.users
  19. cls.user = users[0]
  20. cls.another_user = users[1]
  21. cls.span = Span(
  22. example=cls.example,
  23. label=cls.label_type,
  24. user=cls.user,
  25. start_offset=0,
  26. end_offset=5
  27. )
  28. def test_can_annotate_span_to_unannotated_data(self):
  29. can_annotate = Span.objects.can_annotate(self.span, self.project.item)
  30. self.assertTrue(can_annotate)
  31. class NonCollaborativeMixin:
  32. def test_allow_another_user_to_annotate_same_span(self):
  33. mommy.make(
  34. 'Span',
  35. example=self.example,
  36. label=self.label_type,
  37. user=self.another_user,
  38. start_offset=self.span.start_offset,
  39. end_offset=self.span.end_offset
  40. )
  41. can_annotate = Span.objects.can_annotate(self.span, self.project.item)
  42. self.assertTrue(can_annotate)
  43. class TestNonOverlappingSpanAnnotation(TestSpanAnnotation, NonCollaborativeMixin):
  44. overlapping = False
  45. collaborative = False
  46. def test_cannot_annotate_same_span_to_annotated_data(self):
  47. mommy.make(
  48. 'Span',
  49. example=self.example,
  50. label=self.label_type,
  51. user=self.user,
  52. start_offset=self.span.start_offset,
  53. end_offset=self.span.end_offset,
  54. )
  55. can_annotate = Span.objects.can_annotate(self.span, self.project.item)
  56. self.assertFalse(can_annotate)
  57. def test_cannot_annotate_different_span_type_to_annotated_data(self):
  58. mommy.make(
  59. 'Span',
  60. example=self.example,
  61. user=self.user,
  62. start_offset=self.span.start_offset,
  63. end_offset=self.span.end_offset
  64. )
  65. can_annotate = Span.objects.can_annotate(self.span, self.project.item)
  66. self.assertFalse(can_annotate)
  67. class TestOverlappingSpanAnnotation(TestSpanAnnotation, NonCollaborativeMixin):
  68. overlapping = True
  69. collaborative = False
  70. def test_can_annotate_same_span_to_annotated_data(self):
  71. mommy.make(
  72. 'Span',
  73. example=self.example,
  74. label=self.label_type,
  75. user=self.user,
  76. start_offset=self.span.start_offset,
  77. end_offset=self.span.end_offset,
  78. )
  79. can_annotate = Span.objects.can_annotate(self.span, self.project.item)
  80. self.assertTrue(can_annotate)
  81. class TestCollaborativeNonOverlappingSpanAnnotation(TestSpanAnnotation):
  82. overlapping = False
  83. collaborative = True
  84. def test_deny_another_user_to_annotate_same_span_type(self):
  85. mommy.make(
  86. 'Span',
  87. example=self.example,
  88. label=self.label_type,
  89. user=self.another_user,
  90. start_offset=self.span.start_offset,
  91. end_offset=self.span.end_offset
  92. )
  93. can_annotate = Span.objects.can_annotate(self.span, self.project.item)
  94. self.assertFalse(can_annotate)
  95. def test_deny_another_user_to_annotate_different_span_type(self):
  96. mommy.make(
  97. 'Span',
  98. example=self.example,
  99. user=self.another_user,
  100. start_offset=self.span.start_offset,
  101. end_offset=self.span.end_offset
  102. )
  103. can_annotate = Span.objects.can_annotate(self.span, self.project.item)
  104. self.assertFalse(can_annotate)
  105. class TestCollaborativeOverlappingSpanAnnotation(TestSpanAnnotation):
  106. overlapping = True
  107. collaborative = True
  108. def test_allow_another_user_to_annotate_same_span(self):
  109. mommy.make(
  110. 'Span',
  111. example=self.example,
  112. label=self.label_type,
  113. user=self.another_user,
  114. start_offset=self.span.start_offset,
  115. end_offset=self.span.end_offset
  116. )
  117. can_annotate = Span.objects.can_annotate(self.span, self.project.item)
  118. self.assertTrue(can_annotate)