#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for git helper functions."""


import os
import subprocess
import tempfile
import unittest
import unittest.mock as mock

import git


# These are unittests; protected access is OK to a point.
# pylint: disable=protected-access


class HelperFunctionsTest(unittest.TestCase):
    """Test class for updating LLVM hashes of packages."""

    @mock.patch.object(os.path, "isdir", return_value=False)
    def testFailedToCreateBranchForInvalidDirectoryPath(self, mock_isdir):
        path_to_repo = "/invalid/path/to/repo"
        branch = "branch-name"

        # Verify the exception is raised when provided an invalid directory path.
        with self.assertRaises(ValueError) as err:
            git.CreateBranch(path_to_repo, branch)

        self.assertEqual(
            str(err.exception),
            "Invalid directory path provided: %s" % path_to_repo,
        )

        mock_isdir.assert_called_once()

    @mock.patch.object(os.path, "isdir", return_value=True)
    @mock.patch.object(subprocess, "check_output", return_value=None)
    def testSuccessfullyCreatedBranch(self, mock_command_output, mock_isdir):
        path_to_repo = "/path/to/repo"
        branch = "branch-name"

        git.CreateBranch(path_to_repo, branch)

        mock_isdir.assert_called_once_with(path_to_repo)

        self.assertEqual(mock_command_output.call_count, 2)

    @mock.patch.object(os.path, "isdir", return_value=False)
    def testFailedToDeleteBranchForInvalidDirectoryPath(self, mock_isdir):
        path_to_repo = "/invalid/path/to/repo"
        branch = "branch-name"

        # Verify the exception is raised on an invalid repo path.
        with self.assertRaises(ValueError) as err:
            git.DeleteBranch(path_to_repo, branch)

        self.assertEqual(
            str(err.exception),
            "Invalid directory path provided: %s" % path_to_repo,
        )

        mock_isdir.assert_called_once()

    @mock.patch.object(os.path, "isdir", return_value=True)
    @mock.patch.object(subprocess, "check_output", return_value=None)
    def testSuccessfullyDeletedBranch(self, mock_command_output, mock_isdir):
        path_to_repo = "/valid/path/to/repo"
        branch = "branch-name"

        git.DeleteBranch(path_to_repo, branch)

        mock_isdir.assert_called_once_with(path_to_repo)

        self.assertEqual(mock_command_output.call_count, 3)

    @mock.patch.object(os.path, "isdir", return_value=False)
    def testFailedToUploadChangesForInvalidDirectoryPath(self, mock_isdir):
        path_to_repo = "/some/path/to/repo"
        branch = "update-LLVM_NEXT_HASH-a123testhash3"
        commit_messages = ["Test message"]

        # Verify exception is raised when on an invalid repo path.
        with self.assertRaises(ValueError) as err:
            git.UploadChanges(path_to_repo, branch, commit_messages)

        self.assertEqual(
            str(err.exception), "Invalid path provided: %s" % path_to_repo
        )

        mock_isdir.assert_called_once()

    @mock.patch.object(os.path, "isdir", return_value=True)
    @mock.patch.object(subprocess, "check_output")
    @mock.patch.object(tempfile, "NamedTemporaryFile")
    def testSuccessfullyUploadedChangesForReview(
        self, mock_tempfile, mock_commands, mock_isdir
    ):

        path_to_repo = "/some/path/to/repo"
        branch = "branch-name"
        commit_messages = ["Test message"]
        mock_tempfile.return_value.__enter__.return_value.name = "tmp"

        # A test CL generated by `repo upload`.
        mock_commands.side_effect = [
            None,
            (
                "remote: https://chromium-review.googlesource."
                "com/c/chromiumos/overlays/chromiumos-overlay/"
                "+/193147 Fix stdout"
            ),
        ]
        change_list = git.UploadChanges(path_to_repo, branch, commit_messages)

        self.assertEqual(change_list.cl_number, 193147)

        mock_isdir.assert_called_once_with(path_to_repo)

        expected_command = [
            "git",
            "commit",
            "-F",
            mock_tempfile.return_value.__enter__.return_value.name,
        ]
        self.assertEqual(
            mock_commands.call_args_list[0],
            mock.call(expected_command, cwd=path_to_repo),
        )

        expected_cmd = [
            "repo",
            "upload",
            "--yes",
            "--ne",
            "--no-verify",
            "--br=%s" % branch,
        ]
        self.assertEqual(
            mock_commands.call_args_list[1],
            mock.call(
                expected_cmd,
                stderr=subprocess.STDOUT,
                cwd=path_to_repo,
                encoding="utf-8",
            ),
        )

        self.assertEqual(
            change_list.url,
            "https://chromium-review.googlesource.com/c/chromiumos/overlays/"
            "chromiumos-overlay/+/193147",
        )


if __name__ == "__main__":
    unittest.main()
