Skip to content

Commit ba4660b

Browse files
authored
Merge pull request #88 from browniebroke/test-viewset
Add test covering a viewset using XLSXFileMixin
2 parents 037640d + 95109c5 commit ba4660b

File tree

7 files changed

+90
-1
lines changed

7 files changed

+90
-1
lines changed

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ build-backend = "setuptools.build_meta"
5454
write_to = "drf_excel/_version.py"
5555

5656
[tool.pytest.ini_options]
57-
addopts = "--cov --cov-report=html"
57+
addopts = "--cov --cov-report=html --cov-report=term"
5858
python_files = "tests.py test_*.py"
5959
DJANGO_SETTINGS_MODULE = "tests.settings"
6060

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)