#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The ChromiumOS Authors. All rights reserved.
# 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."""

from __future__ import print_function

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()
