aboutsummaryrefslogtreecommitdiff
path: root/app/tests/test_backends_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/tests/test_backends_common.py')
-rw-r--r--app/tests/test_backends_common.py120
1 files changed, 120 insertions, 0 deletions
diff --git a/app/tests/test_backends_common.py b/app/tests/test_backends_common.py
index 5bc967a..a94994b 100644
--- a/app/tests/test_backends_common.py
+++ b/app/tests/test_backends_common.py
@@ -73,6 +73,126 @@ class GitCloneTests(unittest.TestCase):
self.assertEqual(run.call_args[1]["emit"], emit)
+class GitUpdateTests(unittest.TestCase):
+ """git_update: fetch, then hard reset to origin's default branch."""
+
+ def _patched(self, fetch_rc=0, branch="main"):
+ """Patch run_console_subprocess (fetch/reset) and the branch probe."""
+ run = mock.patch.object(common, "run_console_subprocess",
+ return_value=fetch_rc).start()
+ mock.patch.object(common, "_origin_default_branch",
+ return_value=branch).start()
+ return run
+
+ def tearDown(self):
+ mock.patch.stopall()
+
+ def test_fetch_then_hard_reset_to_origin_head(self):
+ run = self._patched()
+ self.assertEqual(common.git_update(common.Path("/co")), 0)
+ self.assertEqual(
+ run.call_args_list[0][0][0],
+ ["git", "-C", "/co", "fetch", "origin"])
+ self.assertEqual(
+ run.call_args_list[1][0][0],
+ ["git", "-C", "/co", "reset", "--hard", "origin/main"])
+
+ def test_streaming_adds_progress_and_passes_emit(self):
+ emit = lambda line: None # noqa: E731
+ run = self._patched()
+ self.assertEqual(common.git_update(common.Path("/co"), emit=emit), 0)
+ self.assertEqual(
+ run.call_args_list[0][0][0],
+ ["git", "-C", "/co", "fetch", "--progress", "origin"])
+ self.assertEqual(run.call_args_list[0][1]["emit"], emit)
+ self.assertEqual(run.call_args_list[1][1]["emit"], emit)
+
+ def test_fetch_failure_short_circuits_the_reset(self):
+ run = self._patched(fetch_rc=128)
+ self.assertEqual(common.git_update(common.Path("/co")), 128)
+ self.assertEqual(run.call_count, 1)
+
+ def test_reset_uses_the_remote_default_branch(self):
+ run = self._patched(branch="trunk")
+ self.assertEqual(common.git_update(common.Path("/co")), 0)
+ self.assertEqual(
+ run.call_args_list[1][0][0],
+ ["git", "-C", "/co", "reset", "--hard", "origin/trunk"])
+
+
+class OriginDefaultBranchTests(unittest.TestCase):
+ def test_symbolic_ref_name_is_returned(self):
+ proc = mock.Mock(returncode=0,
+ stdout=b"refs/remotes/origin/master\n")
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=proc):
+ self.assertEqual(common._origin_default_branch(
+ common.Path("/co")), "master")
+
+ def test_missing_ref_falls_back_to_main(self):
+ proc = mock.Mock(returncode=128, stdout=b"")
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=proc):
+ self.assertEqual(common._origin_default_branch(
+ common.Path("/co")), "main")
+
+ def test_unstartable_probe_falls_back_to_main(self):
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=None):
+ self.assertEqual(common._origin_default_branch(
+ common.Path("/co")), "main")
+
+
+class GitHeadTests(unittest.TestCase):
+ def test_head_sha_is_returned(self):
+ proc = mock.Mock(returncode=0, stdout=b"abc123\n")
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=proc) as run:
+ self.assertEqual(common.git_head(common.Path("/co")), "abc123")
+ self.assertEqual(run.call_args[0][0],
+ ["git", "-C", "/co", "rev-parse", "HEAD"])
+
+ def test_not_a_repo_yields_none(self):
+ proc = mock.Mock(returncode=128, stdout=b"")
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=proc):
+ self.assertIsNone(common.git_head(common.Path("/co")))
+
+ def test_unstartable_probe_yields_none(self):
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=None):
+ self.assertIsNone(common.git_head(common.Path("/co")))
+
+
+class GitCommitTimeTests(unittest.TestCase):
+ def test_committer_time_is_parsed(self):
+ proc = mock.Mock(returncode=0, stdout=b"1756300000\n")
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=proc) as run:
+ self.assertEqual(common.git_commit_time(common.Path("/co")),
+ 1756300000)
+ self.assertEqual(run.call_args[0][0],
+ ["git", "-C", "/co", "show", "-s",
+ "--format=%ct", "HEAD"])
+
+ def test_not_a_repo_yields_none(self):
+ proc = mock.Mock(returncode=128, stdout=b"")
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=proc):
+ self.assertIsNone(common.git_commit_time(common.Path("/co")))
+
+ def test_unparsable_output_yields_none(self):
+ proc = mock.Mock(returncode=0, stdout=b"not-a-number\n")
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=proc):
+ self.assertIsNone(common.git_commit_time(common.Path("/co")))
+
+ def test_unstartable_probe_yields_none(self):
+ with mock.patch.object(common, "run_console_subprocess_quiet",
+ return_value=None):
+ self.assertIsNone(common.git_commit_time(common.Path("/co")))
+
+
class ParseRequestOptionsTests(unittest.TestCase):
"""parse_request_options: the shared --option / TUI-field parser."""