| from contextlib import contextmanager | |
| import os | |
| from unittest import mock | |
| from mako.cmd import cmdline | |
| from mako.testing.assertions import eq_ | |
| from mako.testing.assertions import expect_raises | |
| from mako.testing.assertions import expect_raises_message | |
| from mako.testing.config import config | |
| from mako.testing.fixtures import TemplateTest | |
| class CmdTest(TemplateTest): | |
| @contextmanager | |
| def _capture_output_fixture(self, stream="stdout"): | |
| with mock.patch("sys.%s" % stream) as stdout: | |
| yield stdout | |
| def test_stdin_success(self): | |
| with self._capture_output_fixture() as stdout: | |
| with mock.patch( | |
| "sys.stdin", | |
| mock.Mock(read=mock.Mock(return_value="hello world ${x}")), | |
| ): | |
| cmdline(["--var", "x=5", "-"]) | |
| eq_(stdout.write.mock_calls[0][1][0], "hello world 5") | |
| def test_stdin_syntax_err(self): | |
| with mock.patch( | |
| "sys.stdin", mock.Mock(read=mock.Mock(return_value="${x")) | |
| ): | |
| with self._capture_output_fixture("stderr") as stderr: | |
| with expect_raises(SystemExit): | |
| cmdline(["--var", "x=5", "-"]) | |
| assert ( | |
| "SyntaxException: Expected" in stderr.write.mock_calls[0][1][0] | |
| ) | |
| assert "Traceback" in stderr.write.mock_calls[0][1][0] | |
| def test_stdin_rt_err(self): | |
| with mock.patch( | |
| "sys.stdin", mock.Mock(read=mock.Mock(return_value="${q}")) | |
| ): | |
| with self._capture_output_fixture("stderr") as stderr: | |
| with expect_raises(SystemExit): | |
| cmdline(["--var", "x=5", "-"]) | |
| assert "NameError: Undefined" in stderr.write.mock_calls[0][1][0] | |
| assert "Traceback" in stderr.write.mock_calls[0][1][0] | |
| def test_file_success(self): | |
| with self._capture_output_fixture() as stdout: | |
| cmdline( | |
| [ | |
| "--var", | |
| "x=5", | |
| os.path.join(config.template_base, "cmd_good.mako"), | |
| ] | |
| ) | |
| eq_(stdout.write.mock_calls[0][1][0], "hello world 5") | |
| def test_file_syntax_err(self): | |
| with self._capture_output_fixture("stderr") as stderr: | |
| with expect_raises(SystemExit): | |
| cmdline( | |
| [ | |
| "--var", | |
| "x=5", | |
| os.path.join(config.template_base, "cmd_syntax.mako"), | |
| ] | |
| ) | |
| assert "SyntaxException: Expected" in stderr.write.mock_calls[0][1][0] | |
| assert "Traceback" in stderr.write.mock_calls[0][1][0] | |
| def test_file_rt_err(self): | |
| with self._capture_output_fixture("stderr") as stderr: | |
| with expect_raises(SystemExit): | |
| cmdline( | |
| [ | |
| "--var", | |
| "x=5", | |
| os.path.join(config.template_base, "cmd_runtime.mako"), | |
| ] | |
| ) | |
| assert "NameError: Undefined" in stderr.write.mock_calls[0][1][0] | |
| assert "Traceback" in stderr.write.mock_calls[0][1][0] | |
| def test_file_notfound(self): | |
| with expect_raises_message( | |
| SystemExit, "error: can't find fake.lalala" | |
| ): | |
| cmdline(["--var", "x=5", "fake.lalala"]) |