Example #1
0
def _():
    @fixture
    def parent_a():
        pass

    @fixture
    def parent_b():
        pass

    @fixture
    def child(a=parent_a, b=parent_b):
        pass

    assert Fixture(child).parents() == [Fixture(parent_a), Fixture(parent_b)]
Example #2
0
def _():
    @fixture
    def a():
        pass

    @fixture
    def b():
        pass

    @fixture
    def c(a=a, b=b):
        pass

    @fixture
    def d(a=a, c=c):
        pass

    fa, fb, fc, fd = fixtures = [Fixture(f) for f in (a, b, c, d)]

    to_parents, to_children = fixture_parents_and_children(fixtures)

    assert to_parents == {fa: [], fb: [], fc: [fa, fb], fd: [fa, fc]}

    assert to_children == {
        fa: [fc, fd],
        fb: [fc],
        fc: [fd],
        fd: [],
    }
Example #3
0
def _():
    def foo(fixture=dummy_fixture, not_fixture=5):
        pass

    t = Test(foo, module_name="")

    assert t.resolver.fixtures == {"fixture": Fixture(dummy_fixture)}
Example #4
0
def output_fixture_dependency_tree(fixture: Fixture,
                                   show_scopes: bool,
                                   max_depth: Optional[int],
                                   depth: int = 0):
    if max_depth is not None and depth >= max_depth:
        return

    deps = [Fixture(par.default) for par in fixture.deps().values()]

    if not deps:
        return

    if depth == 0:
        yield indent(f"depends on", INDENT)

    for idx, dep in enumerate(deps):
        prefix = "├─" if idx != len(deps) - 1 else "└─"
        yield indent(
            f"{prefix} {format_fixture_header(dep, show_scopes)}",
            make_indent(depth + 1),
        )

        child_lines = list(
            output_fixture_dependency_tree(
                dep,
                show_scopes,
                max_depth,
                depth=depth + 1,
            ))
        for child_idx, line in enumerate(child_lines):
            if idx < len(deps) - 1:
                line = line.replace("   └─", "│  └─")
            yield " " + line
Example #5
0
def _():
    @fixture
    def f():
        pass

    t = Test(lambda f=f: None, module_name="")

    assert fixtures_used_directly_by_tests([t]) == {Fixture(f): [t]}
Example #6
0
def _():
    def foo(
            a=each(dummy_fixture, "foo", dummy_fixture, "fourth"),
            b=each("bar", dummy_fixture, dummy_fixture, "fourth"),
    ):
        pass

    t = Test(foo, module_name="")

    first, second, third, fourth = t.get_parameterised_instances()

    assert first.resolver.fixtures == {"a": Fixture(dummy_fixture)}
    assert second.resolver.fixtures == {"b": Fixture(dummy_fixture)}
    assert third.resolver.fixtures == {
        "a": Fixture(dummy_fixture),
        "b": Fixture(dummy_fixture),
    }
    assert fourth.resolver.fixtures == {}
Example #7
0
    def _resolve_single_fixture(
        self, fixture_fn: Callable, cache: FixtureCache
    ) -> Fixture:
        fixture = Fixture(fixture_fn)

        if fixture.key in cache:
            cached_fixture = cache[fixture.key]
            if fixture.scope == Scope.Global:
                return cached_fixture
            elif fixture.scope == Scope.Module:
                if cached_fixture.last_resolved_module_name == self.module_name:
                    return cached_fixture
            elif fixture.scope == Scope.Test:
                if cached_fixture.last_resolved_test_id == self.id:
                    return cached_fixture

        # Cache miss, so update the fixture metadata before we resolve and cache it
        fixture.last_resolved_test_id = self.id
        fixture.last_resolved_module_name = self.module_name

        has_deps = len(fixture.deps()) > 0
        is_generator = fixture.is_generator_fixture
        if not has_deps:
            try:
                if is_generator:
                    fixture.gen = fixture_fn()
                    fixture.resolved_val = next(fixture.gen)
                else:
                    fixture.resolved_val = fixture_fn()
            except Exception as e:
                raise FixtureError(f"Unable to resolve fixture '{fixture.name}'") from e
            cache.cache_fixture(fixture)
            return fixture

        signature = inspect.signature(fixture_fn)
        children_defaults = signature.bind_partial()
        children_defaults.apply_defaults()
        children_resolved = {}
        for name, child_fixture in children_defaults.arguments.items():
            child_resolved = self._resolve_single_fixture(child_fixture, cache)
            children_resolved[name] = child_resolved
        try:
            if is_generator:
                fixture.gen = fixture_fn(
                    **self._resolve_fixture_values(children_resolved)
                )
                fixture.resolved_val = next(fixture.gen)
            else:
                fixture.resolved_val = fixture_fn(
                    **self._resolve_fixture_values(children_resolved)
                )
        except Exception as e:
            raise FixtureError(f"Unable to resolve fixture '{fixture.name}'") from e
        cache.cache_fixture(fixture)
        return fixture
