81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
import pytest
|
|
|
|
try:
|
|
from hypothesis import given, strategies as st, settings
|
|
except Exception: # pragma: no cover
|
|
pytest.skip("Hypothesis not installed; skipping property-based tests.", allow_module_level=True)
|
|
|
|
from app.services.customers_search import apply_customer_filters, apply_customer_sorting
|
|
|
|
|
|
class FakeQuery:
|
|
def __init__(self):
|
|
self.filters = []
|
|
self.orderings = []
|
|
|
|
def filter(self, *args):
|
|
self.filters.extend(args)
|
|
return self
|
|
|
|
def order_by(self, *args):
|
|
self.orderings.extend(args)
|
|
return self
|
|
|
|
|
|
def _expected_filter_count(search, group, groups, state, states):
|
|
s = (search or "").strip()
|
|
search_filter = 1 if s else 0
|
|
|
|
eff_groups = [g for g in (groups or []) if g] or ([group] if group else [])
|
|
groups_filter = 1 if eff_groups else 0
|
|
|
|
eff_states = [s for s in (states or []) if s] or ([state] if state else [])
|
|
states_filter = 1 if eff_states else 0
|
|
|
|
return search_filter + groups_filter + states_filter
|
|
|
|
|
|
@settings(deadline=None, max_examples=100)
|
|
@given(
|
|
search=st.text(min_size=0, max_size=200),
|
|
group=st.one_of(st.none(), st.text(min_size=0, max_size=20)),
|
|
state=st.one_of(st.none(), st.text(min_size=0, max_size=10)),
|
|
groups=st.one_of(
|
|
st.none(),
|
|
st.lists(st.one_of(st.none(), st.text(min_size=0, max_size=10)), max_size=5),
|
|
),
|
|
states=st.one_of(
|
|
st.none(),
|
|
st.lists(st.one_of(st.none(), st.text(min_size=0, max_size=10)), max_size=5),
|
|
),
|
|
)
|
|
def test_apply_customer_filters_property(search, group, groups, state, states):
|
|
q = FakeQuery()
|
|
q = apply_customer_filters(q, search=search, group=group, state=state, groups=groups, states=states)
|
|
|
|
assert len(q.filters) == _expected_filter_count(search, group, groups, state, states)
|
|
|
|
|
|
@settings(deadline=None, max_examples=100)
|
|
@given(
|
|
sort_by=st.one_of(
|
|
st.none(),
|
|
st.sampled_from(["id", "name", "city", "email", "ID", "NAME", "CITY", "EMAIL"]),
|
|
st.text(min_size=0, max_size=15),
|
|
),
|
|
sort_dir=st.one_of(
|
|
st.none(),
|
|
st.sampled_from(["asc", "ASC", "desc", "DESC", ""]),
|
|
st.text(min_size=0, max_size=10),
|
|
),
|
|
)
|
|
def test_apply_customer_sorting_property(sort_by, sort_dir):
|
|
q = FakeQuery()
|
|
q = apply_customer_sorting(q, sort_by=sort_by, sort_dir=sort_dir)
|
|
|
|
sb = (sort_by or "id").lower()
|
|
expected_order_cols = 2 if sb == "name" else 1
|
|
assert len(q.orderings) == expected_order_cols
|
|
|
|
|