project_tests.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. from flask import url_for
  2. from pycs.database.Collection import Collection
  3. from pycs.database.File import File
  4. from pycs.database.Label import Label
  5. from pycs.database.Model import Model
  6. from pycs.database.Project import Project
  7. from tests.base import BaseTestCase
  8. class _BaseProjectTests(BaseTestCase):
  9. def setupModels(self):
  10. model = Model.new(
  11. commit=False,
  12. name="TestModel",
  13. description="Model for a test case",
  14. root_folder="models/fixed_model",
  15. )
  16. model.supports = ["labeled-image"]
  17. model.flush()
  18. self.model = model
  19. class ProjectCreationTests(_BaseProjectTests):
  20. def setUp(self):
  21. super().setUp()
  22. self.url = url_for("create_project")
  23. def test_project_creation_without_name(self):
  24. self.assertEqual(0, Project.query.count())
  25. self.post(self.url, json=dict(
  26. # name="Some Project",
  27. description="Some description",
  28. model=self.model.id,
  29. label=None,
  30. external=None,
  31. ),
  32. status_code=400,
  33. )
  34. self.assertEqual(0, Project.query.count())
  35. def test_project_creation_without_description(self):
  36. self.assertEqual(0, Project.query.count())
  37. self.post(self.url, json=dict(
  38. name="Some Project",
  39. # description="Some description",
  40. model=self.model.id,
  41. label=None,
  42. external=None,
  43. ),
  44. status_code=400,
  45. )
  46. self.assertEqual(0, Project.query.count())
  47. def test_project_creation(self):
  48. self.assertEqual(0, Project.query.count())
  49. self.post(self.url, json=dict(
  50. name="Some Project",
  51. description="Some description",
  52. model=self.model.id,
  53. label=None,
  54. external=None,
  55. )
  56. )
  57. self.assertEqual(1, Project.query.count())
  58. project = Project.query.first()
  59. self.assertIsNotNone(project)
  60. self.assertIsNotNone(project.model)
  61. self.assertIsNone(project.label_provider)
  62. class ProjectDeletionTests(_BaseProjectTests):
  63. def setupModels(self):
  64. super().setupModels()
  65. self.project = Project.new(
  66. name="test_project",
  67. description="Project for a test case",
  68. model=self.model,
  69. root_folder="project_folder",
  70. external_data=False,
  71. data_folder="project_folder/data",)
  72. @property
  73. def url(self):
  74. return url_for("remove_project",
  75. project_id=self.project.id)
  76. def test_project_deletion(self):
  77. self.assertEqual(1, Project.query.count())
  78. self.post(self.url, json=dict(remove=True))
  79. self.assertEqual(0, Project.query.count())
  80. def test_project_deletion_without_flag(self):
  81. self.assertEqual(1, Project.query.count())
  82. self.post(self.url, json=dict(), status_code=400)
  83. self.assertEqual(1, Project.query.count())
  84. self.post(self.url, json=dict(remove=False), status_code=400)
  85. self.assertEqual(1, Project.query.count())
  86. def test_project_deletion_with_labels(self):
  87. self.assertEqual(1, Project.query.count())
  88. self.assertEqual(0, Label.query.count())
  89. for i in range(1, 11):
  90. self.project.create_label(name=f"Label_{i}")
  91. self.assertEqual(10, Label.query.count())
  92. self.post(self.url, json=dict(remove=True))
  93. self.assertEqual(0, Project.query.count())
  94. self.assertEqual(0, Label.query.count())
  95. class ProjectListTests(_BaseProjectTests):
  96. def test_list_projects(self):
  97. self.assertEqual(0, Project.query.count())
  98. for i in range(1, 11):
  99. Project.new(
  100. name=f"TestProject{i}",
  101. description=f"Project for a test case #{i}",
  102. model=self.model,
  103. root_folder=f"project_folder{i}",
  104. external_data=False,
  105. data_folder=f"project_folder{i}/data",
  106. )
  107. self.assertEqual(10, Project.query.count())
  108. response = self.get(url_for("list_projects"))
  109. self.assertTrue(response.is_json)
  110. content = response.json
  111. self.assertTrue(10, len(content))
  112. for entry in content:
  113. project = Project.query.get(entry["id"])
  114. self.assertIsNotNone(project)
  115. self.assertDictEqual(entry, project.serialize())
  116. def test_list_project_collections(self):
  117. project = Project.new(
  118. name="TestProject",
  119. description="Project for a test case #",
  120. model=self.model,
  121. root_folder="project_folder",
  122. external_data=False,
  123. data_folder="project_folder/data",
  124. )
  125. self.assertEqual(0, Collection.query.count())
  126. for i in range(1, 11):
  127. project.create_collection(
  128. reference=f"collection_{i}",
  129. name=f"Some collection {i}",
  130. description=f"A description {i}",
  131. position=i,
  132. autoselect=i is 1
  133. )
  134. self.assertEqual(10, Collection.query.count())
  135. response = self.get(url_for("list_collections",
  136. project_id=project.id))
  137. self.assertTrue(response.is_json)
  138. content = response.json
  139. self.assertTrue(10, len(content))
  140. for entry in content:
  141. collection = Collection.query.get(entry["id"])
  142. self.assertIsNotNone(collection)
  143. self.assertDictEqual(entry, collection.serialize())