Skip to content

Commit

Permalink
import via fp
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuarli committed Mar 18, 2024
1 parent f8e346b commit 1450018
Show file tree
Hide file tree
Showing 15 changed files with 109 additions and 11 deletions.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
24 changes: 20 additions & 4 deletions tests/doctor/test_attempt_fix.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,37 @@
from __future__ import annotations

import os
from concurrent.futures import ThreadPoolExecutor

from devenv import doctor
from tests.doctor.devenv.checks import broken_fix
from tests.doctor.devenv.checks import failing_check
from tests.doctor.devenv.checks import failing_check_with_msg
from tests.doctor.devenv.checks import passing_check
from tests.utils import import_module_from_file

here = os.path.join(os.path.dirname(__file__))


def test_attempt_fix_success() -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)

check = doctor.Check(passing_check)
assert doctor.attempt_fix(check, ThreadPoolExecutor()) == (True, "")


def test_attempt_fix_failure() -> None:
failing_check = import_module_from_file(
f"{here}/checks/failing_check.py", "failing_check"
)

check = doctor.Check(failing_check)
assert doctor.attempt_fix(check, ThreadPoolExecutor()) == (False, "")


def test_attempt_fix_failure_with_msg() -> None:
failing_check_with_msg = import_module_from_file(
f"{here}/checks/failing_check_with_msg.py", "failing_check_with_msg"
)

check = doctor.Check(failing_check_with_msg)
assert doctor.attempt_fix(check, ThreadPoolExecutor()) == (
False,
Expand All @@ -28,6 +40,10 @@ def test_attempt_fix_failure_with_msg() -> None:


def test_attempt_fix_broken_fix() -> None:
broken_fix = import_module_from_file(
f"{here}/checks/broken_fix.py", "broken_fix"
)

check = doctor.Check(broken_fix)
assert doctor.attempt_fix(check, ThreadPoolExecutor()) == (
False,
Expand Down
29 changes: 27 additions & 2 deletions tests/doctor/test_filter_failing_checks.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,43 @@
from __future__ import annotations

import os

from devenv import doctor
from tests.doctor.devenv.checks import failing_check
from tests.doctor.devenv.checks import passing_check
from tests.utils import import_module_from_file

here = os.path.join(os.path.dirname(__file__))


def test_filter_failing_checks_no_checks() -> None:
assert doctor.filter_failing_checks({}) == []


def test_filter_failing_checks_one_passing_check() -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)

check = doctor.Check(passing_check)
assert doctor.filter_failing_checks({check: (True, "")}) == []


def test_filter_failing_checks_one_failing_check() -> None:
failing_check = import_module_from_file(
f"{here}/checks/failing_check.py", "failing_check"
)

check = doctor.Check(failing_check)
assert doctor.filter_failing_checks({check: (False, "")}) == [check]


def test_filter_failing_checks_one_passing_and_one_failing_check() -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)
failing_check = import_module_from_file(
f"{here}/checks/failing_check.py", "failing_check"
)

first_check = doctor.Check(passing_check)
second_check = doctor.Check(failing_check)
assert doctor.filter_failing_checks(
Expand All @@ -28,6 +46,13 @@ def test_filter_failing_checks_one_passing_and_one_failing_check() -> None:


def test_filter_failing_checks_no_duplicate_checks() -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)
failing_check = import_module_from_file(
f"{here}/checks/failing_check.py", "failing_check"
)

first_check = doctor.Check(passing_check)
second_check = doctor.Check(failing_check)
assert doctor.filter_failing_checks(
Expand Down
13 changes: 12 additions & 1 deletion tests/doctor/test_prompt_for_fix.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
from __future__ import annotations

import builtins
import os
from unittest import mock

import pytest

from devenv import doctor
from tests.doctor.devenv.checks import passing_check
from tests.utils import import_module_from_file

here = os.path.join(os.path.dirname(__file__))


prompts_for_fix_yes: list[str] = [
Expand Down Expand Up @@ -35,6 +38,10 @@

@pytest.mark.parametrize("yes", prompts_for_fix_yes)
def test_prompt_for_fix_yes(yes: str) -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)

check = doctor.Check(passing_check)

def fake_input(_: str) -> str:
Expand All @@ -46,6 +53,10 @@ def fake_input(_: str) -> str:

@pytest.mark.parametrize("no", prompts_for_fix_no)
def test_prompt_for_fix_no(no: str) -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)

