Skip to content

Commit d2d88ad

Browse files
committed
Add tests for renderers
1 parent 856922b commit d2d88ad

File tree

5 files changed

+76
-15
lines changed

5 files changed

+76
-15
lines changed

drf_excel/renderers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
5656
"""
5757
Render `data` into XLSX workbook, returning a workbook.
5858
"""
59-
if not self._check_validation_data(data):
60-
return json.dumps(data)
61-
6259
if data is None:
6360
return bytes()
6461

62+
if not self._check_validation_data(data):
63+
return json.dumps(data)
64+
6565
wb = Workbook()
6666
self.ws = wb.active
6767

tests/conftest.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import io
2+
from typing import Union, Callable
3+
14
import pytest
5+
from openpyxl.reader.excel import load_workbook
26
from openpyxl.workbook import Workbook
37
from openpyxl.worksheet.worksheet import Worksheet
48

@@ -11,3 +15,12 @@ def workbook() -> Workbook:
1115
@pytest.fixture
1216
def worksheet(workbook: Workbook) -> Worksheet:
1317
return Worksheet(workbook)
18+
19+
20+
@pytest.fixture
21+
def workbook_reader() -> Callable[[Union[bytes, str]], Workbook]:
22+
def reader_func(buffer: Union[bytes, str]) -> Workbook:
23+
io_buffer = io.BytesIO(buffer)
24+
return load_workbook(io_buffer, read_only=True)
25+
26+
return reader_func

tests/test_renderers.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from PIL import Image
2+
from rest_framework import serializers
3+
from rest_framework.generics import GenericAPIView
4+
from rest_framework.response import Response
5+
6+
from drf_excel.renderers import XLSXRenderer
7+
8+
9+
class MySerializer(serializers.Serializer):
10+
title = serializers.CharField()
11+
12+
13+
class MyBaseView(GenericAPIView):
14+
serializer_class = MySerializer
15+
16+
def retrieve(self, request, *args, **kwargs):
17+
return Response({"title": "example"})
18+
19+
20+
class TestXLSXRenderer:
21+
renderer = XLSXRenderer()
22+
23+
def test_validation_error(self):
24+
assert self.renderer.render({"detail": "invalid"}) == '{"detail": "invalid"}'
25+
26+
def test_none(self):
27+
assert self.renderer.render(None) == b""
28+
29+
def test_with_header_attribute(self, tmp_path, workbook_reader):
30+
image_path = tmp_path / "image.png"
31+
with Image.new(mode="RGB", size=(100, 100), color="blue") as img:
32+
img.save(image_path, format="png")
33+
34+
class MyView(MyBaseView):
35+
header = {
36+
"use_header": True,
37+
"header_title": "My Header",
38+
"tab_title": "My Tab",
39+
"img": str(image_path),
40+
"style": {"font": {"name": "Arial"}},
41+
}
42+
43+
result = self.renderer.render({}, renderer_context={"view": MyView})
44+
wb = workbook_reader(result)
45+
sheet = wb.worksheets[0]
46+
rows = list(sheet.rows)
47+
assert len(rows) == 1
48+
row0_col0 = rows[0][0]
49+
assert row0_col0.value == "My Header"
50+
assert row0_col0.font.name == "Arial"

tests/test_viewset_mixin.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import io
21
import datetime as dt
32

43
import pytest
5-
from openpyxl.reader.excel import load_workbook
64
from rest_framework.test import APIClient
75
from time_machine import TimeMachineFixture
86

97
from tests.testapp.models import ExampleModel, AllFieldsModel, Tag
108

11-
129
pytestmark = pytest.mark.django_db
1310

1411

@@ -17,7 +14,7 @@ def api_client():
1714
return APIClient()
1815

1916

20-
def test_simple_viewset_model(api_client):
17+
def test_simple_viewset_model(api_client, workbook_reader):
2118
ExampleModel.objects.create(title="test 1", description="This is a test")
2219
ExampleModel.objects.create(title="test 2", description="Another test")
2320
ExampleModel.objects.create(title="test 3", description="Testing this out")
@@ -33,11 +30,10 @@ def test_simple_viewset_model(api_client):
3330
response.headers["content-disposition"] == "attachment; filename=my_export.xlsx"
3431
)
3532

36-
workbook_buffer = io.BytesIO(response.content)
37-
workbook = load_workbook(workbook_buffer, read_only=True)
33+
wb = workbook_reader(response.content)
3834

39-
assert len(workbook.worksheets) == 1
40-
sheet = workbook.worksheets[0]
35+
assert len(wb.worksheets) == 1
36+
sheet = wb.worksheets[0]
4137
rows = list(sheet.rows)
4238
assert len(rows) == 4
4339
r0, r1, r2, r3 = rows
@@ -59,7 +55,9 @@ def test_simple_viewset_model(api_client):
5955
assert r3[1].value == "Testing this out"
6056

6157

62-
def test_all_fields_viewset(api_client, time_machine: TimeMachineFixture):
58+
def test_all_fields_viewset(
59+
api_client, time_machine: TimeMachineFixture, workbook_reader
60+
):
6361
time_machine.move_to(dt.datetime(2023, 9, 10, 15, 44, 37))
6462
instance = AllFieldsModel.objects.create(title="Hello", age=36, is_active=True)
6563
instance.tags.set(
@@ -71,9 +69,8 @@ def test_all_fields_viewset(api_client, time_machine: TimeMachineFixture):
7169
response = api_client.get("/all-fields/")
7270
assert response.status_code == 200
7371

74-
workbook_buffer = io.BytesIO(response.content)
75-
workbook = load_workbook(workbook_buffer, read_only=True)
76-
sheet = workbook.worksheets[0]
72+
wb = workbook_reader(response.content)
73+
sheet = wb.worksheets[0]
7774
rows = list(sheet.rows)
7875
assert len(rows) == 2
7976
r0, r1 = rows

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ deps =
1313

1414
djangorestframework
1515
openpyxl
16+
Pillow
1617

1718
pytest
1819
pytest-django

0 commit comments

Comments
 (0)