diff --git a/tst/integration/computer/browser_computer_test.py b/tst/integration/computer/browser_computer_test.py index 54527640d..fa54c53ff 100644 --- a/tst/integration/computer/browser_computer_test.py +++ b/tst/integration/computer/browser_computer_test.py @@ -68,6 +68,7 @@ from agent_env.artifact import EnvironmentUniverseArtifact from agent_env.artifact.artifacts.environment import EnvironmentArtifact from agent_env.artifact.artifacts.file import FileArtifact +from agent_env.config import get_config from agent_env.config.runtime import WEBSITE_BROWSER_OVERRIDE, run_env_ids from agent_env.env import Env from agent_env.env.env import DeployedEnv @@ -83,6 +84,7 @@ from agent_env.task.teardown import teardown_run from agent_env.task_step.context import TaskStepContext from agent_env.task_step.task_steps.browser.connect_cdp import BrowserConnectCdpTaskStep +from agent_env.task_step.task_steps.browser.sign_in import BrowserSignInTaskStep from agent_env.task_step.task_steps.deploy_agent import DeployAgentTaskStep from agent_env.task_step.task_steps.deploy_env import DeployEnvTaskStep from agent_env.task_step.task_steps.load_artifact import LoadArtifactTaskStep @@ -92,6 +94,7 @@ from tst.integration.computer.browser_steps import check_browser_steps from tst.integration.computer.browser_state import check_browser_state, check_browser_state_under_chaos from tst.integration.computer.multi_env_computers_test import _containers, _gateway, _image +from tst.integration.computer.website_browser_test import _signed_in from tst.integration.computer.start_tabs import host_pages, tabs_of from tst.integration.store.local_parallel_deploy_test import _seed_bootstrap_envs from tst.util import local_sandboxes @@ -1447,6 +1450,57 @@ async def test_behind_a_front_that_ends_tls_the_multi_envs_gateway_hands_out_htt assert not report.failed +#: A page the site that offers session serves, which says who a request signs in, and chromium starting there. +SESSION_PAGE = "https://shop.test/api/session" +SESSION_CHROMIUM = {**MULTI_CHROMIUM, + "env_params": {"form": "container", "app_settings": {"chromium": {"start_urls": [SESSION_PAGE]}}}} + + +@pytest.fixture(scope="module") +def session_shop(browser_computer): + """A site named shop.test that offers website/v1 session, under a local id, as a multi env naming chromium's local + id must be.""" + with namespace_routing(): + _seed_bootstrap_envs() + uid = uuid.uuid4().hex[:8] + return WebsiteEnv.put(id=f"@local/~/signin-{uid}/shop", environment_name="shop", domains=["shop.test"], + server_docker_image_artifact=_image("session_website", f"signin-shop-{uid}")) + + +@pytest.mark.asyncio +async def test_under_a_chromium_default_a_site_gets_chromium_unnamed_which_browser_sign_in_signs_in_after_each_reset( + browser_computer, session_shop): + config = get_config() + with namespace_routing(): + office = MultiEnv.put(id=f"{session_shop.id.rsplit('/', 1)[0]}/office", mcp_server_envs=[], + website_envs=[session_shop], name="office") + sign_in = BrowserSignInTaskStep(id="in", version=None, env_id=office.id, site=session_shop.id, user="alex") + context = TaskStepContext() + config.default_website_browser_env_id = browser_computer.id # the config's default, not the run's override + try: + [deployed] = (await DeployEnvTaskStep(id="office", version=None, env_id=office.id, sandbox_type="local", + ttl_seconds=900, child_envs={"chromium": SESSION_CHROMIUM} + ).execute(context)).deployed_envs + browser = DeployedEnv.from_dict(deployed.child_envs["chromium"]) + before = await _signed_in(browser) + await sign_in.execute(context) + signed = await _signed_in(browser) + await ResetEnvTaskStep(id="reset", version=None, env_id=office.id, fail_task_on_error=True).execute(context) + after_reset = await _signed_in(browser) + await sign_in.execute(context) + again = await _signed_in(browser) + finally: + config.default_website_browser_env_id = None + report = await teardown_run(context) + + assert not report.failed + assert office.browser_envs is None and set(deployed.child_envs) == {"chromium"} + [start_tab] = deployed.child_envs["chromium"]["metadata"]["computer"]["start_tabs"]["chromium"] + assert (start_tab["url"], start_tab["site"], start_tab["outcome"]) == (SESSION_PAGE, "shop", "loaded"), start_tab + assert (before, signed, after_reset, again) == (None, "alex", None, "alex") + assert context.metadata["browser_steps"]["in"]["names"] == ["shop.test"] + + @pytest.mark.asyncio async def test_a_multi_env_naming_no_browser_deploys_none(browser_computer, shop): with namespace_routing(): diff --git a/tst/unit/env/envs/test_multi_env_computers.py b/tst/unit/env/envs/test_multi_env_computers.py index b165bc025..ffaeb9563 100644 --- a/tst/unit/env/envs/test_multi_env_computers.py +++ b/tst/unit/env/envs/test_multi_env_computers.py @@ -18,6 +18,7 @@ from agent_env.artifact.artifacts.docker_image import DockerImageArtifact from agent_env.cli.env.multi import multi +from agent_env.config import get_config from agent_env.config.runtime import WEBSITE_BROWSER_OVERRIDE, run_env_ids from agent_env.env.env import DeployedEnv, DeployedGatewayEnv, DeployedSandboxEnv from agent_env.env.envs import _deployment, _multi_computers @@ -809,6 +810,18 @@ def test_the_browser_is_the_one_named_none_for_an_empty_list_and_else_the_runs_w get.assert_called_with("chromium-computer") +def test_without_a_run_override_a_multi_env_with_websites_gets_the_configs_default_browser(local_stores): + chromium, config = FakeBrowser(), get_config() + config.default_website_browser_env_id = "chromium-computer" + try: + with patch("agent_env.env.env.Env.get", return_value=chromium) as get: + assert _browsing().website_browser() == WebsiteBrowser(computer=chromium) + assert _browsing(browser_envs=[]).website_browser() == WebsiteBrowser() + get.assert_called_once_with("chromium-computer") + finally: + config.default_website_browser_env_id = None + + def test_a_runs_browser_the_store_doesnt_hold_yet_is_left_for_the_gateway_to_look_up(local_stores): office = _browsing() assert office.website_browser() == WebsiteBrowser(runs=True)