# 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")