diff --git a/letsencrypt/acme/fields.py b/letsencrypt/acme/fields.py index 59a72953b..f001f1cd5 100644 --- a/letsencrypt/acme/fields.py +++ b/letsencrypt/acme/fields.py @@ -5,7 +5,13 @@ from letsencrypt.acme import jose class RFC3339Field(jose.Field): - """RFC3339 field encoder/decoder""" + """RFC3339 field encoder/decoder. + + Handles decoding/encoding between RFC3339 strings and aware (not + naive) `datetime.datetime` objects + (e.g. ``datetime.datetime.now(pytz.utc)``). + + """ @classmethod def default_encoder(cls, value): diff --git a/letsencrypt/acme/fields_test.py b/letsencrypt/acme/fields_test.py new file mode 100644 index 000000000..204849408 --- /dev/null +++ b/letsencrypt/acme/fields_test.py @@ -0,0 +1,35 @@ +"""Tests for letsencrypt.acme.fields.""" +import datetime +import unittest + +import pytz + +from letsencrypt.acme import jose + + +class RFC3339FieldTest(unittest.TestCase): + """Tests for letsencrypt.acme.fields.RFC3339Field.""" + + def setUp(self): + self.decoded = datetime.datetime(2015, 3, 27, tzinfo=pytz.utc) + self.encoded = '2015-03-27T00:00:00Z' + + def test_default_encoder(self): + from letsencrypt.acme.fields import RFC3339Field + self.assertEqual( + self.encoded, RFC3339Field.default_encoder(self.decoded)) + + def test_default_encoder_naive_fails(self): + from letsencrypt.acme.fields import RFC3339Field + self.assertRaises( + ValueError, RFC3339Field.default_encoder, datetime.datetime.now()) + + def test_default_decoder(self): + from letsencrypt.acme.fields import RFC3339Field + self.assertEqual( + self.decoded, RFC3339Field.default_decoder(self.encoded)) + + def test_default_decoder_raises_deserialization_error(self): + from letsencrypt.acme.fields import RFC3339Field + self.assertRaises( + jose.DeserializationError, RFC3339Field.default_decoder, '') diff --git a/setup.py b/setup.py index b25b7fdb4..b70bfa031 100644 --- a/setup.py +++ b/setup.py @@ -39,6 +39,7 @@ install_requires = [ 'pyrfc3339', 'python-augeas', 'python2-pythondialog', + 'pytz', 'requests', 'werkzeug', 'zope.component',