# -*- coding: utf-8 -*-
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests the `cros buildresult` command."""

from __future__ import print_function

import json
import sys

from chromite.cli import command_unittest
from chromite.cli.cros import cros_buildresult
from chromite.lib import cros_test_lib


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


FAKE_BUILD_STATUS = {
    'id': 1234,
    'buildbucket_id': 'buildbucket_value',
    'status': 'pass',
    'artifacts_url': 'fake_artifacts_url',
    'toolchain_url': 'fake_toolchain_url',
    'stages': [
        {'name': 'stage_a', 'status': 'pass'},
        {'name': 'stage_b', 'status': 'pass'},
        {'name': 'stage_c', 'status': 'pass'},
    ],
}


class MockBuildresultCommand(command_unittest.MockCommand):
  """Mock out the `cros buildresult` command."""
  TARGET = 'chromite.cli.cros.cros_buildresult.BuildResultCommand'
  TARGET_CLASS = cros_buildresult.BuildResultCommand
  COMMAND = 'buildresult'


class BuildresultTest(cros_test_lib.MockTestCase):
  """Base class for buildresult command tests."""

  def setUp(self):
    self.cmd_mock = None

  def SetupCommandMock(self, cmd_args):
    """Sets up the `cros buildresult` command mock."""
    self.cmd_mock = MockBuildresultCommand(cmd_args)
    self.StartPatcher(self.cmd_mock)

    return self.cmd_mock.inst.options


class BuildresultReportTest(BuildresultTest):
  """Test the report generation functions."""

  def testReport(self):
    result = cros_buildresult.Report([FAKE_BUILD_STATUS])
    expected = """buildbucket_id: buildbucket_value
status: pass
artifacts_url: fake_artifacts_url
toolchain_url: fake_toolchain_url
stages:
  stage_a: pass
  stage_b: pass
  stage_c: pass

"""

    self.assertEqual(expected, result)

  def testReportJson(self):
    result = cros_buildresult.ReportJson([FAKE_BUILD_STATUS])
    expected = {
        'buildbucket_value': {
            'buildbucket_id': 'buildbucket_value',
            'status': 'pass',
            'artifacts_url': 'fake_artifacts_url',
            'toolchain_url': 'fake_toolchain_url',
            'stages': {
                'stage_a': 'pass',
                'stage_b': 'pass',
                'stage_c': 'pass',
            },
        },
    }

    self.assertEqual(expected, json.loads(result))
