Тестирование пользовательского фильтра 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)
Вернуться на верх