test_database.py 7.0 KB

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