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)
def filter_instance(): return BooksFilterClass(None)
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.'
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)