# mypy: disable-error-code="attr-defined" import io import pytest import typing from pathlib import Path import cipy import cipy.script from matchers import HasAttributes from mocks import mock_run def test_node_run_runs_main(mock_subprocess) -> None: action = cipy.script.NodeScript(name="example", main=Path("/dev/null")) action.run(cipy.Context()) assert mock_subprocess.call_args_list[0].args == (["node", "/dev/null"],) def test_node_cleanup_noop_without_post(mock_subprocess) -> None: action = cipy.script.NodeScript(name="example", main=Path("/dev/null")) action.cleanup(cipy.Context()) mock_subprocess.assert_not_called() def test_node_cleanup_runs_post(mock_subprocess) -> None: action = cipy.script.NodeScript( name="example", main=Path("/dev/null"), post=Path("/dev/zero") ) action.cleanup(cipy.Context()) assert mock_subprocess.call_args_list[0].args == (["node", "/dev/zero"],) def test_script_writes_to_a_file(mock_subprocess) -> None: action = cipy.script.Script(script=""" echo Lorem Ipsum """) def check(args, **kwargs): assert Path(args[-1]).is_file() with open(args[-1], "r", encoding="utf8") as file: assert file.read() == action.script return mock_run(args, **kwargs) mock_subprocess.side_effect = check action.run(cipy.Context()) def test_script_performs_mustache_substitution(mock_subprocess) -> None: action = cipy.script.Script(script=""" echo {{ foo }} """) def check(args, **kwargs): assert Path(args[-1]).is_file() with open(args[-1], "r", encoding="utf8") as file: assert file.read() == "echo 1" return mock_run(args, **kwargs) mock_subprocess.side_effect = check action.run(cipy.Context(foo=1)) def test_script_propogates_mustache_error(ci_logger, mock_subprocess) -> None: action = cipy.script.Script(script=""" echo {{ foo }} """) mock_subprocess.side_effect = RuntimeError("Should not be reached") assert action.run(cipy.Context()) is cipy.Status.FAILURE ci_logger.format.assert_called_with( HasAttributes(name="Script", message="Could not find key 'foo'\n") )