예제 #1
0
    def test_no_value_provided(self, session):
        query = session.query(User)
        filters = [{'field': 'name', 'op': '==', }]

        with pytest.raises(BadFilterFormat) as err:
            apply_filters(query, filters)

        assert '`value` must be provided.' == err.value.args[0]
예제 #2
0
    def test_no_field_provided(self, session):
        query = session.query(User)
        filters = [{'op': '==', 'value': 'rdas'}]

        with pytest.raises(BadFilterFormat) as err:
            apply_filters(query, filters)

        expected_error = '`field` is a mandatory filter attribute.'
        assert expected_error == err.value.args[0]
예제 #3
0
    def test_do_not_auto_join(self, session):
        query = session.query(Customer)
        filters = [
            {'field': 'customer_ref', 'op': '==', 'value': 'CUST-OBW-505431'},
            {'model': 'User', 'field': 'created_by', 'op': 'is_not_null'},
        ]

        with pytest.raises(BadSpec) as exc:
            apply_filters(query, filters, do_auto_join=False)
예제 #4
0
    def test_invalid_field(self, session):
        query = session.query(User)
        filters = [{'field': 'invalid_field', 'op': '==', 'value': 'rdas1'}]

        with pytest.raises(FieldNotFound) as err:
            apply_filters(query, filters)

        expected_error = (
            "Model <class 'orm.orm_data_access.models.User'> has no column `invalid_field`."
        )
        assert expected_error == err.value.args[0]
예제 #5
0
    def test_wrong_filters_format(self, session, filter_):
        query = session.query(User)
        filters = [filter_]

        with pytest.raises(BadFilterFormat) as err:
            apply_filters(query, filters)

        expected_error = 'Filter spec `{}` should be a dictionary.'.format(
            filter_
        )
        assert expected_error == err.value.args[0]
예제 #6
0
    def test_invalid_field_but_valid_model_attribute(self, session, attr_name):
        query = session.query(User)
        filters = [{'field': attr_name, 'op': '==', 'value': 'rdas'}]

        with pytest.raises(FieldNotFound) as err:
            apply_filters(query, filters)

        expected_error = (
            "Model <class 'orm.orm_data_access.models.User'> has no column `{}`.".format(
                attr_name
            )
        )
        assert expected_error == err.value.args[0]
예제 #7
0
    def test_no_operator_provided(self, session):
        query = session.query(User)
        filters = [{'field': 'login_id', 'value': 'rdas'}]

        filtered_query = apply_filters(query, filters)
        result = filtered_query.all()

        assert len(result) == 1
예제 #8
0
    def test_eager_load(self, session):
        # behaves as if the joinedload wasn't present
        query = session.query(Account).options(joinedload(Account.customer))
        filters = [
            {'field': 'customer_ref', 'op': '==', 'value': 'CUST-OBW-505431'},
            {'model': 'Account', 'field': 'account_number', 'op': 'is_not_null'},
        ]

        filtered_query = apply_filters(query, filters)
        result = filtered_query.all()

        assert len(result) == 3
예제 #9
0
    def test_noop_if_query_contains_named_models(self, session):
        query = session.query(Customer).join(Account)
        filters = [
            {'model': 'Customer', 'field': 'customer_ref', 'op': '==', 'value': 'CUST-OBW-505431'},
            {'model': 'Account', 'field': 'account_number', 'op': 'is_not_null'},
        ]

        filtered_query = apply_filters(query, filters)
        result = filtered_query.all()

        assert len(result) == 1
        assert result[0].customer_id == 1
        assert result[0].created_by == 1
예제 #10
0
    def test_auto_join(self, session):
        query = session.query(Customer)
        filters = [
            {'field': 'customer_ref', 'op': '==', 'value': 'CUST-OBW-505431'},
            {'model': 'Account', 'field': 'account_number', 'op': 'is_not_null'},
        ]

        filtered_query = apply_filters(query, filters)
        result = filtered_query.all()

        assert len(result) == 1
        assert result[0].personal_id == 'G5874880W'
        assert result[0].updated_user is not None
        assert result[0].updated_user.user_id == 1
예제 #11
0
    def test_multiple_models(self, session):
        query = session.query(Customer, Account)
        filters = [
            {'model': 'Customer', 'field': 'customer_ref', 'op': '==', 'value': 'CUST-OBW-505431'},
            {'model': 'Account', 'field': 'customer_ref', 'op': '==', 'value': 'CUST-OBW-505431'},
        ]

        filtered_query = apply_filters(query, filters)
        result = filtered_query.all()

        assert len(result) == 3
        customers, accounts = zip(*result)
        assert set(map(type, customers)) == {Customer}
        assert {cus.customer_id for cus in customers} == {1}
        assert {cus.customer_ref for cus in customers} == {"CUST-OBW-505431"}
        assert set(map(type, accounts)) == {Account}
        assert {acct.account_id for acct in accounts} == {1, 2, 3}
        assert {acct.customer_ref for acct in accounts} == {"CUST-OBW-505431"}
 def get_by_filter_spec_criteria(self, entity, filter_spec):
     query = self.session.query(User)
     query = filters.apply_filters(query, filter_spec.get_filters(), True)
     query = sorting.apply_sort(query, filter_spec.get_order_by())
     return query.all()
예제 #13
0
 def test_no_filters_provided(self, session):
     query = session.query(User)
     filters = []
     filtered_query = apply_filters(query, filters)
     assert query == filtered_query