mirror of
https://github.com/cryptoadvance/specter-desktop.git
synced 2026-08-13 12:33:29 +02:00
A feature for a notification system has been added, including websockets and SSL support, improved error handling, and better logging. There have been various bug fixes, refactoring, and documentation updates throughout the process. The feature is now complete and includes new functionality for managing and displaying notifications, as well as testing and debugging tools.m> Co-authored-by: relativisticelectron <60378539+relativisticelectron@users.noreply.github.com>
152 lines
6.1 KiB
Python
152 lines
6.1 KiB
Python
import logging
|
|
from mock import MagicMock, call, patch
|
|
import pytest
|
|
from cryptoadvance.specter.specter import Specter, UserManager
|
|
from cryptoadvance.specterext.notifications.notification_manager import (
|
|
NotificationManager,
|
|
)
|
|
import datetime
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@pytest.fixture
|
|
def specter_with_user(empty_data_folder):
|
|
"""This assumes a bitcoin-testnet-node is running on loalhost"""
|
|
|
|
specter = Specter(data_folder=empty_data_folder)
|
|
user_manager = UserManager(specter=specter)
|
|
|
|
password = "somepassword"
|
|
user_id = "someuser"
|
|
username = "someuser"
|
|
config = {}
|
|
|
|
user = user_manager.create_user(
|
|
user_id=user_id, username=username, plaintext_password=password, config=config
|
|
)
|
|
yield specter
|
|
|
|
|
|
def test_sending_logging_notification(specter_with_user: Specter, caplog):
|
|
|
|
notification_manager = NotificationManager(
|
|
host="localhost",
|
|
port="1234",
|
|
ssl_cert=None,
|
|
ssl_key=None,
|
|
enable_websockets=False,
|
|
)
|
|
|
|
# do not take the admin user but the "someuser", just to make sure "someuser" can use the default_ui_notifications
|
|
user = specter_with_user.user_manager.get_user("someuser")
|
|
ui_notifications_of_user = notification_manager._get_ui_notifications_of_user(
|
|
user.username
|
|
)
|
|
|
|
# _register_default_ui_notifications should have created 3 ui_notifications accessible for all users
|
|
assert len(ui_notifications_of_user) == 3
|
|
assert ui_notifications_of_user[0].name == "logging"
|
|
assert ui_notifications_of_user[1].name == "print"
|
|
assert ui_notifications_of_user[2].name == "flash"
|
|
|
|
notification = notification_manager.create_notification(
|
|
"testing title",
|
|
user.username,
|
|
target_uis="default",
|
|
date=datetime.datetime(2022, 7, 31, 20, 23, 49, 541516),
|
|
body="testing body",
|
|
data={"key": 1},
|
|
image="someurl",
|
|
icon="someurl",
|
|
timeout=3000,
|
|
)
|
|
# the notification was stored in notification_manager.notifications
|
|
assert len(notification_manager.notifications) == 1
|
|
assert notification_manager.notifications[0].id == notification.id
|
|
|
|
# check if the Notification was created correctly
|
|
notification_str = """{'title': 'testing title', 'user_id': 'someuser', 'date': datetime.datetime(2022, 7, 31, 20, 23, 49, 541516), 'last_shown_date': {}, 'was_closed_in_target_uis': set(), 'target_uis': {'logging'}, 'notification_type': 'information', 'body': 'testing body', 'data': {'key': 1}, 'image': 'someurl', 'icon': 'someurl', 'timeout': 3000, 'id': 'c8b752e0cb679ee13b44497c4b02b11cfafdd378757666b1f9ee805d4a5e7c5a'}"""
|
|
assert str(notification) == notification_str
|
|
|
|
# capture if the notification was actually shown
|
|
with caplog.at_level(logging.INFO):
|
|
notification_manager.show(notification)
|
|
|
|
# check if any of the INFO messages was the notification
|
|
notification_found = False
|
|
logger.debug(caplog.records[-1])
|
|
for record in caplog.records:
|
|
if record.message == notification.to_text() and record.levelname == "INFO":
|
|
notification_found = True
|
|
assert notification_found
|
|
|
|
# the notification was deleted again
|
|
assert len(notification_manager.notifications) == 0
|
|
|
|
|
|
def mock_flash(*args, **kwargs):
|
|
flash_message = str((args, kwargs))
|
|
print(flash_message)
|
|
logger.warning(flash_message)
|
|
|
|
|
|
# check that register_user_ui_notifications registers the flash message
|
|
# check that flash messages would send the correct message to flash
|
|
@patch("cryptoadvance.specterext.notifications.ui_notifications.flash", mock_flash)
|
|
def test_sending_flash_notification(specter_with_user: Specter, caplog):
|
|
|
|
notification_manager = NotificationManager(
|
|
host="localhost",
|
|
port="1234",
|
|
ssl_cert=None,
|
|
ssl_key=None,
|
|
enable_websockets=False,
|
|
)
|
|
|
|
# do not take the admin user but the "someuser", just to make sure "someuser" can use the default_ui_notifications
|
|
user = specter_with_user.user_manager.get_user("someuser")
|
|
notification_manager.register_user_ui_notifications(user.username)
|
|
|
|
ui_notifications_of_user = notification_manager._get_ui_notifications_of_user(
|
|
user.username
|
|
)
|
|
|
|
# _register_default_ui_notifications should have created 3 ui_notifications accessible for all users
|
|
assert len(ui_notifications_of_user) == 3
|
|
assert ui_notifications_of_user[0].name == "logging"
|
|
assert ui_notifications_of_user[1].name == "print"
|
|
assert ui_notifications_of_user[2].name == "flash"
|
|
|
|
notification = notification_manager.create_notification(
|
|
"testing title",
|
|
user.username,
|
|
target_uis="flash",
|
|
date=datetime.datetime(2022, 7, 31, 20, 23, 49, 541516),
|
|
body="testing body",
|
|
data={"key": 1},
|
|
image="someurl",
|
|
icon="someurl",
|
|
timeout=3000,
|
|
)
|
|
# the notification was stored in notification_manager.notifications
|
|
assert len(notification_manager.notifications) == 1
|
|
assert notification_manager.notifications[0].id == notification.id
|
|
|
|
# check if the Notification was created correctly
|
|
notification_str = """{'title': 'testing title', 'user_id': 'someuser', 'date': datetime.datetime(2022, 7, 31, 20, 23, 49, 541516), 'last_shown_date': {}, 'was_closed_in_target_uis': set(), 'target_uis': {'flash'}, 'notification_type': 'information', 'body': 'testing body', 'data': {'key': 1}, 'image': 'someurl', 'icon': 'someurl', 'timeout': 3000, 'id': '56daf971f214d75949a8888654f398d8b8efe14ab027afa1b3393835d4d3edd8'}"""
|
|
assert str(notification) == notification_str
|
|
|
|
# capture if the notification was actually shown. Set it it warning, to only cature the mock_flash message
|
|
with caplog.at_level(logging.WARNING):
|
|
notification_manager.show(notification)
|
|
|
|
# check if any of the INFO messages was the notification
|
|
assert (
|
|
caplog.records[-1].message
|
|
== """(("testing title\\ntesting body\\nData: {\'key\': 1}", \'information\'), {})"""
|
|
)
|
|
assert caplog.records[-1].levelname == "WARNING"
|
|
|
|
# the notification was deleted again
|
|
assert len(notification_manager.notifications) == 0
|