Skip to content

Commit a2fc6da

Browse files
authored
Add ability to defer signals/tasks in tests (baserow#4375)
1 parent 7211b36 commit a2fc6da

31 files changed

+196
-4
lines changed

backend/pytest.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,5 @@ markers =
5252
data_sync: All tests related to data sync functionality
5353
replica: All tests related to db replicas
5454
workspace_search: All tests related to workspace search functionality
55+
enable_all_signals: Disables signal deferral for this test (all signals enabled)
56+
enable_signals: Enables specific signals for this test (accepts dotted callable paths)

backend/src/baserow/test_utils/pytest_conftest.py

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import os
44
import sys
55
import threading
6-
from contextlib import contextmanager
6+
from contextlib import ExitStack, contextmanager
77
from datetime import date, datetime
88
from decimal import Decimal
99
from functools import partial
@@ -48,6 +48,22 @@
4848
SKIP_FLAGS = ["disabled-in-ci", "once-per-day-in-ci"]
4949
COMMAND_LINE_FLAG_PREFIX = "--run-"
5050

51+
# List of heavy callables to defer by default during tests
52+
# Used by defer_heavy_signals fixture
53+
DEFAULT_DEFERRED_CALLABLES: List[str] = [
54+
"baserow.ws.tasks.broadcast_to_channel_group.delay",
55+
"baserow.ws.tasks.broadcast_to_users.delay",
56+
"baserow.ws.tasks.broadcast_to_permitted_users.delay",
57+
"baserow.ws.tasks.broadcast_to_group.delay",
58+
"baserow.ws.tasks.broadcast_to_groups.delay",
59+
"baserow.ws.tasks.broadcast_application_created.delay",
60+
"baserow.contrib.database.search.tasks.schedule_update_search_data.delay",
61+
"baserow.contrib.database.search.tasks.update_search_data.delay",
62+
"baserow.contrib.database.table.tasks.update_table_usage.delay",
63+
"baserow.core.notifications.tasks.send_queued_notifications_to_users.delay",
64+
"baserow.contrib.database.views.tasks.update_view_index.delay",
65+
]
66+
5167

5268
# Provides a new fake instance for each class. Solve uniqueness problem sometimes.
5369
@pytest.fixture(scope="class", autouse=True)
@@ -153,6 +169,41 @@ def clear_cache():
153169
yield
154170

155171

172+
@pytest.fixture(autouse=True)
173+
def defer_heavy_signals(request):
174+
"""
175+
Defer heavy callables by default to speed up tests.
176+
177+
Opt-out options:
178+
@pytest.mark.enable_all_signals - Enable all deferred signals
179+
@pytest.mark.enable_signals("path.to.callable") - Enable specific signal(s)
180+
"""
181+
182+
if request.node.get_closest_marker("enable_all_signals"):
183+
yield
184+
return
185+
186+
signals_to_defer = set(DEFAULT_DEFERRED_CALLABLES)
187+
188+
enable_signals_marker = request.node.get_closest_marker("enable_signals")
189+
if enable_signals_marker:
190+
signals_to_enable = set()
191+
if enable_signals_marker.args:
192+
signals_to_enable.update(enable_signals_marker.args)
193+
if enable_signals_marker.kwargs.get("signals"):
194+
signals_to_enable.update(enable_signals_marker.kwargs["signals"])
195+
signals_to_defer -= signals_to_enable
196+
197+
if not signals_to_defer:
198+
yield
199+
return
200+
201+
with ExitStack() as stack:
202+
for name in signals_to_defer:
203+
stack.enter_context(patch(name, lambda *args, **kwargs: None))
204+
yield
205+
206+
156207
@pytest.fixture
157208
def reset_schema(django_db_blocker):
158209
yield
@@ -498,6 +549,14 @@ def pytest_configure(config):
498549
f"{flag}: mark test so it only runs when the "
499550
f"{COMMAND_LINE_FLAG_PREFIX}{flag} flag is provided to pytest",
500551
)
552+
config.addinivalue_line(
553+
"markers",
554+
"enable_all_signals: Disables signal deferral for this test",
555+
)
556+
config.addinivalue_line(
557+
"markers",
558+
"enable_signals(callable_paths): Enables specific signals for this test",
559+
)
501560
pytest_configure.already_run = True
502561

503562

backend/tests/baserow/contrib/builder/api/data_sources/test_data_source_views.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,6 +1183,10 @@ def test_dispatch_data_source_with_adhoc_sortings(api_client, data_fixture):
11831183

11841184

11851185
@pytest.mark.django_db(transaction=True)
1186+
@pytest.mark.enable_signals(
1187+
"baserow.contrib.database.search.tasks.schedule_update_search_data.delay",
1188+
"baserow.contrib.database.search.tasks.update_search_data.delay",
1189+
)
11861190
def test_dispatch_data_source_with_adhoc_search(api_client, data_fixture):
11871191
with transaction.atomic():
11881192
user, token = data_fixture.create_user_and_token()

