specter-desktop/tests/test_notifications.py
k9ert 99f5404705
Feature: Notification system (#1766) (#2103)
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>
2023-02-07 19:00:44 +01:00

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