Run type checks only against packaged *.py files

- for tests/ and the noxfile.py, type annotations are not strictly
  enforced any more
  + this simplifies the way test cases and nox sessions are written
  + for many pytest fixtures, no types are available via a public API
- put fixtures inside the classes the corresponding test cases are
  grouped in
This commit is contained in:
Alexander Hess 2020-08-04 22:57:55 +02:00
commit 8586db58c7
Signed by: alexander
GPG key ID: 344EA5AB10D868E0
4 changed files with 57 additions and 64 deletions

View file

@ -2,19 +2,11 @@
import click
import pytest
from _pytest.capture import CaptureFixture # noqa:WPS436
from _pytest.monkeypatch import MonkeyPatch # noqa:WPS436
from click import testing as click_testing
from urban_meal_delivery import console
@pytest.fixture
def ctx() -> click.Context:
"""Context around the console.main Command."""
return click.Context(console.main)
class TestShowVersion:
"""Test console.show_version().
@ -29,7 +21,12 @@ class TestShowVersion:
# pylint:disable=no-self-use
def test_no_version(self, capsys: CaptureFixture, ctx: click.Context) -> None:
@pytest.fixture
def ctx(self) -> click.Context:
"""Context around the console.main Command."""
return click.Context(console.main)
def test_no_version(self, capsys, ctx):
"""The the early exit branch without any output."""
console.show_version(ctx, _param='discarded', value=False)
@ -37,9 +34,7 @@ class TestShowVersion:
assert captured.out == ''
def test_final_version(
self, capsys: CaptureFixture, ctx: click.Context, monkeypatch: MonkeyPatch,
) -> None:
def test_final_version(self, capsys, ctx, monkeypatch):
"""For final versions, NO "development" warning is emitted."""
version = '1.2.3'
monkeypatch.setattr(console.urban_meal_delivery, '__version__', version)
@ -51,9 +46,7 @@ class TestShowVersion:
assert captured.out.endswith(f', version {version}\n')
def test_develop_version(
self, capsys: CaptureFixture, ctx: click.Context, monkeypatch: MonkeyPatch,
) -> None:
def test_develop_version(self, capsys, ctx, monkeypatch):
"""For develop versions, a warning thereof is emitted."""
version = '1.2.3.dev0'
monkeypatch.setattr(console.urban_meal_delivery, '__version__', version)
@ -66,12 +59,6 @@ class TestShowVersion:
assert captured.out.strip().endswith(f', version {version} (development)')
@pytest.fixture
def cli() -> click_testing.CliRunner:
"""Initialize Click's CLI Test Runner."""
return click_testing.CliRunner()
class TestCLI:
"""Test the `umd` CLI utility.
@ -81,8 +68,13 @@ class TestCLI:
# pylint:disable=no-self-use
@pytest.fixture
def cli(self) -> click_testing.CliRunner:
"""Initialize Click's CLI Test Runner."""
return click_testing.CliRunner()
@pytest.mark.no_cover
def test_no_options(self, cli: click_testing.CliRunner) -> None:
def test_no_options(self, cli):
"""Exit with 0 status code and no output if run without options."""
result = cli.invoke(console.main)
@ -94,12 +86,8 @@ class TestCLI:
version_options = ('--version', '-V')
@pytest.mark.no_cover
@pytest.mark.parametrize(
'option', version_options,
)
def test_final_version(
self, cli: click_testing.CliRunner, monkeypatch: MonkeyPatch, option: str,
) -> None:
@pytest.mark.parametrize('option', version_options)
def test_final_version(self, cli, monkeypatch, option):
"""For final versions, NO "development" warning is emitted."""
version = '1.2.3'
monkeypatch.setattr(console.urban_meal_delivery, '__version__', version)
@ -110,12 +98,8 @@ class TestCLI:
assert result.output.strip().endswith(f', version {version}')
@pytest.mark.no_cover
@pytest.mark.parametrize(
'option', version_options,
)
def test_develop_version(
self, cli: click_testing.CliRunner, monkeypatch: MonkeyPatch, option: str,
) -> None:
@pytest.mark.parametrize('option', version_options)
def test_develop_version(self, cli, monkeypatch, option):
"""For develop versions, a warning thereof is emitted."""
version = '1.2.3.dev0'
monkeypatch.setattr(console.urban_meal_delivery, '__version__', version)

View file

@ -13,35 +13,33 @@ import re
import pytest
from packaging import version as pkg_version
from packaging.version import Version
import urban_meal_delivery
@pytest.fixture
def parsed_version() -> str:
"""The packaged version."""
return pkg_version.Version(urban_meal_delivery.__version__) # noqa:WPS609
class TestPEP404Compliance:
"""Packaged version identifier is PEP440 compliant."""
# pylint:disable=no-self-use
def test_parsed_version_has_no_epoch(self, parsed_version: Version) -> None:
@pytest.fixture
def parsed_version(self) -> str:
"""The packaged version."""
return pkg_version.Version(urban_meal_delivery.__version__) # noqa:WPS609
def test_parsed_version_has_no_epoch(self, parsed_version):
"""PEP440 compliant subset of semantic versioning: no epoch."""
assert parsed_version.epoch == 0
def test_parsed_version_is_non_local(self, parsed_version: Version) -> None:
def test_parsed_version_is_non_local(self, parsed_version):
"""PEP440 compliant subset of semantic versioning: no local version."""
assert parsed_version.local is None
def test_parsed_version_is_no_post_release(self, parsed_version: Version) -> None:
def test_parsed_version_is_no_post_release(self, parsed_version):
"""PEP440 compliant subset of semantic versioning: no post releases."""
assert parsed_version.is_postrelease is False
def test_parsed_version_is_all_public(self, parsed_version: Version) -> None:
def test_parsed_version_is_all_public(self, parsed_version):
"""PEP440 compliant subset of semantic versioning: all public parts."""
assert parsed_version.public == urban_meal_delivery.__version__ # noqa:WPS609
@ -55,7 +53,7 @@ class TestSemanticVersioning:
r'^(0|([1-9]\d*))\.(0|([1-9]\d*))\.(0|([1-9]\d*))(\.dev(0|([1-9]\d*)))?$',
)
def test_version_is_semantic(self) -> None:
def test_version_is_semantic(self):
"""Packaged version follows semantic versioning."""
result = self.version_pattern.fullmatch(
urban_meal_delivery.__version__, # noqa:WPS609
@ -79,7 +77,7 @@ class TestSemanticVersioning:
'1.2.3.dev10',
],
)
def test_valid_semantic_versioning(self, version: str) -> None:
def test_valid_semantic_versioning(self, version):
"""Versions follow the x.y.z or x.y.z.devN format."""
result = self.version_pattern.fullmatch(version)
@ -109,7 +107,7 @@ class TestSemanticVersioning:
'1.2..3',
],
)
def test_invalid_semantic_versioning(self, version: str) -> None:
def test_invalid_semantic_versioning(self, version):
"""Versions follow the x.y.z or x.y.z.devN format."""
result = self.version_pattern.fullmatch(version)