label_tests.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. from flask import url_for
  2. from pycs import db
  3. from pycs.database.Label import Label
  4. from pycs.database.Model import Model
  5. from pycs.database.Project import Project
  6. from tests.base import BaseTestCase
  7. class _BaseLabelTests(BaseTestCase):
  8. def setupModels(self):
  9. model = Model.new(
  10. commit=False,
  11. name="TestModel",
  12. description="Model for a test case",
  13. root_folder="model_folder",
  14. )
  15. model.supports = ["labeled-image"]
  16. model.flush()
  17. self.project = Project.new(
  18. name="test_project",
  19. description="Project for a test case",
  20. model=model,
  21. root_folder="project_folder",
  22. external_data=False,
  23. data_folder="project_folder/data",
  24. )
  25. class LabelCreationTests(_BaseLabelTests):
  26. def setUp(self):
  27. super().setUp()
  28. self.url = url_for("create_label", project_id=self.project.id)
  29. def test_create_labels(self):
  30. self.assertEqual(0, self.project.labels.count())
  31. for i in range(1, 11):
  32. self.post(self.url, json=dict(name=f"Label{i}"))
  33. self.assertEqual(self.project.labels.count(), i)
  34. last_label = Label.query.order_by(Label.id.desc()).first()
  35. self.assertEqual(last_label.name, f"Label{i}")
  36. def test_create_label_with_same_name(self):
  37. self.assertEqual(0, self.project.labels.count())
  38. name = "SameName"
  39. for i in range(1, 11):
  40. self.post(self.url, json=dict(name=name))
  41. self.assertEqual(self.project.labels.count(), i)
  42. last_label = Label.query.order_by(Label.id.desc()).first()
  43. self.assertEqual(last_label.name, name)
  44. def test_create_labels_with_reference(self):
  45. self.assertEqual(0, self.project.labels.count())
  46. for i in range(1, 11):
  47. self.post(self.url, json=dict(name=f"Label{i}", reference=f"label_ref{i}"))
  48. self.assertEqual(self.project.labels.count(), i)
  49. last_label = Label.query.order_by(Label.id.desc()).first()
  50. self.assertEqual(last_label.name, f"Label{i}")
  51. self.assertEqual(last_label.reference, f"label_ref{i}")
  52. def test_create_labels_with_same_reference(self):
  53. self.assertEqual(0, self.project.labels.count())
  54. ref = "same_ref"
  55. self.post(self.url, json=dict(name=f"Label", reference=ref))
  56. last_label = Label.query.order_by(Label.id.desc()).first()
  57. self.assertEqual(last_label.name, f"Label")
  58. self.assertEqual(last_label.reference, ref)
  59. for i in range(2, 11):
  60. self.post(self.url, status_code=400, json=dict(name=f"Label{i}", reference=ref))
  61. self.assertEqual(self.project.labels.count(), 1)
  62. last_label = Label.query.order_by(Label.id.desc()).first()
  63. self.assertEqual(last_label.name, f"Label")
  64. self.assertEqual(last_label.reference, ref)
  65. class LabelRemovalTests(_BaseLabelTests):
  66. def url(self, label_id):
  67. return url_for("remove_label",
  68. project_id=self.project.id, label_id=label_id)
  69. def setupModels(self):
  70. super().setupModels()
  71. self.N = 10
  72. self.labels = []
  73. with db.session.begin_nested():
  74. for i in range(1, self.N+1):
  75. label, is_new = self.project.create_label(
  76. commit=False,
  77. name=f"Label{i}",
  78. reference=f"Label{i}",
  79. )
  80. assert is_new, "labels should be new"
  81. label.flush()
  82. self.labels.append(label)
  83. def test_remove_label_without_flag(self):
  84. self.assertEqual(self.N, self.project.labels.count())
  85. self.post(self.url(self.labels[0].id), status_code=400)
  86. self.assertEqual(self.N, self.project.labels.count())
  87. self.post(self.url(self.labels[0].id), status_code=400, json=dict(remove=False))
  88. self.assertEqual(self.N, self.project.labels.count())
  89. def test_remove_label(self):
  90. self.assertEqual(self.N, self.project.labels.count())
  91. self.post(self.url(self.labels[0].id), json=dict(remove=True))
  92. self.assertEqual(self.N-1, self.project.labels.count())
  93. class LabelTreeRemovalTests(_BaseLabelTests):
  94. def url(self, label_id):
  95. return url_for("remove_label",
  96. project_id=self.project.id, label_id=label_id)
  97. def setupModels(self):
  98. super().setupModels()
  99. self.n_roots = 5
  100. self.leafs_per_root = 3
  101. self.n_leafs = self.n_roots * self.leafs_per_root
  102. self.N = self.n_roots + self.n_leafs
  103. with db.session.begin_nested():
  104. for i in range(1, self.n_roots+1):
  105. root_label, is_new = self.project.create_label(
  106. commit=False,
  107. name=f"Label{i}",
  108. reference=f"Label{i}",
  109. )
  110. root_label.flush()
  111. for j in range(1, self.leafs_per_root+1):
  112. label, is_new = self.project.create_label(
  113. commit=False,
  114. name=f"Label{i}_{j}",
  115. reference=f"Label{i}_{j}",
  116. parent=root_label
  117. )
  118. label.flush()
  119. @property
  120. def root_labels(self):
  121. return self.project.labels.filter(Label.parent_id == None)
  122. @property
  123. def leaf_labels(self):
  124. return self.project.labels.filter(Label.parent_id != None)
  125. def test_remove_root_label(self):
  126. self.assertEqual(self.N, self.project.labels.count())
  127. self.assertEqual(self.n_roots, self.root_labels.count())
  128. self.assertEqual(self.n_leafs, self.leaf_labels.count())
  129. label = self.root_labels.first()
  130. self.post(self.url(label.id), json=dict(remove=True))
  131. self.assertEqual(self.N-1, self.project.labels.count())
  132. self.assertEqual(self.n_roots-1+self.leafs_per_root, self.root_labels.count())
  133. self.assertEqual(self.n_leafs-self.leafs_per_root, self.leaf_labels.count())
  134. def test_remove_leaf_label(self):
  135. self.assertEqual(self.N, self.project.labels.count())
  136. self.assertEqual(self.n_roots, self.root_labels.count())
  137. self.assertEqual(self.n_leafs, self.leaf_labels.count())
  138. label = self.leaf_labels.first()
  139. self.post(self.url(label.id), json=dict(remove=True))
  140. self.assertEqual(self.N-1, self.project.labels.count())
  141. self.assertEqual(self.n_roots, self.root_labels.count())
  142. self.assertEqual(self.n_leafs-1, self.leaf_labels.count())
  143. def test_remove_intermediate_label(self):
  144. self.assertEqual(self.N, self.project.labels.count())
  145. self.assertEqual(self.n_roots, self.root_labels.count())
  146. self.assertEqual(self.n_leafs, self.leaf_labels.count())
  147. label = self.leaf_labels.first()
  148. label_parent = label.parent
  149. new_label, is_new = self.project.create_label(
  150. commit=False,
  151. name="New Label",
  152. reference="new_ref",
  153. parent=label,
  154. )
  155. self.assertTrue(is_new)
  156. self.assertEqual(label.id, new_label.parent_id)
  157. self.assertEqual(self.n_roots, self.root_labels.count())
  158. self.assertEqual(self.n_leafs + 1, self.leaf_labels.count())
  159. self.post(self.url(label.id), json=dict(remove=True))
  160. self.assertEqual(label_parent.id, new_label.parent_id)
  161. self.assertEqual(self.n_roots, self.root_labels.count())
  162. self.assertEqual(self.n_leafs, self.leaf_labels.count())