from unittest.mock import patch

from library_test.base_test import BaseTest





class AnsibleModuleMocker:

    def __init__(self, params: dict):

        self.params = params





class BaseTestCheckUtil(BaseTest):



    @classmethod

    def get_module_path(cls):

        return "ascend_deployer.module_utils.check_library_utils"



    @classmethod

    def setUpClass(cls) -> None:

        super().setUpClass()

        from ascend_deployer.module_utils.check_library_utils.localhost_check import LocalhostCheck

        params = {'master_groups': "", 'master0_arch': "", 'worker0_arch': "", 'groups': ""}

        cls.localhost_check = LocalhostCheck(AnsibleModuleMocker(params), [])





class TestCheckUtils(BaseTestCheckUtil):

    def test_check_dl_diff_arch(self):

        def check_dl_diff_arch():

            self.localhost_check.master0_arch = 'aarch64'

            self.localhost_check.worker0_arch = 'x86_64'

            self.localhost_check.groups = {"other_build_image": "192.168.1.1"}

            self.localhost_check.check_dl_diff_arch()

            self.assertEqual([], self.localhost_check.error_messages)



            self.localhost_check.groups = {}

            self.localhost_check.check_dl_diff_arch()

            self.assertEqual(["Master and worker have different architectures. "

                              "The 'other_build_image' group is required but is empty."],

                             self.localhost_check.error_messages)

            self.localhost_check.groups = {"other_build_image": "192.168.1.1"}

        check_dl_diff_arch()



    @patch("os.path.isdir")

    @patch("os.listdir")

    @patch("os.path.isfile")

    def test_check_directory_and_files(self, mock_isfile, mock_listdir, mock_isdir):

        self.localhost_check.module.params.setdefault("mtos_sys_dir", "/fake/dir")

        mock_isdir.return_value = False

        self.localhost_check.check_mtos_kernel_devel_pkg()

        self.assertEqual(['Directory /fake/dir does not exist'], self.localhost_check.error_messages)

        self.localhost_check.error_messages = []



        mock_isdir.return_value = True

        self.localhost_check.check_mtos_kernel_devel_pkg()

        self.assertEqual(['MTOS needs to use the kernel-devel package that is not available on the '

                          'public network. If you need to use it, please download the dependencies and '

                          'replace kernel-devel with the '

                          'kernel-devel-5.10.0-218.0.0.mt20240808.560.mt2203sp4.aarch64.rpm package '

                          'after decompressing the image.'], self.localhost_check.error_messages)

        self.localhost_check.error_messages = []



        mock_listdir.side_effect = Exception("err msg")

        mock_isdir.return_value = True

        self.localhost_check.check_mtos_kernel_devel_pkg()

        self.assertEqual(['Error accessing directory /fake/dir: err msg'], self.localhost_check.error_messages)