from __future__ import with_statement from contextlib import contextmanager import os from mako.cmd import cmdline from test import eq_ from test import mock from test import raises from test import template_base from test 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 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 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(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 raises(SystemExit): cmdline( [ "--var", "x=5", os.path.join(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 raises(SystemExit): cmdline( [ "--var", "x=5", os.path.join(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 raises(SystemExit, "error: can't find fake.lalala"): cmdline(["--var", "x=5", "fake.lalala"])