from __future__ import with_statement
from contextlib import contextmanager
from test import TemplateTest, eq_, raises, template_base, mock
import os
from mako.cmd import cmdline

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"])