check = doctor.Check(passing_check)

def fake_input(_: str) -> str:
Expand Down
45 changes: 41 additions & 4 deletions tests/doctor/test_run_checks.py
Original file line number Diff line number Diff line change
@@ -1,42 +1,61 @@
from __future__ import annotations

import os
from concurrent.futures import ThreadPoolExecutor

import pytest

from devenv import doctor
from tests.doctor.devenv.checks import broken_check
from tests.doctor.devenv.checks import failing_check
from tests.doctor.devenv.checks import failing_check_with_msg
from tests.doctor.devenv.checks import passing_check
from tests.utils import import_module_from_file

here = os.path.join(os.path.dirname(__file__))


def test_run_checks_no_checks() -> None:
assert doctor.run_checks([], ThreadPoolExecutor()) == {}


def test_run_checks_one_passing_check() -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)

check = doctor.Check(passing_check)
assert doctor.run_checks([check], ThreadPoolExecutor()) == {
check: (True, "")
}


def test_run_checks_one_failing_check() -> None:
failing_check = import_module_from_file(
f"{here}/checks/failing_check.py", "failing_check"
)

check = doctor.Check(failing_check)
assert doctor.run_checks([check], ThreadPoolExecutor()) == {
check: (False, "")
}


def test_run_checks_one_failing_check_with_msg() -> None:
failing_check_with_msg = import_module_from_file(
f"{here}/checks/failing_check_with_msg.py", "failing_check_with_msg"
)

check = doctor.Check(failing_check_with_msg)
assert doctor.run_checks([check], ThreadPoolExecutor()) == {
check: (False, "check failed")
}


def test_run_checks_one_passing_and_one_failing_check() -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)
failing_check = import_module_from_file(
f"{here}/checks/failing_check.py", "failing_check"
)

first_check = doctor.Check(passing_check)
second_check = doctor.Check(failing_check)
assert doctor.run_checks(
Expand All @@ -45,6 +64,13 @@ def test_run_checks_one_passing_and_one_failing_check() -> None:


def test_run_checks_skip(capsys: pytest.CaptureFixture[str]) -> None:
passing_check = import_module_from_file(
f"{here}/checks/passing_check.py", "passing_check"
)
failing_check = import_module_from_file(
f"{here}/checks/failing_check.py", "failing_check"
)

first_check = doctor.Check(passing_check)
second_check = doctor.Check(failing_check)
assert doctor.run_checks(
Expand All @@ -55,6 +81,13 @@ def test_run_checks_skip(capsys: pytest.CaptureFixture[str]) -> None:


def test_run_checks_multiple_failing_checks() -> None:
failing_check = import_module_from_file(
f"{here}/checks/failing_check.py", "failing_check"
)
failing_check_with_msg = import_module_from_file(
f"{here}/checks/failing_check_with_msg.py", "failing_check_with_msg"
)

first_check = doctor.Check(failing_check)
second_check = doctor.Check(failing_check_with_msg)
assert doctor.run_checks(
Expand All @@ -63,6 +96,10 @@ def test_run_checks_multiple_failing_checks() -> None:


def test_run_checks_broken_check() -> None:
broken_check = import_module_from_file(
f"{here}/checks/broken_check.py", "broken_check"
)

check = doctor.Check(broken_check)
assert doctor.run_checks([check], ThreadPoolExecutor()) == {
check: (False, "Check threw a runtime exception: division by zero")
Expand Down
9 changes: 9 additions & 0 deletions tests/utils.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from __future__ import annotations

import contextlib
import importlib
import os
import pathlib
from collections.abc import Generator
from types import ModuleType


# TODO: replace with contextlib.chdir when we can use python3.11
Expand All @@ -15,3 +17,10 @@ def chdir(d: str | pathlib.Path) -> Generator[None, None, None]:
yield
finally:
os.chdir(curdir)


def import_module_from_file(fp: str, name: str) -> ModuleType:
spec = importlib.util.spec_from_file_location(name, fp)
module = importlib.util.module_from_spec(spec) # type: ignore
spec.loader.exec_module(module) # type: ignore
return module

0 comments on commit 1450018

Please sign in to comment.