Commit f46433e7 by Alexander Kryklia Committed by polesye

Add tests fro IsoTime methods.

parent 0da81e2a
...@@ -150,7 +150,7 @@ class IsoTime(Field): ...@@ -150,7 +150,7 @@ class IsoTime(Field):
try: try:
obj_time = time.strptime(value, '%H:%M:%S') obj_time = time.strptime(value, '%H:%M:%S')
except ValueError as e: except ValueError as e:
raise e( raise ValueError(
"Incorrect IsoTime value {} was set in XML or serialized." "Incorrect IsoTime value {} was set in XML or serialized."
"Original parse message is {}".format(value, e.message) "Original parse message is {}".format(value, e.message)
) )
...@@ -174,8 +174,12 @@ class IsoTime(Field): ...@@ -174,8 +174,12 @@ class IsoTime(Field):
if isinstance(value, float): if isinstance(value, float):
return datetime.timedelta(seconds=value) return datetime.timedelta(seconds=value)
if isinstance(value, basestring):
return self._isotime_to_timedelta(value) return self._isotime_to_timedelta(value)
msg = "IsoTime Field {0} has bad value '{1}'".format(self._name, value)
raise TypeError(msg)
def to_json(self, value): def to_json(self, value):
""" """
Convert datetime.timedelta to "HH:MM:SS" format. Convert datetime.timedelta to "HH:MM:SS" format.
...@@ -194,9 +198,12 @@ class IsoTime(Field): ...@@ -194,9 +198,12 @@ class IsoTime(Field):
value = 86400 value = 86400
return str(datetime.timedelta(seconds=value)) return str(datetime.timedelta(seconds=value))
if isinstance(value, datetime.timedelta):
if value.total_seconds() > 86400: # sanity check if value.total_seconds() > 86400: # sanity check
raise ValueError( raise ValueError(
"IsoTime max value is 23:59:59=86400 seconds" "IsoTime max value is 23:59:59=86400.0 seconds, "
"but {} seconds is passed".format(value.total_seconds()) "but {} seconds is passed".format(value.total_seconds())
) )
return str(value) return str(value)
raise TypeError("IsoTime: cannot convert {!r} to json".format(value))
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import datetime import datetime
import unittest import unittest
from django.utils.timezone import UTC from django.utils.timezone import UTC
from xmodule.fields import Date, Timedelta from xmodule.fields import Date, Timedelta, IsoTime
from xmodule.timeinfo import TimeInfo from xmodule.timeinfo import TimeInfo
import time import time
...@@ -116,3 +116,54 @@ class TimeInfoTest(unittest.TestCase): ...@@ -116,3 +116,54 @@ class TimeInfoTest(unittest.TestCase):
timeinfo = TimeInfo(due_date, grace_pd_string) timeinfo = TimeInfo(due_date, grace_pd_string)
self.assertEqual(timeinfo.close_date, self.assertEqual(timeinfo.close_date,
due_date + Timedelta().from_json(grace_pd_string)) due_date + Timedelta().from_json(grace_pd_string))
class IsoTimeTest(unittest.TestCase):
delta = IsoTime()
def test_from_json(self):
self.assertEqual(
IsoTimeTest.delta.from_json('0:05:07'),
datetime.timedelta(seconds=307)
)
self.assertEqual(
IsoTimeTest.delta.from_json(100.0),
datetime.timedelta(seconds=100)
)
self.assertEqual(
IsoTimeTest.delta.from_json(None),
datetime.timedelta(seconds=0)
)
with self.assertRaises(TypeError):
IsoTimeTest.delta.from_json(1234) # int
with self.assertRaises(ValueError):
IsoTimeTest.delta.from_json("77:77:77")
def test_to_json(self):
self.assertEqual(
"1:02:03",
IsoTimeTest.delta.to_json(datetime.timedelta(seconds=3723))
)
self.assertEqual(
"00:00:00",
IsoTimeTest.delta.to_json(None)
)
self.assertEqual(
"0:01:40",
IsoTimeTest.delta.to_json(100.0)
)
with self.assertRaises(ValueError) as cm:
IsoTimeTest.delta.to_json(datetime.timedelta(seconds=90000))
self.assertEqual(
cm.exception.message,
"IsoTime max value is 23:59:59=86400.0 seconds, but 90000.0 seconds is passed"
)
with self.assertRaises(TypeError):
IsoTimeTest.delta.to_json("123")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment