Skip to content

Commit e151946

Browse files
committed
full coverage models
1 parent 42bd755 commit e151946

File tree

1 file changed

+75
-27
lines changed

1 file changed

+75
-27
lines changed

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

Lines changed: 75 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,29 @@
1313
import simcore_service_webserver.products
1414
import sqlalchemy as sa
1515
from faker import Faker
16+
from models_library.basic_regex import TWILIO_ALPHANUMERIC_SENDER_ID_RE
1617
from models_library.products import ProductName
17-
from pydantic import BaseModel
18+
from pydantic import BaseModel, ValidationError
1819
from pytest_simcore.helpers.faker_factories import random_product
1920
from pytest_simcore.pydantic_models import (
2021
assert_validation_model,
2122
walk_model_examples_in_package,
2223
)
2324
from simcore_postgres_database.models.products import products as products_table
24-
from simcore_service_webserver.constants import FRONTEND_APP_DEFAULT
25-
from simcore_service_webserver.products._models import Product
25+
from simcore_service_webserver.constants import (
26+
FRONTEND_APP_DEFAULT,
27+
FRONTEND_APPS_AVAILABLE,
28+
)
29+
from simcore_service_webserver.products.models import Product
2630
from sqlalchemy import String
2731
from sqlalchemy.dialects import postgresql
2832

2933

34+
@pytest.fixture(scope="session")
35+
def product_name() -> ProductName:
36+
return ProductName(FRONTEND_APP_DEFAULT)
37+
38+
3039
@pytest.mark.parametrize(
3140
"model_cls, example_name, example_data",
3241
chain(walk_model_examples_in_package(simcore_service_webserver.products)),
@@ -109,43 +118,82 @@ def test_product_host_regex_with_spaces():
109118
assert product.support_email == "[email protected]"
110119

111120

112-
@pytest.fixture(scope="session")
113-
def product_name() -> ProductName:
114-
return ProductName(FRONTEND_APP_DEFAULT)
121+
@pytest.fixture
122+
def fake_product_from_db(faker: Faker, product_name: ProductName) -> dict[str, Any]:
123+
server_defaults = {}
124+
for c in products_table.columns:
125+
if c.server_default is not None:
126+
if isinstance(c.type, String):
127+
server_defaults[c.name] = c.server_default.arg
128+
elif isinstance(c.type, postgresql.JSONB):
129+
m = re.match(r"^'(.+)'::jsonb$", c.server_default.arg.text)
130+
if m:
131+
server_defaults[c.name] = json.loads(m.group(1))
132+
return random_product(
133+
name=product_name,
134+
fake=faker,
135+
**server_defaults,
136+
)
115137

116138

117139
def test_safe_load_empty_blanks_on_string_cols_from_db(
118-
faker: Faker, product_name: ProductName
140+
fake_product_from_db: dict[str, Any]
119141
):
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-
133142
nullable_strings_column_names = [
134143
c.name
135144
for c in products_table.columns
136145
if isinstance(c.type, sa.String) and c.nullable
137146
]
138147

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}
148+
fake_product_from_db.update(
149+
{name: " " * len(name) for name in nullable_strings_column_names}
145150
)
146151

147-
product = Product.model_validate(product_row_from_db)
152+
product = Product.model_validate(fake_product_from_db)
148153

149154
assert product.model_dump(include=set(nullable_strings_column_names)) == {
150155
name: None for name in nullable_strings_column_names
151156
}
157+
158+
159+
@pytest.mark.parametrize("product_name", list(FRONTEND_APPS_AVAILABLE))
160+
def test_product_name_needs_front_end(
161+
product_name: ProductName, fake_product_from_db: dict[str, Any]
162+
):
163+
fake_product_from_db.update(name=product_name)
164+
product = Product.model_validate(fake_product_from_db)
165+
assert product.name == product_name
166+
167+
168+
def test_product_name_invalid(fake_product_from_db: dict[str, Any]):
169+
# Test with an invalid name
170+
fake_product_from_db.update(name="invalid name")
171+
with pytest.raises(ValidationError):
172+
Product.model_validate(fake_product_from_db)
173+
174+
175+
def test_twilio_sender_id_is_truncated(fake_product_from_db: dict[str, Any]):
176+
fake_product_from_db.update(short_name=None, display_name="very long name" * 12)
177+
product = Product.model_validate(fake_product_from_db)
178+
179+
assert re.match(
180+
TWILIO_ALPHANUMERIC_SENDER_ID_RE, product.twilio_alpha_numeric_sender_id
181+
)
182+
183+
184+
def test_template_names_from_file(fake_product_from_db: dict[str, Any]):
185+
fake_product_from_db.update(registration_email_template="some_template_name_id")
186+
product = Product.model_validate(fake_product_from_db)
187+
188+
assert (
189+
product.get_template_name_for(filename="registration_email.jinja2")
190+
== "some_template_name_id"
191+
)
192+
assert product.get_template_name_for(filename="other_template.jinja2") is None
193+
194+
fake_product_from_db.update(registration_email_template=None)
195+
product = Product.model_validate(fake_product_from_db)
196+
assert (
197+
product.get_template_name_for(filename="registration_email_template.jinja2")
198+
is None
199+
)

0 commit comments

Comments
 (0)