"""Tests for update_verify.""" from __future__ import annotations import tempfile import unittest from pathlib import Path from unittest.mock import patch from app.services.update_verify import ( requirements_changed, run_smoke_test, wheelhouse_covers_requirements, ) class UpdateVerifyTests(unittest.TestCase): def setUp(self) -> None: self._tmp = tempfile.mkdtemp(prefix="wesp-verify-") self.root = Path(self._tmp) self.req = self.root / "requirements.txt" self.wheels = self.root / "vendor" / "wheels" self.wheels.mkdir(parents=True) self.req.write_text("Flask==2.3.3\n", encoding="utf-8") def tearDown(self) -> None: import shutil shutil.rmtree(self._tmp, ignore_errors=True) def test_requirements_changed(self) -> None: old = self.root / "old.txt" new = self.root / "new.txt" old.write_text("a\n", encoding="utf-8") new.write_text("a\n", encoding="utf-8") self.assertFalse(requirements_changed(old, new)) new.write_text("b\n", encoding="utf-8") self.assertTrue(requirements_changed(old, new)) def test_wheelhouse_covers_ok(self) -> None: (self.wheels / "flask-2.3.3-py3-none-any.whl").write_bytes(b"x") ok, missing = wheelhouse_covers_requirements(self.req, self.wheels) self.assertTrue(ok) self.assertEqual(missing, []) def test_wheelhouse_missing(self) -> None: ok, missing = wheelhouse_covers_requirements(self.req, self.wheels) self.assertFalse(ok) self.assertTrue(missing) def test_wheelhouse_uses_prod_not_dev_requirements(self) -> None: """requirements.txt с -r и pytest не ломает OTA-проверку wheelhouse.""" (self.root / "requirements.txt").write_text( "-r requirements-prod.txt\npytest>=8.0.0,<9\n", encoding="utf-8", ) (self.root / "requirements-prod.txt").write_text("Flask==2.3.3\n", encoding="utf-8") (self.wheels / "flask-2.3.3-py3-none-any.whl").write_bytes(b"x") ok, missing = wheelhouse_covers_requirements(self.root / "requirements.txt", self.wheels) self.assertTrue(ok, missing) self.assertEqual(missing, []) @patch("app.services.update_verify.subprocess.run") def test_smoke_test_ok(self, mock_run) -> None: mock_run.return_value = unittest.mock.Mock(returncode=0, stdout="", stderr="") ok, msg = run_smoke_test(self.root) self.assertTrue(ok) @patch("app.services.update_verify.subprocess.run") def test_smoke_test_fail(self, mock_run) -> None: mock_run.return_value = unittest.mock.Mock(returncode=1, stdout="", stderr="boom") ok, msg = run_smoke_test(self.root) self.assertFalse(ok) self.assertIn("boom", msg) if __name__ == "__main__": unittest.main()