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