Skip to content

Commit 42bd755

Browse files
committed
improving tests
1 parent 0547779 commit 42bd755

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

packages/pytest-simcore/src/pytest_simcore/helpers/faker_factories.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ def fake_task(**overrides) -> dict[str, Any]:
220220

221221

222222
def random_product(
223+
*,
223224
group_id: int | None = None,
224225
registration_email_template: str | None = None,
225226
fake: Faker = DEFAULT_FAKER,

services/web/server/src/simcore_service_webserver/products/_models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
WebFeedback,
3232
products,
3333
)
34-
from sqlalchemy import Column
3534

3635
from ..constants import FRONTEND_APPS_AVAILABLE
3736

@@ -171,6 +170,8 @@ def twilio_alpha_numeric_sender_id(self) -> str:
171170

172171
@staticmethod
173172
def _update_json_schema_extra(schema: JsonDict) -> None:
173+
from sqlalchemy import Column
174+
174175
schema.update(
175176
{
176177
"examples": [

services/web/server/tests/unit/isolated/test_products_model.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
11
# pylint: disable=redefined-outer-name
22
# pylint: disable=unused-argument
33
# pylint: disable=unused-variable
4+
# pylint: disable=too-many-arguments
45

56

7+
import json
8+
import re
69
from itertools import chain
710
from typing import Any
811

912
import pytest
1013
import simcore_service_webserver.products
14+
import sqlalchemy as sa
15+
from faker import Faker
16+
from models_library.products import ProductName
1117
from pydantic import BaseModel
18+
from pytest_simcore.helpers.faker_factories import random_product
1219
from pytest_simcore.pydantic_models import (
1320
assert_validation_model,
1421
walk_model_examples_in_package,
1522
)
23+
from simcore_postgres_database.models.products import products as products_table
24+
from simcore_service_webserver.constants import FRONTEND_APP_DEFAULT
1625
from simcore_service_webserver.products._models import Product
26+
from sqlalchemy import String
27+
from sqlalchemy.dialects import postgresql
1728

1829

1930
@pytest.mark.parametrize(
@@ -96,3 +107,45 @@ def test_product_host_regex_with_spaces():
96107
assert product.host_regex.search("osparc.bar.com")
97108

98109
assert product.support_email == "[email protected]"
110+
111+
112+
@pytest.fixture(scope="session")
113+
def product_name() -> ProductName:
114+
return ProductName(FRONTEND_APP_DEFAULT)
115+
116+
117+
def test_safe_load_empty_blanks_on_string_cols_from_db(
118+
faker: Faker, product_name: ProductName
119+
):
120+
def _get_server_defaults():
121+
server_defaults = {}
122+
for c in products_table.columns:
123+
if c.server_default is not None:
124+
if isinstance(c.type, String):
125+
server_defaults[c.name] = c.server_default.arg
126+
elif isinstance(c.type, postgresql.JSONB):
127+
m = re.match(r"^'(.+)'::jsonb$", c.server_default.arg.text)
128+
if m:
129+
server_defaults[c.name] = json.loads(m.group(1))
130+
131+
return server_defaults
132+
133+
nullable_strings_column_names = [
134+
c.name
135+
for c in products_table.columns
136+
if isinstance(c.type, sa.String) and c.nullable
137+
]
138+
139+
server_defaults = _get_server_defaults()
140+
141+
product_row_from_db = random_product(
142+
name=product_name,
143+
fake=faker,
144+
**{name: " " * len(name) for name in nullable_strings_column_names}
145+
)
146+
147+
product = Product.model_validate(product_row_from_db)
148+
149+
assert product.model_dump(include=set(nullable_strings_column_names)) == {
150+
name: None for name in nullable_strings_column_names
151+
}

0 commit comments

Comments
 (0)