test_database.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import unittest
  2. from pycs import db
  3. from pycs.database.File import File
  4. from pycs.database.Label import Label
  5. from pycs.database.LabelProvider import LabelProvider
  6. from pycs.database.Model import Model
  7. from pycs.database.Project import Project
  8. from pycs.database.Result import Result
  9. from test.base import BaseTestCase
  10. class DatabaseTests(BaseTestCase):
  11. def setUp(self) -> None:
  12. super().setUp(discovery=False)
  13. # insert default models and label_providers
  14. with db.session.begin_nested():
  15. for i, supports in enumerate([["labeled-image", "fit"], ["labeled-bounding-boxes"], ["labeled-bounding-boxes"]], 1):
  16. model = Model.new(
  17. commit=False,
  18. name=f"Model {i}",
  19. description=f"Description for Model {i}",
  20. root_folder=f"modeldir{i}",
  21. )
  22. model.supports = supports
  23. if i > 2:
  24. continue
  25. provider = LabelProvider.new(
  26. commit=False,
  27. name=f"Label Provider {i}",
  28. description=f"Description for Label Provider {i}",
  29. root_folder=f"labeldir{i}",
  30. configuration_file=f"labeldir{i}/configuration.json"
  31. )
  32. # projects
  33. models = Model.query.all()
  34. label_providers = LabelProvider.query.all()
  35. for i, model in enumerate(models, 1):
  36. Project.new(
  37. name=f'Project {i}',
  38. description=f'Project Description {i}',
  39. model=model,
  40. label_provider=label_providers[i-1] if i < 3 else None,
  41. root_folder=f'projectdir{i}',
  42. external_data=i==2,
  43. data_folder=f'datadir{i}',
  44. )
  45. def test_models(self):
  46. models = Model.query.all()
  47. # test length
  48. self.assertEqual(len(models), 3)
  49. # test insert
  50. for i in range(2):
  51. self.assertEqual(models[i].id, i + 1)
  52. self.assertEqual(models[i].name, f'Model {i + 1}')
  53. self.assertEqual(models[i].description, f'Description for Model {i + 1}')
  54. self.assertEqual(models[i].root_folder, f'modeldir{i + 1}')
  55. self.assertEqual(models[0].supports, ['labeled-image', 'fit'])
  56. self.assertEqual(models[1].supports, ['labeled-bounding-boxes'])
  57. # test copy
  58. copy, _ = models[0].copy_to('Copied Model', 'modeldir3')
  59. self.assertEqual(copy.id, 3)
  60. self.assertEqual(copy.name, 'Copied Model')
  61. self.assertEqual(copy.description, 'Description for Model 1')
  62. self.assertEqual(copy.root_folder, 'modeldir3')
  63. self.assertEqual(copy.supports, ['labeled-image', 'fit'])
  64. def test_label_providers(self):
  65. label_providers = LabelProvider.query.all()
  66. # test length
  67. self.assertEqual(len(label_providers), 2)
  68. for i in range(2):
  69. self.assertEqual(label_providers[i].id, i + 1)
  70. self.assertEqual(label_providers[i].name, f'Label Provider {i + 1}')
  71. self.assertEqual(label_providers[i].description, f'Description for Label Provider {i + 1}')
  72. self.assertEqual(label_providers[i].root_folder, f'labeldir{i + 1}')
  73. def test_projects(self):
  74. models = Model.query.all()
  75. label_providers = LabelProvider.query.all()
  76. projects = Project.query.all()
  77. # create projects
  78. for i in range(3):
  79. project = projects[i]
  80. self.assertEqual(project.id, i + 1)
  81. self.assertEqual(project.name, f'Project {i + 1}')
  82. self.assertEqual(project.description, f'Project Description {i + 1}')
  83. self.assertEqual(project.model_id, i + 1)
  84. self.assertEqual(project.model.__dict__, models[i].__dict__)
  85. self.assertEqual(project.label_provider_id, label_providers[i].id if i < 2 else None)
  86. self.assertEqual(
  87. project.label_provider.__dict__ if project.label_provider is not None else None,
  88. label_providers[i].__dict__ if i < 2 else None
  89. )
  90. self.assertEqual(project.root_folder, f'projectdir{i + 1}')
  91. self.assertEqual(project.external_data, i == 1)
  92. self.assertEqual(project.data_folder, f'datadir{i + 1}')
  93. # get projects
  94. self.assertEqual(Project.query.count(), 3)
  95. # remove a project
  96. Project.query.first().remove()
  97. self.assertEqual(Project.query.count(), 2)
  98. self.assertEqual(Project.query.first().name, 'Project 2')
  99. # set properties
  100. project = Project.query.first()
  101. project.set_name('Project 0')
  102. self.assertEqual(Project.query.first().name, 'Project 0')
  103. project.set_description('Description 0')
  104. self.assertEqual(Project.query.first().description, 'Description 0')
  105. def test_no_files_after_project_deletion(self):
  106. project = Project.query.get(1)
  107. for i in range(5):
  108. file, is_new = project.add_file(
  109. uuid=f"some_string{i}",
  110. name=f"some_name{i}",
  111. filename=f"some_filename{i}",
  112. file_type="image",
  113. extension=".jpg",
  114. size=42,
  115. )
  116. self.assertTrue(is_new)
  117. self.assertIsNotNone(file)
  118. self.assertEqual(5, File.query.filter_by(project_id=project.id).count())
  119. project.remove()
  120. self.assertIsNone(Project.query.get(1))
  121. self.assertEqual(0, File.query.filter_by(project_id=project.id).count())
  122. def test_no_labels_after_project_deletion(self):
  123. self.assertEqual(0, Label.query.count())
  124. project = Project.query.get(1)
  125. for i in range(5):
  126. label, is_new = project.create_label(
  127. name=f"label{i}",
  128. reference=f"ref{i}"
  129. )
  130. self.assertTrue(is_new)
  131. self.assertIsNotNone(label)
  132. self.assertEqual(5, Label.query.filter_by(project_id=project.id).count())
  133. project.remove()
  134. self.assertIsNone(Project.query.get(1))
  135. self.assertEqual(0, Label.query.count())
  136. def test_no_results_after_file_deletion(self):
  137. project = Project.query.get(1)
  138. self.assertIsNotNone(project)
  139. file, is_new = project.add_file(
  140. uuid=f"some_string",
  141. name=f"some_name",
  142. filename=f"some_filename",
  143. file_type="image",
  144. extension=".jpg",
  145. size=42,
  146. )
  147. self.assertIsNotNone(file)
  148. for i in range(5):
  149. result = file.create_result(
  150. origin="pipeline",
  151. result_type="bounding_box",
  152. label=None,
  153. )
  154. self.assertEqual(5, Result.query.count())
  155. File.query.filter_by(id=file.id).delete()
  156. self.assertEqual(0, Result.query.count())
  157. if __name__ == '__main__':
  158. unittest.main()