1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-02-22 04:28:36 +00:00
bramw_baserow/backend/tests/baserow/contrib/builder/test_builder_handler.py
2025-02-21 08:59:53 +00:00

219 lines
7 KiB
Python

from unittest.mock import MagicMock
from django.contrib.auth import get_user_model
import pytest
from baserow.contrib.builder.handler import CACHE_KEY_PREFIX, BuilderHandler
from baserow.core.exceptions import ApplicationDoesNotExist
from baserow.core.user_sources.user_source_user import UserSourceUser
User = get_user_model()
@pytest.mark.django_db
def test_get_builder(data_fixture):
builder = data_fixture.create_builder_application()
assert BuilderHandler().get_builder(builder.id).id == builder.id
@pytest.mark.django_db
def test_get_builder_does_not_exist(data_fixture):
with pytest.raises(ApplicationDoesNotExist):
BuilderHandler().get_builder(9999)
@pytest.mark.django_db(transaction=True)
def test_get_builder_select_related_theme_config(
data_fixture, django_assert_num_queries
):
builder = data_fixture.create_builder_application()
builder.colorthemeconfigblock
builder.typographythemeconfigblock
builder.buttonthemeconfigblock
builder = BuilderHandler().get_builder(builder.id)
with django_assert_num_queries(0):
builder.colorthemeconfigblock.id
builder.typographythemeconfigblock.id
builder.buttonthemeconfigblock.id
@pytest.mark.parametrize(
"is_anonymous,user_role,expected_cache_key",
[
(
True,
"",
f"{CACHE_KEY_PREFIX}_100",
),
(
True,
"foo_role",
f"{CACHE_KEY_PREFIX}_100",
),
(
False,
"foo_role",
f"{CACHE_KEY_PREFIX}_100_foo_role",
),
],
)
def test_get_builder_used_properties_cache_key_returned_expected_cache_key(
is_anonymous, user_role, expected_cache_key
):
"""
Test the BuilderHandler::get_builder_used_properties_cache_key() method.
Ensure the expected cache key is returned.
"""
user_source_user = MagicMock()
user_source_user.is_anonymous = is_anonymous
user_source_user.role = user_role
mock_builder = MagicMock()
mock_builder.id = 100
handler = BuilderHandler()
cache_key = handler.get_builder_used_properties_cache_key(
user_source_user, mock_builder
)
assert cache_key == expected_cache_key
@pytest.mark.django_db
def test_public_allowed_properties_is_cached(data_fixture, django_assert_num_queries):
"""
Test the BuilderHandler::public_allowed_properties property.
Ensure that the expensive call to get_formula_field_names() is cached.
"""
user, token = data_fixture.create_user_and_token()
table, fields, rows = data_fixture.build_table(
user=user,
columns=[
("Name", "text"),
("Color", "text"),
],
rows=[
["Apple", "Red"],
["Banana", "Yellow"],
["Cherry", "Purple"],
],
)
builder = data_fixture.create_builder_application(user=user)
user_source, integration = data_fixture.create_user_table_and_role(
user,
builder,
"foo_user_role",
)
user_source_user = UserSourceUser(
user_source, None, 1, "foo_username", "foo@bar.com", role="foo_user_role"
)
integration = data_fixture.create_local_baserow_integration(
user=user, application=builder
)
page = data_fixture.create_builder_page(user=user, builder=builder)
data_source = data_fixture.create_builder_local_baserow_list_rows_data_source(
user=user,
page=page,
integration=integration,
table=table,
)
data_fixture.create_builder_heading_element(
page=page,
value=f"get('data_source.{data_source.id}.0.field_{fields[0].id}')",
)
handler = BuilderHandler()
expected_results = {
"all": {data_source.service.id: [f"field_{fields[0].id}"]},
"external": {data_source.service.id: [f"field_{fields[0].id}"]},
"internal": {},
}
# Initially calling the property should cause a bunch of DB queries.
with django_assert_num_queries(9):
result = handler.get_builder_public_properties(user_source_user, builder)
assert result == expected_results
# Subsequent calls to the property should *not* cause any DB queries.
with django_assert_num_queries(0):
result = handler.get_builder_public_properties(user_source_user, builder)
assert result == expected_results
@pytest.mark.django_db
def test_aggregate_user_source_counts(data_fixture):
user = data_fixture.create_user()
workspace = data_fixture.create_workspace(user=user)
# A builder with no domains.
builder_no_domains = data_fixture.create_builder_application(workspace=workspace)
data_fixture.create_local_baserow_table_user_source(application=builder_no_domains)
assert BuilderHandler().aggregate_user_source_counts() == 0
# A builder with a domain, but it hasn't been published to.
builder_with_unpublished_domains = data_fixture.create_builder_application(
workspace=workspace
)
data_fixture.create_builder_custom_domain(
builder=builder_with_unpublished_domains, published_to=None
)
data_fixture.create_local_baserow_table_user_source(
application=builder_with_unpublished_domains
)
assert BuilderHandler().aggregate_user_source_counts() == 0
# A builder with a published domain.
builder_with_published_domains = data_fixture.create_builder_application(
workspace=workspace
)
published_builder = data_fixture.create_builder_application(workspace=None)
data_fixture.create_builder_custom_domain(
builder=builder_with_published_domains, published_to=published_builder
)
data_fixture.create_local_baserow_table_user_source(
application=builder_with_published_domains
)
assert BuilderHandler().aggregate_user_source_counts() == 5
@pytest.mark.django_db
def test_builder_get_published_applications(data_fixture):
user = data_fixture.create_user()
workspace = data_fixture.create_workspace(user=user)
# A builder with no domains.
data_fixture.create_builder_application(workspace=workspace)
assert BuilderHandler().get_published_applications(workspace=workspace).count() == 0
# A builder with a domain, but it hasn't been published to.
builder_with_unpublished_domains = data_fixture.create_builder_application(
workspace=workspace
)
data_fixture.create_builder_custom_domain(
builder=builder_with_unpublished_domains, published_to=None
)
assert BuilderHandler().get_published_applications(workspace=workspace).count() == 0
# A builder with a published domain.
builder_with_published_domains = data_fixture.create_builder_application(
workspace=workspace
)
published_builder = data_fixture.create_builder_application(workspace=None)
data_fixture.create_builder_custom_domain(
builder=builder_with_published_domains, published_to=published_builder
)
qs = BuilderHandler().get_published_applications(workspace=workspace)
assert qs.contains(builder_with_published_domains)
assert qs.count() == 1