import unittest
from unittest.mock import patch

from lib.executar_validacoes_servidor_linux import (
    _obter_percentual_uso_disco_raiz,
    _validar_uso_disco_servidor,
    executar_validacoes_servidor_linux,
)


class ResultadoComandoFake:
    def __init__(self, codigo_retorno=0, saida=""):
        self.codigo_retorno = codigo_retorno
        self.saida = saida


class ClienteLinuxFake:
    def __init__(self, resultado_df=None):
        self.resultado_df = resultado_df or ResultadoComandoFake(
            codigo_retorno=0,
            saida="Filesystem 1024-blocks Used Available Capacity Mounted on\n/dev/sda1 100 79 21 79% /\n"
        )
        self.comandos = []

    def executar_comando(self, comando, disparar_excecao_se_retorno_nao_zero=True, echoar=True, descricao=""):
        self.comandos.append(comando)
        return self.resultado_df

class TestExecutarValidacoesServidorLinux(unittest.TestCase):
    def test_obter_percentual_uso_disco_raiz_retorna_percentual(self):
        percentual = _obter_percentual_uso_disco_raiz(
            "Filesystem 1024-blocks Used Available Capacity Mounted on\n/dev/sda1 100 85 15 85% /\n"
        )

        self.assertEqual(percentual, 85)

    @patch("lib.executar_validacoes_servidor_linux.echo")
    def test_validar_uso_disco_servidor_emite_aviso_em_80_porcento(self, echo_mock):
        cliente_linux = ClienteLinuxFake(
            ResultadoComandoFake(
                codigo_retorno=0,
                saida="Filesystem 1024-blocks Used Available Capacity Mounted on\n/dev/sda1 100 80 20 80% /\n"
            )
        )

        mensagem_erro = _validar_uso_disco_servidor(cliente_linux)

        echo_mock.assert_called_once()
        self.assertIn("80%", echo_mock.call_args.args[0])
        self.assertIsNone(mensagem_erro)

    @patch("lib.executar_validacoes_servidor_linux.echo")
    def test_validar_uso_disco_servidor_nao_emite_aviso_quando_abaixo_de_80(self, echo_mock):
        cliente_linux = ClienteLinuxFake()

        mensagem_erro = _validar_uso_disco_servidor(cliente_linux)

        echo_mock.assert_not_called()
        self.assertIsNone(mensagem_erro)

    @patch("lib.executar_validacoes_servidor_linux.echo")
    def test_validar_uso_disco_servidor_barra_quando_chega_a_100_porcento(self, echo_mock):
        cliente_linux = ClienteLinuxFake(
            ResultadoComandoFake(
                codigo_retorno=0,
                saida="Filesystem 1024-blocks Used Available Capacity Mounted on\n/dev/sda1 100 100 0 100% /\n"
            )
        )

        mensagem_erro = _validar_uso_disco_servidor(cliente_linux)

        echo_mock.assert_called_once()
        self.assertEqual(
            mensagem_erro,
            "Servidor Linux com 100% de uso na particao /. Libere espaco antes de continuar."
        )

    def test_executar_validacoes_servidor_linux(self):
        arquivo_configuracao = r'C:\microuniversoWeb\microuniversoWeb.yaml'
        diretorio_scripts_implantacao = r'C:\TrabalhoWeb\ScriptsDeploy\scripts_implantacao'

        mensagem_erro = executar_validacoes_servidor_linux(arquivo_configuracao, diretorio_scripts_implantacao)


        print(mensagem_erro)

        self.assertIn(
            mensagem_erro,
            [
                None,
                "Servidor Linux com 100% de uso na particao /. Libere espaco antes de continuar."
            ]
        )
