##// END OF EJS Templates
skip Python 2.6 in test_profile...
MinRK -
Show More
@@ -1,166 +1,167 b''
1 # coding: utf-8
1 # coding: utf-8
2 """Tests for profile-related functions.
2 """Tests for profile-related functions.
3
3
4 Currently only the startup-dir functionality is tested, but more tests should
4 Currently only the startup-dir functionality is tested, but more tests should
5 be added for:
5 be added for:
6
6
7 * ipython profile create
7 * ipython profile create
8 * ipython profile list
8 * ipython profile list
9 * ipython profile create --parallel
9 * ipython profile create --parallel
10 * security dir permissions
10 * security dir permissions
11
11
12 Authors
12 Authors
13 -------
13 -------
14
14
15 * MinRK
15 * MinRK
16
16
17 """
17 """
18 from __future__ import absolute_import
18 from __future__ import absolute_import
19
19
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21 # Imports
21 # Imports
22 #-----------------------------------------------------------------------------
22 #-----------------------------------------------------------------------------
23
23
24 import os
24 import os
25 import shutil
25 import shutil
26 import sys
26 import sys
27 import tempfile
27 import tempfile
28
28
29 from subprocess import check_output
30 from unittest import TestCase
29 from unittest import TestCase
31
30
32 import nose.tools as nt
31 import nose.tools as nt
33
32
34 from IPython.core.profileapp import list_profiles_in, list_bundled_profiles
33 from IPython.core.profileapp import list_profiles_in, list_bundled_profiles
35 from IPython.core.profiledir import ProfileDir
34 from IPython.core.profiledir import ProfileDir
36
35
37 from IPython.testing import decorators as dec
36 from IPython.testing import decorators as dec
38 from IPython.testing import tools as tt
37 from IPython.testing import tools as tt
39 from IPython.utils import py3compat
38 from IPython.utils import py3compat
40 from IPython.utils.tempdir import TemporaryDirectory
39 from IPython.utils.tempdir import TemporaryDirectory
41
40
42 #-----------------------------------------------------------------------------
41 #-----------------------------------------------------------------------------
43 # Globals
42 # Globals
44 #-----------------------------------------------------------------------------
43 #-----------------------------------------------------------------------------
45 TMP_TEST_DIR = tempfile.mkdtemp()
44 TMP_TEST_DIR = tempfile.mkdtemp()
46 HOME_TEST_DIR = os.path.join(TMP_TEST_DIR, "home_test_dir")
45 HOME_TEST_DIR = os.path.join(TMP_TEST_DIR, "home_test_dir")
47 IP_TEST_DIR = os.path.join(HOME_TEST_DIR,'.ipython')
46 IP_TEST_DIR = os.path.join(HOME_TEST_DIR,'.ipython')
48
47
49 #
48 #
50 # Setup/teardown functions/decorators
49 # Setup/teardown functions/decorators
51 #
50 #
52
51
53 def setup():
52 def setup():
54 """Setup test environment for the module:
53 """Setup test environment for the module:
55
54
56 - Adds dummy home dir tree
55 - Adds dummy home dir tree
57 """
56 """
58 # Do not mask exceptions here. In particular, catching WindowsError is a
57 # Do not mask exceptions here. In particular, catching WindowsError is a
59 # problem because that exception is only defined on Windows...
58 # problem because that exception is only defined on Windows...
60 os.makedirs(IP_TEST_DIR)
59 os.makedirs(IP_TEST_DIR)
61
60
62
61
63 def teardown():
62 def teardown():
64 """Teardown test environment for the module:
63 """Teardown test environment for the module:
65
64
66 - Remove dummy home dir tree
65 - Remove dummy home dir tree
67 """
66 """
68 # Note: we remove the parent test dir, which is the root of all test
67 # Note: we remove the parent test dir, which is the root of all test
69 # subdirs we may have created. Use shutil instead of os.removedirs, so
68 # subdirs we may have created. Use shutil instead of os.removedirs, so
70 # that non-empty directories are all recursively removed.
69 # that non-empty directories are all recursively removed.
71 shutil.rmtree(TMP_TEST_DIR)
70 shutil.rmtree(TMP_TEST_DIR)
72
71
73
72
74 #-----------------------------------------------------------------------------
73 #-----------------------------------------------------------------------------
75 # Test functions
74 # Test functions
76 #-----------------------------------------------------------------------------
75 #-----------------------------------------------------------------------------
77 def win32_without_pywin32():
76 def win32_without_pywin32():
78 if sys.platform == 'win32':
77 if sys.platform == 'win32':
79 try:
78 try:
80 import pywin32
79 import pywin32
81 except ImportError:
80 except ImportError:
82 return True
81 return True
83 return False
82 return False
84
83
85
84
86 class ProfileStartupTest(TestCase):
85 class ProfileStartupTest(TestCase):
87 def setUp(self):
86 def setUp(self):
88 # create profile dir
87 # create profile dir
89 self.pd = ProfileDir.create_profile_dir_by_name(IP_TEST_DIR, 'test')
88 self.pd = ProfileDir.create_profile_dir_by_name(IP_TEST_DIR, 'test')
90 self.options = ['--ipython-dir', IP_TEST_DIR, '--profile', 'test']
89 self.options = ['--ipython-dir', IP_TEST_DIR, '--profile', 'test']
91 self.fname = os.path.join(TMP_TEST_DIR, 'test.py')
90 self.fname = os.path.join(TMP_TEST_DIR, 'test.py')
92
91
93 def tearDown(self):
92 def tearDown(self):
94 # We must remove this profile right away so its presence doesn't
93 # We must remove this profile right away so its presence doesn't
95 # confuse other tests.
94 # confuse other tests.
96 shutil.rmtree(self.pd.location)
95 shutil.rmtree(self.pd.location)
97
96
98 def init(self, startup_file, startup, test):
97 def init(self, startup_file, startup, test):
99 # write startup python file
98 # write startup python file
100 with open(os.path.join(self.pd.startup_dir, startup_file), 'w') as f:
99 with open(os.path.join(self.pd.startup_dir, startup_file), 'w') as f:
101 f.write(startup)
100 f.write(startup)
102 # write simple test file, to check that the startup file was run
101 # write simple test file, to check that the startup file was run
103 with open(self.fname, 'w') as f:
102 with open(self.fname, 'w') as f:
104 f.write(py3compat.doctest_refactor_print(test))
103 f.write(py3compat.doctest_refactor_print(test))
105
104
106 def validate(self, output):
105 def validate(self, output):
107 tt.ipexec_validate(self.fname, output, '', options=self.options)
106 tt.ipexec_validate(self.fname, output, '', options=self.options)
108
107
109 @dec.skipif(win32_without_pywin32(), "Test requires pywin32 on Windows")
108 @dec.skipif(win32_without_pywin32(), "Test requires pywin32 on Windows")
110 def test_startup_py(self):
109 def test_startup_py(self):
111 self.init('00-start.py', 'zzz=123\n',
110 self.init('00-start.py', 'zzz=123\n',
112 py3compat.doctest_refactor_print('print zzz\n'))
111 py3compat.doctest_refactor_print('print zzz\n'))
113 self.validate('123')
112 self.validate('123')
114
113
115 @dec.skipif(win32_without_pywin32(), "Test requires pywin32 on Windows")
114 @dec.skipif(win32_without_pywin32(), "Test requires pywin32 on Windows")
116 def test_startup_ipy(self):
115 def test_startup_ipy(self):
117 self.init('00-start.ipy', '%profile\n', '')
116 self.init('00-start.ipy', '%profile\n', '')
118 self.validate('test')
117 self.validate('test')
119
118
120
119
121 def test_list_profiles_in():
120 def test_list_profiles_in():
122 # No need to remove these directories and files, as they will get nuked in
121 # No need to remove these directories and files, as they will get nuked in
123 # the module-level teardown.
122 # the module-level teardown.
124 td = tempfile.mkdtemp(dir=TMP_TEST_DIR)
123 td = tempfile.mkdtemp(dir=TMP_TEST_DIR)
125 td = py3compat.str_to_unicode(td)
124 td = py3compat.str_to_unicode(td)
126 for name in ('profile_foo', 'profile_hello', 'not_a_profile'):
125 for name in ('profile_foo', 'profile_hello', 'not_a_profile'):
127 os.mkdir(os.path.join(td, name))
126 os.mkdir(os.path.join(td, name))
128 if dec.unicode_paths:
127 if dec.unicode_paths:
129 os.mkdir(os.path.join(td, u'profile_ΓΌnicode'))
128 os.mkdir(os.path.join(td, u'profile_ΓΌnicode'))
130
129
131 with open(os.path.join(td, 'profile_file'), 'w') as f:
130 with open(os.path.join(td, 'profile_file'), 'w') as f:
132 f.write("I am not a profile directory")
131 f.write("I am not a profile directory")
133 profiles = list_profiles_in(td)
132 profiles = list_profiles_in(td)
134
133
135 # unicode normalization can turn u'ΓΌnicode' into u'u\0308nicode',
134 # unicode normalization can turn u'ΓΌnicode' into u'u\0308nicode',
136 # so only check for *nicode, and that creating a ProfileDir from the
135 # so only check for *nicode, and that creating a ProfileDir from the
137 # name remains valid
136 # name remains valid
138 found_unicode = False
137 found_unicode = False
139 for p in list(profiles):
138 for p in list(profiles):
140 if p.endswith('nicode'):
139 if p.endswith('nicode'):
141 pd = ProfileDir.find_profile_dir_by_name(td, p)
140 pd = ProfileDir.find_profile_dir_by_name(td, p)
142 profiles.remove(p)
141 profiles.remove(p)
143 found_unicode = True
142 found_unicode = True
144 break
143 break
145 if dec.unicode_paths:
144 if dec.unicode_paths:
146 nt.assert_true(found_unicode)
145 nt.assert_true(found_unicode)
147 nt.assert_equal(set(profiles), set(['foo', 'hello']))
146 nt.assert_equal(set(profiles), set(['foo', 'hello']))
148
147
149
148
150 def test_list_bundled_profiles():
149 def test_list_bundled_profiles():
151 # This variable will need to be updated when a new profile gets bundled
150 # This variable will need to be updated when a new profile gets bundled
152 bundled_true = [u'cluster', u'math', u'pysh', u'sympy']
151 bundled_true = [u'cluster', u'math', u'pysh', u'sympy']
153 bundled = sorted(list_bundled_profiles())
152 bundled = sorted(list_bundled_profiles())
154 nt.assert_equal(bundled, bundled_true)
153 nt.assert_equal(bundled, bundled_true)
155
154
156
155
156 @dec.skipif(sys.version_info < (2,7), "python -m doesn't work on 2.6")
157 def test_profile_create_ipython_dir():
157 def test_profile_create_ipython_dir():
158 """ipython profile create respects --ipython-dir"""
158 """ipython profile create respects --ipython-dir"""
159 from subprocess import check_output, STDOUT
159 with TemporaryDirectory() as td:
160 with TemporaryDirectory() as td:
160 check_output([sys.executable, '-m', 'IPython', 'profile', 'create',
161 check_output([sys.executable, '-m', 'IPython', 'profile', 'create',
161 'foo', '--ipython-dir=%s' % td])
162 'foo', '--ipython-dir=%s' % td], stderr=STDOUT)
162 profile_dir = os.path.join(td, 'profile_foo')
163 profile_dir = os.path.join(td, 'profile_foo')
163 assert os.path.exists(profile_dir)
164 assert os.path.exists(profile_dir)
164 ipython_config = os.path.join(profile_dir, 'ipython_config.py')
165 ipython_config = os.path.join(profile_dir, 'ipython_config.py')
165 assert os.path.exists(ipython_config)
166 assert os.path.exists(ipython_config)
166 No newline at end of file
167
General Comments 0
You need to be logged in to leave comments. Login now