script_test.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # mypy: disable-error-code="attr-defined"
  2. import io
  3. import pytest
  4. import typing
  5. from pathlib import Path
  6. import cipy
  7. import cipy.script
  8. from matchers import HasAttributes
  9. from mocks import mock_run
  10. def test_node_run_runs_main(mock_subprocess) -> None:
  11. action = cipy.script.NodeScript(name="example", main=Path("/dev/null"))
  12. action.run(cipy.Context())
  13. assert mock_subprocess.call_args_list[0].args == (["node", "/dev/null"],)
  14. def test_node_cleanup_noop_without_post(mock_subprocess) -> None:
  15. action = cipy.script.NodeScript(name="example", main=Path("/dev/null"))
  16. action.cleanup(cipy.Context())
  17. mock_subprocess.assert_not_called()
  18. def test_node_cleanup_runs_post(mock_subprocess) -> None:
  19. action = cipy.script.NodeScript(
  20. name="example", main=Path("/dev/null"), post=Path("/dev/zero")
  21. )
  22. action.cleanup(cipy.Context())
  23. assert mock_subprocess.call_args_list[0].args == (["node", "/dev/zero"],)
  24. def test_script_writes_to_a_file(mock_subprocess) -> None:
  25. action = cipy.script.Script(script="""
  26. echo Lorem Ipsum
  27. """)
  28. def check(args, **kwargs):
  29. assert Path(args[-1]).is_file()
  30. with open(args[-1], "r", encoding="utf8") as file:
  31. assert file.read() == action.script
  32. return mock_run(args, **kwargs)
  33. mock_subprocess.side_effect = check
  34. action.run(cipy.Context())
  35. def test_script_performs_mustache_substitution(mock_subprocess) -> None:
  36. action = cipy.script.Script(script="""
  37. echo {{ foo }}
  38. """)
  39. def check(args, **kwargs):
  40. assert Path(args[-1]).is_file()
  41. with open(args[-1], "r", encoding="utf8") as file:
  42. assert file.read() == "echo 1"
  43. return mock_run(args, **kwargs)
  44. mock_subprocess.side_effect = check
  45. action.run(cipy.Context(foo=1))
  46. def test_script_propogates_mustache_error(ci_logger, mock_subprocess) -> None:
  47. action = cipy.script.Script(script="""
  48. echo {{ foo }}
  49. """)
  50. mock_subprocess.side_effect = RuntimeError("Should not be reached")
  51. assert action.run(cipy.Context()) is cipy.Status.FAILURE
  52. ci_logger.format.assert_called_with(
  53. HasAttributes(name="Script", message="Could not find key 'foo'\n")
  54. )