6
0

test_database.py 6.9 KB

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