summaryrefslogtreecommitdiffstats
path: root/tests/test_init.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_init.py')
-rw-r--r--tests/test_init.py255
1 files changed, 255 insertions, 0 deletions
diff --git a/tests/test_init.py b/tests/test_init.py
new file mode 100644
index 0000000..832343f
--- /dev/null
+++ b/tests/test_init.py
@@ -0,0 +1,255 @@
+import builtins
+from contextlib import contextmanager
+from pathlib import Path
+from tempfile import TemporaryDirectory
+from testpath import assert_isfile
+from unittest.mock import patch
+import pytest
+
+try:
+ import tomllib
+except ImportError:
+ import tomli as tomllib
+
+from flit import init
+
+
+@contextmanager
+def patch_data_dir():
+ with TemporaryDirectory() as td:
+ with patch.object(init, 'get_data_dir', lambda: Path(td)):
+ yield td
+
+def test_store_defaults():
+ with patch_data_dir():
+ assert init.get_defaults() == {}
+ d = {'author': 'Test'}
+ init.store_defaults(d)
+ assert init.get_defaults() == d
+
+def fake_input(entries):
+ it = iter(entries)
+ def inner(prompt):
+ try:
+ return next(it)
+ except StopIteration:
+ raise EOFError
+
+ return inner
+
+def faking_input(entries):
+ return patch.object(builtins, 'input', fake_input(entries))
+
+def test_prompt_options():
+ ti = init.TerminalIniter()
+ with faking_input(['4', '1']):
+ res = ti.prompt_options('Pick one', [('A', 'Apple'), ('B', 'Banana')])
+ assert res == 'A'
+
+ # Test with a default
+ with faking_input(['']):
+ res = ti.prompt_options('Pick one', [('A', 'Apple'), ('B', 'Banana')],
+ default='B')
+ assert res == 'B'
+
+@contextmanager
+def make_dir(files=(), dirs=()):
+ with TemporaryDirectory() as td:
+ tdp = Path(td)
+ for d in dirs:
+ (tdp / d).mkdir()
+ for f in files:
+ (tdp / f).touch()
+ yield td
+
+def test_guess_module_name():
+ with make_dir(['foo.py', 'foo-bar.py', 'test_foo.py', 'setup.py']) as td:
+ ib = init.IniterBase(td)
+ assert ib.guess_module_name() == 'foo'
+
+ with make_dir(['baz/__init__.py', 'tests/__init__.py'], ['baz', 'tests']) as td:
+ ib = init.IniterBase(td)
+ assert ib.guess_module_name() == 'baz'
+
+ with make_dir(['src/foo.py', 'src/foo-bar.py', 'test_foo.py', 'setup.py'],
+ ['src',]) as td:
+ ib = init.IniterBase(td)
+ assert ib.guess_module_name() == 'foo'
+
+ with make_dir(['src/baz/__init__.py', 'tests/__init__.py'], ['src', 'src/baz', 'tests']) as td:
+ ib = init.IniterBase(td)
+ assert ib.guess_module_name() == 'baz'
+
+ with make_dir(['foo.py', 'bar.py']) as td:
+ ib = init.IniterBase(td)
+ assert ib.guess_module_name() is None
+
+ with make_dir(['src/foo.py', 'src/bar.py'], ['src']) as td:
+ ib = init.IniterBase(td)
+ assert ib.guess_module_name() is None
+
+def test_write_license():
+ with TemporaryDirectory() as td:
+ ib = init.IniterBase(td)
+ ib.write_license('mit', 'Thomas Kluyver')
+ assert_isfile(Path(td, 'LICENSE'))
+
+def test_init():
+ responses = ['foo', # Module name
+ 'Test Author', # Author
+ 'test@example.com', # Author email
+ 'http://example.com/', # Home page
+ '1' # License (1 -> MIT)
+ ]
+ with TemporaryDirectory() as td, \
+ patch_data_dir(), \
+ faking_input(responses):
+ ti = init.TerminalIniter(td)
+ ti.initialise()
+
+ generated = Path(td) / 'pyproject.toml'
+ assert_isfile(generated)
+ with generated.open('rb') as f:
+ data = tomllib.load(f)
+ assert data['project']['authors'][0]['email'] == "test@example.com"
+ license = Path(td) / 'LICENSE'
+ assert data['project']['license']['file'] == 'LICENSE'
+ assert_isfile(license)
+ with license.open() as f:
+ license_text = f.read()
+ assert license_text.startswith("The MIT License (MIT)")
+ assert "{year}" not in license_text
+ assert "Test Author" in license_text
+
+def test_init_homepage_and_license_are_optional():
+ responses = ['test_module_name',
+ 'Test Author',
+ 'test_email@example.com',
+ '', # Home page omitted
+ '4', # Skip - choose a license later
+ ]
+ with TemporaryDirectory() as td, \
+ patch_data_dir(), \
+ faking_input(responses):
+ ti = init.TerminalIniter(td)
+ ti.initialise()
+ with Path(td, 'pyproject.toml').open('rb') as f:
+ data = tomllib.load(f)
+ assert not Path(td, 'LICENSE').exists()
+ assert data['project'] == {
+ 'authors': [{'name': 'Test Author', 'email': 'test_email@example.com'}],
+ 'name': 'test_module_name',
+ 'dynamic': ['version', 'description'],
+ }
+
+def test_init_homepage_validator():
+ responses = ['test_module_name',
+ 'Test Author',
+ 'test_email@example.com',
+ 'www.uh-oh-spagghetti-o.com', # fails validation
+ 'https://www.example.org', # passes
+ '4', # Skip - choose a license later
+ ]
+ with TemporaryDirectory() as td, \
+ patch_data_dir(), \
+ faking_input(responses):
+ ti = init.TerminalIniter(td)
+ ti.initialise()
+ with Path(td, 'pyproject.toml').open('rb') as f:
+ data = tomllib.load(f)
+ assert data['project'] == {
+ 'authors': [{'name': 'Test Author', 'email': 'test_email@example.com'}],
+ 'name': 'test_module_name',
+ 'urls': {'Home': 'https://www.example.org'},
+ 'dynamic': ['version', 'description'],
+ }
+
+def test_author_email_field_is_optional():
+ responses = ['test_module_name',
+ 'Test Author',
+ '', # Author-email field is skipped
+ 'https://www.example.org',
+ '4',
+ ]
+ with TemporaryDirectory() as td, \
+ patch_data_dir(), \
+ faking_input(responses):
+ ti = init.TerminalIniter(td)
+ ti.initialise()
+ with Path(td, 'pyproject.toml').open('rb') as f:
+ data = tomllib.load(f)
+ assert not Path(td, 'LICENSE').exists()
+
+ assert data['project'] == {
+ 'authors': [{'name': 'Test Author'}],
+ 'name': 'test_module_name',
+ 'urls': {'Home': 'https://www.example.org'},
+ 'dynamic': ['version', 'description'],
+ }
+
+
+@pytest.mark.parametrize(
+ "readme_file",
+ ["readme.md", "README.MD", "README.md",
+ "Readme.md", "readme.MD", "readme.rst",
+ "readme.txt"])
+def test_find_readme(readme_file):
+ with make_dir([readme_file]) as td:
+ ib = init.IniterBase(td)
+ assert ib.find_readme() == readme_file
+
+
+def test_find_readme_not_found():
+ with make_dir() as td:
+ ib = init.IniterBase(td)
+ assert ib.find_readme() is None
+
+
+def test_init_readme_found_yes_choosen():
+ responses = ['test_module_name',
+ 'Test Author',
+ 'test_email@example.com',
+ '', # Home page omitted
+ '4', # Skip - choose a license later
+ ]
+ with make_dir(["readme.md"]) as td, \
+ patch_data_dir(), \
+ faking_input(responses):
+ ti = init.TerminalIniter(td)
+ ti.initialise()
+ with Path(td, 'pyproject.toml').open('rb') as f:
+ data = tomllib.load(f)
+
+ assert data['project'] == {
+ 'authors': [{'name': 'Test Author', 'email': 'test_email@example.com'}],
+ 'name': 'test_module_name',
+ 'readme': 'readme.md',
+ 'dynamic': ['version', 'description'],
+ }
+
+
+def test_init_non_ascii_author_name():
+ responses = ['foo', # Module name
+ 'Test Authôr', # Author
+ '', # Author email omitted
+ '', # Home page omitted
+ '1' # License (1 -> MIT)
+ ]
+ with TemporaryDirectory() as td, \
+ patch_data_dir(), \
+ faking_input(responses):
+ ti = init.TerminalIniter(td)
+ ti.initialise()
+
+ generated = Path(td) / 'pyproject.toml'
+ assert_isfile(generated)
+ with generated.open('r', encoding='utf-8') as f:
+ raw_text = f.read()
+ print(raw_text)
+ assert "Test Authôr" in raw_text
+ assert "\\u00f4" not in raw_text
+ license = Path(td) / 'LICENSE'
+ assert_isfile(license)
+ with license.open(encoding='utf-8') as f:
+ license_text = f.read()
+ assert "Test Authôr" in license_text