"""Testes da resolução do executável Node usada pelo aplicador de planos.""" import os import unittest from unittest.mock import patch from engine import aplicar_plano_de_edicao class TesteResolucaoDoNode(unittest.TestCase): """Garante que a engine não dependa do PATH herdado pelo painel CEP.""" def test_prioriza_executavel_configurado_no_ambiente(self): """Usa o caminho explícito quando o painel ou sistema o fornece.""" with patch.dict(os.environ, {"PREMIERE_NODE_BIN": "/custom/node"}, clear=False), patch( "engine.aplicar_plano_de_edicao.os.path.isfile", return_value=True ), patch("engine.aplicar_plano_de_edicao.os.access", return_value=True): self.assertEqual(aplicar_plano_de_edicao.resolver_caminho_do_node(), "/custom/node") def test_usa_caminho_conhecido_quando_node_nao_esta_no_path(self): """Encontra a instalação Homebrew mesmo com PATH incompleto.""" with patch.dict(os.environ, {}, clear=True), patch( "engine.aplicar_plano_de_edicao.shutil.which", return_value=None ), patch("engine.aplicar_plano_de_edicao.os.path.isfile", side_effect=lambda caminho: caminho == "/opt/homebrew/bin/node"), patch( "engine.aplicar_plano_de_edicao.os.access", return_value=True ): self.assertEqual(aplicar_plano_de_edicao.resolver_caminho_do_node(), "/opt/homebrew/bin/node") def test_informa_instalacao_ausente(self): """Levanta um erro explicativo quando nenhum executável existe.""" with patch.dict(os.environ, {}, clear=True), patch( "engine.aplicar_plano_de_edicao.shutil.which", return_value=None ), patch("engine.aplicar_plano_de_edicao.os.path.isfile", return_value=False): with self.assertRaisesRegex(FileNotFoundError, "Node.js não encontrado"): aplicar_plano_de_edicao.resolver_caminho_do_node() if __name__ == "__main__": unittest.main()