test_script.py 2.3 KB

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