55import requests
66import pytest
77from unittest .mock import patch
8+
89import pyodata .v2 .model
910import pyodata .v2 .service
1011from pyodata .exceptions import PyODataException , HttpError , ExpressionError
@@ -277,7 +278,7 @@ def test_entity_key_complex(service):
277278 entity = service .entity_sets .TemperatureMeasurements .get_entity (key = None , ** entity_key ).execute ()
278279 assert key_properties == set (entity_property .name for entity_property in entity .entity_key .key_properties )
279280 # check also python represantation of date
280- assert entity .Date == datetime .datetime (2017 , 12 , 24 , 18 , 0 )
281+ assert entity .Date == datetime .datetime (2017 , 12 , 24 , 18 , 0 , tzinfo = datetime . timezone . utc )
281282
282283
283284def test_get_entity_property_complex_key (service ):
@@ -574,7 +575,7 @@ def test_update_entity(service):
574575 "{0}/TemperatureMeasurements(Sensor='sensor1',Date=datetime'2017-12-24T18:00:00')" .format (service .url ),
575576 json = {'d' : {
576577 'Sensor' : 'Sensor-address' ,
577- 'Date' : "datetime'2017-12-24T18:00' " ,
578+ 'Date' : "/Date(1714138400000)/ " ,
578579 'Value' : 34
579580 }},
580581 status = 204 )
@@ -586,6 +587,16 @@ def test_update_entity(service):
586587 assert isinstance (request , pyodata .v2 .service .EntityModifyRequest )
587588
588589 request .set (Value = 34 )
590+ # Tests if update entity correctly calls 'to_json' method
591+ request .set (Date = datetime .datetime (2017 , 12 , 24 , 19 , 0 ))
592+
593+ assert request ._values ['Value' ] == 34
594+ assert request ._values ['Date' ] == '/Date(1514142000000)/'
595+
596+ # If preformatted datetime is passed (e. g. you already replaced datetime instance with string which is
597+ # complaint with odata specification), 'to_json' does not update given value (for backward compatibility reasons)
598+ request .set (Date = '/Date(1714138400000)/' )
599+ assert request ._values ['Date' ] == '/Date(1714138400000)/'
589600
590601 request .execute ()
591602
@@ -1418,3 +1429,82 @@ def test_navigation_count_with_filter(service):
14181429 assert isinstance (request , pyodata .v2 .service .GetEntitySetRequest )
14191430
14201431 assert request .execute () == 3
1432+
1433+
1434+ @responses .activate
1435+ def test_create_entity_with_datetime (service ):
1436+ """
1437+ Basic test on creating entity with datetime
1438+ Also tzinfo is set to simulate user passing datetime object with different timezone than UTC
1439+ """
1440+
1441+ # https://stackoverflow.com/questions/17976063/how-to-create-tzinfo-when-i-have-utc-offset
1442+ class MyUTCOffsetTimezone (datetime .tzinfo ):
1443+
1444+ def __init__ (self , offset = 19800 , name = None ):
1445+ self .offset = datetime .timedelta (seconds = offset )
1446+ self .name = name or self .__class__ .__name__
1447+
1448+ def utcoffset (self , dt ):
1449+ return self .offset
1450+
1451+ def tzname (self , dt ):
1452+ return self .name
1453+
1454+ def dst (self , dt ):
1455+ return datetime .timedelta (0 )
1456+
1457+ # pylint: disable=redefined-outer-name
1458+
1459+ responses .add (
1460+ responses .POST ,
1461+ "{0}/TemperatureMeasurements" .format (service .url ),
1462+ headers = {'Content-type' : 'application/json' },
1463+ json = {'d' : {
1464+ 'Sensor' : 'Sensor1' ,
1465+ 'Date' : '/Date(1514138400000)/' ,
1466+ 'Value' : '34'
1467+ }},
1468+ status = 201 )
1469+
1470+
1471+ # Offset -18000 sec is for America/Chicago (CDT) timezone
1472+ request = service .entity_sets .TemperatureMeasurements .create_entity ().set (** {
1473+ 'Sensor' : 'Sensor1' ,
1474+ 'Date' : datetime .datetime (2017 , 12 , 24 , 18 , 0 , tzinfo = MyUTCOffsetTimezone (- 18000 )),
1475+ 'Value' : 34
1476+ })
1477+
1478+ assert request ._values ['Date' ] == '/Date(1514138400000)/'
1479+
1480+ result = request .execute ()
1481+ assert result .Date == datetime .datetime (2017 , 12 , 24 , 18 , 0 , tzinfo = datetime .timezone .utc )
1482+
1483+
1484+ @responses .activate
1485+ def test_parsing_of_datetime_before_unix_time (service ):
1486+ """Test DateTime handling of time before 1970"""
1487+
1488+ # pylint: disable=redefined-outer-name
1489+
1490+ responses .add (
1491+ responses .POST ,
1492+ "{0}/TemperatureMeasurements" .format (service .url ),
1493+ headers = {'Content-type' : 'application/json' },
1494+ json = {'d' : {
1495+ 'Sensor' : 'Sensor1' ,
1496+ 'Date' : '/Date(-777877200000)/' ,
1497+ 'Value' : '34'
1498+ }},
1499+ status = 201 )
1500+
1501+ request = service .entity_sets .TemperatureMeasurements .create_entity ().set (** {
1502+ 'Sensor' : 'Sensor1' ,
1503+ 'Date' : datetime .datetime (1945 , 5 , 8 , 19 , 0 ),
1504+ 'Value' : 34
1505+ })
1506+
1507+ assert request ._values ['Date' ] == '/Date(-777877200000)/'
1508+
1509+ result = request .execute ()
1510+ assert result .Date == datetime .datetime (1945 , 5 , 8 , 19 , 0 , tzinfo = datetime .timezone .utc )
0 commit comments