Skip to content

Commit 48029ec

Browse files
committed
Add test covering a viewset using XLSXFileMixin
1 parent 9003f7e commit 48029ec

File tree

6 files changed

+89
-0
lines changed

6 files changed

+89
-0
lines changed

tests/settings.py

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
USE_TZ = True
1414
TIME_ZONE = "UTC"
15+
ROOT_URLCONF = "tests.urls"
1516

1617
INSTALLED_APPS = [
1718
"django.contrib.auth",

tests/test_viewset_mixin.py

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import io
2+
3+
import pytest
4+
from openpyxl.reader.excel import load_workbook
5+
from rest_framework.test import APIClient
6+
7+
from tests.testapp.models import ExampleModel
8+
9+
@pytest.fixture
10+
def api_client():
11+
return APIClient()
12+
13+
14+
@pytest.mark.django_db
15+
def test_simple_viewset_model(api_client):
16+
ExampleModel.objects.create(title="test 1", description="This is a test")
17+
ExampleModel.objects.create(title="test 2", description="Another test")
18+
ExampleModel.objects.create(title="test 3", description="Testing this out")
19+
20+
response = api_client.get("/examples/")
21+
22+
assert response.status_code == 200
23+
assert response.headers["Content-Type"] == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8"
24+
assert response.headers["content-disposition"] == "attachment; filename=my_export.xlsx"
25+
26+
workbook_buffer = io.BytesIO(response.content)
27+
workbook = load_workbook(workbook_buffer, read_only=True)
28+
29+
assert len(workbook.worksheets) == 1
30+
sheet = workbook.worksheets[0]
31+
rows = list(sheet.rows)
32+
assert len(rows) == 4
33+
r0, r1, r2, r3 = rows
34+
35+
assert len(r0) == 2
36+
assert r0[0].value == "title"
37+
assert r0[1].value == "description"
38+
39+
assert len(r1) == 2
40+
assert r1[0].value == "test 1"
41+
assert r1[1].value == "This is a test"
42+
43+
assert len(r2) == 2
44+
assert r2[0].value == "test 2"
45+
assert r2[1].value == "Another test"
46+
47+
assert len(r3) == 2
48+
assert r3[0].value == "test 3"
49+
assert r3[1].value == "Testing this out"

tests/testapp/models.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from django.db import models
2+
3+
4+
class ExampleModel(models.Model):
5+
title = models.CharField(max_length=100)
6+
description = models.TextField()
7+
8+
def __str__(self):
9+
return self.title

tests/testapp/serializers.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from rest_framework import serializers
2+
3+
from .models import ExampleModel
4+
5+
6+
class ExampleSerializer(serializers.ModelSerializer):
7+
class Meta:
8+
model = ExampleModel
9+
fields = ("title", "description")

tests/testapp/views.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from rest_framework.viewsets import ReadOnlyModelViewSet
2+
from drf_excel.mixins import XLSXFileMixin
3+
from drf_excel.renderers import XLSXRenderer
4+
5+
from .models import ExampleModel
6+
from .serializers import ExampleSerializer
7+
8+
9+
class ExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
10+
queryset = ExampleModel.objects.all()
11+
serializer_class = ExampleSerializer
12+
renderer_classes = (XLSXRenderer,)
13+
filename = "my_export.xlsx"

tests/urls.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from rest_framework import routers
2+
3+
from .testapp.views import ExampleViewSet
4+
5+
router = routers.SimpleRouter()
6+
router.register(r'examples', ExampleViewSet)
7+
8+
urlpatterns = router.urls

0 commit comments

Comments
 (0)