diff options
Diffstat (limited to 'app/tests/test_backends_common.py')
| -rw-r--r-- | app/tests/test_backends_common.py | 120 |
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.""" |