backend/tests/baserow/contrib/database/api/rows/test_row_views.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3678,6 +3678,10 @@ def test_get_row_adjacent_view_invalid_requests(api_client, data_fixture):
36783678

36793679
@pytest.mark.django_db(transaction=True)
36803680
@pytest.mark.parametrize("search_mode", ALL_SEARCH_MODES)
3681+
@pytest.mark.enable_signals(
3682+
"baserow.contrib.database.search.tasks.schedule_update_search_data.delay",
3683+
"baserow.contrib.database.search.tasks.update_search_data.delay",
3684+
)
36813685
def test_get_row_adjacent_search(api_client, data_fixture, search_mode):
36823686
user, jwt_token = data_fixture.create_user_and_token(
36833687
email="test@test.nl", password="password", first_name="Test1"

backend/tests/baserow/contrib/database/api/views/gallery/test_gallery_view_views.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,10 @@ def test_list_rows_public_with_query_param_advanced_filters(api_client, data_fix
12491249

12501250
@pytest.mark.django_db(transaction=True)
12511251
@pytest.mark.parametrize("search_mode", ALL_SEARCH_MODES)
1252+
@pytest.mark.enable_signals(
1253+
"baserow.contrib.database.search.tasks.schedule_update_search_data.delay",
1254+
"baserow.contrib.database.search.tasks.update_search_data.delay",
1255+
)
12521256
def test_list_rows_public_only_searches_by_visible_columns(
12531257
api_client, data_fixture, search_mode
12541258
):

backend/tests/baserow/contrib/database/api/views/grid/test_grid_view_views.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4024,6 +4024,10 @@ def test_list_rows_public_filters_by_visible_and_hidden_columns(
40244024

40254025
@pytest.mark.django_db(transaction=True)
40264026
@pytest.mark.parametrize("search_mode", ALL_SEARCH_MODES)
4027+
@pytest.mark.enable_signals(
4028+
"baserow.contrib.database.search.tasks.schedule_update_search_data.delay",
4029+
"baserow.contrib.database.search.tasks.update_search_data.delay",
4030+
)
40274031
def test_list_rows_public_only_searches_by_visible_columns(
40284032
api_client, data_fixture, search_mode
40294033
):

backend/tests/baserow/contrib/database/api/views/test_view_views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,6 +1172,9 @@ def test_view_cant_update_allow_public_export(data_fixture, api_client):
11721172

11731173

11741174
@pytest.mark.django_db(transaction=True)
1175+
@pytest.mark.enable_signals(
1176+
"baserow.contrib.database.views.tasks.update_view_index.delay"
1177+
)
11751178
def test_loading_a_sortable_view_will_create_an_index(api_client, data_fixture):
11761179
user, token = data_fixture.create_user_and_token()
11771180
table = data_fixture.create_database_table(user=user)

backend/tests/baserow/contrib/database/field/test_field_notification_types.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
assert_undo_redo_actions_are_valid,
3232
)
3333

34+
pytestmark = pytest.mark.enable_signals(
35+
"baserow.core.notifications.tasks.send_queued_notifications_to_users.delay",
36+
"baserow.ws.tasks.broadcast_to_users.delay",
37+
)
38+
3439

3540
@pytest.mark.django_db(transaction=True)
3641
@patch("baserow.ws.tasks.broadcast_to_users.apply")

backend/tests/baserow/contrib/database/field/test_link_row_field_type.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,10 @@ def test_link_row_field_type_api_row_views(api_client, data_fixture):
11851185

11861186
@pytest.mark.django_db(transaction=True)
11871187
@pytest.mark.field_link_row
1188+
@pytest.mark.enable_signals(
1189+
"baserow.contrib.database.search.tasks.schedule_update_search_data.delay",
1190+
"baserow.contrib.database.search.tasks.update_search_data.delay",
1191+
)
11881192
def test_import_export_link_row_field(data_fixture):
11891193
user = data_fixture.create_user()
11901194
imported_workspace = data_fixture.create_workspace(user=user)

backend/tests/baserow/contrib/database/field/test_multiple_collaborators_field_type.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,10 @@ def test_multiple_collaborators_field_type_values_can_be_stringified(data_fixtur
832832

833833
@pytest.mark.django_db(transaction=True)
834834
@pytest.mark.field_multiple_collaborators
835+
@pytest.mark.enable_signals(
836+
"baserow.contrib.database.search.tasks.schedule_update_search_data.delay",
837+
"baserow.contrib.database.search.tasks.update_search_data.delay",
838+
)
835839
def test_multiple_collaborators_field_type_values_can_be_searched(data_fixture):
836840
mario = data_fixture.create_user(first_name="Mario")
837841
luigi = data_fixture.create_user(first_name="Luigi")

0 commit comments

Comments
 (0)