Keep session manager open on launch failure
This commit is contained in:
@@ -316,6 +316,55 @@ class SelectorCatalogTests(unittest.TestCase):
|
||||
|
||||
|
||||
class SelectorActionTests(unittest.TestCase):
|
||||
def test_open_failure_stays_in_context_and_retry_can_succeed(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
attempts: list[SelectorResult] = []
|
||||
|
||||
def activate(result: SelectorResult) -> None:
|
||||
attempts.append(result)
|
||||
if len(attempts) == 1:
|
||||
raise RuntimeError(
|
||||
"Bad owner or permissions on /etc/ssh/ssh_config"
|
||||
)
|
||||
|
||||
selector = SessionSelector(
|
||||
[
|
||||
CatalogWindow(
|
||||
"@1",
|
||||
"remote:pi:default",
|
||||
"pi",
|
||||
True,
|
||||
False,
|
||||
kind="remote",
|
||||
target="pi",
|
||||
session="default",
|
||||
)
|
||||
],
|
||||
RemoteRegistry(Path(directory) / "remotes.json"),
|
||||
"/missing/ssh",
|
||||
activate_handler=activate,
|
||||
)
|
||||
self.addCleanup(selector.pool.close)
|
||||
row = next(
|
||||
item
|
||||
for item in selector._rows() # type: ignore[attr-defined]
|
||||
if item.key == "window:@1"
|
||||
)
|
||||
|
||||
self.assertIsNone(selector._activate(row)) # type: ignore[attr-defined]
|
||||
self.assertEqual(selector.view, "actions")
|
||||
self.assertIn("打开失败", selector.message)
|
||||
self.assertIn("ssh_config", selector.context_row.error)
|
||||
retry = next(
|
||||
item
|
||||
for item in selector._rows() # type: ignore[attr-defined]
|
||||
if item.kind == "action-window"
|
||||
)
|
||||
self.assertEqual(selector.selected_key, retry.key)
|
||||
|
||||
self.assertFalse(selector._activate(retry)) # type: ignore[attr-defined]
|
||||
self.assertEqual(len(attempts), 2)
|
||||
|
||||
def test_search_is_explicit_and_escape_preserves_selection(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
window = CatalogWindow(
|
||||
|
||||
@@ -28,7 +28,8 @@ class TmuxIntegrationTests(unittest.TestCase):
|
||||
self.fake_herdr.write_text(
|
||||
"#!/bin/sh\n"
|
||||
"if [ \"${1:-}\" = \"--session\" ] && [ \"${2:-}\" = \"dead\" ]; then\n"
|
||||
" exit 0\n"
|
||||
" printf '%s\\n' 'fake startup failure' >&2\n"
|
||||
" exit 7\n"
|
||||
"fi\n"
|
||||
"exec sleep 30\n",
|
||||
encoding="utf-8",
|
||||
@@ -219,6 +220,20 @@ class TmuxIntegrationTests(unittest.TestCase):
|
||||
self.hub.reconnect(window.window_id)
|
||||
self.assertIsNotNone(self.hub.window_for_key("local:dead"))
|
||||
|
||||
def test_startup_verification_reports_immediate_process_failure(self) -> None:
|
||||
self.hub.ensure_server()
|
||||
with self.assertRaisesRegex(HubError, "fake startup failure"):
|
||||
self.hub.activate_endpoint(
|
||||
Endpoint.local("dead"),
|
||||
str(self.fake_herdr),
|
||||
verify_startup=True,
|
||||
)
|
||||
|
||||
failed = self.hub.window_for_key("local:dead")
|
||||
self.assertIsNotNone(failed)
|
||||
assert failed is not None
|
||||
self.assertTrue(failed.dead)
|
||||
|
||||
def test_alias_is_applied_immediately_and_can_be_reset(self) -> None:
|
||||
self.hub.aliases["remote:orangepi:work"] = "客厅开发"
|
||||
self.hub.ensure_server()
|
||||
|
||||
Reference in New Issue
Block a user