def test_searching_q_ok(value, db_lookup, db_value):
    cls = BooksFilterClass(book_qs)

    for v in (value, '"{}"'.format(value)):
        like_q = cls.build_q_for_filter(FilterArgs('title', SearchOperators.LIKE, v))
        assert like_q.children[0] == ('title__{}'.format(db_lookup), db_value)

    i_like_q = cls.build_q_for_filter(FilterArgs('title', SearchOperators.I_LIKE, value))
    assert i_like_q.children[0] == ('title__i{}'.format(db_lookup), db_value)
def test_old_syntax_select_remains(query, mocker):
    expected = ('select(books)&in(k,("v","v"))',
                'in(k,("v","v"))&select(books)')
    request = mocker.MagicMock(query_params=QueryDict(query))
    filter_instance = BooksFilterClass(Book.objects.none())
    assert DjangoFiltersRQLFilterBackend.get_rql_query(filter_instance,
                                                       request,
                                                       query) in expected
def test_old_syntax_filters(mocker):
    query = 'k__in=v'
    request = mocker.MagicMock(query_params=QueryDict(query))
    filter_instance = BooksFilterClass(Book.objects.none())

    for _ in range(2):
        assert DjangoFiltersRQLFilterBackend.is_old_syntax(
            filter_instance, request, query) is True
        assert filter_instance.old_syntax_filters == {'t__in'}
def test_bad_syntax_query(mocker):
    query = 'limit=10&offset=0&in=(prop,(val1,val2))&in(prop.prop,(val))' \
        '&ge=(created,2020-06-01T04:00:00Z)&le=(created,2020-06-24T03:59:59Z)'
    request = mocker.MagicMock(
        query_params=QueryDict(query),
        _request=mocker.MagicMock(META={'QUERY_STRING': query}),
    )
    filter_instance = BooksFilterClass(Book.objects.none())
    mocker.patch(
        'dj_rql.drf.compat.DjangoFiltersRQLFilterBackend.is_old_syntax',
        return_value=True)

    with pytest.raises(RQLFilterParsingError):
        assert DjangoFiltersRQLFilterBackend.get_query(filter_instance,
                                                       request, None)
Beispiel #5
0
def filter_instance():
    return BooksFilterClass(None)
Beispiel #6
0
def test_custom_filter_ordering_fail():
    with pytest.raises(RQLFilterParsingError) as e:
        BooksFilterClass(book_qs).build_name_for_custom_ordering(
            'custom_filter')
    assert e.value.details[
        'error'] == 'Ordering logic is not implemented: custom_filter.'
Beispiel #7
0
def filter_field(filter_name, operator, value):
    filter_cls = BooksFilterClass(book_qs)
    q = filter_cls.build_q_for_filter(
        FilterArgs(filter_name, operator, str(value)))
    return list(book_qs.filter(q))
def test_old_syntax(mocker, query, expected):
    request = mocker.MagicMock(query_params=QueryDict(query))
    filter_instance = BooksFilterClass(Book.objects.none())
    assert DjangoFiltersRQLFilterBackend.is_old_syntax(filter_instance,
                                                       request,
                                                       query) == expected
def test_distinct_on_field_field_not_in_ordering():
    _, qs = BooksFilterClass(book_qs).apply_filters(
        'ordering(int_choice_field)')
    assert not qs.query.distinct
def test_two_distinct_fields():
    _, qs = BooksFilterClass(book_qs).apply_filters(
        'status=planning,name=author')
    assert qs.query.distinct
def test_distinct_on_field_field_in_ordering():
    _, qs = BooksFilterClass(book_qs).apply_filters('ordering(published.at)')
    assert qs.query.distinct
def test_distinct_on_field_field_in_filter():
    _, qs = BooksFilterClass(book_qs).apply_filters('status=planning')
    assert qs.query.distinct
def test_redefined_distinct_from_namespace():
    _, qs = BooksFilterClass(book_qs).apply_filters('author.publisher.id=1')
    assert not qs.query.distinct
def test_default_distinct_from_namespace():
    _, qs = BooksFilterClass(book_qs).apply_filters('[email protected]')
    assert qs.query.distinct
def test_distinct_on_field_no_field_in_filter():
    _, qs = BooksFilterClass(book_qs).apply_filters('title=abc')
    assert not qs.query.distinct
def apply_filters(query):
    filter_cls = BooksFilterClass(book_qs)
    _, q = filter_cls.apply_filters(query)
    return list(q)