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