1import sys
2try:
3    import unittest2 as unittest
4except ImportError:
5    import unittest
6try:
7    from unittest import mock
8except ImportError:
9    import mock
10
11from qrcode.console_scripts import main
12
13
14def bad_read():
15    raise UnicodeDecodeError('utf-8', b'0x80', 0, 1, 'invalid start byte')
16
17
18class ScriptTest(unittest.TestCase):
19
20    @mock.patch('os.isatty', lambda *args: True)
21    @mock.patch('qrcode.main.QRCode.print_ascii')
22    def test_isatty(self, mock_print_ascii):
23        main(['testtext'])
24        mock_print_ascii.assert_called_with(tty=True)
25
26    @mock.patch('os.isatty', lambda *args: False)
27    @mock.patch('sys.stdout')
28    def test_piped(self, mock_stdout):
29        main(['testtext'])
30
31    @mock.patch('os.isatty', lambda *args: True)
32    @mock.patch('qrcode.main.QRCode.print_ascii')
33    def test_stdin(self, mock_print_ascii):
34        mock_stdin = mock.Mock(sys.stdin)
35        stdin_buffer = getattr(mock_stdin, 'buffer', mock_stdin)
36        stdin_buffer.read.return_value = 'testtext'
37        with mock.patch('sys.stdin', mock_stdin):
38            main([])
39        self.assertTrue(stdin_buffer.read.called)
40        mock_print_ascii.assert_called_with(tty=True)
41
42    @unittest.skipIf(sys.version_info[0] < 3, 'Python 3')
43    @mock.patch('os.isatty', lambda *args: True)
44    @mock.patch('qrcode.main.QRCode.print_ascii')
45    def test_stdin_py3_unicodedecodeerror(self, mock_print_ascii):
46        mock_stdin = mock.Mock(sys.stdin)
47        mock_stdin.buffer.read.return_value = 'testtext'
48        mock_stdin.read.side_effect = bad_read
49        with mock.patch('sys.stdin', mock_stdin):
50            # sys.stdin.read() will raise an error...
51            self.assertRaises(UnicodeDecodeError, sys.stdin.read)
52            # ... but it won't be used now.
53            main([])
54        mock_print_ascii.assert_called_with(tty=True)
55
56    @mock.patch('os.isatty', lambda *args: True)
57    @mock.patch('qrcode.main.QRCode.print_ascii')
58    def test_optimize(self, mock_print_ascii):
59        main('testtext --optimize 0'.split())
60
61    @mock.patch('sys.stdout')
62    def test_factory(self, mock_stdout):
63        main('testtext --factory svg'.split())
64
65    @mock.patch('sys.stderr')
66    def test_bad_factory(self, mock_stderr):
67        self.assertRaises(SystemExit, main, 'testtext --factory fish'.split())
68