Skip to content

Commit 3576801

Browse files
authored
Merge pull request RustPython#2734 from fanninpm/test-webbrowser
Add test_webbrowser from CPython 3.8
2 parents d0cc0a4 + 3a8e0d0 commit 3576801

File tree

1 file changed

+348
-0
lines changed

1 file changed

+348
-0
lines changed

Lib/test/test_webbrowser.py

Lines changed: 348 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,348 @@
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+
# TODO: RUSTPYTHON
174+
@unittest.expectedFailure
175+
def test_open(self):
176+
self._test('open',
177+
options=[],
178+
arguments=[URL])
179+
180+
# TODO: RUSTPYTHON
181+
@unittest.expectedFailure
182+
def test_open_with_autoraise_false(self):
183+
self._test('open', kw=dict(autoraise=False),
184+
options=[],
185+
arguments=[URL])
186+
187+
# TODO: RUSTPYTHON
188+
@unittest.expectedFailure
189+
def test_open_new(self):
190+
self._test('open_new',
191+
options=['--new-window'],
192+
arguments=[URL])
193+
194+
# TODO: RUSTPYTHON
195+
@unittest.expectedFailure
196+
def test_open_new_tab(self):
197+
self._test('open_new_tab',
198+
options=[],
199+
arguments=[URL])
200+
201+
202+
class ELinksCommandTest(CommandTestMixin, unittest.TestCase):
203+
204+
browser_class = webbrowser.Elinks
205+
206+
def test_open(self):
207+
self._test('open', options=['-remote'],
208+
arguments=['openURL({})'.format(URL)])
209+
210+
def test_open_with_autoraise_false(self):
211+
self._test('open',
212+
options=['-remote'],
213+
arguments=['openURL({})'.format(URL)])
214+
215+
def test_open_new(self):
216+
self._test('open_new',
217+
options=['-remote'],
218+
arguments=['openURL({},new-window)'.format(URL)])
219+
220+
def test_open_new_tab(self):
221+
self._test('open_new_tab',
222+
options=['-remote'],
223+
arguments=['openURL({},new-tab)'.format(URL)])
224+
225+
226+
class BrowserRegistrationTest(unittest.TestCase):
227+
228+
def setUp(self):
229+
# Ensure we don't alter the real registered browser details
230+
self._saved_tryorder = webbrowser._tryorder
231+
webbrowser._tryorder = []
232+
self._saved_browsers = webbrowser._browsers
233+
webbrowser._browsers = {}
234+
235+
def tearDown(self):
236+
webbrowser._tryorder = self._saved_tryorder
237+
webbrowser._browsers = self._saved_browsers
238+
239+
def _check_registration(self, preferred):
240+
class ExampleBrowser:
241+
pass
242+
243+
expected_tryorder = []
244+
expected_browsers = {}
245+
246+
self.assertEqual(webbrowser._tryorder, expected_tryorder)
247+
self.assertEqual(webbrowser._browsers, expected_browsers)
248+
249+
webbrowser.register('Example1', ExampleBrowser)
250+
expected_tryorder = ['Example1']
251+
expected_browsers['example1'] = [ExampleBrowser, None]
252+
self.assertEqual(webbrowser._tryorder, expected_tryorder)
253+
self.assertEqual(webbrowser._browsers, expected_browsers)
254+
255+
instance = ExampleBrowser()
256+
if preferred is not None:
257+
webbrowser.register('example2', ExampleBrowser, instance,
258+
preferred=preferred)
259+
else:
260+
webbrowser.register('example2', ExampleBrowser, instance)
261+
if preferred:
262+
expected_tryorder = ['example2', 'Example1']
263+
else:
264+
expected_tryorder = ['Example1', 'example2']
265+
expected_browsers['example2'] = [ExampleBrowser, instance]
266+
self.assertEqual(webbrowser._tryorder, expected_tryorder)
267+
self.assertEqual(webbrowser._browsers, expected_browsers)
268+
269+
# TODO: RUSTPYTHON
270+
@unittest.expectedFailure
271+
def test_register(self):
272+
self._check_registration(preferred=False)
273+
274+
def test_register_default(self):
275+
self._check_registration(preferred=None)
276+
277+
# TODO: RUSTPYTHON
278+
@unittest.expectedFailure
279+
def test_register_preferred(self):
280+
self._check_registration(preferred=True)
281+
282+
283+
class ImportTest(unittest.TestCase):
284+
# TODO: RUSTPYTHON
285+
@unittest.expectedFailure
286+
def test_register(self):
287+
webbrowser = support.import_fresh_module('webbrowser')
288+
self.assertIsNone(webbrowser._tryorder)
289+
self.assertFalse(webbrowser._browsers)
290+
291+
class ExampleBrowser:
292+
pass
293+
webbrowser.register('Example1', ExampleBrowser)
294+
self.assertTrue(webbrowser._tryorder)
295+
self.assertEqual(webbrowser._tryorder[-1], 'Example1')
296+
self.assertTrue(webbrowser._browsers)
297+
self.assertIn('example1', webbrowser._browsers)
298+
self.assertEqual(webbrowser._browsers['example1'], [ExampleBrowser, None])
299+
300+
# TODO: RUSTPYTHON
301+
@unittest.expectedFailure
302+
def test_get(self):
303+
webbrowser = support.import_fresh_module('webbrowser')
304+
self.assertIsNone(webbrowser._tryorder)
305+
self.assertFalse(webbrowser._browsers)
306+
307+
with self.assertRaises(webbrowser.Error):
308+
webbrowser.get('fakebrowser')
309+
self.assertIsNotNone(webbrowser._tryorder)
310+
311+
def test_synthesize(self):
312+
webbrowser = support.import_fresh_module('webbrowser')
313+
name = os.path.basename(sys.executable).lower()
314+
webbrowser.register(name, None, webbrowser.GenericBrowser(name))
315+
webbrowser.get(sys.executable)
316+
317+
def test_environment(self):
318+
webbrowser = support.import_fresh_module('webbrowser')
319+
try:
320+
browser = webbrowser.get().name
321+
except (webbrowser.Error, AttributeError) as err:
322+
self.skipTest(str(err))
323+
with support.EnvironmentVarGuard() as env:
324+
env["BROWSER"] = browser
325+
webbrowser = support.import_fresh_module('webbrowser')
326+
webbrowser.get()
327+
328+
def test_environment_preferred(self):
329+
webbrowser = support.import_fresh_module('webbrowser')
330+
try:
331+
webbrowser.get()
332+
least_preferred_browser = webbrowser.get(webbrowser._tryorder[-1]).name
333+
except (webbrowser.Error, AttributeError, IndexError) as err:
334+
self.skipTest(str(err))
335+
336+
with support.EnvironmentVarGuard() as env:
337+
env["BROWSER"] = least_preferred_browser
338+
webbrowser = support.import_fresh_module('webbrowser')
339+
self.assertEqual(webbrowser.get().name, least_preferred_browser)
340+
341+
with support.EnvironmentVarGuard() as env:
342+
env["BROWSER"] = sys.executable
343+
webbrowser = support.import_fresh_module('webbrowser')
344+
self.assertEqual(webbrowser.get().name, sys.executable)
345+
346+
347+
if __name__=='__main__':
348+
unittest.main()

0 commit comments

Comments
 (0)