|
18 | 18 | resolve_single_saved_tab_selection, |
19 | 19 | run_wizard, |
20 | 20 | ) |
| 21 | +from codex_tabs.wizard import process_selected_thread |
21 | 22 |
|
22 | 23 |
|
23 | 24 | class WizardTests(unittest.TestCase): |
@@ -224,3 +225,36 @@ def test_browse_recent_threads_can_show_more(self) -> None: |
224 | 225 |
|
225 | 226 | self.assertIsNotNone(selected) |
226 | 227 | self.assertEqual(selected.session_id, threads_twenty[11].session_id) |
| 228 | + |
| 229 | + def test_process_selected_thread_retries_invalid_name(self) -> None: |
| 230 | + with tempfile.TemporaryDirectory() as tmp: |
| 231 | + config = Path(tmp) / "sessions.toml" |
| 232 | + output = io.StringIO() |
| 233 | + responses = iter(["!!!", "Obsidian"]) |
| 234 | + thread = CodexThread( |
| 235 | + session_id="01234567-89ab-cdef-0123-456789abcdef", |
| 236 | + title="Thread", |
| 237 | + cwd="/tmp/work", |
| 238 | + created_at=1, |
| 239 | + updated_at=2, |
| 240 | + first_user_message="first", |
| 241 | + last_user_message="last", |
| 242 | + last_codex_message="assistant", |
| 243 | + ) |
| 244 | + |
| 245 | + with patch("codex_tabs.wizard.prompt_yes_no", return_value=False): |
| 246 | + entries: dict[str, SessionEntry] = {} |
| 247 | + process_selected_thread( |
| 248 | + thread, |
| 249 | + entries, |
| 250 | + config, |
| 251 | + input_fn=lambda _prompt: next(responses), |
| 252 | + output=output, |
| 253 | + ) |
| 254 | + |
| 255 | + self.assertIn("obsidian", entries) |
| 256 | + self.assertEqual(entries["obsidian"].session_id, thread.session_id) |
| 257 | + self.assertIn( |
| 258 | + "Choose a name that includes at least one letter or number.", |
| 259 | + output.getvalue(), |
| 260 | + ) |
0 commit comments