Example #8
0
def _():
    @fixture
    def parent():
        pass

    @fixture
    def child():
        pass

    @fixture
    def not_used():
        pass

    t1 = Test(lambda c=child: None, module_name="")
    t2 = Test(lambda p=parent, c=child: None, module_name="")
    t3 = Test(lambda _: None, module_name="")

    assert fixtures_used_directly_by_tests([t1, t2, t3]) == {
        Fixture(child): [t1, t2],
        Fixture(parent): [t2],
    }
Example #9
0
def _():
    @fixture
    def parent():
        pass

    @fixture
    def child():
        pass

    t = Test(lambda c=child: None, module_name="")

    assert fixtures_used_directly_by_tests([t]) == {Fixture(child): [t]}
Example #10
0
    def _resolve_single_arg(self, arg: Callable,
                            cache: FixtureCache) -> Union[Any, Fixture]:
        """
        Get the fixture return value

        If the fixture has been cached, return the value from the cache.
        Otherwise, call the fixture function and return the value.
        """

        if not hasattr(arg, "ward_meta"):
            return arg

        fixture = Fixture(arg)
        if cache.contains(fixture, fixture.scope,
                          self.scope_key_from(fixture.scope)):
            return cache.get(fixture.key, fixture.scope,
                             self.scope_key_from(fixture.scope))

        has_deps = len(fixture.deps()) > 0
        is_generator = fixture.is_generator_fixture
        if not has_deps:
            try:
                if is_generator:
                    fixture.gen = arg()
                    fixture.resolved_val = next(fixture.gen)
                else:
                    fixture.resolved_val = arg()
            except Exception as e:
                raise FixtureError(
                    f"Unable to resolve fixture '{fixture.name}'") from e
            scope_key = self.scope_key_from(fixture.scope)
            cache.cache_fixture(fixture, scope_key)
            return fixture

        children_defaults = self._get_default_args(func=arg)
        children_resolved = {}
        for name, child_fixture in children_defaults.items():
            child_resolved = self._resolve_single_arg(child_fixture, cache)
            children_resolved[name] = child_resolved

        try:
            args_to_inject = self._unpack_resolved(children_resolved)
            if is_generator:
                fixture.gen = arg(**args_to_inject)
                fixture.resolved_val = next(fixture.gen)
            else:
                fixture.resolved_val = arg(**args_to_inject)
        except Exception as e:
            raise FixtureError(
                f"Unable to resolve fixture '{fixture.name}'") from e
        scope_key = self.scope_key_from(fixture.scope)
        cache.cache_fixture(fixture, scope_key)
        return fixture
Example #11
0
def output_fixtures(
    show_scopes: bool,
    show_docstrings: bool,
    show_direct_dependencies: bool,
    show_dependency_trees: bool,
):
    fixtures = [Fixture(f) for f in _FIXTURES]

    for fixture in fixtures:
        output_fixture_information(
            fixture,
            show_scopes=show_scopes,
            show_docstrings=show_docstrings,
            show_direct_dependencies=show_direct_dependencies,
            show_dependency_trees=show_dependency_trees,
        )
