futureselves / test_app_state.py
Papajams's picture
chore: sync updates to Space
d94d5ba verified
Raw
History Blame Contribute Delete
5.19 kB
"""Unit tests for AppState methods — no Gradio, no heavy deps."""
from __future__ import annotations
import sys
from datetime import date
from unittest import TestCase, main
from unittest.mock import MagicMock
gr = MagicMock()
gr.Blocks = MagicMock
gr.HTML = MagicMock
gr.Button = MagicMock
gr.Textbox = MagicMock
gr.Radio = MagicMock
gr.Column = MagicMock
gr.Tab = MagicMock
gr.Tabs = MagicMock
gr.Markdown = MagicMock
gr.State = MagicMock
gr.BrowserState = MagicMock
gr.Timer = MagicMock
gr.update = MagicMock
gr.themes = MagicMock()
gr.themes.Base = MagicMock
gr.themes.Color = MagicMock
sys.modules["gradio"] = gr
sys.modules["gradio"].themes = gr.themes
from app import AppState
from transmission import PersonaContext
def _persona(**kw) -> PersonaContext:
return PersonaContext(
name=kw.get("name", "test"),
city=kw.get("city", ""),
current_chapter=kw.get("current_chapter", "a chapter"),
primary_arc=kw.get("primary_arc", "purpose"),
miraculous_year=kw.get("miraculous_year", "a good year"),
avoiding=kw.get("avoiding", "something"),
afraid_wont_happen=kw.get("afraid_wont_happen", "nothing"),
draining=kw.get("draining", "nothing"),
selected_voice_name=kw.get("selected_voice_name", "Ember"),
selected_voice_description=kw.get("selected_voice_description", "warm"),
streak=kw.get("streak", 0),
toward_count=kw.get("toward_count", 0),
steady_count=kw.get("steady_count", 0),
release_count=kw.get("release_count", 0),
repair_count=kw.get("repair_count", 0),
timeline_divergence_score=kw.get("timeline_divergence_score", 0),
)
class TestApplyCheckin(TestCase):
def test_creates_default_persona(self):
s = AppState()
s.apply_checkin("restless", "a note")
self.assertIsNotNone(s.persona)
self.assertEqual(s.persona.name, "you")
self.assertEqual(s.check_in_word, "restless")
self.assertEqual(s.check_in_note, "a note")
self.assertTrue(s.checked_in)
def test_truncates_long_word(self):
s = AppState(persona=_persona())
s.apply_checkin("x" * 100, "")
self.assertEqual(len(s.check_in_word), 40)
def test_preserves_existing_persona(self):
s = AppState(persona=_persona(name="Alice"))
s.apply_checkin("hopeful", "")
self.assertEqual(s.persona.name, "Alice")
class TestStartGeneration(TestCase):
def test_sets_flags(self):
s = AppState(persona=_persona())
s.start_generation()
self.assertTrue(s.generating)
self.assertFalse(s.generation_done)
self.assertEqual(s.today_audio, "")
self.assertIsNone(s.today_transmission)
self.assertIsNotNone(s.today_cast)
class TestRecordMemory(TestCase):
def _setup(self) -> AppState:
s = AppState(persona=_persona())
s.today_cast = "future_self"
s.today_transmission = type("T", (), {
"title": "You are closer than you think", "text": "body",
"action_prompt": "reach out", "cliffhanger": "something shifts",
})()
return s
def test_appends_history(self):
s = self._setup()
s.record_memory("do_it", "great message")
self.assertEqual(len(s.recent_transmissions), 1)
self.assertEqual(s.recent_transmissions[0].title, "You are closer than you think")
self.assertEqual(s.recent_choices[0].choice, "toward")
self.assertEqual(s.recent_responses[0].reaction, "did_it")
self.assertEqual(s.recent_responses[0].reply_note, "great message")
self.assertEqual(s.persona.streak, 1)
self.assertEqual(s.persona.toward_count, 1)
def test_maps_keep_value(self):
s = self._setup()
s.record_memory("keep", "")
self.assertEqual(s.recent_choices[0].choice, "steady")
self.assertEqual(s.recent_responses[0].reaction, "keep_close")
def test_maps_landed_value(self):
s = self._setup()
s.record_memory("landed", "")
self.assertEqual(s.recent_choices[0].choice, "repair")
self.assertEqual(s.recent_responses[0].reaction, "landed")
def test_maps_not_quite_value(self):
s = self._setup()
s.record_memory("not_quite", "")
self.assertEqual(s.recent_choices[0].choice, "release")
self.assertEqual(s.recent_responses[0].reaction, "not_quite")
def test_works_without_transmission(self):
s = AppState(persona=_persona())
s.record_memory("do_it", "")
self.assertEqual(len(s.recent_transmissions), 0)
self.assertEqual(s.recent_choices[0].choice, "toward")
def test_resets_for_next_cycle(self):
s = self._setup()
s.checked_in = True
s.generation_done = True
s.choice_made = True
s.check_in_word = "old"
s.check_in_note = "old note"
s.record_memory("do_it", "")
self.assertFalse(s.checked_in)
self.assertFalse(s.generation_done)
self.assertFalse(s.choice_made)
self.assertEqual(s.check_in_word, "")
self.assertEqual(s.check_in_note, "")
if __name__ == "__main__":
main()