test_path.py
369 lines
| 11.0 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r1617 | # encoding: utf-8 | ||
Brian Granger
|
r2498 | """Tests for IPython.utils.path.py""" | ||
Brian Granger
|
r1617 | |||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2008 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
Fernando Perez
|
r1843 | import os | ||
import shutil | ||||
import sys | ||||
import tempfile | ||||
Jorgen Stenarson
|
r1751 | |||
Jorgen Stenarson
|
r1801 | from os.path import join, abspath, split | ||
Fernando Perez
|
r1843 | |||
Jorgen Stenarson
|
r1802 | import nose.tools as nt | ||
Brian Granger
|
r1617 | |||
Fernando Perez
|
r1843 | from nose import with_setup | ||
Brian Granger
|
r1617 | |||
Fernando Perez
|
r1843 | import IPython | ||
Fernando Perez
|
r2436 | from IPython.testing import decorators as dec | ||
bgranger
|
r2513 | from IPython.testing.decorators import skip_if_not_win32, skip_win32 | ||
Brian Granger
|
r2505 | from IPython.utils import path | ||
Fernando Perez
|
r1843 | |||
# Platform-dependent imports | ||||
Jorgen Stenarson
|
r1750 | try: | ||
import _winreg as wreg | ||||
except ImportError: | ||||
Jorgen Stenarson
|
r1793 | #Fake _winreg module on none windows platforms | ||
import new | ||||
Jorgen Stenarson
|
r1796 | sys.modules["_winreg"] = new.module("_winreg") | ||
Jorgen Stenarson
|
r1793 | import _winreg as wreg | ||
#Add entries that needs to be stubbed by the testing code | ||||
(wreg.OpenKey, wreg.QueryValueEx,) = (None, None) | ||||
Jorgen Stenarson
|
r1750 | |||
Fernando Perez
|
r1843 | #----------------------------------------------------------------------------- | ||
# Globals | ||||
#----------------------------------------------------------------------------- | ||||
env = os.environ | ||||
TEST_FILE_PATH = split(abspath(__file__))[0] | ||||
TMP_TEST_DIR = tempfile.mkdtemp() | ||||
HOME_TEST_DIR = join(TMP_TEST_DIR, "home_test_dir") | ||||
MinRK
|
r3347 | XDG_TEST_DIR = join(HOME_TEST_DIR, "xdg_test_dir") | ||
Fernando Perez
|
r2449 | IP_TEST_DIR = join(HOME_TEST_DIR,'.ipython') | ||
Jorgen Stenarson
|
r1804 | # | ||
# Setup/teardown functions/decorators | ||||
Jorgen Stenarson
|
r1803 | # | ||
def setup(): | ||||
Jorgen Stenarson
|
r1805 | """Setup testenvironment for the module: | ||
- Adds dummy home dir tree | ||||
""" | ||||
Fernando Perez
|
r1843 | # Do not mask exceptions here. In particular, catching WindowsError is a | ||
# problem because that exception is only defined on Windows... | ||||
os.makedirs(IP_TEST_DIR) | ||||
MinRK
|
r3347 | os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython')) | ||
Jorgen Stenarson
|
r1803 | |||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1803 | def teardown(): | ||
Jorgen Stenarson
|
r1805 | """Teardown testenvironment for the module: | ||
- Remove dummy home dir tree | ||||
""" | ||||
Fernando Perez
|
r1843 | # Note: we remove the parent test dir, which is the root of all test | ||
# subdirs we may have created. Use shutil instead of os.removedirs, so | ||||
# that non-empty directories are all recursively removed. | ||||
shutil.rmtree(TMP_TEST_DIR) | ||||
Jorgen Stenarson
|
r1803 | |||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1750 | def setup_environment(): | ||
Jorgen Stenarson
|
r1805 | """Setup testenvironment for some functions that are tested | ||
in this module. In particular this functions stores attributes | ||||
and other things that we need to stub in some test functions. | ||||
This needs to be done on a function level and not module level because | ||||
each testfunction needs a pristine environment. | ||||
""" | ||||
Jorgen Stenarson
|
r1750 | global oldstuff, platformstuff | ||
Brian Granger
|
r2505 | oldstuff = (env.copy(), os.name, path.get_home_dir, IPython.__file__) | ||
Jorgen Stenarson
|
r1750 | |||
Jorgen Stenarson
|
r1796 | if os.name == 'nt': | ||
platformstuff = (wreg.OpenKey, wreg.QueryValueEx,) | ||||
Jorgen Stenarson
|
r1750 | |||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1750 | def teardown_environment(): | ||
Jorgen Stenarson
|
r1805 | """Restore things that were remebered by the setup_environment function | ||
""" | ||||
MinRK
|
r3896 | (oldenv, os.name, path.get_home_dir, IPython.__file__,) = oldstuff | ||
Fernando Perez
|
r2449 | |||
Jorgen Stenarson
|
r1750 | for key in env.keys(): | ||
if key not in oldenv: | ||||
del env[key] | ||||
env.update(oldenv) | ||||
if hasattr(sys, 'frozen'): | ||||
del sys.frozen | ||||
Jorgen Stenarson
|
r1796 | if os.name == 'nt': | ||
(wreg.OpenKey, wreg.QueryValueEx,) = platformstuff | ||||
Jorgen Stenarson
|
r1750 | |||
Jorgen Stenarson
|
r1805 | # Build decorator that uses the setup_environment/setup_environment | ||
Fernando Perez
|
r2436 | with_environment = with_setup(setup_environment, teardown_environment) | ||
Jorgen Stenarson
|
r1750 | |||
Jorgen Stenarson
|
r1804 | |||
Jorgen Stenarson
|
r1820 | @skip_if_not_win32 | ||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1745 | def test_get_home_dir_1(): | ||
Jorgen Stenarson
|
r1746 | """Testcase for py2exe logic, un-compressed lib | ||
""" | ||||
Jorgen Stenarson
|
r1796 | sys.frozen = True | ||
Jorgen Stenarson
|
r1746 | |||
#fake filename for IPython.__init__ | ||||
Jorgen Stenarson
|
r1855 | IPython.__file__ = abspath(join(HOME_TEST_DIR, "Lib/IPython/__init__.py")) | ||
Jorgen Stenarson
|
r1746 | |||
bgranger
|
r2513 | home_dir = path.get_home_dir() | ||
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | ||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1812 | @skip_if_not_win32 | ||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_2(): | ||
Jorgen Stenarson
|
r1746 | """Testcase for py2exe logic, compressed lib | ||
""" | ||||
Jorgen Stenarson
|
r1801 | sys.frozen = True | ||
Jorgen Stenarson
|
r1746 | #fake filename for IPython.__init__ | ||
Jorgen Stenarson
|
r1855 | IPython.__file__ = abspath(join(HOME_TEST_DIR, "Library.zip/IPython/__init__.py")).lower() | ||
Jorgen Stenarson
|
r1746 | |||
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | ||
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR).lower()) | ||
Jorgen Stenarson
|
r1746 | |||
Brian Granger
|
r2505 | |||
Fernando Perez
|
r2436 | @with_environment | ||
bgranger
|
r2513 | @skip_win32 | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_3(): | ||
Jorgen Stenarson
|
r1746 | """Testcase $HOME is set, then use its value as home directory.""" | ||
Fernando Perez
|
r1843 | env["HOME"] = HOME_TEST_DIR | ||
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | ||
Jorgen Stenarson
|
r1802 | nt.assert_equal(home_dir, env["HOME"]) | ||
Jorgen Stenarson
|
r1745 | |||
Brian Granger
|
r2505 | |||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_4(): | ||
Brian Granger
|
r2505 | """Testcase $HOME is not set, os=='posix'. | ||
Jorgen Stenarson
|
r1746 | This should fail with HomeDirError""" | ||
Jorgen Stenarson
|
r1796 | os.name = 'posix' | ||
Jorgen Stenarson
|
r1812 | if 'HOME' in env: del env['HOME'] | ||
Brian Granger
|
r2505 | nt.assert_raises(path.HomeDirError, path.get_home_dir) | ||
Jorgen Stenarson
|
r1820 | @skip_if_not_win32 | ||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_5(): | ||
bgranger
|
r2513 | """Using HOMEDRIVE + HOMEPATH, os=='nt'. | ||
HOMESHARE is missing. | ||||
""" | ||||
Jorgen Stenarson
|
r1812 | |||
Jorgen Stenarson
|
r1796 | os.name = 'nt' | ||
bgranger
|
r2513 | env.pop('HOMESHARE', None) | ||
Jorgen Stenarson
|
r1855 | env['HOMEDRIVE'], env['HOMEPATH'] = os.path.splitdrive(HOME_TEST_DIR) | ||
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | ||
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | ||
Jorgen Stenarson
|
r1746 | |||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1820 | @skip_if_not_win32 | ||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_6(): | ||
bgranger
|
r2513 | """Using USERPROFILE, os=='nt'. | ||
HOMESHARE, HOMEDRIVE, HOMEPATH are missing. | ||||
Jorgen Stenarson
|
r1746 | """ | ||
Jorgen Stenarson
|
r1750 | |||
Jorgen Stenarson
|
r1796 | os.name = 'nt' | ||
bgranger
|
r2513 | env.pop('HOMESHARE', None) | ||
env.pop('HOMEDRIVE', None) | ||||
env.pop('HOMEPATH', None) | ||||
Fernando Perez
|
r1843 | env["USERPROFILE"] = abspath(HOME_TEST_DIR) | ||
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | ||
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | ||
Jorgen Stenarson
|
r1746 | |||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1812 | @skip_if_not_win32 | ||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_7(): | ||
bgranger
|
r2513 | """Using HOMESHARE, os=='nt'.""" | ||
os.name = 'nt' | ||||
env["HOMESHARE"] = abspath(HOME_TEST_DIR) | ||||
home_dir = path.get_home_dir() | ||||
nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | ||||
Fernando Perez
|
r3373 | |||
bgranger
|
r2513 | |||
# Should we stub wreg fully so we can run the test on all platforms? | ||||
@skip_if_not_win32 | ||||
@with_environment | ||||
def test_get_home_dir_8(): | ||||
"""Using registry hack for 'My Documents', os=='nt' | ||||
Fernando Perez
|
r2447 | |||
bgranger
|
r2513 | HOMESHARE, HOMEDRIVE, HOMEPATH, USERPROFILE and others are missing. | ||
Jorgen Stenarson
|
r1746 | """ | ||
Jorgen Stenarson
|
r1796 | os.name = 'nt' | ||
Fernando Perez
|
r2447 | # Remove from stub environment all keys that may be set | ||
for key in ['HOME', 'HOMESHARE', 'HOMEDRIVE', 'HOMEPATH', 'USERPROFILE']: | ||||
env.pop(key, None) | ||||
Jorgen Stenarson
|
r1746 | |||
#Stub windows registry functions | ||||
Jorgen Stenarson
|
r1796 | def OpenKey(x, y): | ||
Jorgen Stenarson
|
r1746 | class key: | ||
def Close(self): | ||||
pass | ||||
return key() | ||||
Jorgen Stenarson
|
r1796 | def QueryValueEx(x, y): | ||
Fernando Perez
|
r1843 | return [abspath(HOME_TEST_DIR)] | ||
Jorgen Stenarson
|
r1746 | |||
Jorgen Stenarson
|
r1796 | wreg.OpenKey = OpenKey | ||
wreg.QueryValueEx = QueryValueEx | ||||
Jorgen Stenarson
|
r1746 | |||
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | ||
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | ||
Jorgen Stenarson
|
r1745 | |||
Jorgen Stenarson
|
r1750 | |||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1749 | def test_get_ipython_dir_1(): | ||
Jorgen Stenarson
|
r1805 | """test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions.""" | ||
Fernando Perez
|
r2447 | env['IPYTHON_DIR'] = "someplace/.ipython" | ||
Brian Granger
|
r2505 | ipdir = path.get_ipython_dir() | ||
Fernando Perez
|
r2392 | nt.assert_equal(ipdir, "someplace/.ipython") | ||
Jorgen Stenarson
|
r1749 | |||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_ipython_dir_2(): | ||
Jorgen Stenarson
|
r1805 | """test_get_ipython_dir_2, Testcase to see if we can call get_ipython_dir without Exceptions.""" | ||
Brian Granger
|
r2505 | path.get_home_dir = lambda : "someplace" | ||
Jorgen Stenarson
|
r1796 | os.name = "posix" | ||
Fernando Perez
|
r2449 | env.pop('IPYTHON_DIR', None) | ||
env.pop('IPYTHONDIR', None) | ||||
MinRK
|
r3347 | env.pop('XDG_CONFIG_HOME', None) | ||
Brian Granger
|
r2505 | ipdir = path.get_ipython_dir() | ||
Fernando Perez
|
r2392 | nt.assert_equal(ipdir, os.path.join("someplace", ".ipython")) | ||
Jorgen Stenarson
|
r1749 | |||
MinRK
|
r3347 | @with_environment | ||
def test_get_ipython_dir_3(): | ||||
"""test_get_ipython_dir_3, use XDG if defined, and .ipython doesn't exist.""" | ||||
path.get_home_dir = lambda : "someplace" | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | ||||
ipdir = path.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join(XDG_TEST_DIR, "ipython")) | ||||
@with_environment | ||||
def test_get_ipython_dir_4(): | ||||
"""test_get_ipython_dir_4, use XDG if both exist.""" | ||||
path.get_home_dir = lambda : HOME_TEST_DIR | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | ||||
xdg_ipdir = os.path.join(XDG_TEST_DIR, "ipython") | ||||
ipdir = path.get_ipython_dir() | ||||
nt.assert_equal(ipdir, xdg_ipdir) | ||||
@with_environment | ||||
def test_get_ipython_dir_5(): | ||||
"""test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist.""" | ||||
MinRK
|
r3896 | path.get_home_dir = lambda : HOME_TEST_DIR | ||
MinRK
|
r3347 | os.name = "posix" | ||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | ||||
os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython')) | ||||
ipdir = path.get_ipython_dir() | ||||
nt.assert_equal(ipdir, IP_TEST_DIR) | ||||
@with_environment | ||||
def test_get_ipython_dir_6(): | ||||
"""test_get_ipython_dir_6, use XDG if defined and neither exist.""" | ||||
path.get_home_dir = lambda : 'somehome' | ||||
path.get_xdg_dir = lambda : 'somexdg' | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
xdg_ipdir = os.path.join("somexdg", "ipython") | ||||
ipdir = path.get_ipython_dir() | ||||
nt.assert_equal(ipdir, xdg_ipdir) | ||||
@with_environment | ||||
MinRK
|
r3896 | def test_get_ipython_dir_7(): | ||
"""test_get_ipython_dir_7, test home directory expansion on IPYTHON_DIR""" | ||||
home_dir = os.path.expanduser('~/') | ||||
env['IPYTHON_DIR'] = '~/somewhere' | ||||
ipdir = path.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join(home_dir, 'somewhere')) | ||||
@with_environment | ||||
MinRK
|
r3347 | def test_get_xdg_dir_1(): | ||
"""test_get_xdg_dir_1, check xdg_dir""" | ||||
reload(path) | ||||
path.get_home_dir = lambda : 'somewhere' | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
nt.assert_equal(path.get_xdg_dir(), os.path.join('somewhere', '.config')) | ||||
@with_environment | ||||
def test_get_xdg_dir_1(): | ||||
"""test_get_xdg_dir_1, check nonexistant xdg_dir""" | ||||
reload(path) | ||||
path.get_home_dir = lambda : HOME_TEST_DIR | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
nt.assert_equal(path.get_xdg_dir(), None) | ||||
@with_environment | ||||
def test_get_xdg_dir_2(): | ||||
"""test_get_xdg_dir_2, check xdg_dir default to ~/.config""" | ||||
reload(path) | ||||
path.get_home_dir = lambda : HOME_TEST_DIR | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
cfgdir=os.path.join(path.get_home_dir(), '.config') | ||||
os.makedirs(cfgdir) | ||||
nt.assert_equal(path.get_xdg_dir(), cfgdir) | ||||
Fernando Perez
|
r1969 | |||
def test_filefind(): | ||||
"""Various tests for filefind""" | ||||
f = tempfile.NamedTemporaryFile() | ||||
Brian Granger
|
r2505 | # print 'fname:',f.name | ||
alt_dirs = path.get_ipython_dir() | ||||
t = path.filefind(f.name, alt_dirs) | ||||
# print 'found:',t | ||||
Fernando Perez
|
r2357 | |||
def test_get_ipython_package_dir(): | ||||
Brian Granger
|
r2505 | ipdir = path.get_ipython_package_dir() | ||
Fernando Perez
|
r2357 | nt.assert_true(os.path.isdir(ipdir)) | ||
Fernando Perez
|
r2436 | |||
Brian Granger
|
r2505 | |||
Brian Granger
|
r2498 | def test_get_ipython_module_path(): | ||
Brian Granger
|
r2760 | ipapp_path = path.get_ipython_module_path('IPython.frontend.terminal.ipapp') | ||
Brian Granger
|
r2498 | nt.assert_true(os.path.isfile(ipapp_path)) | ||
Fernando Perez
|
r2436 | |||
Brian Granger
|
r2505 | |||
Brian Granger
|
r2498 | @dec.skip_if_not_win32 | ||
def test_get_long_path_name_win32(): | ||||
Brian Granger
|
r2505 | p = path.get_long_path_name('c:\\docume~1') | ||
Brian Granger
|
r2498 | nt.assert_equals(p,u'c:\\Documents and Settings') | ||
Fernando Perez
|
r2436 | |||
Brian Granger
|
r2505 | |||
Brian Granger
|
r2498 | @dec.skip_win32 | ||
def test_get_long_path_name(): | ||||
Brian Granger
|
r2505 | p = path.get_long_path_name('/usr/local') | ||
Brian Granger
|
r2498 | nt.assert_equals(p,'/usr/local') | ||
Fernando Perez
|
r2436 | |||