# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittests for main builder logic (__init__.py)."""

import importlib
from unittest import mock

from chromite.cbuildbot import builders
from chromite.cbuildbot.builders import simple_builders
from chromite.lib import cros_test_lib


class ModuleTest(cros_test_lib.MockTempDirTestCase):
    """Module loading related tests"""

    def testGetBuilderClass(self):
        """Check behavior when requesting a valid builder."""
        result = builders.GetBuilderClass("simple_builders.SimpleBuilder")
        self.assertEqual(result, simple_builders.SimpleBuilder)

    def testGetBuilderClassError(self):
        """Check behavior when requesting missing builders."""
        self.assertRaises(ValueError, builders.GetBuilderClass, "Foalksdjo")
        self.assertRaises(
            ImportError, builders.GetBuilderClass, "foo.Foalksdjo"
        )
        self.assertRaises(
            AttributeError,
            builders.GetBuilderClass,
            "release_builders.Foalksdjo",
        )

    def testGetBuilderClassConfig(self):
        """Check behavior when requesting config builders.

        This can't be done with live classes since the site config may or may not
        be there.
        """
        # Setup
        mock_module = mock.Mock()
        mock_module.MyBuilder = "fake_class"
        mock_import = self.PatchObject(
            importlib, "import_module", return_value=mock_module
        )
        # Test
        result = builders.GetBuilderClass("config.my_builders.MyBuilder")
        # Verify
        mock_import.assert_called_once_with("chromite.config.my_builders")
        self.assertEqual(result, "fake_class")

        # Test again with a nested builder class name.
        mock_import.reset_mock()

        # Test
        result = builders.GetBuilderClass("config.nested.my_builders.MyBuilder")
        # Verify
        mock_import.assert_called_once_with(
            "chromite.config.nested.my_builders"
        )
        self.assertEqual(result, "fake_class")
