fix: Browser.quit() stops managed driver service; document facade semantics
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
@@ -61,6 +62,22 @@ class TestDelegation:
|
||||
with pytest.raises(AttributeError):
|
||||
_ = bot.do_login
|
||||
|
||||
def test_direct_delegation_does_not_flip_good(self, bot):
|
||||
# only perform() traps+flips; direct bot.x() is the raw path
|
||||
bot.set_page(Login)
|
||||
with pytest.raises(WebDriverException):
|
||||
bot.explode()
|
||||
assert bot.good is True
|
||||
|
||||
def test_getitem_without_page_raises_friendly(self, bot):
|
||||
with pytest.raises(RuntimeError, match="no current page"):
|
||||
bot["username"]
|
||||
|
||||
def test_repr_shows_page_and_good(self, bot):
|
||||
assert "page=None" in repr(bot) and "good=True" in repr(bot)
|
||||
bot.set_page(Login)
|
||||
assert "page=Login" in repr(bot)
|
||||
|
||||
|
||||
class TestPerform:
|
||||
def test_returns_method_result(self, bot):
|
||||
@@ -84,10 +101,18 @@ class TestPerform:
|
||||
bot.reset()
|
||||
assert bot.perform("do_login") == "logged-in"
|
||||
|
||||
def test_broken_state_attribute_read_returns_noop_callable(self, bot):
|
||||
# documents the footgun: while broken, an attribute read yields the
|
||||
# no-op refusal callable, not the underlying value
|
||||
bot.set_page(Login)
|
||||
bot.perform("explode") # flips good=False
|
||||
assert callable(bot.anything)
|
||||
|
||||
|
||||
class TestQuit:
|
||||
def test_quit_quits_driver_and_removes_session(self):
|
||||
driver, store = MagicMock(), MagicMock()
|
||||
store.get.return_value = SimpleNamespace(service_pid=None) # external: nothing to stop
|
||||
bot = Browser(driver, session_name="s1", store=store)
|
||||
bot.quit()
|
||||
driver.quit.assert_called_once_with()
|
||||
@@ -97,3 +122,27 @@ class TestQuit:
|
||||
driver = MagicMock()
|
||||
Browser(driver).quit()
|
||||
driver.quit.assert_called_once_with()
|
||||
|
||||
def test_quit_stops_managed_service(self, monkeypatch):
|
||||
import wabot.browser as browser_mod
|
||||
|
||||
stopped = []
|
||||
monkeypatch.setattr(browser_mod, "stop_service", lambda pid: stopped.append(pid))
|
||||
driver, store = MagicMock(), MagicMock()
|
||||
store.get.return_value = SimpleNamespace(service_pid=4321) # managed session
|
||||
bot = Browser(driver, session_name="s1", store=store)
|
||||
bot.quit()
|
||||
assert stopped == [4321]
|
||||
store.remove.assert_called_once_with("s1")
|
||||
|
||||
def test_quit_removes_record_even_if_driver_quit_raises(self, monkeypatch):
|
||||
import wabot.browser as browser_mod
|
||||
|
||||
monkeypatch.setattr(browser_mod, "stop_service", lambda pid: None)
|
||||
driver, store = MagicMock(), MagicMock()
|
||||
driver.quit.side_effect = WebDriverException("boom")
|
||||
store.get.return_value = SimpleNamespace(service_pid=None)
|
||||
bot = Browser(driver, session_name="s1", store=store)
|
||||
with pytest.raises(WebDriverException):
|
||||
bot.quit()
|
||||
store.remove.assert_called_once_with("s1") # finally block still ran
|
||||
|
||||
Reference in New Issue
Block a user