|
| 1 | +import io |
1 | 2 | import os
|
2 | 3 | import re
|
3 | 4 | import shlex
|
4 | 5 | import subprocess
|
5 | 6 | import sys
|
6 | 7 | import unittest
|
7 | 8 | import webbrowser
|
| 9 | +from functools import partial |
8 | 10 | from test import support
|
9 | 11 | from test.support import import_helper
|
10 | 12 | from test.support import is_apple_mobile
|
@@ -301,6 +303,69 @@ def test_open_new_tab(self):
|
301 | 303 | self._test('open_new_tab')
|
302 | 304 |
|
303 | 305 |
|
| 306 | +class MockPopenPipe: |
| 307 | + def __init__(self, cmd, mode): |
| 308 | + self.cmd = cmd |
| 309 | + self.mode = mode |
| 310 | + self.pipe = io.StringIO() |
| 311 | + self._closed = False |
| 312 | + |
| 313 | + def write(self, buf): |
| 314 | + self.pipe.write(buf) |
| 315 | + |
| 316 | + def close(self): |
| 317 | + self._closed = True |
| 318 | + return None |
| 319 | + |
| 320 | + |
| 321 | +@unittest.skipUnless(sys.platform == "darwin", "macOS specific test") |
| 322 | +@requires_subprocess() |
| 323 | +class MacOSXOSAScriptTest(unittest.TestCase): |
| 324 | + def setUp(self): |
| 325 | + support.patch(self, os, "popen", self.mock_popen) |
| 326 | + self.browser = webbrowser.MacOSXOSAScript("default") |
| 327 | + |
| 328 | + def mock_popen(self, cmd, mode): |
| 329 | + self.popen_pipe = MockPopenPipe(cmd, mode) |
| 330 | + return self.popen_pipe |
| 331 | + |
| 332 | + def test_default(self): |
| 333 | + browser = webbrowser.get() |
| 334 | + assert isinstance(browser, webbrowser.MacOSXOSAScript) |
| 335 | + self.assertEqual(browser.name, "default") |
| 336 | + |
| 337 | + def test_default_open(self): |
| 338 | + url = "https://python.org" |
| 339 | + self.browser.open(url) |
| 340 | + self.assertTrue(self.popen_pipe._closed) |
| 341 | + self.assertEqual(self.popen_pipe.cmd, "osascript") |
| 342 | + script = self.popen_pipe.pipe.getvalue() |
| 343 | + self.assertEqual(script.strip(), f'open location "{url}"') |
| 344 | + |
| 345 | + def test_url_quote(self): |
| 346 | + self.browser.open('https://python.org/"quote"') |
| 347 | + script = self.popen_pipe.pipe.getvalue() |
| 348 | + self.assertEqual( |
| 349 | + script.strip(), 'open location "https://python.org/%22quote%22"' |
| 350 | + ) |
| 351 | + |
| 352 | + def test_default_browser_lookup(self): |
| 353 | + url = "file:///tmp/some-file.html" |
| 354 | + self.browser.open(url) |
| 355 | + script = self.popen_pipe.pipe.getvalue() |
| 356 | + # doesn't actually test the browser lookup works, |
| 357 | + # just that the branch is taken |
| 358 | + self.assertIn("URLForApplicationToOpenURL", script) |
| 359 | + self.assertIn(f'open location "{url}"', script) |
| 360 | + |
| 361 | + def test_explicit_browser(self): |
| 362 | + browser = webbrowser.MacOSXOSAScript("safari") |
| 363 | + browser.open("https://python.org") |
| 364 | + script = self.popen_pipe.pipe.getvalue() |
| 365 | + self.assertIn('tell application "safari"', script) |
| 366 | + self.assertIn('open location "https://python.org"', script) |
| 367 | + |
| 368 | + |
304 | 369 | class BrowserRegistrationTest(unittest.TestCase):
|
305 | 370 |
|
306 | 371 | def setUp(self):
|
|
0 commit comments