test_completerlib.py
193 lines
| 6.4 KiB
| text/x-python
|
PythonLexer
Jörgen Stenarson
|
r5688 | # -*- coding: utf-8 -*- | ||
"""Tests for completerlib. | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import os | ||||
import shutil | ||||
import sys | ||||
import tempfile | ||||
import unittest | ||||
from os.path import join | ||||
Matthias Bussonnier
|
r27509 | from tempfile import TemporaryDirectory | ||
Wei Yen
|
r24419 | from IPython.core.completerlib import magic_run_completer, module_completion, try_import | ||
Thomas Kluyver
|
r12168 | from IPython.testing.decorators import onlyif_unicode_paths | ||
Jörgen Stenarson
|
r5688 | |||
class MockEvent(object): | ||||
def __init__(self, line): | ||||
self.line = line | ||||
#----------------------------------------------------------------------------- | ||||
# Test functions begin | ||||
#----------------------------------------------------------------------------- | ||||
class Test_magic_run_completer(unittest.TestCase): | ||||
Thomas Kluyver
|
r14814 | files = [u"aao.py", u"a.py", u"b.py", u"aao.txt"] | ||
Thomas Kluyver
|
r14818 | dirs = [u"adir/", "bdir/"] | ||
Thomas Kluyver
|
r14814 | |||
Jörgen Stenarson
|
r5688 | def setUp(self): | ||
self.BASETESTDIR = tempfile.mkdtemp() | ||||
Thomas Kluyver
|
r14814 | for fil in self.files: | ||
gousaiyang
|
r27495 | with open(join(self.BASETESTDIR, fil), "w", encoding="utf-8") as sfile: | ||
Jörgen Stenarson
|
r5688 | sfile.write("pass\n") | ||
Thomas Kluyver
|
r14817 | for d in self.dirs: | ||
os.mkdir(join(self.BASETESTDIR, d)) | ||||
Srinivas Reddy Thatiparthy
|
r23045 | self.oldpath = os.getcwd() | ||
Jörgen Stenarson
|
r5688 | os.chdir(self.BASETESTDIR) | ||
def tearDown(self): | ||||
os.chdir(self.oldpath) | ||||
shutil.rmtree(self.BASETESTDIR) | ||||
def test_1(self): | ||||
Min ho Kim
|
r25167 | """Test magic_run_completer, should match two alternatives | ||
Jörgen Stenarson
|
r5688 | """ | ||
event = MockEvent(u"%run a") | ||||
mockself = None | ||||
MinRK
|
r5692 | match = set(magic_run_completer(mockself, event)) | ||
Thomas Kluyver
|
r14817 | self.assertEqual(match, {u"a.py", u"aao.py", u"adir/"}) | ||
Jörgen Stenarson
|
r5688 | |||
def test_2(self): | ||||
Min ho Kim
|
r25167 | """Test magic_run_completer, should match one alternative | ||
Jörgen Stenarson
|
r5688 | """ | ||
event = MockEvent(u"%run aa") | ||||
mockself = None | ||||
MinRK
|
r5692 | match = set(magic_run_completer(mockself, event)) | ||
Rémy Léone
|
r21804 | self.assertEqual(match, {u"aao.py"}) | ||
Min RK
|
r5690 | |||
def test_3(self): | ||||
MinRK
|
r5692 | """Test magic_run_completer with unterminated " """ | ||
Min RK
|
r5690 | event = MockEvent(u'%run "a') | ||
mockself = None | ||||
MinRK
|
r5692 | match = set(magic_run_completer(mockself, event)) | ||
Thomas Kluyver
|
r14817 | self.assertEqual(match, {u"a.py", u"aao.py", u"adir/"}) | ||
Min RK
|
r5690 | |||
Thomas Kluyver
|
r14814 | def test_completion_more_args(self): | ||
event = MockEvent(u'%run a.py ') | ||||
match = set(magic_run_completer(None, event)) | ||||
Thomas Kluyver
|
r14817 | self.assertEqual(match, set(self.files + self.dirs)) | ||
Thomas Kluyver
|
r14814 | |||
Thomas Kluyver
|
r14813 | def test_completion_in_dir(self): | ||
# Github issue #3459 | ||||
event = MockEvent(u'%run a.py {}'.format(join(self.BASETESTDIR, 'a'))) | ||||
print(repr(event.line)) | ||||
match = set(magic_run_completer(None, event)) | ||||
Thomas Kluyver
|
r14849 | # We specifically use replace here rather than normpath, because | ||
# at one point there were duplicates 'adir' and 'adir/', and normpath | ||||
# would hide the failure for that. | ||||
self.assertEqual(match, {join(self.BASETESTDIR, f).replace('\\','/') | ||||
for f in (u'a.py', u'aao.py', u'aao.txt', u'adir/')}) | ||||
Thomas Kluyver
|
r12168 | |||
class Test_magic_run_completer_nonascii(unittest.TestCase): | ||||
@onlyif_unicode_paths | ||||
def setUp(self): | ||||
self.BASETESTDIR = tempfile.mkdtemp() | ||||
for fil in [u"aaø.py", u"a.py", u"b.py"]: | ||||
gousaiyang
|
r27495 | with open(join(self.BASETESTDIR, fil), "w", encoding="utf-8") as sfile: | ||
Thomas Kluyver
|
r12168 | sfile.write("pass\n") | ||
Srinivas Reddy Thatiparthy
|
r23045 | self.oldpath = os.getcwd() | ||
Thomas Kluyver
|
r12168 | os.chdir(self.BASETESTDIR) | ||
def tearDown(self): | ||||
os.chdir(self.oldpath) | ||||
shutil.rmtree(self.BASETESTDIR) | ||||
@onlyif_unicode_paths | ||||
def test_1(self): | ||||
Min ho Kim
|
r25167 | """Test magic_run_completer, should match two alternatives | ||
Thomas Kluyver
|
r12168 | """ | ||
event = MockEvent(u"%run a") | ||||
mockself = None | ||||
match = set(magic_run_completer(mockself, event)) | ||||
Rémy Léone
|
r21804 | self.assertEqual(match, {u"a.py", u"aaø.py"}) | ||
Thomas Kluyver
|
r12168 | |||
@onlyif_unicode_paths | ||||
def test_2(self): | ||||
Min ho Kim
|
r25167 | """Test magic_run_completer, should match one alternative | ||
Thomas Kluyver
|
r12168 | """ | ||
event = MockEvent(u"%run aa") | ||||
mockself = None | ||||
match = set(magic_run_completer(mockself, event)) | ||||
Rémy Léone
|
r21804 | self.assertEqual(match, {u"aaø.py"}) | ||
Thomas Kluyver
|
r12168 | |||
@onlyif_unicode_paths | ||||
def test_3(self): | ||||
"""Test magic_run_completer with unterminated " """ | ||||
event = MockEvent(u'%run "a') | ||||
mockself = None | ||||
match = set(magic_run_completer(mockself, event)) | ||||
Rémy Léone
|
r21804 | self.assertEqual(match, {u"a.py", u"aaø.py"}) | ||
Thomas Kluyver
|
r14813 | |||
# module_completer: | ||||
def test_import_invalid_module(): | ||||
"""Testing of issue https://github.com/ipython/ipython/issues/1107""" | ||||
Rémy Léone
|
r21804 | invalid_module_names = {'foo-bar', 'foo:bar', '10foo'} | ||
valid_module_names = {'foobar'} | ||||
Thomas Kluyver
|
r14813 | with TemporaryDirectory() as tmpdir: | ||
sys.path.insert( 0, tmpdir ) | ||||
for name in invalid_module_names | valid_module_names: | ||||
gousaiyang
|
r27495 | filename = os.path.join(tmpdir, name + ".py") | ||
open(filename, "w", encoding="utf-8").close() | ||||
Thomas Kluyver
|
r14813 | |||
s = set( module_completion('import foo') ) | ||||
intersection = s.intersection(invalid_module_names) | ||||
Samuel Gaist
|
r26889 | assert intersection == set() | ||
Thomas Kluyver
|
r14813 | |||
assert valid_module_names.issubset(s), valid_module_names.intersection(s) | ||||
Thomas Kluyver
|
r22618 | |||
def test_bad_module_all(): | ||||
"""Test module with invalid __all__ | ||||
https://github.com/ipython/ipython/issues/9678 | ||||
""" | ||||
testsdir = os.path.dirname(__file__) | ||||
sys.path.insert(0, testsdir) | ||||
try: | ||||
Samuel Gaist
|
r26889 | results = module_completion("from bad_all import ") | ||
assert "puppies" in results | ||||
Thomas Kluyver
|
r22618 | for r in results: | ||
Samuel Gaist
|
r26889 | assert isinstance(r, str) | ||
Daniel Shimon
|
r26670 | |||
# bad_all doesn't contain submodules, but this completion | ||||
# should finish without raising an exception: | ||||
results = module_completion("import bad_all.") | ||||
Samuel Gaist
|
r26889 | assert results == [] | ||
Thomas Kluyver
|
r22618 | finally: | ||
sys.path.remove(testsdir) | ||||
Wei Yen
|
r24419 | |||
def test_module_without_init(): | ||||
""" | ||||
Test module without __init__.py. | ||||
https://github.com/ipython/ipython/issues/11226 | ||||
""" | ||||
fake_module_name = "foo" | ||||
with TemporaryDirectory() as tmpdir: | ||||
sys.path.insert(0, tmpdir) | ||||
Wei Yen
|
r24421 | try: | ||
os.makedirs(os.path.join(tmpdir, fake_module_name)) | ||||
s = try_import(mod=fake_module_name) | ||||
Matthias Bussonnier
|
r28165 | assert s == [], f"for module {fake_module_name}" | ||
Wei Yen
|
r24421 | finally: | ||
sys.path.remove(tmpdir) | ||||
Daniel Shimon
|
r26670 | |||
def test_valid_exported_submodules(): | ||||
""" | ||||
Test checking exported (__all__) objects are submodules | ||||
""" | ||||
results = module_completion("import os.pa") | ||||
# ensure we get a valid submodule: | ||||
Samuel Gaist
|
r26889 | assert "os.path" in results | ||
Daniel Shimon
|
r26670 | # ensure we don't get objects that aren't submodules: | ||
Samuel Gaist
|
r26889 | assert "os.pathconf" not in results | ||