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