pipeline_tests.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import eventlet
  2. import tempfile
  3. import uuid
  4. from flask import url_for
  5. from pathlib import Path
  6. from pycs.database.Model import Model
  7. from pycs.database.Project import Project
  8. from tests.base import BaseTestCase
  9. from tests.base import pаtch_tpool_execute
  10. class PipelineTests(BaseTestCase):
  11. _sleep_time = .2
  12. def setupModels(self):
  13. super().setupModels()
  14. Model.discover("tests/client/test_models")
  15. self.model = Model.query.one()
  16. self.project = Project.new(
  17. name="test_project",
  18. description="Project for a test case",
  19. model=self.model,
  20. root_folder="project_folder",
  21. external_data=False,
  22. data_folder="project_folder/data",
  23. )
  24. root = Path(self.project.root_folder)
  25. data_root = Path(self.project.data_folder)
  26. for folder in [data_root, root / "temp"]:
  27. folder.mkdir(exist_ok=True, parents=True)
  28. file_uuid = str(uuid.uuid1())
  29. self.file, is_new = self.project.add_file(
  30. uuid=file_uuid,
  31. file_type="image",
  32. name="name",
  33. filename="image",
  34. extension=".jpg",
  35. size=32*1024,
  36. )
  37. self.assertTrue(is_new)
  38. with open(self.file.absolute_path, "wb") as f:
  39. f.write(b"some content")
  40. def tearDown(self):
  41. self.wait_for_bg_jobs()
  42. self.project.delete()
  43. super().tearDown()
  44. def test_predict_file_busy(self):
  45. url = url_for("predict_file", file_id=self.file.id)
  46. self.post(url, json=dict(predict=True))
  47. self.post(url, json=dict(predict=True), status_code=400)
  48. def test_predict_file_errors(self):
  49. self.post(url_for("predict_file", file_id=4242),
  50. status_code=404)
  51. url = url_for("predict_file", file_id=self.file.id)
  52. for data in [None, dict(), dict(predict=False)]:
  53. self.post(url, status_code=400, json=data)
  54. def test_predict_file(self):
  55. url = url_for("predict_file", file_id=self.file.id)
  56. self.assertEqual(0, self.file.results.count())
  57. self.post(url, json=dict(predict=True))
  58. self.wait_for_bg_jobs()
  59. self.assertEqual(1, self.file.results.count())
  60. def test_predict_file_multiple_times(self):
  61. url = url_for("predict_file", file_id=self.file.id)
  62. self.assertEqual(0, self.file.results.count())
  63. self.post(url, json=dict(predict=True))
  64. self.wait_for_bg_jobs()
  65. self.assertEqual(1, self.file.results.count())
  66. self.post(url, json=dict(predict=True))
  67. self.wait_for_bg_jobs()
  68. self.assertEqual(1, self.file.results.count())
  69. def test_predict_model_errors(self):
  70. self.post(url_for("predict_model", project_id=4242),
  71. status_code=404)
  72. url = url_for("predict_model", project_id=self.project.id)
  73. for data in [None, dict(), dict(predict=False), dict(predict=True), dict(predict="not new or all")]:
  74. self.post(url, status_code=400, json=data)
  75. def test_predict_model_busy(self):
  76. url = url_for("predict_model", project_id=self.project.id)
  77. self.post(url, json=dict(predict="new"))
  78. self.post(url, json=dict(predict="new"), status_code=400)
  79. def test_predict_model_for_new(self):
  80. url = url_for("predict_model", project_id=self.project.id)
  81. self.post(url, json=dict(predict="new"))
  82. def test_predict_model_for_all(self):
  83. url = url_for("predict_model", project_id=self.project.id)
  84. self.post(url, json=dict(predict="all"))
  85. def test_model_fit_errors(self):
  86. self.post(url_for("fit_model", project_id=4242),
  87. status_code=404)
  88. url = url_for("fit_model", project_id=self.project.id)
  89. for data in [None, dict(), dict(fit=False)]:
  90. self.post(url, status_code=400, json=data)
  91. def test_model_fit_busy(self):
  92. url = url_for("fit_model", project_id=self.project.id)
  93. self.post(url, json=dict(fit=True))
  94. self.post(url, json=dict(fit=True), status_code=400)
  95. def test_model_fit(self):
  96. url = url_for("fit_model", project_id=self.project.id)
  97. self.post(url, json=dict(fit=True))