1+ import io
2+ import os
13import webbrowser
24import unittest
3- import os
45import sys
56import subprocess
67from unittest import mock
@@ -47,6 +48,14 @@ def _test(self, meth, *, args=[URL], kw={}, options, arguments):
4748 popen_args .pop (popen_args .index (option ))
4849 self .assertEqual (popen_args , arguments )
4950
51+ def test_reject_dash_prefixes (self ):
52+ browser = self .browser_class (name = CMD_NAME )
53+ with self .assertRaisesRegex (
54+ ValueError ,
55+ r"^Invalid URL \(leading dash disallowed\): '--key=val http.*'$"
56+ ):
57+ browser .open (f"--key=val { URL } " )
58+
5059
5160class GenericBrowserCommandTest (CommandTestMixin , unittest .TestCase ):
5261
@@ -57,11 +66,6 @@ def test_open(self):
5766 options = [],
5867 arguments = [URL ])
5968
60- def test_reject_dash_prefixes (self ):
61- browser = self .browser_class (name = CMD_NAME )
62- with self .assertRaises (ValueError ):
63- browser .open (f"--key=val { URL } " )
64-
6569
6670class BackgroundBrowserCommandTest (CommandTestMixin , unittest .TestCase ):
6771
@@ -222,6 +226,71 @@ def test_open_new_tab(self):
222226 arguments = ['openURL({},new-tab)' .format (URL )])
223227
224228
229+ class MockPopenPipe :
230+ def __init__ (self , cmd , mode ):
231+ self .cmd = cmd
232+ self .mode = mode
233+ self .pipe = io .StringIO ()
234+ self ._closed = False
235+
236+ def write (self , buf ):
237+ self .pipe .write (buf )
238+
239+ def close (self ):
240+ self ._closed = True
241+ return None
242+
243+
244+ @unittest .skipUnless (sys .platform == "darwin" , "macOS specific test" )
245+ class MacOSXOSAScriptTest (unittest .TestCase ):
246+ def setUp (self ):
247+ # Ensure that 'BROWSER' is not set to 'open' or something else.
248+ # See: https://github.com/python/cpython/issues/131254.
249+ env = self .enterContext (os_helper .EnvironmentVarGuard ())
250+ env .unset ("BROWSER" )
251+
252+ support .patch (self , os , "popen" , self .mock_popen )
253+ self .browser = webbrowser .MacOSXOSAScript ("default" )
254+
255+ def mock_popen (self , cmd , mode ):
256+ self .popen_pipe = MockPopenPipe (cmd , mode )
257+ return self .popen_pipe
258+
259+ def test_default (self ):
260+ browser = webbrowser .get ()
261+ assert isinstance (browser , webbrowser .MacOSXOSAScript )
262+ self .assertEqual (browser .name , "default" )
263+
264+ def test_default_open (self ):
265+ url = "https://python.org"
266+ self .browser .open (url )
267+ self .assertTrue (self .popen_pipe ._closed )
268+ self .assertEqual (self .popen_pipe .cmd , "osascript" )
269+ script = self .popen_pipe .pipe .getvalue ()
270+ self .assertEqual (script .strip (), f'open location "{ url } "' )
271+
272+ def test_url_quote (self ):
273+ self .browser .open ('https://python.org/"quote"' )
274+ script = self .popen_pipe .pipe .getvalue ()
275+ self .assertEqual (
276+ script .strip (), 'open location "https://python.org/%22quote%22"'
277+ )
278+
279+ def test_explicit_browser (self ):
280+ browser = webbrowser .MacOSXOSAScript ("safari" )
281+ browser .open ("https://python.org" )
282+ script = self .popen_pipe .pipe .getvalue ()
283+ self .assertIn ('tell application "safari"' , script )
284+ self .assertIn ('open location "https://python.org"' , script )
285+
286+ def test_reject_dash_prefixes (self ):
287+ with self .assertRaisesRegex (
288+ ValueError ,
289+ r"^Invalid URL \(leading dash disallowed\): '--key=val http.*'$"
290+ ):
291+ self .browser .open (f"--key=val { URL } " )
292+
293+
225294class BrowserRegistrationTest (unittest .TestCase ):
226295
227296 def setUp (self ):
0 commit comments