Commit 8d339506 authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Split site fixture into running/non-running

parent 4a5d4811
Loading
Loading
Loading
Loading
+6 −14
Original line number Diff line number Diff line
@@ -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
@@ -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:
@@ -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
@@ -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():
+31 −7
Original line number Diff line number Diff line
@@ -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
@@ -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):
@@ -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

@@ -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