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]
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]
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)
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]
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]
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]
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
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
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
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
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()
def test_no_filters_provided(self, session): query = session.query(User) filters = [] filtered_query = apply_filters(query, filters) assert query == filtered_query