| # Copyright (C) 2026 The Android Open Source Project | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """Unittests for subcmds/cherry_pick.py.""" | |
| from unittest import mock | |
| import pytest | |
| from error import GitError | |
| from git_command import GitCommand | |
| from subcmds import cherry_pick | |
| def test_resolve_reference_uses_one_typed_batch_request( | |
| monkeypatch: pytest.MonkeyPatch, | |
| ) -> None: | |
| oid = "1" * 40 | |
| commit = "tree " + "2" * 40 + "\n\nSubject 🚀\n\nBody\n" | |
| output = oid + " commit " + str(len(commit.encode("utf-8"))) + "\n" | |
| output += commit + "\n" | |
| command = mock.create_autospec(GitCommand, instance=True) | |
| command.stdout = output | |
| command.stderr = "" | |
| command.Wait.return_value = 0 | |
| run_git = mock.create_autospec(GitCommand, return_value=command) | |
| monkeypatch.setattr(cherry_pick, "GitCommand", run_git) | |
| resolved, contents = cherry_pick.CherryPick()._ResolveReference("topic") | |
| assert resolved == oid | |
| assert contents == commit | |
| run_git.assert_called_once_with( | |
| None, | |
| ["cat-file", "--batch"], | |
| input="topic^{commit}\n", | |
| capture_stdout=True, | |
| capture_stderr=True, | |
| verify_command=True, | |
| ) | |
| def test_resolve_reference_rejects_missing_object( | |
| monkeypatch: pytest.MonkeyPatch, | |
| ) -> None: | |
| command = mock.create_autospec(GitCommand, instance=True) | |
| command.stdout = "topic^{commit} missing\n" | |
| command.stderr = "" | |
| command.Wait.return_value = 0 | |
| monkeypatch.setattr( | |
| cherry_pick, | |
| "GitCommand", | |
| mock.create_autospec(GitCommand, return_value=command), | |
| ) | |
| with pytest.raises(GitError, match="commit topic not found"): | |
| cherry_pick.CherryPick()._ResolveReference("topic") | |
| def test_resolve_reference_rejects_ambiguous_object( | |
| monkeypatch: pytest.MonkeyPatch, | |
| ) -> None: | |
| command = mock.create_autospec(GitCommand, instance=True) | |
| command.stdout = "topic^{commit} ambiguous\n" | |
| command.stderr = "" | |
| command.Wait.return_value = 0 | |
| monkeypatch.setattr( | |
| cherry_pick, | |
| "GitCommand", | |
| mock.create_autospec(GitCommand, return_value=command), | |
| ) | |
| with pytest.raises(GitError, match="commit topic not found"): | |
| cherry_pick.CherryPick()._ResolveReference("topic") |