#!/usr/bin/env python3
# Copyright 2021 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.

# We're testing protected methods, so allow protected access.
# pylint: disable=protected-access

"""Tests bug filing bits."""

import json
import tempfile
import unittest
from unittest.mock import patch

import bugs


class Tests(unittest.TestCase):
  """Tests for the bugs module."""
  def testWritingJSONFileSeemsToWork(self):
    """Tests JSON file writing."""
    old_x20_path = bugs.X20_PATH

    def restore_x20_path():
      bugs.X20_PATH = old_x20_path

    self.addCleanup(restore_x20_path)

    with tempfile.TemporaryDirectory() as tempdir:
      bugs.X20_PATH = tempdir
      file_path = bugs._WriteBugJSONFile(
          'ObjectType', {
              'foo': 'bar',
              'baz': bugs.WellKnownComponents.CrOSToolchainPublic,
          })

      self.assertTrue(file_path.startswith(tempdir),
                      f'Expected {file_path} to start with {tempdir}')

      with open(file_path) as f:
        self.assertEqual(
            json.load(f),
            {
                'type': 'ObjectType',
                'value': {
                    'foo': 'bar',
                    'baz': int(bugs.WellKnownComponents.CrOSToolchainPublic),
                },
            },
        )

  @patch('bugs._WriteBugJSONFile')
  def testAppendingToBugsSeemsToWork(self, mock_write_json_file):
    """Tests AppendToExistingBug."""
    bugs.AppendToExistingBug(1234, 'hello, world!')
    mock_write_json_file.assert_called_once_with(
        'AppendToExistingBugRequest',
        {
            'body': 'hello, world!',
            'bug_id': 1234,
        },
    )

  @patch('bugs._WriteBugJSONFile')
  def testBugCreationSeemsToWork(self, mock_write_json_file):
    """Tests CreateNewBug."""
    test_case_additions = (
        {},
        {
            'component_id': bugs.WellKnownComponents.CrOSToolchainPublic,
        },
        {
            'assignee': 'foo@gbiv.com',
            'cc': ['bar@baz.com'],
        },
    )

    for additions in test_case_additions:
      test_case = {
          'component_id': 123,
          'title': 'foo',
          'body': 'bar',
          **additions,
      }

      bugs.CreateNewBug(**test_case)

      expected_output = {
          'component_id': test_case['component_id'],
          'subject': test_case['title'],
          'body': test_case['body'],
      }

      assignee = test_case.get('assignee')
      if assignee:
        expected_output['assignee'] = assignee

      cc = test_case.get('cc')
      if cc:
        expected_output['cc'] = cc

      mock_write_json_file.assert_called_once_with(
          'FileNewBugRequest',
          expected_output,
      )
      mock_write_json_file.reset_mock()

  @patch('bugs._WriteBugJSONFile')
  def testCronjobLogSendingSeemsToWork(self, mock_write_json_file):
    """Tests SendCronjobLog."""
    bugs.SendCronjobLog('my_name', False, 'hello, world!')
    mock_write_json_file.assert_called_once_with(
        'ChrotomationCronjobUpdate',
        {
            'name': 'my_name',
            'message': 'hello, world!',
            'failed': False,
        },
    )


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