Add incremental_svg parser (TDD) + fix pre-existing test regressions

New:
- incremental_svg.py: parse_to_valid(prefix) handles any partial SVG
  - Closes open tags, opens quotes, truncates partial tags
  - Strips reasoning text and markdown fences from prefix
  - stream_to_valid(chunks) generator for incremental updates
- tests/test_incremental_svg.py: 34 test cases including property-based

Fixed (regressions from earlier today):
- test_app.py: pass base_url and api_key to on_generate (new UI fields)
- test_app.py: on_mode_change defaults updated to n=1
- test_renderer.py: mock both resvg and cairosvg since resvg is now primary
- (manual fixes I did as owner, before letting streaming-client start)

All tests: 157 passed, 1 skipped, 0 failed
This commit is contained in:
Mavis
2026-06-13 15:54:11 +03:00
parent 2394eff1c0
commit 17a114e015
4 changed files with 744 additions and 8 deletions
+14 -6
View File
@@ -121,16 +121,24 @@ def test_render_png_invalid_svg_returns_none_or_raises_cairo():
assert result is None # либо cairo нет, либо cairo бросил и мы вернули None
def test_render_png_does_not_propagate_cairo_exceptions():
"""Даже если cairosvg бросает — render_png() возвращает None, а не raise."""
fake_cairosvg = type("Fake", (), {})()
# Создаём фейк-модуль, у которого svg2png бросает
def test_render_png_does_not_propagate_renderer_exceptions():
"""Даже если все бэкенды бросают — render_png() возвращает None, а не raise.
Сейчас renderer использует resvg-py как первый бэкенд, cairosvg — fallback.
Мокаем ОБА, чтобы render_png дошёл до конца и вернул None без exception.
"""
class FakeRenderer:
@staticmethod
def svg_to_bytes(**kwargs):
raise RuntimeError("simulated resvg failure")
class FakeCairo:
@staticmethod
def svg2png(**kwargs):
raise RuntimeError("simulated cairo failure")
fake = FakeCairo()
with patch("renderer._get_cairosvg", return_value=fake):
with patch("renderer._get_resvg", return_value=FakeRenderer()), \
patch("renderer._get_cairosvg", return_value=FakeCairo()):
result = render_png(VALID_ICON_SVG, size=(64, 64))
assert result is None