Как фильтровать в 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 - было бы просто крышесносно. Заранее благодарю за помощь!


Ответы (0 шт):