Example #12
0
    def _resolve_single_arg(self, arg: Callable,
                            cache: FixtureCache) -> Union[Any, Fixture]:
        """
        Get the fixture return value

        If the fixture has been cached, return the value from the cache.
        Otherwise, call the fixture function and return the value.
        """

        if not hasattr(arg, "ward_meta"):
            return arg

        fixture = Fixture(arg)
        if cache.contains(fixture, fixture.scope,
                          self.test.scope_key_from(fixture.scope)):
            return cache.get(fixture.key, fixture.scope,
                             self.test.scope_key_from(fixture.scope))

        children_defaults = self.get_default_args(func=arg)
        children_resolved = {}
        for name, child_fixture in children_defaults.items():
            child_resolved = self._resolve_single_arg(child_fixture, cache)
            children_resolved[name] = child_resolved

        try:
            args_to_inject = self._unpack_resolved(children_resolved)
            if fixture.is_generator_fixture:
                fixture.gen = arg(**args_to_inject)
                fixture.resolved_val = next(
                    fixture.gen)  # type: ignore[arg-type]
            elif fixture.is_async_generator_fixture:
                fixture.gen = arg(**args_to_inject)
                awaitable = fixture.gen.__anext__()  # type: ignore[union-attr]
                fixture.resolved_val = asyncio.get_event_loop(
                ).run_until_complete(awaitable)
            elif fixture.is_coroutine_fixture:
                fixture.resolved_val = asyncio.get_event_loop(
                ).run_until_complete(arg(**args_to_inject))
            else:
                fixture.resolved_val = arg(**args_to_inject)
        except (Exception, SystemExit) as e:
            raise FixtureError(
                f"Unable to resolve fixture '{fixture.name}'") from e
        scope_key = self.test.scope_key_from(fixture.scope)
        cache.cache_fixture(fixture, scope_key)
        return fixture
Example #13
0
def _(path=each(THIS_FILE.parent / "the-fixture-is-not-in-this-file.py")):
    fixtures = [Fixture(f) for f in [named_fixture]]
    assert list(filter_fixtures(fixtures, paths=[path])) == []
Example #14
0
def _(path=each(THIS_FILE, THIS_FILE.parent, THIS_FILE.parent.parent)):
    fixtures = [Fixture(f) for f in [named_fixture]]
    assert list(filter_fixtures(fixtures, paths=[path])) == fixtures
Example #15
0
def _(query=each("echo", "foobar", "wizbang")):
    fixtures = [Fixture(f) for f in [named_fixture, marker_fixture]]
    assert list(filter_fixtures(fixtures, query=query)) == []
Example #16
0
def _(query=each("marker", "mark", "ret", "return", '"')):
    fixtures = [Fixture(f) for f in [named_fixture, marker_fixture]]
    assert list(filter_fixtures(fixtures,
                                query=query)) == [Fixture(marker_fixture)]
Example #17
0
def _(query=each("test", "test_collect", "collect", "t_coll")):
    fixtures = [Fixture(f) for f in [named_fixture]]
    assert list(filter_fixtures(fixtures, query=query)) == fixtures
Example #18
0
def _(query=each("named_fixture", "named", "fixture", "med_fix")):
    fixtures = [Fixture(f) for f in [named_fixture]]
    assert list(filter_fixtures(fixtures, query=query)) == fixtures
Example #19
0
def _():
    fixtures = [Fixture(f) for f in [named_fixture, marker_fixture]]
    assert list(filter_fixtures(fixtures)) == fixtures
Example #20
0
def exception_raising_fixture():
    def i_raise_an_exception():
        raise ZeroDivisionError()

    return Fixture(fn=i_raise_an_exception)
Example #21
0
 def fixtures(self) -> Dict[str, Fixture]:
     return {
         name: Fixture(arg)
         for name, arg in self._get_args_for_iteration().items()
         if is_fixture(arg)
     }
Example #22
0
def fixtures(a=fixture_a, b=fixture_b):
    return {"fixture_a": Fixture(fn=a), "fixture_b": Fixture(fn=b)}
Example #23
0
def _():
    @fixture
    def fix():
        pass

    assert len(Fixture(fix).parents()) == 0