Как фильтровать в sqlalchemy
Есть такая функция в dao для получения отфильтрованых данных из бд исходя из фильтров.
def get_something_by_guid_and_filter(guid: UUID,
filter_field,
filter_value,
session: Session) -> List[MainEntity]:
result_query = session.query(MainEntity). \
join(MainEntity.filter_entity).join(FilterEntity.some_type)
if guid:
result_query.filter(SomeTypeEntity.type_guid == guid)
if filter_field:
result_query.filter(FilterEntity.filter_field == filter_field)
if filter_value:
result_query.filter(FilterEntity.filter_value == filter_value)
return result_query.all()
И вот такой тест для этой функции. Почему-то actual - это Magic mock для query.join.join.all а не то что нужно и в целом фильтры не отрабатывают, хотя данные переданы в функцию.
def test_get_something_by_guid_and_filter(session_mock):
# GIVEN
main_entity: MainEntity = MainEntity(
filter_guid=UUID('eee31795-a97a-4aa3-813e-b256ce7b2ead'))
query_mock = session_mock.query
join_filter_mock = query_mock.return_value.join
join_some_type_mock = join_filter_mock.return_value.join
filter_mock = join_some_type_mock \
.return_value.filter. \
.return_value.filter. \
.return_value.filter. \
.return_value.all
filter_mock.return_value = [main_entity]
# WHEN
actual: List[MainEntity] = dao.get_something_by_guid_and_filter(
guid=UUID('129bec6f-3831-422c-8078-15cdf984c808'),
filter_field='detail filter field',
filter_value='detail filter value',
session=session_mock)
# THEN
query_mock.assert_called_once_with(MainEntity)
join_filter_mock.assert_called_once_with(MainEntity.filter_entity)
join_some_type_mock.assert_called_once_with(FilterEntity.some_type)
filter_mock.assert_called_once()
assert actual == [main_entity]
Помогите понять что делаю не так, и если есть варианты как это сделать через инструменты alchemy - было бы просто крышесносно. Заранее благодарю за помощь!