Jelajahi Sumber

add tests for activity manager

Daniel Sheffield 1 tahun lalu
induk
melakukan
4b9d90ed9c

+ 2 - 3
app/activities/ActivityManager.py

@@ -5,8 +5,8 @@
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
 from typing import Iterator
-import urwid
 from urwid.display_common import BaseScreen
+from urwid import ExitMainLoop
 
 def show_or_exit(key,
     screen: BaseScreen = None, palettes: Iterator = None
@@ -25,7 +25,7 @@ def show_or_exit(key,
         screen.clear()
 
     if key in ('esc',):
-        raise urwid.ExitMainLoop()
+        raise ExitMainLoop()
 
 class ActivityManager():
 
@@ -58,4 +58,3 @@ class ActivityManager():
         if self.app is None:
             return None
         return self.app.original_widget
-

+ 12 - 1
app/palette/__init__.py

@@ -1 +1,12 @@
-
+#
+# Copyright (c) Daniel Sheffield 2023
+#
+# All rights reserved
+#
+# THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
+def iter_palettes(theme):
+    palettes = [ v for k,v in theme.items() ]
+    while True:
+        p = palettes.pop(0)
+        palettes.append(p)
+        yield p

+ 3 - 9
grocery_transactions.py

@@ -11,7 +11,7 @@ from urwid import raw_display, WidgetPlaceholder, SolidFill, MainLoop
 from app.activities.ActivityManager import ActivityManager, show_or_exit
 from app.activities.TransactionEditor import TransactionEditor
 from app.data.QueryManager import QueryManager, display_mapper
-from app.palette import solarized
+from app.palette import iter_palettes, solarized
 
 try:
     from db_credentials import HOST, PASSWORD
@@ -114,14 +114,8 @@ activity_manager.create(TransactionEditor, 'transaction',
 )
 
 app = None
-def iter_palettes():
-    palettes = [ v for k,v in solarized.theme.items() ]
-    while True:
-        p = palettes.pop(0)
-        palettes.append(p)
-        yield p
-
-palettes = iter_palettes()
+
+palettes = iter_palettes(solarized.theme)
 
 try:
     app = GroceryTransactionEditor(activity_manager, cur, log)

+ 83 - 0
test/activities/test_activity_manager.py

@@ -0,0 +1,83 @@
+#
+# Copyright (c) Daniel Sheffield 2023
+#
+# All rights reserved
+#
+# THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
+from itertools import chain
+from pytest import mark, fixture, raises
+from urwid.raw_display import Screen
+from urwid import ExitMainLoop
+from urwid.widget import Widget, Text
+from app.activities import ActivityManager
+from app.activities.ActivityManager import show_or_exit, ActivityManager
+
+from app.palette import high_contrast, iter_palettes, solarized
+
+@fixture
+def palettes():
+    return chain(iter_palettes(solarized.theme), iter_palettes(high_contrast.theme))
+
+@fixture
+def activity_manager():
+    return ActivityManager()
+
+@fixture
+def widget():
+    return Widget()
+
+@mark.parametrize('screen', [
+    None,
+    Screen(),
+])
+@mark.parametrize('key, expected', [
+  ((1,), None),
+  ('ctrl home', None),
+  ('esc', (ExitMainLoop, ""))
+])
+def test_show_or_exit(key, screen, palettes, expected):
+    if not isinstance(expected, tuple):
+        assert expected == show_or_exit(key, screen=screen, palettes=palettes)
+        return
+    
+    with raises(expected[0]):
+        show_or_exit(key, screen=screen, palettes=palettes)
+
+def test_add(activity_manager, widget):
+    assert widget == activity_manager.add(widget, 'myActivity')
+    assert 'myActivity' in activity_manager.widgets
+    assert widget == activity_manager.add(widget, 'myOtherActivity')
+    assert 'myOtherActivity' in activity_manager.widgets
+    assert 'myActivity' in activity_manager.widgets
+
+def test_get(activity_manager, widget):
+    assert activity_manager.get('myActivity') is None
+    activity_manager.add(widget, 'myActivity')
+    assert widget == activity_manager.get('myActivity')
+    activity_manager.add(widget, 'myOtherActivity')
+    assert widget == activity_manager.get('myOtherActivity')
+    assert widget == activity_manager.get('myActivity')
+
+def test_create(activity_manager):
+    widget = activity_manager.create(Text, 'widget_name', 'abc', align='right')
+    assert isinstance(widget, Text)
+    assert activity_manager.get('widget_name') is widget
+    activity_manager.show(widget)
+    assert activity_manager.app is widget
+
+def test_show(activity_manager, widget):
+    assert activity_manager.app is None
+    activity_manager.add(widget, 'myActivity')
+    assert activity_manager.show(widget) is None
+    assert activity_manager.app is widget
+    assert getattr(activity_manager.app, 'original_widget', None) is None
+    assert activity_manager.show(widget) is None
+    assert activity_manager.app.original_widget is widget
+
+def test_current(activity_manager, widget):
+    assert activity_manager.current() is None
+    activity_manager.add(widget, 'myActivity')
+    activity_manager.show(widget)
+    # fix requiring call twice if not a container widget
+    activity_manager.show(widget)
+    assert activity_manager.current() is widget