test_prompt_manager.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. """Regression tests for prompt handling."""
  2. from __future__ import annotations
  3. from typing import Any
  4. import pytest
  5. from cli.core.input.prompt_manager import PromptHandler
  6. from cli.core.template.variable import Variable
  7. TEST_REQUIRED_INTEGER = 42
  8. @pytest.mark.parametrize(
  9. "variable_data",
  10. [
  11. {"name": "puid", "type": "int"},
  12. {"name": "database_type", "type": "enum", "config": {"options": ["sqlite", "postgres"]}},
  13. {"name": "disable_local_login", "type": "bool"},
  14. ],
  15. )
  16. def test_optional_prompt_allows_blank_input(
  17. monkeypatch: pytest.MonkeyPatch,
  18. variable_data: dict[str, Any],
  19. ) -> None:
  20. """Optional variables without defaults should accept an empty response."""
  21. prompts: list[dict[str, Any]] = []
  22. def fake_ask(prompt_text: str, default: str = "", show_default: bool = False, **kwargs: Any) -> str:
  23. prompts.append(
  24. {
  25. "prompt_text": prompt_text,
  26. "default": default,
  27. "show_default": show_default,
  28. **kwargs,
  29. }
  30. )
  31. return ""
  32. monkeypatch.setattr("cli.core.input.prompt_manager.Prompt.ask", fake_ask)
  33. variable = Variable(variable_data)
  34. prompt_handler = PromptHandler()
  35. raw_value = prompt_handler._prompt_variable(variable)
  36. assert raw_value is None
  37. assert prompts
  38. assert prompts[0]["default"] == ""
  39. assert prompts[0]["show_default"] is False
  40. def test_required_integer_without_default_still_uses_integer_prompt(monkeypatch: pytest.MonkeyPatch) -> None:
  41. """Required integers should still use the integer prompt path instead of accepting blank input."""
  42. calls: list[tuple[str, Any]] = []
  43. def fake_integer(self, prompt: str, default: int | None = None, **kwargs: Any) -> int:
  44. del self, kwargs
  45. calls.append((prompt, default))
  46. return TEST_REQUIRED_INTEGER
  47. monkeypatch.setattr("cli.core.input.prompt_manager.InputManager.integer", fake_integer)
  48. variable = Variable({"name": "ports_http", "type": "int", "required": True})
  49. prompt_handler = PromptHandler()
  50. assert prompt_handler._prompt_variable(variable) == TEST_REQUIRED_INTEGER
  51. assert calls