From 82e0b99b070402025c0787c6a111aa818918acd0 Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Mon, 21 Oct 2024 11:35:37 +0200 Subject: [PATCH] #2727 Notifications - Fix "send test notification" on empty list, includes test (#2731) --- changedetectionio/flask_app.py | 17 ++++++++-------- changedetectionio/tests/test_notification.py | 21 ++++++++++++++++++++ changedetectionio/update_worker.py | 3 ++- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/changedetectionio/flask_app.py b/changedetectionio/flask_app.py index 705ea20d..a1bb862e 100644 --- a/changedetectionio/flask_app.py +++ b/changedetectionio/flask_app.py @@ -67,7 +67,6 @@ FlaskCompress(app) # Stop browser caching of assets app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 - app.config.exit = Event() app.config['NEW_VERSION_AVAILABLE'] = False @@ -470,7 +469,7 @@ def changedetection_app(config=None, datastore_o=None): continue if watch.get('last_error'): errored_count += 1 - + if search_q: if (watch.get('title') and search_q in watch.get('title').lower()) or search_q in watch.get('url', '').lower(): sorted_watches.append(watch) @@ -533,7 +532,7 @@ def changedetection_app(config=None, datastore_o=None): @login_optionally_required def ajax_callback_send_notification_test(watch_uuid=None): - # Watch_uuid could be unset in the case its used in tag editor, global setings + # Watch_uuid could be unset in the case it`s used in tag editor, global settings import apprise import random from .apprise_asset import asset @@ -542,13 +541,15 @@ def changedetection_app(config=None, datastore_o=None): from changedetectionio.apprise_plugin import apprise_custom_api_call_wrapper is_global_settings_form = request.args.get('mode', '') == 'global-settings' is_group_settings_form = request.args.get('mode', '') == 'group-settings' - # Use an existing random one on the global/main settings form - if not watch_uuid and (is_global_settings_form or is_group_settings_form): + if not watch_uuid and (is_global_settings_form or is_group_settings_form) \ + and datastore.data.get('watching'): + logger.debug(f"Send test notification - Choosing random Watch {watch_uuid}") watch_uuid = random.choice(list(datastore.data['watching'].keys())) - - watch = datastore.data['watching'].get(watch_uuid) + watch = datastore.data['watching'].get(watch_uuid) + else: + watch = None notification_urls = request.form['notification_urls'].strip().splitlines() @@ -1396,7 +1397,7 @@ def changedetection_app(config=None, datastore_o=None): url = request.form.get('url').strip() if datastore.url_exists(url): flash(f'Warning, URL {url} already exists', "notice") - + add_paused = request.form.get('edit_and_watch_submit_button') != None processor = request.form.get('processor', 'text_json_diff') new_uuid = datastore.add_watch(url=url, tag=request.form.get('tags').strip(), extras={'paused': add_paused, 'processor': processor}) diff --git a/changedetectionio/tests/test_notification.py b/changedetectionio/tests/test_notification.py index 9e9c1c6f..760c660e 100644 --- a/changedetectionio/tests/test_notification.py +++ b/changedetectionio/tests/test_notification.py @@ -429,3 +429,24 @@ def test_global_send_test_notification(client, live_server, measure_memory_usage follow_redirects=True ) + #2727 - be sure a test notification when there are zero watches works ( should all be deleted now) + + os.unlink("test-datastore/notification.txt") + + + ######### Test global/system settings + res = client.post( + url_for("ajax_callback_send_notification_test")+"?mode=global-settings", + data={"notification_urls": test_notification_url}, + follow_redirects=True + ) + + assert res.status_code != 400 + assert res.status_code != 500 + + # Give apprise time to fire + time.sleep(4) + + with open("test-datastore/notification.txt", 'r') as f: + x = f.read() + assert 'change detection is cool 网站监测 内容更新了' in x diff --git a/changedetectionio/update_worker.py b/changedetectionio/update_worker.py index 9dd460d3..af54eff4 100644 --- a/changedetectionio/update_worker.py +++ b/changedetectionio/update_worker.py @@ -81,7 +81,8 @@ class update_worker(threading.Thread): 'watch_url': watch.get('url') if watch else None, }) - n_object.update(watch.extra_notification_token_values()) + if watch: + n_object.update(watch.extra_notification_token_values()) logger.trace(f"Main rendered notification placeholders (diff_added etc) calculated in {time.time()-now:.3f}s") logger.debug("Queued notification for sending")