Skip to content

Commit 3c333ec

Browse files
committed
Add TestXLSXDateField
1 parent 07359ab commit 3c333ec

File tree

1 file changed

+162
-2
lines changed

1 file changed

+162
-2
lines changed

tests/test_fields.py

Lines changed: 162 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
from decimal import Decimal
2+
import datetime as dt
23

34
import pytest
45
from openpyxl.cell import Cell
56
from openpyxl.worksheet.worksheet import Worksheet
6-
from rest_framework.fields import CharField, IntegerField, FloatField, DecimalField
7+
from rest_framework.fields import (
8+
CharField,
9+
IntegerField,
10+
FloatField,
11+
DecimalField,
12+
DateTimeField,
13+
DateField,
14+
TimeField,
15+
)
716

8-
from drf_excel.fields import XLSXField, XLSXNumberField
17+
from drf_excel.fields import XLSXField, XLSXNumberField, XLSXDateField
918
from drf_excel.utilities import XLSXStyle
1019

1120

@@ -144,3 +153,154 @@ def test_cell_float(self, style: XLSXStyle, worksheet: Worksheet):
144153
assert isinstance(cell, Cell)
145154
assert cell.value == 35.5
146155
assert cell.number_format == "0.00"
156+
157+
158+
class TestXLSXDateField:
159+
@pytest.mark.parametrize(
160+
("original_value", "cleaned_value"),
161+
[
162+
# Successful parsing
163+
("2020-01-01", dt.datetime(2020, 1, 1, 0, 0)),
164+
("2020-02-03T13:01", dt.datetime(2020, 2, 3, 13, 1)),
165+
("2020-03-04T13:15:30", dt.datetime(2020, 3, 4, 13, 15, 30)),
166+
("2020-10-08T15:18:23.1234Z", dt.datetime(2020, 10, 8, 15, 18, 23, 123400)),
167+
# Failed parsing
168+
("foo", "foo"),
169+
(None, None),
170+
(True, True),
171+
(300, 300),
172+
(99.99, 99.99),
173+
],
174+
)
175+
def test_init_datetime_field(self, style: XLSXStyle, original_value, cleaned_value):
176+
f = XLSXDateField(
177+
key="dt",
178+
value=original_value,
179+
field=DateTimeField(),
180+
style=style,
181+
mapping=None,
182+
cell_style=style,
183+
)
184+
assert f.original_value == original_value
185+
assert f.value == cleaned_value
186+
187+
@pytest.mark.parametrize(
188+
("original_value", "cleaned_value"),
189+
[
190+
# Successful parsing
191+
("2020-01-01", dt.date(2020, 1, 1)),
192+
# Failed parsing
193+
("2020-02-03T13:01", None),
194+
("2020-03-04T13:15:30", None),
195+
("2020-10-08T15:18:23.1234Z", None),
196+
("foo", None),
197+
(None, None),
198+
(True, True),
199+
(300, 300),
200+
(99.99, 99.99),
201+
],
202+
)
203+
def test_init_date_field(self, style: XLSXStyle, original_value, cleaned_value):
204+
f = XLSXDateField(
205+
key="d",
206+
value=original_value,
207+
field=DateField(),
208+
style=style,
209+
mapping=None,
210+
cell_style=style,
211+
)
212+
assert f.original_value == original_value
213+
assert f.value == cleaned_value
214+
215+
@pytest.mark.parametrize(
216+
("original_value", "cleaned_value"),
217+
[
218+
# Successful parsing
219+
("13:01", dt.time(13, 1)),
220+
("13:15:30", dt.time(13, 15, 30)),
221+
("14:15:16.1234Z", dt.time(14, 15, 16, 123400)),
222+
# Failed parsing
223+
("2020-01-01", "2020-01-01"),
224+
("2020-02-03T13:01", "2020-02-03T13:01"),
225+
("2020-03-04T13:15:30", "2020-03-04T13:15:30"),
226+
("2020-10-08T15:18:23.1234Z", "2020-10-08T15:18:23.1234Z"),
227+
("foo", "foo"),
228+
(None, None),
229+
(True, True),
230+
(300, 300),
231+
(99.99, 99.99),
232+
],
233+
)
234+
def test_init_time_field(self, style: XLSXStyle, original_value, cleaned_value):
235+
f = XLSXDateField(
236+
key="t",
237+
value=original_value,
238+
field=TimeField(),
239+
style=style,
240+
mapping=None,
241+
cell_style=style,
242+
)
243+
assert f.original_value == original_value
244+
assert f.value == cleaned_value
245+
246+
def test_cell_datetime_default_format(self, style: XLSXStyle, worksheet: Worksheet):
247+
f = XLSXDateField(
248+
key="dt",
249+
value="2019-03-04T13:15:30",
250+
field=DateTimeField(),
251+
style=style,
252+
mapping=None,
253+
cell_style=style,
254+
)
255+
cell = f.cell(worksheet, 1, 1)
256+
assert isinstance(cell, Cell)
257+
assert cell.value == dt.datetime(2019, 3, 4, 13, 15, 30)
258+
assert cell.number_format == "yyyy-mm-dd h:mm:ss"
259+
260+
def test_cell_datetime_custom_format(
261+
self, style: XLSXStyle, worksheet: Worksheet, settings
262+
):
263+
settings.DRF_EXCEL_DATETIME_FORMAT = "dd/mm/yyyy h:mm:ss"
264+
f = XLSXDateField(
265+
key="dt",
266+
value="01-04-2015 05:16:09",
267+
field=DateTimeField(format="%d-%m-%Y %H:%M:%S"),
268+
style=style,
269+
mapping=None,
270+
cell_style=style,
271+
)
272+
cell = f.cell(worksheet, 1, 1)
273+
assert isinstance(cell, Cell)
274+
assert cell.value == dt.datetime(2015, 4, 1, 5, 16, 9)
275+
assert cell.number_format == "dd/mm/yyyy h:mm:ss"
276+
277+
def test_cell_date_default_format(self, style: XLSXStyle, worksheet: Worksheet):
278+
f = XLSXDateField(
279+
key="dt",
280+
value="2018-09-10",
281+
field=DateField(),
282+
style=style,
283+
mapping=None,
284+
cell_style=style,
285+
)
286+
cell = f.cell(worksheet, 1, 1)
287+
assert isinstance(cell, Cell)
288+
assert cell.value == dt.date(2018, 9, 10)
289+
assert cell.number_format == "yyyy-mm-dd"
290+
291+
def test_cell_date_custom_format(
292+
self, style: XLSXStyle, worksheet: Worksheet, settings
293+
):
294+
settings.DRF_EXCEL_DATE_FORMAT = "dd/mm/yyyy"
295+
f = XLSXDateField(
296+
key="dt",
297+
value="25/10/2017",
298+
field=DateField(format="%d/%m/%Y"),
299+
style=style,
300+
mapping=None,
301+
cell_style=style,
302+
)
303+
cell = f.cell(worksheet, 1, 1)
304+
assert isinstance(cell, Cell)
305+
assert cell.value == dt.date(2017, 10, 25)
306+
assert cell.number_format == "dd/mm/yyyy"

0 commit comments

Comments
 (0)