test_database.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. configuration_file=f"labeldir{i}/configuration.json"
  30. )
  31. # projects
  32. models = list(self.database.models())
  33. label_providers = list(self.database.label_providers())
  34. for i, model in enumerate(models, 1):
  35. self.database.create_project(
  36. name=f'Project {i}',
  37. description=f'Project Description {i}',
  38. model=model,
  39. label_provider=label_providers[i-1] if i < 3 else None,
  40. root_folder=f'projectdir{i}',
  41. external_data=i==2,
  42. data_folder=f'datadir{i}',
  43. )
  44. def test_models(self):
  45. models = list(self.database.models())
  46. # test length
  47. self.assertEqual(len(models), 3)
  48. # test insert
  49. for i in range(2):
  50. self.assertEqual(models[i].id, i + 1)
  51. self.assertEqual(models[i].name, f'Model {i + 1}')
  52. self.assertEqual(models[i].description, f'Description for Model {i + 1}')
  53. self.assertEqual(models[i].root_folder, f'modeldir{i + 1}')
  54. self.assertEqual(models[0].supports, ['labeled-image', 'fit'])
  55. self.assertEqual(models[1].supports, ['labeled-bounding-boxes'])
  56. # test copy
  57. copy, _ = models[0].copy_to('Copied Model', 'modeldir3')
  58. self.assertEqual(copy.id, 3)
  59. self.assertEqual(copy.name, 'Copied Model')
  60. self.assertEqual(copy.description, 'Description for Model 1')
  61. self.assertEqual(copy.root_folder, 'modeldir3')
  62. self.assertEqual(copy.supports, ['labeled-image', 'fit'])
  63. def test_label_providers(self):
  64. label_providers = list(self.database.label_providers())
  65. # test length
  66. self.assertEqual(len(label_providers), 2)
  67. for i in range(2):
  68. self.assertEqual(label_providers[i].id, i + 1)
  69. self.assertEqual(label_providers[i].name, f'Label Provider {i + 1}')
  70. self.assertEqual(label_providers[i].description, f'Description for Label Provider {i + 1}')
  71. self.assertEqual(label_providers[i].root_folder, f'labeldir{i + 1}')
  72. def test_projects(self):
  73. models = list(self.database.models())
  74. label_providers = list(self.database.label_providers())
  75. projects = list(self.database.projects())
  76. # create projects
  77. for i in range(3):
  78. project = projects[i]
  79. self.assertEqual(project.id, i + 1)
  80. self.assertEqual(project.name, f'Project {i + 1}')
  81. self.assertEqual(project.description, f'Project Description {i + 1}')
  82. self.assertEqual(project.model_id, i + 1)
  83. self.assertEqual(project.model.__dict__, models[i].__dict__)
  84. self.assertEqual(project.label_provider_id, label_providers[i].id if i < 2 else None)
  85. self.assertEqual(
  86. project.label_provider.__dict__ if project.label_provider is not None else None,
  87. label_providers[i].__dict__ if i < 2 else None
  88. )
  89. self.assertEqual(project.root_folder, f'projectdir{i + 1}')
  90. self.assertEqual(project.external_data, i == 1)
  91. self.assertEqual(project.data_folder, f'datadir{i + 1}')
  92. # get projects
  93. self.assertEqual(len(list(self.database.projects())), 3)
  94. # remove a project
  95. list(self.database.projects())[0].remove()
  96. projects = list(self.database.projects())
  97. self.assertEqual(len(projects), 2)
  98. self.assertEqual(projects[0].name, 'Project 2')
  99. # set properties
  100. project = list(self.database.projects())[0]
  101. project.set_name('Project 0')
  102. self.assertEqual(list(self.database.projects())[0].name, 'Project 0')
  103. project.set_description('Description 0')
  104. self.assertEqual(list(self.database.projects())[0].description, 'Description 0')
  105. def test_no_files_after_project_deletion(self):
  106. project = self.database.project(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(self.database.project(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 = self.database.project(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(self.database.project(1))
  135. self.assertEqual(0, Label.query.count())
  136. def test_no_results_after_file_deletion(self):
  137. project = self.database.project(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()