""" The two answers a person now gives, in the real application, in both engines. An invitee answers an invitation on the home page (harness/invitation_probe.py); a group owner answers a node that asked to host the group, and sees who was invited and has not answered (harness/group_hosts_probe.py). The hub side is `test_invitations_and_hosts.py`; this is where it meets the interface. """ import json import shutil import subprocess import sys from pathlib import Path import pytest HARNESS = Path(__file__).parent / "harness" BINARY = {"chrome": "google-chrome", "firefox": "firefox"} def _run(probe: str, engine: str): if shutil.which(BINARY[engine]) is None: pytest.skip(f"{engine} is not available") proc = subprocess.run([sys.executable, str(HARNESS / probe), "--engine", engine], capture_output=True, text=True, timeout=240) assert proc.returncode == 0, f"probe failed: {proc.stdout}{proc.stderr}" return json.loads(proc.stdout) @pytest.fixture(scope="module", params=["chrome", "firefox"]) def invitation(request): return {c["case"]: c for c in _run("invitation_probe.py", request.param)} @pytest.fixture(scope="module", params=["chrome", "firefox"]) def hosts(request): return _run("group_hosts_probe.py", request.param) def test_an_invitation_is_listed_with_its_two_answers(invitation): for c in invitation.values(): assert "error" not in c, c["error"] assert c["listed"] and c["buttons"] == 2 def test_accepting_joins_and_shows_the_group(invitation): c = invitation["accept"] assert c["answer_call"] == [ "POST /v1/groups/0f8fad5b-d9cb-469f-a165-70867728950e/invitation/accept"] assert c["group_card"] and not c["invitation_still_shown"] def test_declining_leaves_no_group(invitation): c = invitation["decline"] assert c["answer_call"][0].endswith("/invitation/decline") assert not c["group_card"] and not c["invitation_still_shown"] def test_the_owner_sees_the_invited_and_approves_a_host(hosts): assert "error" not in hosts, hosts.get("error") assert hosts["invited_row"] assert hosts["host_rows"] == 2 assert hosts["buttons_on_request"] == 2 # approve and refuse assert hosts["buttons_on_approved"] == 1 # refuse only assert hosts["decision"] == ["POST /v1/groups/g1/hosts/n-asking"]