ai-content-maker/.venv/Lib/site-packages/weasel/tests/cli/test_cli_app.py

190 lines
5.8 KiB
Python

from pathlib import Path
from typing import Any, Dict
import pytest
import srsly
from typer.testing import CliRunner
from weasel import app
from weasel.cli.main import HELP
from weasel.util import get_git_version
runner = CliRunner()
@pytest.mark.parametrize("cmd", [None, "--help"])
def test_show_help(cmd):
"""Basic test to confirm help text appears"""
result = runner.invoke(app, [cmd] if cmd else None)
for line in HELP.splitlines():
assert line in result.stdout
def has_git():
try:
get_git_version()
return True
except RuntimeError:
return False
SAMPLE_PROJECT: Dict[str, Any] = {
"title": "Sample project",
"description": "This is a project for testing",
"assets": [
{
"dest": "assets/weasel-readme.md",
"url": "https://github.com/explosion/weasel/raw/9a3632862b47069d2f9033b773e814d4c4e09c83/README.md",
"checksum": "65f4c426a9b153b7683738c92d0d20f9",
},
{
"dest": "assets/pyproject.toml",
"url": "https://github.com/explosion/weasel/raw/9a3632862b47069d2f9033b773e814d4c4e09c83/pyproject.toml",
"checksum": "1e2da3a3030d6611520952d5322cd94e",
"extra": True,
},
],
"commands": [
{
"name": "ok",
"help": "print ok",
"script": ["python -c \"print('okokok')\""],
},
{
"name": "create",
"help": "make a file",
"script": ["touch abc.txt"],
"outputs": ["abc.txt"],
},
{
"name": "clean",
"help": "remove test file",
"script": ["rm abc.txt"],
},
],
}
SAMPLE_PROJECT_TEXT = srsly.yaml_dumps(SAMPLE_PROJECT)
@pytest.fixture
def project_dir(tmp_path: Path):
path = tmp_path / "project"
path.mkdir()
(path / "project.yml").write_text(SAMPLE_PROJECT_TEXT)
yield path
def test_project_document(project_dir: Path):
readme_path = project_dir / "README.md"
assert not readme_path.exists(), "README already exists"
result = CliRunner().invoke(
app, ["document", str(project_dir), "-o", str(readme_path)]
)
assert result.exit_code == 0
assert readme_path.is_file()
text = readme_path.read_text("utf-8")
assert SAMPLE_PROJECT["description"] in text
def test_project_assets(project_dir: Path):
asset_dir = project_dir / "assets"
assert not asset_dir.exists(), "Assets dir is already present"
result = CliRunner().invoke(app, ["assets", str(project_dir)])
assert result.exit_code == 0
assert (asset_dir / "weasel-readme.md").is_file(), "Assets not downloaded"
# check that extras work
result = CliRunner().invoke(app, ["assets", "--extra", str(project_dir)])
assert result.exit_code == 0
assert (asset_dir / "pyproject.toml").is_file(), "Extras not downloaded"
def test_project_run(project_dir: Path):
# make sure dry run works
test_file = project_dir / "abc.txt"
result = CliRunner().invoke(app, ["run", "--dry", "create", str(project_dir)])
assert result.exit_code == 0
assert not test_file.is_file()
result = CliRunner().invoke(app, ["run", "create", str(project_dir)])
assert result.exit_code == 0
assert test_file.is_file()
result = CliRunner().invoke(app, ["run", "ok", str(project_dir)])
assert result.exit_code == 0
assert "okokok" in result.stdout
def test_check_spacy_env_vars(project_dir: Path, monkeypatch: pytest.MonkeyPatch):
# make sure dry run works
project_dir / "abc.txt"
result = CliRunner().invoke(app, ["run", "--dry", "create", str(project_dir)])
assert result.exit_code == 0
assert (
"You've set a `SPACY_CONFIG_OVERRIDES` environment variable"
not in result.output
)
assert (
"You've set a `SPACY_PROJECT_USE_GIT_VERSION` environment variable"
not in result.output
)
monkeypatch.setenv("SPACY_CONFIG_OVERRIDES", "test")
monkeypatch.setenv("SPACY_PROJECT_USE_GIT_VERSION", "false")
result = CliRunner().invoke(app, ["run", "--dry", "create", str(project_dir)])
assert result.exit_code == 0
assert "You've set a `SPACY_CONFIG_OVERRIDES` environment variable" in result.output
assert (
"You've set a `SPACY_PROJECT_USE_GIT_VERSION` environment variable"
in result.output
)
@pytest.mark.skipif(not has_git(), reason="git not installed")
@pytest.mark.parametrize(
"options_string",
[
"",
# "--sparse",
"--branch v3",
"--repo https://github.com/explosion/projects --branch v3",
],
)
def test_project_clone(tmp_path: Path, options_string: str):
out = tmp_path / "project_clone"
target = "benchmarks/ner_conll03"
if not options_string:
options = []
else:
options = options_string.split()
result = CliRunner().invoke(app, ["clone", target, *options, str(out)])
assert result.exit_code == 0
assert "weasel assets" in result.output
assert (out / "README.md").is_file()
def test_project_push_pull(tmp_path: Path, project_dir: Path):
proj = dict(SAMPLE_PROJECT)
remote = "xyz"
remote_dir = tmp_path / "remote"
remote_dir.mkdir()
proj["remotes"] = {remote: str(remote_dir)}
proj_text = srsly.yaml_dumps(proj)
(project_dir / "project.yml").write_text(proj_text)
test_file = project_dir / "abc.txt"
result = CliRunner().invoke(app, ["run", "create", str(project_dir)])
assert result.exit_code == 0
assert test_file.is_file()
result = CliRunner().invoke(app, ["push", remote, str(project_dir)])
assert result.exit_code == 0
result = CliRunner().invoke(app, ["run", "clean", str(project_dir)])
assert result.exit_code == 0
assert not test_file.exists()
result = CliRunner().invoke(app, ["pull", remote, str(project_dir)])
assert result.exit_code == 0
assert test_file.is_file()