2026-06-03 10:14:34 +05:00
|
|
|
|
import pytest
|
2026-06-04 20:26:58 +03:00
|
|
|
|
from routes.chat_helpers import clean_thinking_for_save, needs_auto_name
|
2026-06-03 10:14:34 +05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("name,expected", [
|
|
|
|
|
|
# 24h format (the bug this PR fixes)
|
|
|
|
|
|
("deepseek-v4-flash 14:05:33", True),
|
|
|
|
|
|
("qwq 17:46:02", True),
|
|
|
|
|
|
("gemma3 23:59:59", True),
|
|
|
|
|
|
("claude-sonnet 4 0:00:00", True),
|
|
|
|
|
|
|
|
|
|
|
|
# 12h format (was already working)
|
|
|
|
|
|
("deepseek-v4-flash 2:05:33 PM", True),
|
|
|
|
|
|
("qwq 06:46:02 AM", True),
|
|
|
|
|
|
("claude-sonnet-4 8:05:17 am", True),
|
|
|
|
|
|
|
|
|
|
|
|
# empty / default
|
|
|
|
|
|
("", True),
|
|
|
|
|
|
(" ", False),
|
|
|
|
|
|
("Chat: something", True),
|
|
|
|
|
|
|
|
|
|
|
|
# custom titles – should NOT trigger auto-naming
|
|
|
|
|
|
("custom title", False),
|
|
|
|
|
|
("CW Decoder for STM32", False),
|
|
|
|
|
|
("my chat about python", False),
|
|
|
|
|
|
("Fix the login bug", False),
|
|
|
|
|
|
])
|
|
|
|
|
|
def test_needs_auto_name(name, expected):
|
|
|
|
|
|
assert needs_auto_name(name) == expected, f"needs_auto_name({name!r}) should be {expected}"
|
2026-06-04 20:26:58 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_clean_thinking_for_save_extracts_gemma4_thought_channel():
|
|
|
|
|
|
content, metadata = clean_thinking_for_save(
|
|
|
|
|
|
"<|channel>thought\ninternal reasoning<channel|>Final answer.",
|
|
|
|
|
|
{"model": "google/gemma-4-31B-it"},
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert content == "Final answer."
|
|
|
|
|
|
assert metadata["thinking"] == "internal reasoning"
|
|
|
|
|
|
assert metadata["model"] == "google/gemma-4-31B-it"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_clean_thinking_for_save_strips_empty_gemma4_thought_channel():
|
|
|
|
|
|
content, metadata = clean_thinking_for_save(
|
|
|
|
|
|
"<|channel>thought\n<channel|>Final answer.",
|
|
|
|
|
|
{"model": "google/gemma-4-31B-it"},
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert content == "Final answer."
|
|
|
|
|
|
assert "thinking" not in metadata
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_clean_thinking_for_save_unwraps_gemma4_response_channel():
|
|
|
|
|
|
content, metadata = clean_thinking_for_save(
|
|
|
|
|
|
"<|channel>thought\ninternal reasoning<channel|><|channel>response\nFinal answer.<channel|>",
|
|
|
|
|
|
{"model": "google/gemma-4-31B-it"},
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert content == "Final answer."
|
|
|
|
|
|
assert metadata["thinking"] == "internal reasoning"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_clean_thinking_for_save_extracts_thought_tag():
|
|
|
|
|
|
content, metadata = clean_thinking_for_save(
|
|
|
|
|
|
"<thought>internal reasoning</thought>Final answer.",
|
|
|
|
|
|
{},
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert content == "Final answer."
|
|
|
|
|
|
assert metadata["thinking"] == "internal reasoning"
|