Compare commits

...

8 Commits

Author SHA1 Message Date
dgtlmoon
9672c92a9b tweak timing
Some checks failed
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built 📦 package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
2025-10-10 00:27:28 +02:00
dgtlmoon
3ab4b337b6 hmm 2025-10-09 19:13:05 +02:00
dgtlmoon
ead82d373a timing 2025-10-09 18:54:02 +02:00
dgtlmoon
1abb5de0e7 speed up waits 2025-10-09 18:49:09 +02:00
dgtlmoon
830332ff82 tweak stats 2025-10-09 18:44:28 +02:00
dgtlmoon
0bec23bd72 Add memor usage 2025-10-09 18:38:13 +02:00
dgtlmoon
c61ea82816 Merge branch 'master' into test-speedup 2025-10-09 18:33:43 +02:00
dgtlmoon
ab84c6590a Test speedup - remove common calls for function calls 2025-10-09 18:33:15 +02:00
51 changed files with 325 additions and 716 deletions

View File

@@ -29,16 +29,28 @@ def reportlog(pytestconfig):
logger.remove(handler_id) logger.remove(handler_id)
def format_memory_human(bytes_value):
"""Format memory in human-readable units (KB, MB, GB)"""
if bytes_value < 1024:
return f"{bytes_value} B"
elif bytes_value < 1024 ** 2:
return f"{bytes_value / 1024:.2f} KB"
elif bytes_value < 1024 ** 3:
return f"{bytes_value / (1024 ** 2):.2f} MB"
else:
return f"{bytes_value / (1024 ** 3):.2f} GB"
def track_memory(memory_usage, ): def track_memory(memory_usage, ):
process = psutil.Process(os.getpid()) process = psutil.Process(os.getpid())
while not memory_usage["stop"]: while not memory_usage["stop"]:
current_rss = process.memory_info().rss current_rss = process.memory_info().rss
memory_usage["peak"] = max(memory_usage["peak"], current_rss) memory_usage["peak"] = max(memory_usage["peak"], current_rss)
memory_usage["current"] = current_rss # Keep updating current
time.sleep(0.01) # Adjust the sleep time as needed time.sleep(0.01) # Adjust the sleep time as needed
@pytest.fixture(scope='function') @pytest.fixture(scope='function')
def measure_memory_usage(request): def measure_memory_usage(request):
memory_usage = {"peak": 0, "stop": False} memory_usage = {"peak": 0, "current": 0, "stop": False}
tracker_thread = Thread(target=track_memory, args=(memory_usage,)) tracker_thread = Thread(target=track_memory, args=(memory_usage,))
tracker_thread.start() tracker_thread.start()
@@ -47,16 +59,17 @@ def measure_memory_usage(request):
memory_usage["stop"] = True memory_usage["stop"] = True
tracker_thread.join() tracker_thread.join()
# Note: ru_maxrss is in kilobytes on Unix-based systems # Note: psutil returns RSS memory in bytes
max_memory_used = memory_usage["peak"] / 1024 # Convert to MB peak_human = format_memory_human(memory_usage["peak"])
s = f"{time.time()} Peak memory used by the test {request.node.fspath} - '{request.node.name}': {max_memory_used:.2f} MB"
s = f"{time.time()} {request.node.fspath} - '{request.node.name}' - Peak memory: {peak_human}"
logger.debug(s) logger.debug(s)
with open("test-memory.log", 'a') as f: with open("test-memory.log", 'a') as f:
f.write(f"{s}\n") f.write(f"{s}\n")
# Assert that the memory usage is less than 200MB # Assert that the memory usage is less than 200MB
# assert max_memory_used < 150, f"Memory usage exceeded 200MB: {max_memory_used:.2f} MB" # assert peak_memory_kb < 150 * 1024, f"Memory usage exceeded 150MB: {peak_human}"
def cleanup(datastore_path): def cleanup(datastore_path):

View File

@@ -29,13 +29,8 @@ def do_test(client, live_server, make_test_use_extra_browser=False):
assert b"Settings updated." in res.data assert b"Settings updated." in res.data
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
if make_test_use_extra_browser: if make_test_use_extra_browser:

View File

