Тестирование пользовательского фильтра django
Написали фильтр, который работает так, как нужно
class ExternalProductActiveStatusFilter(admin.SimpleListFilter):
title = "EP Active status"
parameter_name = "ep active status"
def lookups(self, request, model_admin):
return [
("active", "Active"),
("inactive", "Inactive"),
]
def queryset(self, request, queryset):
if self.value() == "active":
return queryset.distinct().filter(external_products__active=True)
if self.value() == "inactive":
return queryset.exclude(external_products__active=True)
Теперь я хочу протестировать его, но не могу заставить его работать.
Посмотрел старые вопросы SO, но решения не помогают. В частности, вот эти: Тестирование пользовательского фильтра в admin.py (7 лет назад) и Тестирование фильтра в Django (5 лет назад)
Мой тест на данный момент
def test_externalproductactivestatusfilter_active(self):
self.product1 = baker.make(
"products.Product", id=uuid4(), title="Active product"
)
self.product2 = baker.make(
"products.Product", id=uuid4(), title="Inactive product"
)
self.external_product1 = baker.make(
"external_products.ExternalProduct",
internal_product=self.product1,
active=True,
)
self.external_product2 = baker.make(
"external_products.ExternalProduct",
internal_product=self.product2,
active=False,
)
request = MockRequest()
f = ExternalProductActiveStatusFilter(
None, {"active": "Active"}, Product, ProductAdmin
)
result = f.queryset(request, Product.objects.all())
print(result)
result is None
Корс None: У вас есть два возврата в if, и больше ничего. Если фильтр не установлен - вы получаете None. В вашем случае:
def queryset(self, request, queryset):
query = Q()
if self.value() == "active":
query = Q(external_products__active=True)
if self.value() == "inactive":
query = Q(external_products__active=False)
return queryset.filter(query)