Loading tests/environment.py +6 −14 Original line number Diff line number Diff line Loading @@ -28,8 +28,7 @@ from behave_utils import URL from behave_utils import redirect from behave_utils.mysql import snapshot_rollback from requests.sessions import Session from wp import Site from wp import test_cluster from wp import running_site_fixture if TYPE_CHECKING: from behave.runner import FeatureContext Loading @@ -42,7 +41,7 @@ def before_all(context: Context) -> None: """ Setup fixtures for all tests """ context.site = use_fixture(setup_test_cluster, context, SITE_URL) use_fixture(running_site_fixture, context, site_url=SITE_URL) def before_feature(context: FeatureContext, feature: Feature) -> None: Loading @@ -59,21 +58,12 @@ def before_scenario(context: ScenarioContext, scenario: Scenario) -> None: context.session = use_fixture(requests_session, context) @fixture def setup_test_cluster(context: Context, /, site_url: URL) -> Iterator[Site]: """ Prepare and return the details of a site fixture """ with test_cluster(site_url) as site: yield site @fixture def requests_session(context: ScenarioContext, /) -> Iterator[Session]: """ Create and configure a `requests` session for accessing site fixtures """ site = context.site site = use_fixture(running_site_fixture, context) with Session() as session: redirect(session, site.url, site.address) yield session Loading @@ -93,7 +83,9 @@ def db_snapshot_rollback(context: FeatureContext, /) -> Iterator[None]: if __name__ == "__main__": from subprocess import run with test_cluster(SITE_URL) as site: from wp import Site with Site.build(SITE_URL) as site, site.running(): run([environ.get("SHELL", "/bin/sh")]) elif not sys.stderr.isatty(): Loading tests/wp.py +31 −7 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ from typing import TYPE_CHECKING from typing import Iterator from typing import TypeVar from behave import fixture from behave import use_fixture from behave.runner import Context from behave_utils import URL from behave_utils import wait from behave_utils.docker import Cli Loading @@ -27,6 +30,7 @@ from behave_utils.docker import Network from behave_utils.mysql import Mysql BUILD_CONTEXT = Path(__file__).parent.parent DEFAULT_URL = URL("http://test.example.com") class Wordpress(Container): Loading Loading @@ -133,13 +137,13 @@ class Site: yield cls(site_url, network, frontend, backend, database) @contextmanager def running(self) -> Iterator[None]: def running(self: T) -> Iterator[T]: """ Start all the services and configure the network """ with self.database.started(), self.backend.started(), self.frontend.started(): try: yield yield self finally: self._address = None Loading @@ -157,12 +161,32 @@ class Site: return self._address @contextmanager def test_cluster(site_url: URL) -> Iterator[Site]: @fixture def site_fixture(context: Context, /, site_url: URL|None = None) -> Iterator[Site]: """ Return a currently in-scope Site instance when used with `use_fixture` If "site_url" is provided and it doesn't match a current Site instance, a new instance will be created in the current context. >>> use_fixture(site_fixture, context) <<< <wp.Site at [...]> """ if hasattr(context, "site"): assert isinstance(context.site, Site) if site_url is None or context.site.url == site_url: yield context.site return with Site.build(site_url or DEFAULT_URL) as context.site: yield context.site @fixture def running_site_fixture(context: Context, /, site_url: URL|None = None) -> Iterator[Site]: """ Configure and start all the necessary containers for use as test fixtures Return a currently in-scope Site instance that is running when used with `use_fixture` Deprecated: this is now a wrapper around Site.build() and Site.running() Like `site_fixture` but additionally entered into the `Site.running` context manager. """ with Site.build(site_url) as site, site.running(): with use_fixture(site_fixture, context, site_url=site_url).running() as site: yield site Loading
tests/environment.py +6 −14 Original line number Diff line number Diff line Loading @@ -28,8 +28,7 @@ from behave_utils import URL from behave_utils import redirect from behave_utils.mysql import snapshot_rollback from requests.sessions import Session from wp import Site from wp import test_cluster from wp import running_site_fixture if TYPE_CHECKING: from behave.runner import FeatureContext Loading @@ -42,7 +41,7 @@ def before_all(context: Context) -> None: """ Setup fixtures for all tests """ context.site = use_fixture(setup_test_cluster, context, SITE_URL) use_fixture(running_site_fixture, context, site_url=SITE_URL) def before_feature(context: FeatureContext, feature: Feature) -> None: Loading @@ -59,21 +58,12 @@ def before_scenario(context: ScenarioContext, scenario: Scenario) -> None: context.session = use_fixture(requests_session, context) @fixture def setup_test_cluster(context: Context, /, site_url: URL) -> Iterator[Site]: """ Prepare and return the details of a site fixture """ with test_cluster(site_url) as site: yield site @fixture def requests_session(context: ScenarioContext, /) -> Iterator[Session]: """ Create and configure a `requests` session for accessing site fixtures """ site = context.site site = use_fixture(running_site_fixture, context) with Session() as session: redirect(session, site.url, site.address) yield session Loading @@ -93,7 +83,9 @@ def db_snapshot_rollback(context: FeatureContext, /) -> Iterator[None]: if __name__ == "__main__": from subprocess import run with test_cluster(SITE_URL) as site: from wp import Site with Site.build(SITE_URL) as site, site.running(): run([environ.get("SHELL", "/bin/sh")]) elif not sys.stderr.isatty(): Loading
tests/wp.py +31 −7 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ from typing import TYPE_CHECKING from typing import Iterator from typing import TypeVar from behave import fixture from behave import use_fixture from behave.runner import Context from behave_utils import URL from behave_utils import wait from behave_utils.docker import Cli Loading @@ -27,6 +30,7 @@ from behave_utils.docker import Network from behave_utils.mysql import Mysql BUILD_CONTEXT = Path(__file__).parent.parent DEFAULT_URL = URL("http://test.example.com") class Wordpress(Container): Loading Loading @@ -133,13 +137,13 @@ class Site: yield cls(site_url, network, frontend, backend, database) @contextmanager def running(self) -> Iterator[None]: def running(self: T) -> Iterator[T]: """ Start all the services and configure the network """ with self.database.started(), self.backend.started(), self.frontend.started(): try: yield yield self finally: self._address = None Loading @@ -157,12 +161,32 @@ class Site: return self._address @contextmanager def test_cluster(site_url: URL) -> Iterator[Site]: @fixture def site_fixture(context: Context, /, site_url: URL|None = None) -> Iterator[Site]: """ Return a currently in-scope Site instance when used with `use_fixture` If "site_url" is provided and it doesn't match a current Site instance, a new instance will be created in the current context. >>> use_fixture(site_fixture, context) <<< <wp.Site at [...]> """ if hasattr(context, "site"): assert isinstance(context.site, Site) if site_url is None or context.site.url == site_url: yield context.site return with Site.build(site_url or DEFAULT_URL) as context.site: yield context.site @fixture def running_site_fixture(context: Context, /, site_url: URL|None = None) -> Iterator[Site]: """ Configure and start all the necessary containers for use as test fixtures Return a currently in-scope Site instance that is running when used with `use_fixture` Deprecated: this is now a wrapper around Site.build() and Site.running() Like `site_fixture` but additionally entered into the `Site.running` context manager. """ with Site.build(site_url) as site, site.running(): with use_fixture(site_fixture, context, site_url=site_url).running() as site: yield site