summaryrefslogtreecommitdiff
path: root/creole/tests/test_cli.py
blob: cae1e402718adada977a62e505d826b050473720 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env python
# coding: utf-8

"""
    unittest for CLI
    ~~~~~~~~~~~~~~~~

    :copyleft: 2013-2020 by python-creole team, see AUTHORS for more details.
    :license: GNU GPL v3 or above, see LICENSE for more details.
"""


import sys
import tempfile
import unittest

from creole import VERSION_STRING, cmdline
from creole.tests.utils.base_unittest import BaseCreoleTest
from creole.tests.utils.unittest_subprocess import SubprocessMixin

CMDS = ("creole2html", "html2creole", "html2rest", "html2textile")


class CliTestMixins(object):
    def test_creole2html(self):
        self._test_convert(
            source_content=b"= test creole2html =",
            dest_content="<h1>test creole2html</h1>",
            cli_str="creole2html",
        )

    def test_html2creole(self):
        self._test_convert(
            source_content=b"<h1>test html2creole</h1>",
            dest_content="= test html2creole",
            cli_str="html2creole",
        )

    def test_html2rest(self):
        self._test_convert(
            source_content=b"<h1>test html2rest</h1>",
            dest_content=(
                "==============\n"
                "test html2rest\n"
                "=============="
            ),
            cli_str="html2rest",
        )

    def test_html2textile(self):
        self._test_convert(
            source_content=b"<h1>test html2textile</h1>",
            dest_content="h1. test html2textile",
            cli_str="html2textile",
        )


class CreoleCLITests(BaseCreoleTest, SubprocessMixin, CliTestMixins):
    def _test_convert(self, source_content, dest_content, cli_str, verbose=True):
        assert isinstance(source_content, bytes), type(source_content)

        source_file = tempfile.NamedTemporaryFile()
        sourcefilepath = source_file.name
        source_file.write(source_content)
        source_file.seek(0)

        dest_file = tempfile.NamedTemporaryFile()
        destfilepath = dest_file.name

        stdout = (
            "Convert '%(src)s' to '%(dst)s' with %(prog)s (codec: utf-8)\n"
            "done. '%(dst)s' created."
        ) % {
            "prog": cli_str,
            "src": sourcefilepath,
            "dst": destfilepath,
        }

        self.assertSubprocess(
            popen_args=[cli_str, sourcefilepath, destfilepath],
            retcode=0, stdout=stdout,
        )

        dest_file.seek(0)
        result_content = dest_file.read()

        result_content = result_content.decode("utf-8")
        self.assertEqual(result_content, dest_content)

    def test_version(self):
        for cmd in CMDS:
            version_info = f"{cmd} from python-creole v{VERSION_STRING}"
            self.assertSubprocess(
                popen_args=[cmd, "--version"],
                retcode=0,
                stdout=version_info,
            )


class CreoleCLITestsDirect(BaseCreoleTest, CliTestMixins):

    def setUp(self):
        super(CreoleCLITestsDirect, self).setUp()
        self._old_sys_argv = sys.argv[:]

    def tearDown(self):
        sys.argv = self._old_sys_argv

    def _test_convert(self, source_content, dest_content, cli_str, verbose=True):
        assert isinstance(source_content, bytes), type(source_content)

        source_file = tempfile.NamedTemporaryFile()
        sourcefilepath = source_file.name
        source_file.write(source_content)
        source_file.seek(0)

        dest_file = tempfile.NamedTemporaryFile()
        destfilepath = dest_file.name

        sys.argv = [cli_str, sourcefilepath, destfilepath]
        cli = getattr(cmdline, f"cli_{cli_str}")
        cli()

        dest_file.seek(0)
        result_content = dest_file.read()

        result_content = result_content.decode("utf-8")
        self.assertEqual(result_content, dest_content)


if __name__ == '__main__':
    unittest.main()