From 48029ecf0ee316ebb9c61be29549831056b30454 Mon Sep 17 00:00:00 2001 From: Bruno Alla Date: Sun, 29 Sep 2024 17:49:44 -0300 Subject: [PATCH 1/2] Add test covering a viewset using XLSXFileMixin --- tests/settings.py | 1 + tests/test_viewset_mixin.py | 49 ++++++++++++++++++++++++++++++++++++ tests/testapp/models.py | 9 +++++++ tests/testapp/serializers.py | 9 +++++++ tests/testapp/views.py | 13 ++++++++++ tests/urls.py | 8 ++++++ 6 files changed, 89 insertions(+) create mode 100644 tests/test_viewset_mixin.py create mode 100644 tests/testapp/models.py create mode 100644 tests/testapp/serializers.py create mode 100644 tests/testapp/views.py create mode 100644 tests/urls.py diff --git a/tests/settings.py b/tests/settings.py index 8ed666f..55ba275 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -12,6 +12,7 @@ USE_TZ = True TIME_ZONE = "UTC" +ROOT_URLCONF = "tests.urls" INSTALLED_APPS = [ "django.contrib.auth", diff --git a/tests/test_viewset_mixin.py b/tests/test_viewset_mixin.py new file mode 100644 index 0000000..595c9a7 --- /dev/null +++ b/tests/test_viewset_mixin.py @@ -0,0 +1,49 @@ +import io + +import pytest +from openpyxl.reader.excel import load_workbook +from rest_framework.test import APIClient + +from tests.testapp.models import ExampleModel + +@pytest.fixture +def api_client(): + return APIClient() + + +@pytest.mark.django_db +def test_simple_viewset_model(api_client): + ExampleModel.objects.create(title="test 1", description="This is a test") + ExampleModel.objects.create(title="test 2", description="Another test") + ExampleModel.objects.create(title="test 3", description="Testing this out") + + response = api_client.get("/examples/") + + assert response.status_code == 200 + assert response.headers["Content-Type"] == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8" + assert response.headers["content-disposition"] == "attachment; filename=my_export.xlsx" + + workbook_buffer = io.BytesIO(response.content) + workbook = load_workbook(workbook_buffer, read_only=True) + + assert len(workbook.worksheets) == 1 + sheet = workbook.worksheets[0] + rows = list(sheet.rows) + assert len(rows) == 4 + r0, r1, r2, r3 = rows + + assert len(r0) == 2 + assert r0[0].value == "title" + assert r0[1].value == "description" + + assert len(r1) == 2 + assert r1[0].value == "test 1" + assert r1[1].value == "This is a test" + + assert len(r2) == 2 + assert r2[0].value == "test 2" + assert r2[1].value == "Another test" + + assert len(r3) == 2 + assert r3[0].value == "test 3" + assert r3[1].value == "Testing this out" diff --git a/tests/testapp/models.py b/tests/testapp/models.py new file mode 100644 index 0000000..ed3a96f --- /dev/null +++ b/tests/testapp/models.py @@ -0,0 +1,9 @@ +from django.db import models + + +class ExampleModel(models.Model): + title = models.CharField(max_length=100) + description = models.TextField() + + def __str__(self): + return self.title diff --git a/tests/testapp/serializers.py b/tests/testapp/serializers.py new file mode 100644 index 0000000..ceb261c --- /dev/null +++ b/tests/testapp/serializers.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + +from .models import ExampleModel + + +class ExampleSerializer(serializers.ModelSerializer): + class Meta: + model = ExampleModel + fields = ("title", "description") diff --git a/tests/testapp/views.py b/tests/testapp/views.py new file mode 100644 index 0000000..87eea78 --- /dev/null +++ b/tests/testapp/views.py @@ -0,0 +1,13 @@ +from rest_framework.viewsets import ReadOnlyModelViewSet +from drf_excel.mixins import XLSXFileMixin +from drf_excel.renderers import XLSXRenderer + +from .models import ExampleModel +from .serializers import ExampleSerializer + + +class ExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet): + queryset = ExampleModel.objects.all() + serializer_class = ExampleSerializer + renderer_classes = (XLSXRenderer,) + filename = "my_export.xlsx" diff --git a/tests/urls.py b/tests/urls.py new file mode 100644 index 0000000..309b702 --- /dev/null +++ b/tests/urls.py @@ -0,0 +1,8 @@ +from rest_framework import routers + +from .testapp.views import ExampleViewSet + +router = routers.SimpleRouter() +router.register(r'examples', ExampleViewSet) + +urlpatterns = router.urls From 95109c5528e8da2134de75ffac341942b92eb2ed Mon Sep 17 00:00:00 2001 From: Bruno Alla Date: Sun, 29 Sep 2024 17:52:39 -0300 Subject: [PATCH 2/2] Show coverage report in the terminal --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 56ac071..6370da3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,7 @@ build-backend = "setuptools.build_meta" write_to = "drf_excel/_version.py" [tool.pytest.ini_options] -addopts = "--cov --cov-report=html" +addopts = "--cov --cov-report=html --cov-report=term" python_files = "tests.py test_*.py" DJANGO_SETTINGS_MODULE = "tests.settings"