@@ -2,7 +2,7 @@
import json import json
import os import os
from flask import url_for from flask import url_for
from changedetectionio.tests.util import live_server_setup, wait_for_all_checks, extract_UUID_from_client from changedetectionio.tests.util import live_server_setup, wait_for_all_checks, extract_UUID_from_client, delete_all_watches
def set_response(): def set_response():
@@ -98,6 +98,5 @@ def test_socks5(client, live_server, measure_memory_usage):
) )
assert b"OK" in res.data assert b"OK" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -5,7 +5,7 @@ import re
from flask import url_for from flask import url_for
from changedetectionio.tests.util import set_original_response, set_modified_response, set_more_modified_response, live_server_setup, \ from changedetectionio.tests.util import set_original_response, set_modified_response, set_more_modified_response, live_server_setup, \
wait_for_all_checks, \ wait_for_all_checks, \
set_longer_modified_response set_longer_modified_response, delete_all_watches
from changedetectionio.tests.util import extract_UUID_from_client from changedetectionio.tests.util import extract_UUID_from_client
import logging import logging
import base64 import base64
@@ -85,8 +85,7 @@ def test_check_notification_email_formats_default_HTML(client, live_server, meas
assert '(added) So let\'s see what happens.\r\n' in msg # The plaintext part with \r\n assert '(added) So let\'s see what happens.\r\n' in msg # The plaintext part with \r\n
assert 'Content-Type: text/html' in msg assert 'Content-Type: text/html' in msg
assert '(added) So let\'s see what happens.<br>' in msg # the html part assert '(added) So let\'s see what happens.<br>' in msg # the html part
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_check_notification_email_formats_default_Text_override_HTML(client, live_server, measure_memory_usage): def test_check_notification_email_formats_default_Text_override_HTML(client, live_server, measure_memory_usage):
@@ -179,5 +178,4 @@ def test_check_notification_email_formats_default_Text_override_HTML(client, liv
assert '&lt;' not in msg assert '&lt;' not in msg
assert 'Content-Type: text/html' in msg assert 'Content-Type: text/html' in msg
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -2,7 +2,7 @@ from .util import live_server_setup, wait_for_all_checks
from flask import url_for from flask import url_for
import time import time
def test_check_access_control(app, client, live_server): def test_check_access_control(app, client, live_server, measure_memory_usage):
# Still doesnt work, but this is closer. # Still doesnt work, but this is closer.
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function

View File

@@ -3,7 +3,7 @@
import os.path import os.path
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks, wait_for_notification_endpoint_output from .util import live_server_setup, wait_for_all_checks, wait_for_notification_endpoint_output, delete_all_watches
import time import time
def set_original(excluding=None, add_line=None): def set_original(excluding=None, add_line=None):
@@ -44,12 +44,8 @@ def test_check_removed_line_contains_trigger(client, live_server, measure_memory
set_original() set_original()
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -107,14 +103,12 @@ def test_check_removed_line_contains_trigger(client, live_server, measure_memory
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'has-unread-changes' in res.data assert b'has-unread-changes' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_check_add_line_contains_trigger(client, live_server, measure_memory_usage): def test_check_add_line_contains_trigger(client, live_server, measure_memory_usage):
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
time.sleep(1) time.sleep(1)
# Give the endpoint time to spin up # Give the endpoint time to spin up
@@ -137,12 +131,8 @@ def test_check_add_line_contains_trigger(client, live_server, measure_memory_usa
set_original() set_original()
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -187,5 +177,4 @@ def test_check_add_line_contains_trigger(client, live_server, measure_memory_usa
assert b'-Oh yes please' in response assert b'-Oh yes please' in response
assert '网站监测 内容更新了'.encode('utf-8') in response assert '网站监测 内容更新了'.encode('utf-8') in response
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -2,7 +2,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
import json import json
import uuid import uuid
@@ -276,8 +276,7 @@ def test_access_denied(client, live_server, measure_memory_usage):
assert res.status_code == 200 assert res.status_code == 200
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
res = client.post( res = client.post(
url_for("settings.settings_page"), url_for("settings.settings_page"),
@@ -385,8 +384,7 @@ def test_api_watch_PUT_update(client, live_server, measure_memory_usage):
assert b'Additional properties are not allowed' in res.data assert b'Additional properties are not allowed' in res.data
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_api_import(client, live_server, measure_memory_usage): def test_api_import(client, live_server, measure_memory_usage):

View File

@@ -4,7 +4,7 @@ from flask import url_for
from .util import live_server_setup from .util import live_server_setup
import json import json
def test_api_notifications_crud(client, live_server): def test_api_notifications_crud(client, live_server, measure_memory_usage):
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
api_key = live_server.app.config['DATASTORE'].data['settings']['application'].get('api_access_token') api_key = live_server.app.config['DATASTORE'].data['settings']['application'].get('api_access_token')

View File

@@ -6,7 +6,7 @@ import time
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks
def test_api_search(client, live_server): def test_api_search(client, live_server, measure_memory_usage):
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
api_key = live_server.app.config['DATASTORE'].data['settings']['application'].get('api_access_token') api_key = live_server.app.config['DATASTORE'].data['settings']['application'].get('api_access_token')

View File

@@ -12,12 +12,8 @@ def test_basic_auth(client, live_server, measure_memory_usage):
# This page will echo back any auth info # This page will echo back any auth info
test_url = url_for('test_basicauth_method', _external=True).replace("//","//myuser:mypass@") test_url = url_for('test_basicauth_method', _external=True).replace("//","//myuser:mypass@")
time.sleep(1) time.sleep(1)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
time.sleep(1) time.sleep(1)
# Check form validation # Check form validation

View File

@@ -86,12 +86,8 @@ def test_check_ldjson_price_autodetect(client, live_server, measure_memory_usage
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# Should get a notice that it's available # Should get a notice that it's available
@@ -129,12 +125,8 @@ def test_check_ldjson_price_autodetect(client, live_server, measure_memory_usage
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'ldjson-price-track-offer' not in res.data assert b'ldjson-price-track-offer' not in res.data
@@ -146,12 +138,8 @@ def test_check_ldjson_price_autodetect(client, live_server, measure_memory_usage
def _test_runner_check_bad_format_ignored(live_server, client, has_ldjson_price_data): def _test_runner_check_bad_format_ignored(live_server, client, has_ldjson_price_data):
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
for k,v in client.application.config.get('DATASTORE').data['watching'].items(): for k,v in client.application.config.get('DATASTORE').data['watching'].items():

View File

@@ -3,7 +3,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks, extract_rss_token_from_UI, \ from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks, extract_rss_token_from_UI, \
extract_UUID_from_client extract_UUID_from_client, delete_all_watches
sleep_time_for_fetch_thread = 3 sleep_time_for_fetch_thread = 3
@@ -163,8 +163,7 @@ def test_check_basic_change_detection_functionality(client, live_server, measure
# #
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_non_text_mime_or_downloads(client, live_server, measure_memory_usage): def test_non_text_mime_or_downloads(client, live_server, measure_memory_usage):
""" """
@@ -193,13 +192,8 @@ got it\r\n
test_url = url_for('test_endpoint', content_type="application/octet-stream", _external=True) test_url = url_for('test_endpoint', content_type="application/octet-stream", _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -227,7 +221,7 @@ got it\r\n
assert b"some random text that should be split by line\n" in res.data assert b"some random text that should be split by line\n" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
def test_standard_text_plain(client, live_server, measure_memory_usage): def test_standard_text_plain(client, live_server, measure_memory_usage):
@@ -258,13 +252,8 @@ got it\r\n
test_url = url_for('test_endpoint', content_type="text/plain", _external=True) test_url = url_for('test_endpoint', content_type="text/plain", _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -293,7 +282,7 @@ got it\r\n
assert b"some random text that should be split by line\n" in res.data assert b"some random text that should be split by line\n" in res.data
assert b"<title>Even this title should stay because we are just plain text</title>" in res.data assert b"<title>Even this title should stay because we are just plain text</title>" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
# Server says its plaintext, we should always treat it as plaintext # Server says its plaintext, we should always treat it as plaintext
def test_plaintext_even_if_xml_content(client, live_server, measure_memory_usage): def test_plaintext_even_if_xml_content(client, live_server, measure_memory_usage):
@@ -309,13 +298,8 @@ def test_plaintext_even_if_xml_content(client, live_server, measure_memory_usage
test_url = url_for('test_endpoint', content_type="text/plain", _external=True) test_url = url_for('test_endpoint', content_type="text/plain", _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -326,7 +310,7 @@ def test_plaintext_even_if_xml_content(client, live_server, measure_memory_usage
assert b'&lt;string name=&#34;feed_update_receiver_name&#34;' in res.data assert b'&lt;string name=&#34;feed_update_receiver_name&#34;' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
# Server says its plaintext, we should always treat it as plaintext, and then if they have a filter, try to apply that # Server says its plaintext, we should always treat it as plaintext, and then if they have a filter, try to apply that
def test_plaintext_even_if_xml_content_and_can_apply_filters(client, live_server, measure_memory_usage): def test_plaintext_even_if_xml_content_and_can_apply_filters(client, live_server, measure_memory_usage):

View File

@@ -2,7 +2,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
from changedetectionio import html_tools from changedetectionio import html_tools
def set_original_ignore_response(): def set_original_ignore_response():
@@ -70,12 +70,8 @@ def test_check_block_changedetection_text_NOT_present(client, live_server, measu
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -144,5 +140,4 @@ def test_check_block_changedetection_text_NOT_present(client, live_server, measu
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -14,12 +14,8 @@ def test_clone_functionality(client, live_server, measure_memory_usage):
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# So that we can be sure the same history doesnt carry over # So that we can be sure the same history doesnt carry over

View File

@@ -3,7 +3,7 @@ import json
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
from ..model import CONDITIONS_MATCH_LOGIC_DEFAULT from ..model import CONDITIONS_MATCH_LOGIC_DEFAULT
@@ -47,11 +47,11 @@ def set_number_out_of_range_response(number="150"):
f.write(test_return_data) f.write(test_return_data)
# def test_setup(client, live_server): # def test_setup(client, live_server, measure_memory_usage):
"""Test that both text and number conditions work together with AND logic.""" """Test that both text and number conditions work together with AND logic."""
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
def test_conditions_with_text_and_number(client, live_server): def test_conditions_with_text_and_number(client, live_server, measure_memory_usage):
"""Test that both text and number conditions work together with AND logic.""" """Test that both text and number conditions work together with AND logic."""
set_original_response("50") set_original_response("50")
@@ -60,12 +60,8 @@ def test_conditions_with_text_and_number(client, live_server):
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# Configure the watch with two conditions connected with AND: # Configure the watch with two conditions connected with AND:
@@ -143,23 +139,18 @@ def test_conditions_with_text_and_number(client, live_server):
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'has-unread-changes' not in res.data assert b'has-unread-changes' not in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# The 'validate' button next to each rule row # The 'validate' button next to each rule row
def test_condition_validate_rule_row(client, live_server): def test_condition_validate_rule_row(client, live_server, measure_memory_usage):
set_original_response("50") set_original_response("50")
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
uuid = next(iter(live_server.app.config['DATASTORE'].data['watching'])) uuid = next(iter(live_server.app.config['DATASTORE'].data['watching']))
@@ -230,12 +221,8 @@ def test_wordcount_conditions_plugin(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)

View File

@@ -81,12 +81,8 @@ def test_check_markup_include_filters_restriction(client, live_server, measure_m
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
time.sleep(sleep_time_for_fetch_thread) time.sleep(sleep_time_for_fetch_thread)
@@ -138,12 +134,8 @@ def test_check_multiple_filters(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# Goto the edit page, add our ignore text # Goto the edit page, add our ignore text
@@ -193,12 +185,8 @@ def test_filter_is_empty_help_suggestion(client, live_server, measure_memory_usa
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# Goto the edit page, add our ignore text # Goto the edit page, add our ignore text

View File

@@ -5,7 +5,7 @@ import time
from flask import url_for from flask import url_for
from ..html_tools import * from ..html_tools import *
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
@@ -231,8 +231,7 @@ body > table > tr:nth-child(3) > td:nth-child(3)""",
for selector_list in subtractive_selectors_data: for selector_list in subtractive_selectors_data:
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
uuid = client.application.config.get('DATASTORE').add_watch(url=test_url, extras={"subtractive_selectors": selector_list.splitlines()}) uuid = client.application.config.get('DATASTORE').add_watch(url=test_url, extras={"subtractive_selectors": selector_list.splitlines()})
client.get(url_for("ui.form_watch_checknow"), follow_redirects=True) client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)

View File

@@ -28,11 +28,8 @@ def test_check_encoding_detection(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', content_type="text/html", _external=True) test_url = url_for('test_endpoint', content_type="text/html", _external=True)
client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -59,11 +56,8 @@ def test_check_encoding_detection_missing_content_type_header(client, live_serve
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
wait_for_all_checks(client) wait_for_all_checks(client)

View File

@@ -3,7 +3,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
@@ -19,12 +19,8 @@ def _runner_test_http_errors(client, live_server, http_code, expected_text):
status_code=http_code, status_code=http_code,
_external=True) _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -47,8 +43,7 @@ def _runner_test_http_errors(client, live_server, http_code, expected_text):
#assert b'Error Screenshot' in res.data #assert b'Error Screenshot' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_http_error_handler(client, live_server, measure_memory_usage): def test_http_error_handler(client, live_server, measure_memory_usage):
@@ -56,8 +51,7 @@ def test_http_error_handler(client, live_server, measure_memory_usage):
_runner_test_http_errors(client, live_server, 404, 'Page not found') _runner_test_http_errors(client, live_server, 404, 'Page not found')
_runner_test_http_errors(client, live_server, 500, '(Internal server error) received') _runner_test_http_errors(client, live_server, 500, '(Internal server error) received')
_runner_test_http_errors(client, live_server, 400, 'Error - Request returned a HTTP error code 400') _runner_test_http_errors(client, live_server, 400, 'Error - Request returned a HTTP error code 400')
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# Just to be sure error text is properly handled # Just to be sure error text is properly handled
def test_DNS_errors(client, live_server, measure_memory_usage): def test_DNS_errors(client, live_server, measure_memory_usage):
@@ -87,8 +81,7 @@ def test_DNS_errors(client, live_server, measure_memory_usage):
assert found_name_resolution_error assert found_name_resolution_error
# Should always record that we tried # Should always record that we tried
assert bytes("just now".encode('utf-8')) in res.data assert bytes("just now".encode('utf-8')) in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# Re 1513 # Re 1513
def test_low_level_errors_clear_correctly(client, live_server, measure_memory_usage): def test_low_level_errors_clear_correctly(client, live_server, measure_memory_usage):
@@ -145,5 +138,4 @@ def test_low_level_errors_clear_correctly(client, live_server, measure_memory_us
) )
assert not found_name_resolution_error assert not found_name_resolution_error
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -2,7 +2,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
from ..html_tools import * from ..html_tools import *
@@ -76,12 +76,8 @@ def test_check_filter_multiline(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -131,12 +127,8 @@ def test_check_filter_and_regex_extract(client, live_server, measure_memory_usag
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -212,12 +204,8 @@ def test_regex_error_handling(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
### test regex error handling ### test regex error handling
res = client.post( res = client.post(
@@ -231,5 +219,4 @@ def test_regex_error_handling(client, live_server, measure_memory_usage):
assert b'is not a valid regular expression.' in res.data assert b'is not a valid regular expression.' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -42,13 +42,8 @@ def run_filter_test(client, live_server, content_filter):
if os.path.isfile("test-datastore/notification.txt"): if os.path.isfile("test-datastore/notification.txt"):
os.unlink("test-datastore/notification.txt") os.unlink("test-datastore/notification.txt")
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
uuid = next(iter(live_server.app.config['DATASTORE'].data['watching'])) uuid = next(iter(live_server.app.config['DATASTORE'].data['watching']))

View File

@@ -2,7 +2,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks, extract_rss_token_from_UI, get_UUID_for_tag_name, extract_UUID_from_client from .util import live_server_setup, wait_for_all_checks, extract_rss_token_from_UI, get_UUID_for_tag_name, extract_UUID_from_client, delete_all_watches
import os import os
@@ -127,8 +127,7 @@ def test_setup_group_tag(client, live_server, measure_memory_usage):
assert b"should-be-excluded" not in res.data assert b"should-be-excluded" not in res.data
assert res.status_code == 200 assert res.status_code == 200
assert b"first-imported=1" in res.data assert b"first-imported=1" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_tag_import_singular(client, live_server, measure_memory_usage): def test_tag_import_singular(client, live_server, measure_memory_usage):
@@ -147,8 +146,7 @@ def test_tag_import_singular(client, live_server, measure_memory_usage):
) )
# Should be only 1 tag because they both had the same # Should be only 1 tag because they both had the same
assert res.data.count(b'test-tag') == 1 assert res.data.count(b'test-tag') == 1
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_tag_add_in_ui(client, live_server, measure_memory_usage): def test_tag_add_in_ui(client, live_server, measure_memory_usage):
@@ -164,8 +162,7 @@ def test_tag_add_in_ui(client, live_server, measure_memory_usage):
res = client.get(url_for("tags.delete_all"), follow_redirects=True) res = client.get(url_for("tags.delete_all"), follow_redirects=True)
assert b'All tags deleted' in res.data assert b'All tags deleted' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_group_tag_notification(client, live_server, measure_memory_usage): def test_group_tag_notification(client, live_server, measure_memory_usage):
@@ -232,8 +229,7 @@ def test_group_tag_notification(client, live_server, measure_memory_usage):
#@todo Test that multiple notifications fired #@todo Test that multiple notifications fired
#@todo Test that each of multiple notifications with different settings #@todo Test that each of multiple notifications with different settings
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_limit_tag_ui(client, live_server, measure_memory_usage): def test_limit_tag_ui(client, live_server, measure_memory_usage):
@@ -269,8 +265,7 @@ def test_limit_tag_ui(client, live_server, measure_memory_usage):
assert res.data.count(b' unviewed ') == 1 assert res.data.count(b' unviewed ') == 1
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
res = client.get(url_for("tags.delete_all"), follow_redirects=True) res = client.get(url_for("tags.delete_all"), follow_redirects=True)
assert b'All tags deleted' in res.data assert b'All tags deleted' in res.data
@@ -297,8 +292,7 @@ def test_clone_tag_on_import(client, live_server, measure_memory_usage):
# 2 times plus the top link to tag # 2 times plus the top link to tag
assert res.data.count(b'test-tag') == 3 assert res.data.count(b'test-tag') == 3
assert res.data.count(b'another-tag') == 3 assert res.data.count(b'another-tag') == 3
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_clone_tag_on_quickwatchform_add(client, live_server, measure_memory_usage): def test_clone_tag_on_quickwatchform_add(client, live_server, measure_memory_usage):
@@ -325,8 +319,7 @@ def test_clone_tag_on_quickwatchform_add(client, live_server, measure_memory_usa
# 2 times plus the top link to tag # 2 times plus the top link to tag
assert res.data.count(b'test-tag') == 3 assert res.data.count(b'test-tag') == 3
assert res.data.count(b'another-tag') == 3 assert res.data.count(b'another-tag') == 3
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
res = client.get(url_for("tags.delete_all"), follow_redirects=True) res = client.get(url_for("tags.delete_all"), follow_redirects=True)
assert b'All tags deleted' in res.data assert b'All tags deleted' in res.data
@@ -389,12 +382,8 @@ def test_order_of_filters_tag_filter_and_watch_filter(client, live_server, measu
f.write(d) f.write(d)
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
filters = [ filters = [
@@ -480,5 +469,4 @@ the {test} appeared before. {test in res.data[:n]=}
""" """
n += t_index + len(test) n += t_index + len(test)
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -4,7 +4,7 @@ import time
import os import os
import json import json
from flask import url_for from flask import url_for
from .util import wait_for_all_checks from .util import wait_for_all_checks, delete_all_watches
from urllib.parse import urlparse, parse_qs from urllib.parse import urlparse, parse_qs
def test_consistent_history(client, live_server, measure_memory_usage): def test_consistent_history(client, live_server, measure_memory_usage):
@@ -80,19 +80,15 @@ def test_consistent_history(client, live_server, measure_memory_usage):
assert '"default"' not in f.read(), "'default' probably shouldnt be here, it came from when the 'default' Watch vars were accidently being saved" assert '"default"' not in f.read(), "'default' probably shouldnt be here, it came from when the 'default' Watch vars were accidently being saved"
def test_check_text_history_view(client, live_server): def test_check_text_history_view(client, live_server, measure_memory_usage):
with open("test-datastore/endpoint-content.txt", "w") as f: with open("test-datastore/endpoint-content.txt", "w") as f:
f.write("<html>test-one</html>") f.write("<html>test-one</html>")
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -121,5 +117,4 @@ def test_check_text_history_view(client, live_server):
assert b'test-two' in res.data assert b'test-two' in res.data
assert b'test-one' not in res.data assert b'test-one' not in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -27,12 +27,8 @@ def test_ignore(client, live_server, measure_memory_usage):
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
set_original_ignore_response() set_original_ignore_response()
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -79,12 +75,8 @@ def test_strip_ignore_lines(client, live_server, measure_memory_usage):
assert b"Settings updated." in res.data assert b"Settings updated." in res.data
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)

View File

@@ -2,7 +2,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
from changedetectionio import html_tools from changedetectionio import html_tools
@@ -97,12 +97,8 @@ def test_check_ignore_text_functionality(client, live_server, measure_memory_usa
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -163,8 +159,7 @@ def test_check_ignore_text_functionality(client, live_server, measure_memory_usa
# it is only ignored, it is not removed (it will be highlighted too) # it is only ignored, it is not removed (it will be highlighted too)
assert b'new ignore stuff' in res.data assert b'new ignore stuff' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# When adding some ignore text, it should not trigger a change, even if something else on that line changes # When adding some ignore text, it should not trigger a change, even if something else on that line changes
def _run_test_global_ignore(client, as_source=False, extra_ignore=""): def _run_test_global_ignore(client, as_source=False, extra_ignore=""):
@@ -192,12 +187,8 @@ def _run_test_global_ignore(client, as_source=False, extra_ignore=""):
# Switch to source mode so we can test that too! # Switch to source mode so we can test that too!
test_url = "source:"+test_url test_url = "source:"+test_url
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -251,13 +242,12 @@ def _run_test_global_ignore(client, as_source=False, extra_ignore=""):
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'has-unread-changes' in res.data assert b'has-unread-changes' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_check_global_ignore_text_functionality(client, live_server): def test_check_global_ignore_text_functionality(client, live_server, measure_memory_usage):
_run_test_global_ignore(client, as_source=False) _run_test_global_ignore(client, as_source=False)
def test_check_global_ignore_text_functionality_as_source(client, live_server): def test_check_global_ignore_text_functionality_as_source(client, live_server, measure_memory_usage):
_run_test_global_ignore(client, as_source=True, extra_ignore='/\?v=\d/') _run_test_global_ignore(client, as_source=True, extra_ignore='/\?v=\d/')

View File

@@ -3,9 +3,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
def set_original_ignore_response(): def set_original_ignore_response():
@@ -117,7 +115,5 @@ def test_render_anchor_tag_content_true(client, live_server, measure_memory_usag
assert b"/test-endpoint" in res.data assert b"/test-endpoint" in res.data
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), delete_all_watches(client)
follow_redirects=True)
assert b'Deleted' in res.data

View File

@@ -60,12 +60,8 @@ def test_normal_page_check_works_with_ignore_status_code(client, live_server, me
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -94,12 +90,8 @@ def test_403_page_check_works_with_ignore_status_code(client, live_server, measu
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', status_code=403, _external=True) test_url = url_for('test_endpoint', status_code=403, _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
time.sleep(sleep_time_for_fetch_thread) time.sleep(sleep_time_for_fetch_thread)

View File

@@ -70,12 +70,8 @@ def test_check_ignore_whitespace(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
time.sleep(sleep_time_for_fetch_thread) time.sleep(sleep_time_for_fetch_thread)
# Trigger a check # Trigger a check

View File

@@ -5,7 +5,7 @@ import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
# def test_setup(client, live_server, measure_memory_usage): # def test_setup(client, live_server, measure_memory_usage):
@@ -28,7 +28,7 @@ https://example.com tag1, other tag"""
assert b"3 Imported" in res.data assert b"3 Imported" in res.data
assert b"tag1" in res.data assert b"tag1" in res.data
assert b"other tag" in res.data assert b"other tag" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
# Clear flask alerts # Clear flask alerts
res = client.get( url_for("watchlist.index")) res = client.get( url_for("watchlist.index"))
@@ -53,7 +53,7 @@ def xtest_import_skip_url(client, live_server, measure_memory_usage):
assert b"1 Imported" in res.data assert b"1 Imported" in res.data
assert b"ht000000broken" in res.data assert b"ht000000broken" in res.data
assert b"1 Skipped" in res.data assert b"1 Skipped" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
# Clear flask alerts # Clear flask alerts
res = client.get( url_for("watchlist.index")) res = client.get( url_for("watchlist.index"))
@@ -119,7 +119,7 @@ def test_import_distillio(client, live_server, measure_memory_usage):
assert b"nice stuff" in res.data assert b"nice stuff" in res.data
assert b"nerd-news" in res.data assert b"nerd-news" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
# Clear flask alerts # Clear flask alerts
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
@@ -169,8 +169,7 @@ def test_import_custom_xlsx(client, live_server, measure_memory_usage):
assert filters[0] == '/html[1]/body[1]/div[4]/div[1]/div[1]/div[1]||//*[@id=\'content\']/div[3]/div[1]/div[1]||//*[@id=\'content\']/div[1]' assert filters[0] == '/html[1]/body[1]/div[4]/div[1]/div[1]/div[1]||//*[@id=\'content\']/div[3]/div[1]/div[1]||//*[@id=\'content\']/div[1]'
assert watch.get('time_between_check') == {'weeks': 0, 'days': 1, 'hours': 6, 'minutes': 24, 'seconds': 0} assert watch.get('time_between_check') == {'weeks': 0, 'days': 1, 'hours': 6, 'minutes': 24, 'seconds': 0}
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_import_watchete_xlsx(client, live_server, measure_memory_usage): def test_import_watchete_xlsx(client, live_server, measure_memory_usage):
"""Test can upload a excel spreadsheet and the watches are created correctly""" """Test can upload a excel spreadsheet and the watches are created correctly"""
@@ -214,5 +213,4 @@ def test_import_watchete_xlsx(client, live_server, measure_memory_usage):
if watch.get('title') == 'system default website': if watch.get('title') == 'system default website':
assert watch.get('fetch_backend') == 'system' # uses default if blank assert watch.get('fetch_backend') == 'system' # uses default if blank
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -3,7 +3,7 @@
import time import time
from flask import url_for, escape from flask import url_for, escape
from . util import live_server_setup, wait_for_all_checks from . util import live_server_setup, wait_for_all_checks, delete_all_watches
import pytest import pytest
jq_support = True jq_support = True
@@ -207,11 +207,8 @@ def test_check_json_without_filter(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', content_type="application/json", _external=True) test_url = url_for('test_endpoint', content_type="application/json", _external=True)
client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -225,8 +222,7 @@ def test_check_json_without_filter(client, live_server, measure_memory_usage):
assert b'&#34;html&#34;: &#34;&lt;b&gt;&#34;' in res.data assert b'&#34;html&#34;: &#34;&lt;b&gt;&#34;' in res.data
assert res.data.count(b'{') >= 2 assert res.data.count(b'{') >= 2
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def check_json_filter(json_filter, client, live_server): def check_json_filter(json_filter, client, live_server):
set_original_response() set_original_response()
@@ -234,12 +230,8 @@ def check_json_filter(json_filter, client, live_server):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', content_type="application/json", _external=True) test_url = url_for('test_endpoint', content_type="application/json", _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -286,8 +278,7 @@ def check_json_filter(json_filter, client, live_server):
# And #462 - check we see the proper utf-8 string there # And #462 - check we see the proper utf-8 string there
assert "Örnsköldsvik".encode('utf-8') in res.data assert "Örnsköldsvik".encode('utf-8') in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_check_jsonpath_filter(client, live_server, measure_memory_usage): def test_check_jsonpath_filter(client, live_server, measure_memory_usage):
check_json_filter('json:boss.name', client, live_server) check_json_filter('json:boss.name', client, live_server)
@@ -308,12 +299,8 @@ def check_json_filter_bool_val(json_filter, client, live_server):
test_url = url_for('test_endpoint', content_type="application/json", _external=True) test_url = url_for('test_endpoint', content_type="application/json", _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# Goto the edit page, add our ignore text # Goto the edit page, add our ignore text
@@ -345,8 +332,7 @@ def check_json_filter_bool_val(json_filter, client, live_server):
# But the change should be there, tho its hard to test the change was detected because it will show old and new versions # But the change should be there, tho its hard to test the change was detected because it will show old and new versions
assert b'false' in res.data assert b'false' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_check_jsonpath_filter_bool_val(client, live_server, measure_memory_usage): def test_check_jsonpath_filter_bool_val(client, live_server, measure_memory_usage):
check_json_filter_bool_val("json:$['available']", client, live_server) check_json_filter_bool_val("json:$['available']", client, live_server)
@@ -372,12 +358,8 @@ def check_json_ext_filter(json_filter, client, live_server):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', content_type="application/json", _external=True) test_url = url_for('test_endpoint', content_type="application/json", _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -431,8 +413,7 @@ def check_json_ext_filter(json_filter, client, live_server):
assert b'ForSale' in res.data assert b'ForSale' in res.data
assert b'Sold' in res.data assert b'Sold' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_ignore_json_order(client, live_server, measure_memory_usage): def test_ignore_json_order(client, live_server, measure_memory_usage):
# A change in order shouldn't trigger a notification # A change in order shouldn't trigger a notification
@@ -443,12 +424,8 @@ def test_ignore_json_order(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', content_type="application/json", _external=True) test_url = url_for('test_endpoint', content_type="application/json", _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -473,8 +450,7 @@ def test_ignore_json_order(client, live_server, measure_memory_usage):
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'has-unread-changes' in res.data assert b'has-unread-changes' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_correct_header_detect(client, live_server, measure_memory_usage): def test_correct_header_detect(client, live_server, measure_memory_usage):
# Like in https://github.com/dgtlmoon/changedetection.io/pull/1593 # Like in https://github.com/dgtlmoon/changedetection.io/pull/1593
@@ -485,12 +461,8 @@ def test_correct_header_detect(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
# Check weird casing is cleaned up and detected also # Check weird casing is cleaned up and detected also
test_url = url_for('test_endpoint', content_type="aPPlication/JSon", uppercase_headers=True, _external=True) test_url = url_for('test_endpoint', content_type="aPPlication/JSon", uppercase_headers=True, _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
@@ -505,8 +477,7 @@ def test_correct_header_detect(client, live_server, measure_memory_usage):
assert b'&#34;hello&#34;: 123,' in res.data assert b'&#34;hello&#34;: 123,' in res.data
assert b'&#34;world&#34;: 123' in res.data assert b'&#34;world&#34;: 123' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_check_jsonpath_ext_filter(client, live_server, measure_memory_usage): def test_check_jsonpath_ext_filter(client, live_server, measure_memory_usage):
check_json_ext_filter('json:$[?(@.status==Sold)]', client, live_server) check_json_ext_filter('json:$[?(@.status==Sold)]', client, live_server)

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from flask import url_for from flask import url_for
from changedetectionio.tests.util import live_server_setup, wait_for_all_checks, extract_UUID_from_client from changedetectionio.tests.util import live_server_setup, wait_for_all_checks, extract_UUID_from_client, delete_all_watches
def set_response(): def set_response():
@@ -75,5 +75,4 @@ def test_content_filter_live_preview(client, live_server, measure_memory_usage):
assert reply.get('ignore_line_numbers') == [2] # Ignored - "socks" on line 2 assert reply.get('ignore_line_numbers') == [2] # Ignored - "socks" on line 2
assert reply.get('trigger_line_numbers') == [1] # Triggers "Awesome" in line 1 assert reply.get('trigger_line_numbers') == [1] # Triggers "Awesome" in line 1
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from flask import url_for from flask import url_for
from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks, delete_all_watches
import time import time
@@ -113,6 +113,5 @@ def test_check_basic_change_detection_functionality(client, live_server, measure
# #
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -24,12 +24,8 @@ def test_obfuscations(client, live_server, measure_memory_usage):
time.sleep(1) time.sleep(1)
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
time.sleep(3) time.sleep(3)

View File

@@ -13,13 +13,8 @@ def test_fetch_pdf(client, live_server, measure_memory_usage):
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
test_url = url_for('test_pdf_endpoint', _external=True) test_url = url_for('test_pdf_endpoint', _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)

View File

@@ -13,13 +13,8 @@ def test_fetch_pdf(client, live_server, measure_memory_usage):
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
test_url = url_for('test_pdf_endpoint', _external=True) test_url = url_for('test_pdf_endpoint', _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)

View File

@@ -2,7 +2,7 @@ import json
import os import os
import time import time
from flask import url_for from flask import url_for
from . util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks, extract_UUID_from_client from . util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks, extract_UUID_from_client, delete_all_watches
@@ -17,21 +17,13 @@ def test_headers_in_request(client, live_server, measure_memory_usage):
test_url = test_url.replace('localhost', 'changedet') test_url = test_url.replace('localhost', 'changedet')
# Add the test URL twice, we will check # Add the test URL twice, we will check
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
cookie_header = '_ga=GA1.2.1022228332; cookie-preferences=analytics:accepted;' cookie_header = '_ga=GA1.2.1022228332; cookie-preferences=analytics:accepted;'
@@ -82,8 +74,7 @@ def test_headers_in_request(client, live_server, measure_memory_usage):
for k, watch in client.application.config.get('DATASTORE').data.get('watching').items(): for k, watch in client.application.config.get('DATASTORE').data.get('watching').items():
assert 'custom' in watch.get('remote_server_reply') # added in util.py assert 'custom' in watch.get('remote_server_reply') # added in util.py
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_body_in_request(client, live_server, measure_memory_usage): def test_body_in_request(client, live_server, measure_memory_usage):
@@ -93,12 +84,8 @@ def test_body_in_request(client, live_server, measure_memory_usage):
# Because its no longer calling back to localhost but from the browser container, set in test-only.yml # Because its no longer calling back to localhost but from the browser container, set in test-only.yml
test_url = test_url.replace('localhost', 'cdio') test_url = test_url.replace('localhost', 'cdio')
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -150,12 +137,8 @@ def test_body_in_request(client, live_server, measure_memory_usage):
####### data sanity checks ####### data sanity checks
# Add the test URL twice, we will check # Add the test URL twice, we will check
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
watches_with_body = 0 watches_with_body = 0
with open('test-datastore/url-watches.json') as f: with open('test-datastore/url-watches.json') as f:
@@ -180,8 +163,7 @@ def test_body_in_request(client, live_server, measure_memory_usage):
follow_redirects=True follow_redirects=True
) )
assert b"Body must be empty when Request Method is set to GET" in res.data assert b"Body must be empty when Request Method is set to GET" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_method_in_request(client, live_server, measure_memory_usage): def test_method_in_request(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
@@ -191,20 +173,12 @@ def test_method_in_request(client, live_server, measure_memory_usage):
test_url = test_url.replace('localhost', 'cdio') test_url = test_url.replace('localhost', 'cdio')
# Add the test URL twice, we will check # Add the test URL twice, we will check
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -258,8 +232,7 @@ def test_method_in_request(client, live_server, measure_memory_usage):
# Should be only one with method set to PATCH # Should be only one with method set to PATCH
assert watches_with_method == 1 assert watches_with_method == 1
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# Re #2408 - user-agent override test, also should handle case-insensitive header deduplication # Re #2408 - user-agent override test, also should handle case-insensitive header deduplication
def test_ua_global_override(client, live_server, measure_memory_usage): def test_ua_global_override(client, live_server, measure_memory_usage):
@@ -277,12 +250,8 @@ def test_ua_global_override(client, live_server, measure_memory_usage):
) )
assert b'Settings updated' in res.data assert b'Settings updated' in res.data
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.get( res = client.get(
@@ -315,8 +284,7 @@ def test_ua_global_override(client, live_server, measure_memory_usage):
) )
assert b"agent-from-watch" in res.data assert b"agent-from-watch" in res.data
assert b"html-requests-user-agent" not in res.data assert b"html-requests-user-agent" not in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_headers_textfile_in_request(client, live_server, measure_memory_usage): def test_headers_textfile_in_request(client, live_server, measure_memory_usage):
@@ -356,12 +324,8 @@ def test_headers_textfile_in_request(client, live_server, measure_memory_usage):
assert b"requests-default_ua-html_requests" in res.data assert b"requests-default_ua-html_requests" in res.data
# Add the test URL twice, we will check # Add the test URL twice, we will check
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -429,19 +393,14 @@ def test_headers_textfile_in_request(client, live_server, measure_memory_usage):
assert "User-Agent:".encode('utf-8') + requests_ua.encode('utf-8') in res.data assert "User-Agent:".encode('utf-8') + requests_ua.encode('utf-8') in res.data
# unlink headers.txt on start/stop # unlink headers.txt on start/stop
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_headers_validation(client, live_server): def test_headers_validation(client, live_server, measure_memory_usage):
test_url = url_for('test_headers', _external=True) test_url = url_for('test_headers', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
res = client.post( res = client.post(
url_for("ui.ui_edit.edit_page", uuid="first"), url_for("ui.ui_edit.edit_page", uuid="first"),

View File

@@ -3,7 +3,7 @@ import os
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks, wait_for_notification_endpoint_output, extract_UUID_from_client from .util import live_server_setup, wait_for_all_checks, wait_for_notification_endpoint_output, extract_UUID_from_client, delete_all_watches
from ..notification import default_notification_format from ..notification import default_notification_format
instock_props = [ instock_props = [
@@ -44,11 +44,11 @@ def set_original_response(props_markup='', price="121.95"):
# def test_setup(client, live_server): # def test_setup(client, live_server, measure_memory_usage):
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
def test_restock_itemprop_basic(client, live_server): def test_restock_itemprop_basic(client, live_server, measure_memory_usage):
@@ -69,8 +69,7 @@ def test_restock_itemprop_basic(client, live_server):
assert b'has-restock-info' in res.data assert b'has-restock-info' in res.data
assert b' in-stock' in res.data assert b' in-stock' in res.data
assert b' not-in-stock' not in res.data assert b' not-in-stock' not in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
for p in out_of_stock_props: for p in out_of_stock_props:
@@ -85,10 +84,9 @@ def test_restock_itemprop_basic(client, live_server):
assert b'has-restock-info not-in-stock' in res.data assert b'has-restock-info not-in-stock' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_itemprop_price_change(client, live_server): def test_itemprop_price_change(client, live_server, measure_memory_usage):
# Out of the box 'Follow price changes' should be ON # Out of the box 'Follow price changes' should be ON
@@ -132,13 +130,11 @@ def test_itemprop_price_change(client, live_server):
assert b'has-unread-changes' not in res.data assert b'has-unread-changes' not in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def _run_test_minmax_limit(client, extra_watch_edit_form): def _run_test_minmax_limit(client, extra_watch_edit_form):
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
@@ -212,11 +208,10 @@ def _run_test_minmax_limit(client, extra_watch_edit_form):
assert b'1,890.45' in res.data or b'1890.45' in res.data assert b'1,890.45' in res.data or b'1890.45' in res.data
assert b'has-unread-changes' in res.data assert b'has-unread-changes' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_restock_itemprop_minmax(client, live_server): def test_restock_itemprop_minmax(client, live_server, measure_memory_usage):
extras = { extras = {
"restock_settings-follow_price_changes": "y", "restock_settings-follow_price_changes": "y",
@@ -225,7 +220,7 @@ def test_restock_itemprop_minmax(client, live_server):
} }
_run_test_minmax_limit(client, extra_watch_edit_form=extras) _run_test_minmax_limit(client, extra_watch_edit_form=extras)
def test_restock_itemprop_with_tag(client, live_server): def test_restock_itemprop_with_tag(client, live_server, measure_memory_usage):
res = client.post( res = client.post(
@@ -254,11 +249,10 @@ def test_restock_itemprop_with_tag(client, live_server):
def test_itemprop_percent_threshold(client, live_server): def test_itemprop_percent_threshold(client, live_server, measure_memory_usage):
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
@@ -317,12 +311,11 @@ def test_itemprop_percent_threshold(client, live_server):
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_change_with_notification_values(client, live_server): def test_change_with_notification_values(client, live_server, measure_memory_usage):
if os.path.isfile("test-datastore/notification.txt"): if os.path.isfile("test-datastore/notification.txt"):
@@ -390,11 +383,10 @@ def test_change_with_notification_values(client, live_server):
assert os.path.isfile("test-datastore/notification.txt"), "Notification received" assert os.path.isfile("test-datastore/notification.txt"), "Notification received"
def test_data_sanity(client, live_server): def test_data_sanity(client, live_server, measure_memory_usage):
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
test_url2 = url_for('test_endpoint2', _external=True) test_url2 = url_for('test_endpoint2', _external=True)
@@ -421,8 +413,7 @@ def test_data_sanity(client, live_server):
assert str(res.data.decode()).count("950.95") == 1, "Price should only show once (for the watch added, no other watches yet)" assert str(res.data.decode()).count("950.95") == 1, "Price should only show once (for the watch added, no other watches yet)"
## different test, check the edit page works on an empty request result ## different test, check the edit page works on an empty request result
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
client.post( client.post(
url_for("ui.ui_views.form_quick_watch_add"), url_for("ui.ui_views.form_quick_watch_add"),
@@ -435,11 +426,10 @@ def test_data_sanity(client, live_server):
url_for("ui.ui_edit.edit_page", uuid="first")) url_for("ui.ui_edit.edit_page", uuid="first"))
assert test_url2.encode('utf-8') in res.data assert test_url2.encode('utf-8') in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# All examples should give a prive of 666.66 # All examples should give a prive of 666.66
def test_special_prop_examples(client, live_server): def test_special_prop_examples(client, live_server, measure_memory_usage):
import glob import glob

View File

@@ -3,7 +3,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks, extract_rss_token_from_UI, \ from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks, extract_rss_token_from_UI, \
extract_UUID_from_client extract_UUID_from_client, delete_all_watches
def set_original_cdata_xml(): def set_original_cdata_xml():
@@ -114,13 +114,8 @@ def test_basic_cdata_rss_markup(client, live_server, measure_memory_usage):
test_url = url_for('test_endpoint', content_type="application/atom+xml; charset=UTF-8", _external=True) test_url = url_for('test_endpoint', content_type="application/atom+xml; charset=UTF-8", _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -132,7 +127,7 @@ def test_basic_cdata_rss_markup(client, live_server, measure_memory_usage):
assert b'<![' not in res.data assert b'<![' not in res.data
assert b'Hackers can access your computer' in res.data assert b'Hackers can access your computer' in res.data
assert b'The days of Terminator' in res.data assert b'The days of Terminator' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
def test_rss_xpath_filtering(client, live_server, measure_memory_usage): def test_rss_xpath_filtering(client, live_server, measure_memory_usage):
@@ -180,10 +175,10 @@ def test_rss_xpath_filtering(client, live_server, measure_memory_usage):
assert b'The days of Terminator' not in res.data # Should NOT be selected by the xpath assert b'The days of Terminator' not in res.data # Should NOT be selected by the xpath
assert b'Some other description' not in res.data # Should NOT be selected by the xpath assert b'Some other description' not in res.data # Should NOT be selected by the xpath
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
def test_rss_bad_chars_breaking(client, live_server): def test_rss_bad_chars_breaking(client, live_server, measure_memory_usage):
"""This should absolutely trigger the RSS builder to go into worst state mode """This should absolutely trigger the RSS builder to go into worst state mode
- source: prefix means no html conversion (which kinda filters out the bad stuff) - source: prefix means no html conversion (which kinda filters out the bad stuff)

View File

@@ -5,11 +5,11 @@ from copy import copy
from datetime import datetime, timezone from datetime import datetime, timezone
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks, extract_UUID_from_client from .util import live_server_setup, wait_for_all_checks, extract_UUID_from_client, delete_all_watches
from ..forms import REQUIRE_ATLEAST_ONE_TIME_PART_MESSAGE_DEFAULT, REQUIRE_ATLEAST_ONE_TIME_PART_WHEN_NOT_GLOBAL_DEFAULT from ..forms import REQUIRE_ATLEAST_ONE_TIME_PART_MESSAGE_DEFAULT, REQUIRE_ATLEAST_ONE_TIME_PART_WHEN_NOT_GLOBAL_DEFAULT
# def test_setup(client, live_server): # def test_setup(client, live_server, measure_memory_usage):
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
def test_check_basic_scheduler_functionality(client, live_server, measure_memory_usage): def test_check_basic_scheduler_functionality(client, live_server, measure_memory_usage):
@@ -34,13 +34,8 @@ def test_check_basic_scheduler_functionality(client, live_server, measure_memory
res = client.get(url_for("settings.settings_page")) res = client.get(url_for("settings.settings_page"))
assert b'Pacific/Kiritimati' in res.data assert b'Pacific/Kiritimati' in res.data
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
uuid = next(iter(live_server.app.config['DATASTORE'].data['watching'])) uuid = next(iter(live_server.app.config['DATASTORE'].data['watching']))
@@ -92,8 +87,7 @@ def test_check_basic_scheduler_functionality(client, live_server, measure_memory
assert live_server.app.config['DATASTORE'].data['watching'][uuid]['last_checked'] != last_check assert live_server.app.config['DATASTORE'].data['watching'][uuid]['last_checked'] != last_check
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_check_basic_global_scheduler_functionality(client, live_server, measure_memory_usage): def test_check_basic_global_scheduler_functionality(client, live_server, measure_memory_usage):
@@ -101,13 +95,8 @@ def test_check_basic_global_scheduler_functionality(client, live_server, measure
days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
test_url = url_for('test_random_content_endpoint', _external=True) test_url = url_for('test_random_content_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
uuid = next(iter(live_server.app.config['DATASTORE'].data['watching'])) uuid = next(iter(live_server.app.config['DATASTORE'].data['watching']))
@@ -180,18 +169,13 @@ def test_check_basic_global_scheduler_functionality(client, live_server, measure
assert live_server.app.config['DATASTORE'].data['watching'][uuid]['last_checked'] != last_check assert live_server.app.config['DATASTORE'].data['watching'][uuid]['last_checked'] != last_check
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_validation_time_interval_field(client, live_server, measure_memory_usage): def test_validation_time_interval_field(client, live_server, measure_memory_usage):
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
res = client.post( res = client.post(

View File

@@ -1,7 +1,7 @@
import os import os
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
from .. import strtobool from .. import strtobool
@@ -100,8 +100,7 @@ def _runner_test_various_file_slash(client, file_uri):
# This will give some error from requests or if it went to chrome, will give some other error :-) # This will give some error from requests or if it went to chrome, will give some other error :-)
assert any(s in res.data for s in substrings) assert any(s in res.data for s in substrings)
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_file_slash_access(client, live_server, measure_memory_usage): def test_file_slash_access(client, live_server, measure_memory_usage):

View File

@@ -3,7 +3,7 @@
import time import time
from flask import url_for from flask import url_for
from urllib.request import urlopen from urllib.request import urlopen
from .util import set_original_response, set_modified_response, live_server_setup from .util import set_original_response, set_modified_response, live_server_setup, delete_all_watches
import re import re
sleep_time_for_fetch_thread = 3 sleep_time_for_fetch_thread = 3
@@ -17,13 +17,8 @@ def test_share_watch(client, live_server, measure_memory_usage):
include_filters = ".nice-filter" include_filters = ".nice-filter"
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Goto the edit page, add our ignore text # Goto the edit page, add our ignore text
# Add our URL to the import page # Add our URL to the import page
@@ -54,8 +49,7 @@ def test_share_watch(client, live_server, measure_memory_usage):
# Now delete what we have, we will try to re-import it # Now delete what we have, we will try to re-import it
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# Add our URL to the import page # Add our URL to the import page
res = client.post( res = client.post(

View File

@@ -13,13 +13,8 @@ def test_check_basic_change_detection_functionality_source(client, live_server,
set_original_response() set_original_response()
test_url = 'source:'+url_for('test_endpoint', _external=True) test_url = 'source:'+url_for('test_endpoint', _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
time.sleep(sleep_time_for_fetch_thread) time.sleep(sleep_time_for_fetch_thread)
@@ -62,13 +57,8 @@ def test_check_ignore_elements(client, live_server, measure_memory_usage):
time.sleep(1) time.sleep(1)
test_url = 'source:'+url_for('test_endpoint', _external=True) test_url = 'source:'+url_for('test_endpoint', _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)

View File

@@ -65,12 +65,8 @@ def test_trigger_functionality(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Trigger a check # Trigger a check
client.get(url_for("ui.form_watch_checknow"), follow_redirects=True) client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)

View File

@@ -2,7 +2,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
def set_original_ignore_response(): def set_original_ignore_response():
@@ -30,12 +30,8 @@ def test_trigger_regex_functionality(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -76,5 +72,4 @@ def test_trigger_regex_functionality(client, live_server, measure_memory_usage):
assert b'has-unread-changes' in res.data assert b'has-unread-changes' in res.data
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -2,7 +2,7 @@
import time import time
from flask import url_for from flask import url_for
from . util import live_server_setup from . util import live_server_setup, delete_all_watches
def set_original_ignore_response(): def set_original_ignore_response():
@@ -34,12 +34,8 @@ def test_trigger_regex_functionality_with_filter(client, live_server, measure_me
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# it needs time to save the original version # it needs time to save the original version
time.sleep(sleep_time_for_fetch_thread) time.sleep(sleep_time_for_fetch_thread)
@@ -81,5 +77,4 @@ def test_trigger_regex_functionality_with_filter(client, live_server, measure_me
assert b'has-unread-changes' in res.data assert b'has-unread-changes' in res.data
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -1,11 +1,11 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from flask import url_for from flask import url_for
from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks, delete_all_watches
from ..forms import REQUIRE_ATLEAST_ONE_TIME_PART_WHEN_NOT_GLOBAL_DEFAULT, REQUIRE_ATLEAST_ONE_TIME_PART_MESSAGE_DEFAULT from ..forms import REQUIRE_ATLEAST_ONE_TIME_PART_WHEN_NOT_GLOBAL_DEFAULT, REQUIRE_ATLEAST_ONE_TIME_PART_MESSAGE_DEFAULT
def test_recheck_time_field_validation_global_settings(client, live_server): def test_recheck_time_field_validation_global_settings(client, live_server, measure_memory_usage):
""" """
Tests that the global settings time field has atleast one value for week/day/hours/minute/seconds etc entered Tests that the global settings time field has atleast one value for week/day/hours/minute/seconds etc entered
class globalSettingsRequestForm(Form): class globalSettingsRequestForm(Form):
@@ -27,7 +27,7 @@ def test_recheck_time_field_validation_global_settings(client, live_server):
assert REQUIRE_ATLEAST_ONE_TIME_PART_MESSAGE_DEFAULT.encode('utf-8') in res.data assert REQUIRE_ATLEAST_ONE_TIME_PART_MESSAGE_DEFAULT.encode('utf-8') in res.data
def test_recheck_time_field_validation_single_watch(client, live_server): def test_recheck_time_field_validation_single_watch(client, live_server, measure_memory_usage):
""" """
Tests that the global settings time field has atleast one value for week/day/hours/minute/seconds etc entered Tests that the global settings time field has atleast one value for week/day/hours/minute/seconds etc entered
class globalSettingsRequestForm(Form): class globalSettingsRequestForm(Form):
@@ -36,13 +36,8 @@ def test_recheck_time_field_validation_single_watch(client, live_server):
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
# Add our URL to the import page # Add our URL to the import page
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
res = client.post( res = client.post(
url_for("ui.ui_edit.edit_page", uuid="first"), url_for("ui.ui_edit.edit_page", uuid="first"),
@@ -100,7 +95,7 @@ def test_recheck_time_field_validation_single_watch(client, live_server):
assert b"Updated watch." in res.data assert b"Updated watch." in res.data
assert REQUIRE_ATLEAST_ONE_TIME_PART_WHEN_NOT_GLOBAL_DEFAULT.encode('utf-8') not in res.data assert REQUIRE_ATLEAST_ONE_TIME_PART_WHEN_NOT_GLOBAL_DEFAULT.encode('utf-8') not in res.data
def test_checkbox_open_diff_in_new_tab(client, live_server): def test_checkbox_open_diff_in_new_tab(client, live_server, measure_memory_usage):
set_original_response() set_original_response()
# Add our URL to the import page # Add our URL to the import page
@@ -171,10 +166,9 @@ def test_checkbox_open_diff_in_new_tab(client, live_server):
assert 'target=' not in target_line assert 'target=' not in target_line
# Cleanup everything # Cleanup everything
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_page_title_listing_behaviour(client, live_server): def test_page_title_listing_behaviour(client, live_server, measure_memory_usage):
set_original_response(extra_title="custom html") set_original_response(extra_title="custom html")
@@ -249,7 +243,7 @@ def test_page_title_listing_behaviour(client, live_server):
assert b"head titlecustom html" in res.data assert b"head titlecustom html" in res.data
def test_ui_viewed_unread_flag(client, live_server): def test_ui_viewed_unread_flag(client, live_server, measure_memory_usage):
import time import time

View File

@@ -2,7 +2,7 @@
import time import time
from flask import url_for from flask import url_for
from .util import live_server_setup, wait_for_all_checks from .util import live_server_setup, wait_for_all_checks, delete_all_watches
def set_original_ignore_response(): def set_original_ignore_response():
@@ -79,12 +79,8 @@ def test_unique_lines_functionality(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# Add our URL to the import page # Add our URL to the import page
@@ -118,8 +114,7 @@ def test_unique_lines_functionality(client, live_server, measure_memory_usage):
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'has-unread-changes' in res.data assert b'has-unread-changes' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_sort_lines_functionality(client, live_server, measure_memory_usage): def test_sort_lines_functionality(client, live_server, measure_memory_usage):
@@ -128,12 +123,8 @@ def test_sort_lines_functionality(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# Add our URL to the import page # Add our URL to the import page
@@ -168,8 +159,7 @@ def test_sort_lines_functionality(client, live_server, measure_memory_usage):
assert res.data.find(b'A uppercase') < res.data.find(b'Z last') assert res.data.find(b'A uppercase') < res.data.find(b'Z last')
assert res.data.find(b'Some initial text') < res.data.find(b'Which is across multiple lines') assert res.data.find(b'Some initial text') < res.data.find(b'Which is across multiple lines')
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_extra_filters(client, live_server, measure_memory_usage): def test_extra_filters(client, live_server, measure_memory_usage):
@@ -179,12 +169,8 @@ def test_extra_filters(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
# Add our URL to the import page # Add our URL to the import page
@@ -216,5 +202,4 @@ def test_extra_filters(client, live_server, measure_memory_usage):
# still should remain unsorted ('A - sortable line') stays at the end # still should remain unsorted ('A - sortable line') stays at the end
assert res.data.find(b'A - sortable line') > res.data.find(b'Which is across multiple lines') assert res.data.find(b'A - sortable line') > res.data.find(b'Which is across multiple lines')
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data

View File

@@ -10,12 +10,8 @@ def test_check_watch_field_storage(client, live_server, measure_memory_usage):
test_url = "http://somerandomsitewewatch.com" test_url = "http://somerandomsitewewatch.com"
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
res = client.post( res = client.post(

View File

@@ -2,7 +2,7 @@
from flask import url_for from flask import url_for
from .util import wait_for_all_checks from .util import wait_for_all_checks, delete_all_watches
from ..processors.magic import RSS_XML_CONTENT_TYPES from ..processors.magic import RSS_XML_CONTENT_TYPES
@@ -113,12 +113,8 @@ def test_check_xpath_filter_utf8(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True, content_type="application/rss+xml;charset=UTF-8") test_url = url_for('test_endpoint', _external=True, content_type="application/rss+xml;charset=UTF-8")
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
url_for("ui.ui_edit.edit_page", uuid="first"), url_for("ui.ui_edit.edit_page", uuid="first"),
@@ -129,8 +125,7 @@ def test_check_xpath_filter_utf8(client, live_server, measure_memory_usage):
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'Unicode strings with encoding declaration are not supported.' not in res.data assert b'Unicode strings with encoding declaration are not supported.' not in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# Handle utf-8 charset replies https://github.com/dgtlmoon/changedetection.io/pull/613 # Handle utf-8 charset replies https://github.com/dgtlmoon/changedetection.io/pull/613
@@ -167,12 +162,8 @@ def test_check_xpath_text_function_utf8(client, live_server, measure_memory_usag
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True, content_type="application/rss+xml;charset=UTF-8") test_url = url_for('test_endpoint', _external=True, content_type="application/rss+xml;charset=UTF-8")
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
url_for("ui.ui_edit.edit_page", uuid="first"), url_for("ui.ui_edit.edit_page", uuid="first"),
@@ -193,8 +184,7 @@ def test_check_xpath_text_function_utf8(client, live_server, measure_memory_usag
assert b'Stock Alert (UK): RPi CM4' in res.data assert b'Stock Alert (UK): RPi CM4' in res.data
assert b'Stock Alert (UK): Big monitor' in res.data assert b'Stock Alert (UK): Big monitor' in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_check_markup_xpath_filter_restriction(client, live_server, measure_memory_usage): def test_check_markup_xpath_filter_restriction(client, live_server, measure_memory_usage):
@@ -204,12 +194,8 @@ def test_check_markup_xpath_filter_restriction(client, live_server, measure_memo
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
# Give the thread time to pick it up # Give the thread time to pick it up
wait_for_all_checks(client) wait_for_all_checks(client)
@@ -239,19 +225,14 @@ def test_check_markup_xpath_filter_restriction(client, live_server, measure_memo
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'has-unread-changes' not in res.data assert b'has-unread-changes' not in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_xpath_validation(client, live_server, measure_memory_usage): def test_xpath_validation(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
@@ -260,19 +241,14 @@ def test_xpath_validation(client, live_server, measure_memory_usage):
follow_redirects=True follow_redirects=True
) )
assert b"is not a valid XPath expression" in res.data assert b"is not a valid XPath expression" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_xpath23_prefix_validation(client, live_server, measure_memory_usage): def test_xpath23_prefix_validation(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
@@ -281,8 +257,7 @@ def test_xpath23_prefix_validation(client, live_server, measure_memory_usage):
follow_redirects=True follow_redirects=True
) )
assert b"is not a valid XPath expression" in res.data assert b"is not a valid XPath expression" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_xpath1_lxml(client, live_server, measure_memory_usage): def test_xpath1_lxml(client, live_server, measure_memory_usage):
@@ -317,12 +292,8 @@ def test_xpath1_lxml(client, live_server, measure_memory_usage):
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
@@ -351,12 +322,8 @@ def test_xpath1_lxml(client, live_server, measure_memory_usage):
def test_xpath1_validation(client, live_server, measure_memory_usage): def test_xpath1_validation(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
@@ -365,25 +332,19 @@ def test_xpath1_validation(client, live_server, measure_memory_usage):
follow_redirects=True follow_redirects=True
) )
assert b"is not a valid XPath expression" in res.data assert b"is not a valid XPath expression" in res.data
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
# actually only really used by the distll.io importer, but could be handy too # actually only really used by the distll.io importer, but could be handy too
def test_check_with_prefix_include_filters(client, live_server, measure_memory_usage): def test_check_with_prefix_include_filters(client, live_server, measure_memory_usage):
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
set_original_response() set_original_response()
wait_for_all_checks(client) wait_for_all_checks(client)
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
@@ -428,12 +389,8 @@ def test_various_rules(client, live_server, measure_memory_usage):
""") """)
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
for r in ['//div', '//a', 'xpath://div', 'xpath://a']: for r in ['//div', '//a', 'xpath://div', 'xpath://a']:
@@ -452,18 +409,13 @@ def test_various_rules(client, live_server, measure_memory_usage):
res = client.get(url_for("watchlist.index")) res = client.get(url_for("watchlist.index"))
assert b'fetch-error' not in res.data, f"Should not see errors after '{r} filter" assert b'fetch-error' not in res.data, f"Should not see errors after '{r} filter"
res = client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) delete_all_watches(client)
assert b'Deleted' in res.data
def test_xpath_20(client, live_server, measure_memory_usage): def test_xpath_20(client, live_server, measure_memory_usage):
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
set_original_response() set_original_response()
@@ -499,12 +451,8 @@ def test_xpath_20_function_count(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
@@ -536,12 +484,8 @@ def test_xpath_20_function_count2(client, live_server, measure_memory_usage):
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
@@ -573,16 +517,12 @@ def test_xpath_20_function_string_join_matches(client, live_server, measure_memo
# Add our URL to the import page # Add our URL to the import page
test_url = url_for('test_endpoint', _external=True) test_url = url_for('test_endpoint', _external=True)
res = client.post( uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
url_for("imports.import_page"), client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
data={"urls": test_url},
follow_redirects=True
)
assert b"1 Imported" in res.data
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.post( res = client.post(
url_for("ui.ui_edit.edit_page", uuid="first"), url_for("ui.ui_edit.edit_page", uuid=uuid),
data={ data={
"include_filters": "xpath:string-join(//*[contains(@class, 'sametext')]|//*[matches(@class, 'changetext')], 'specialconjunction')", "include_filters": "xpath:string-join(//*[contains(@class, 'sametext')]|//*[matches(@class, 'changetext')], 'specialconjunction')",
"url": test_url, "url": test_url,
@@ -597,7 +537,7 @@ def test_xpath_20_function_string_join_matches(client, live_server, measure_memo
wait_for_all_checks(client) wait_for_all_checks(client)
res = client.get( res = client.get(
url_for("ui.ui_views.preview_page", uuid="first"), url_for("ui.ui_views.preview_page", uuid=uuid),
follow_redirects=True follow_redirects=True
) )
@@ -644,7 +584,7 @@ def _subtest_xpath_rss(client, content_type='text/html'):
client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True) client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True)
# Be sure all-in-the-wild types of RSS feeds work with xpath # Be sure all-in-the-wild types of RSS feeds work with xpath
def test_rss_xpath(client, live_server): def test_rss_xpath(client, live_server, measure_memory_usage):
for feed_header in ['', '<?xml version="1.0" encoding="utf-8"?>']: for feed_header in ['', '<?xml version="1.0" encoding="utf-8"?>']:
set_rss_atom_feed_response(header=feed_header) set_rss_atom_feed_response(header=feed_header)
for content_type in RSS_XML_CONTENT_TYPES: for content_type in RSS_XML_CONTENT_TYPES:

View File

@@ -127,6 +127,11 @@ def extract_UUID_from_client(client):
uuid = m.group(1) uuid = m.group(1)
return uuid.strip() return uuid.strip()
def delete_all_watches(client=None):
uuids = list(client.application.config.get('DATASTORE').data['watching'])
for uuid in uuids:
client.application.config.get('DATASTORE').delete(uuid)
def wait_for_all_checks(client=None): def wait_for_all_checks(client=None):
""" """
@@ -135,8 +140,6 @@ def wait_for_all_checks(client=None):
""" """
from changedetectionio.flask_app import update_q as global_update_q from changedetectionio.flask_app import update_q as global_update_q
from changedetectionio import worker_handler from changedetectionio import worker_handler
logger = logging.getLogger()
empty_since = None empty_since = None
attempt = 0 attempt = 0
max_attempts = 150 # Still reasonable upper bound max_attempts = 150 # Still reasonable upper bound
@@ -144,9 +147,9 @@ def wait_for_all_checks(client=None):
while attempt < max_attempts: while attempt < max_attempts:
# Start with fast checks, slow down if needed # Start with fast checks, slow down if needed
if attempt < 10: if attempt < 10:
time.sleep(0.1) # Very fast initial checks time.sleep(0.2) # Very fast initial checks
elif attempt < 30: elif attempt < 30:
time.sleep(0.3) # Medium speed time.sleep(0.4) # Medium speed
else: else:
time.sleep(0.8) # Slower for persistent issues time.sleep(0.8) # Slower for persistent issues
@@ -322,4 +325,3 @@ def new_live_server_setup(live_server):
return resp return resp
live_server.start() live_server.start()

View File

@@ -4,7 +4,7 @@ import os
from flask import url_for from flask import url_for
from ..util import live_server_setup, wait_for_all_checks from ..util import live_server_setup, wait_for_all_checks
# def test_setup(client, live_server): # def test_setup(client, live_server, measure_memory_usage):
# live_server_setup(live_server) # Setup on conftest per function # live_server_setup(live_server) # Setup on conftest per function
@@ -142,7 +142,7 @@ def test_basic_browserstep(client, live_server, measure_memory_usage):
assert b"testheader: yes" in res.data assert b"testheader: yes" in res.data
assert b"user-agent: mycustomagent" in res.data assert b"user-agent: mycustomagent" in res.data
def test_non_200_errors_report_browsersteps(client, live_server): def test_non_200_errors_report_browsersteps(client, live_server, measure_memory_usage):
four_o_four_url = url_for('test_endpoint', status_code=404, _external=True) four_o_four_url = url_for('test_endpoint', status_code=404, _external=True)