# 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) -> None:
        """Check behavior when requesting a valid builder."""
        result = builders.GetBuilderClass("simple_builders.SimpleBuilder")
        self.assertEqual(result, simple_builders.SimpleBuilder)

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

    def testGetBuilderClassConfig(self) -> None:
        """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")
