test_webbrowser.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. import webbrowser
  2. import unittest
  3. import os
  4. import sys
  5. import subprocess
  6. from unittest import mock
  7. from test import support
  8. from test.support import import_helper
  9. from test.support import os_helper
  10. if not support.has_subprocess_support:
  11. raise unittest.SkipTest("test webserver requires subprocess")
  12. URL = 'http://www.example.com'
  13. CMD_NAME = 'test'
  14. class PopenMock(mock.MagicMock):
  15. def poll(self):
  16. return 0
  17. def wait(self, seconds=None):
  18. return 0
  19. class CommandTestMixin:
  20. def _test(self, meth, *, args=[URL], kw={}, options, arguments):
  21. """Given a web browser instance method name along with arguments and
  22. keywords for same (which defaults to the single argument URL), creates
  23. a browser instance from the class pointed to by self.browser, calls the
  24. indicated instance method with the indicated arguments, and compares
  25. the resulting options and arguments passed to Popen by the browser
  26. instance against the 'options' and 'args' lists. Options are compared
  27. in a position independent fashion, and the arguments are compared in
  28. sequence order to whatever is left over after removing the options.
  29. """
  30. popen = PopenMock()
  31. support.patch(self, subprocess, 'Popen', popen)
  32. browser = self.browser_class(name=CMD_NAME)
  33. getattr(browser, meth)(*args, **kw)
  34. popen_args = subprocess.Popen.call_args[0][0]
  35. self.assertEqual(popen_args[0], CMD_NAME)
  36. popen_args.pop(0)
  37. for option in options:
  38. self.assertIn(option, popen_args)
  39. popen_args.pop(popen_args.index(option))
  40. self.assertEqual(popen_args, arguments)
  41. class GenericBrowserCommandTest(CommandTestMixin, unittest.TestCase):
  42. browser_class = webbrowser.GenericBrowser
  43. def test_open(self):
  44. self._test('open',
  45. options=[],
  46. arguments=[URL])
  47. class BackgroundBrowserCommandTest(CommandTestMixin, unittest.TestCase):
  48. browser_class = webbrowser.BackgroundBrowser
  49. def test_open(self):
  50. self._test('open',
  51. options=[],
  52. arguments=[URL])
  53. class ChromeCommandTest(CommandTestMixin, unittest.TestCase):
  54. browser_class = webbrowser.Chrome
  55. def test_open(self):
  56. self._test('open',
  57. options=[],
  58. arguments=[URL])
  59. def test_open_with_autoraise_false(self):
  60. self._test('open', kw=dict(autoraise=False),
  61. options=[],
  62. arguments=[URL])
  63. def test_open_new(self):
  64. self._test('open_new',
  65. options=['--new-window'],
  66. arguments=[URL])
  67. def test_open_new_tab(self):
  68. self._test('open_new_tab',
  69. options=[],
  70. arguments=[URL])
  71. class MozillaCommandTest(CommandTestMixin, unittest.TestCase):
  72. browser_class = webbrowser.Mozilla
  73. def test_open(self):
  74. self._test('open',
  75. options=[],
  76. arguments=[URL])
  77. def test_open_with_autoraise_false(self):
  78. self._test('open', kw=dict(autoraise=False),
  79. options=[],
  80. arguments=[URL])
  81. def test_open_new(self):
  82. self._test('open_new',
  83. options=[],
  84. arguments=['-new-window', URL])
  85. def test_open_new_tab(self):
  86. self._test('open_new_tab',
  87. options=[],
  88. arguments=['-new-tab', URL])
  89. class NetscapeCommandTest(CommandTestMixin, unittest.TestCase):
  90. browser_class = webbrowser.Netscape
  91. def test_open(self):
  92. self._test('open',
  93. options=['-raise', '-remote'],
  94. arguments=['openURL({})'.format(URL)])
  95. def test_open_with_autoraise_false(self):
  96. self._test('open', kw=dict(autoraise=False),
  97. options=['-noraise', '-remote'],
  98. arguments=['openURL({})'.format(URL)])
  99. def test_open_new(self):
  100. self._test('open_new',
  101. options=['-raise', '-remote'],
  102. arguments=['openURL({},new-window)'.format(URL)])
  103. def test_open_new_tab(self):
  104. self._test('open_new_tab',
  105. options=['-raise', '-remote'],
  106. arguments=['openURL({},new-tab)'.format(URL)])
  107. class GaleonCommandTest(CommandTestMixin, unittest.TestCase):
  108. browser_class = webbrowser.Galeon
  109. def test_open(self):
  110. self._test('open',
  111. options=['-n'],
  112. arguments=[URL])
  113. def test_open_with_autoraise_false(self):
  114. self._test('open', kw=dict(autoraise=False),
  115. options=['-noraise', '-n'],
  116. arguments=[URL])
  117. def test_open_new(self):
  118. self._test('open_new',
  119. options=['-w'],
  120. arguments=[URL])
  121. def test_open_new_tab(self):
  122. self._test('open_new_tab',
  123. options=['-w'],
  124. arguments=[URL])
  125. class OperaCommandTest(CommandTestMixin, unittest.TestCase):
  126. browser_class = webbrowser.Opera
  127. def test_open(self):
  128. self._test('open',
  129. options=[],
  130. arguments=[URL])
  131. def test_open_with_autoraise_false(self):
  132. self._test('open', kw=dict(autoraise=False),
  133. options=[],
  134. arguments=[URL])
  135. def test_open_new(self):
  136. self._test('open_new',
  137. options=['--new-window'],
  138. arguments=[URL])
  139. def test_open_new_tab(self):
  140. self._test('open_new_tab',
  141. options=[],
  142. arguments=[URL])
  143. class ELinksCommandTest(CommandTestMixin, unittest.TestCase):
  144. browser_class = webbrowser.Elinks
  145. def test_open(self):
  146. self._test('open', options=['-remote'],
  147. arguments=['openURL({})'.format(URL)])
  148. def test_open_with_autoraise_false(self):
  149. self._test('open',
  150. options=['-remote'],
  151. arguments=['openURL({})'.format(URL)])
  152. def test_open_new(self):
  153. self._test('open_new',
  154. options=['-remote'],
  155. arguments=['openURL({},new-window)'.format(URL)])
  156. def test_open_new_tab(self):
  157. self._test('open_new_tab',
  158. options=['-remote'],
  159. arguments=['openURL({},new-tab)'.format(URL)])
  160. class BrowserRegistrationTest(unittest.TestCase):
  161. def setUp(self):
  162. # Ensure we don't alter the real registered browser details
  163. self._saved_tryorder = webbrowser._tryorder
  164. webbrowser._tryorder = []
  165. self._saved_browsers = webbrowser._browsers
  166. webbrowser._browsers = {}
  167. def tearDown(self):
  168. webbrowser._tryorder = self._saved_tryorder
  169. webbrowser._browsers = self._saved_browsers
  170. def _check_registration(self, preferred):
  171. class ExampleBrowser:
  172. pass
  173. expected_tryorder = []
  174. expected_browsers = {}
  175. self.assertEqual(webbrowser._tryorder, expected_tryorder)
  176. self.assertEqual(webbrowser._browsers, expected_browsers)
  177. webbrowser.register('Example1', ExampleBrowser)
  178. expected_tryorder = ['Example1']
  179. expected_browsers['example1'] = [ExampleBrowser, None]
  180. self.assertEqual(webbrowser._tryorder, expected_tryorder)
  181. self.assertEqual(webbrowser._browsers, expected_browsers)
  182. instance = ExampleBrowser()
  183. if preferred is not None:
  184. webbrowser.register('example2', ExampleBrowser, instance,
  185. preferred=preferred)
  186. else:
  187. webbrowser.register('example2', ExampleBrowser, instance)
  188. if preferred:
  189. expected_tryorder = ['example2', 'Example1']
  190. else:
  191. expected_tryorder = ['Example1', 'example2']
  192. expected_browsers['example2'] = [ExampleBrowser, instance]
  193. self.assertEqual(webbrowser._tryorder, expected_tryorder)
  194. self.assertEqual(webbrowser._browsers, expected_browsers)
  195. def test_register(self):
  196. self._check_registration(preferred=False)
  197. def test_register_default(self):
  198. self._check_registration(preferred=None)
  199. def test_register_preferred(self):
  200. self._check_registration(preferred=True)
  201. class ImportTest(unittest.TestCase):
  202. def test_register(self):
  203. webbrowser = import_helper.import_fresh_module('webbrowser')
  204. self.assertIsNone(webbrowser._tryorder)
  205. self.assertFalse(webbrowser._browsers)
  206. class ExampleBrowser:
  207. pass
  208. webbrowser.register('Example1', ExampleBrowser)
  209. self.assertTrue(webbrowser._tryorder)
  210. self.assertEqual(webbrowser._tryorder[-1], 'Example1')
  211. self.assertTrue(webbrowser._browsers)
  212. self.assertIn('example1', webbrowser._browsers)
  213. self.assertEqual(webbrowser._browsers['example1'], [ExampleBrowser, None])
  214. def test_get(self):
  215. webbrowser = import_helper.import_fresh_module('webbrowser')
  216. self.assertIsNone(webbrowser._tryorder)
  217. self.assertFalse(webbrowser._browsers)
  218. with self.assertRaises(webbrowser.Error):
  219. webbrowser.get('fakebrowser')
  220. self.assertIsNotNone(webbrowser._tryorder)
  221. def test_synthesize(self):
  222. webbrowser = import_helper.import_fresh_module('webbrowser')
  223. name = os.path.basename(sys.executable).lower()
  224. webbrowser.register(name, None, webbrowser.GenericBrowser(name))
  225. webbrowser.get(sys.executable)
  226. def test_environment(self):
  227. webbrowser = import_helper.import_fresh_module('webbrowser')
  228. try:
  229. browser = webbrowser.get().name
  230. except webbrowser.Error as err:
  231. self.skipTest(str(err))
  232. with os_helper.EnvironmentVarGuard() as env:
  233. env["BROWSER"] = browser
  234. webbrowser = import_helper.import_fresh_module('webbrowser')
  235. webbrowser.get()
  236. def test_environment_preferred(self):
  237. webbrowser = import_helper.import_fresh_module('webbrowser')
  238. try:
  239. webbrowser.get()
  240. least_preferred_browser = webbrowser.get(webbrowser._tryorder[-1]).name
  241. except (webbrowser.Error, IndexError) as err:
  242. self.skipTest(str(err))
  243. with os_helper.EnvironmentVarGuard() as env:
  244. env["BROWSER"] = least_preferred_browser
  245. webbrowser = import_helper.import_fresh_module('webbrowser')
  246. self.assertEqual(webbrowser.get().name, least_preferred_browser)
  247. with os_helper.EnvironmentVarGuard() as env:
  248. env["BROWSER"] = sys.executable
  249. webbrowser = import_helper.import_fresh_module('webbrowser')
  250. self.assertEqual(webbrowser.get().name, sys.executable)
  251. if __name__=='__main__':
  252. unittest.main()