2121
2222from __future__ import absolute_import
2323
24- from datetime import datetime , tzinfo , timedelta
24+ from datetime import tzinfo , timedelta
2525import datetime as dt
2626from unittest import TestCase , skipIf
2727from unittest .mock import patch , MagicMock
3131from sqlalchemy .orm import Session , sessionmaker
3232
3333from sqlalchemy_cratedb import SA_VERSION , SA_1_4
34+ from sqlalchemy_cratedb .dialect import DateTime
3435
3536try :
3637 from sqlalchemy .orm import declarative_base
@@ -57,6 +58,15 @@ def dst(self, date_time):
5758 return timedelta (seconds = - 7200 )
5859
5960
61+ INPUT_DATE = dt .date (2009 , 5 , 13 )
62+ INPUT_DATETIME_NOTZ = dt .datetime (2009 , 5 , 13 , 19 , 19 , 30 , 123456 )
63+ INPUT_DATETIME_TZ = dt .datetime (2009 , 5 , 13 , 19 , 19 , 30 , 123456 , tzinfo = CST ())
64+ OUTPUT_DATE = INPUT_DATE
65+ OUTPUT_TIME = dt .time (19 , 19 , 30 , 123000 )
66+ OUTPUT_DATETIME_NOTZ = dt .datetime (2009 , 5 , 13 , 19 , 19 , 30 , 123000 )
67+ OUTPUT_DATETIME_TZ = dt .datetime (2009 , 5 , 13 , 19 , 19 , 30 , 123000 )
68+
69+
6070@skipIf (SA_VERSION < SA_1_4 , "SQLAlchemy 1.3 suddenly has problems with these test cases" )
6171@patch ('crate.client.connection.Cursor' , FakeCursor )
6272class SqlAlchemyDateAndDateTimeTest (TestCase ):
@@ -69,7 +79,7 @@ class Character(Base):
6979 __tablename__ = 'characters'
7080 name = sa .Column (sa .String , primary_key = True )
7181 date = sa .Column (sa .Date )
72- timestamp = sa .Column (sa .DateTime )
82+ datetime = sa .Column (sa .DateTime )
7383
7484 fake_cursor .description = (
7585 ('characters_name' , None , None , None , None , None , None ),
@@ -91,7 +101,7 @@ def test_date_can_handle_datetime(self):
91101 def test_date_can_handle_tz_aware_datetime (self ):
92102 character = self .Character ()
93103 character .name = "Athur"
94- character .timestamp = datetime ( 2009 , 5 , 13 , 19 , 19 , 30 , tzinfo = CST ())
104+ character .datetime = INPUT_DATETIME_NOTZ
95105 self .session .add (character )
96106
97107
@@ -102,7 +112,8 @@ class FooBar(Base):
102112 __tablename__ = "foobar"
103113 name = sa .Column (sa .String , primary_key = True )
104114 date = sa .Column (sa .Date )
105- datetime = sa .Column (sa .DateTime )
115+ datetime_notz = sa .Column (DateTime (timezone = False ))
116+ datetime_tz = sa .Column (DateTime (timezone = True ))
106117
107118
108119@pytest .fixture
@@ -124,22 +135,28 @@ def test_datetime_notz(session):
124135 # Insert record.
125136 foo_item = FooBar (
126137 name = "foo" ,
127- date = dt .date (2009 , 5 , 13 ),
128- datetime = dt .datetime (2009 , 5 , 13 , 19 , 19 , 30 , 123456 ),
138+ date = INPUT_DATE ,
139+ datetime_notz = INPUT_DATETIME_NOTZ ,
140+ datetime_tz = INPUT_DATETIME_NOTZ ,
129141 )
130142 session .add (foo_item )
131143 session .commit ()
132144 session .execute (sa .text ("REFRESH TABLE foobar" ))
133145
134146 # Query record.
135- result = session .execute (sa .select (FooBar .name , FooBar .date , FooBar .datetime )).mappings ().first ()
147+ result = session .execute (sa .select (
148+ FooBar .name , FooBar .date , FooBar .datetime_notz , FooBar .datetime_tz )).mappings ().first ()
136149
137150 # Compare outcome.
138- assert result ["date" ].year == 2009
139- assert result ["datetime" ].year == 2009
140- assert result ["datetime" ].tzname () is None
141- assert result ["datetime" ].timetz () == dt .time (19 , 19 , 30 , 123000 )
142- assert result ["datetime" ].tzinfo is None
151+ assert result ["date" ] == OUTPUT_DATE
152+ assert result ["datetime_notz" ] == OUTPUT_DATETIME_NOTZ
153+ assert result ["datetime_notz" ].tzname () is None
154+ assert result ["datetime_notz" ].timetz () == OUTPUT_TIME
155+ assert result ["datetime_notz" ].tzinfo is None
156+ assert result ["datetime_tz" ] == OUTPUT_DATETIME_NOTZ
157+ assert result ["datetime_tz" ].tzname () is None
158+ assert result ["datetime_tz" ].timetz () == OUTPUT_TIME
159+ assert result ["datetime_tz" ].tzinfo is None
143160
144161
145162@pytest .mark .skipif (SA_VERSION < SA_1_4 , reason = "Test case not supported on SQLAlchemy 1.3" )
@@ -151,19 +168,25 @@ def test_datetime_tz(session):
151168 # Insert record.
152169 foo_item = FooBar (
153170 name = "foo" ,
154- date = dt .date (2009 , 5 , 13 ),
155- datetime = dt .datetime (2009 , 5 , 13 , 19 , 19 , 30 , 123456 , tzinfo = CST ()),
171+ date = INPUT_DATE ,
172+ datetime_notz = INPUT_DATETIME_TZ ,
173+ datetime_tz = INPUT_DATETIME_TZ ,
156174 )
157175 session .add (foo_item )
158176 session .commit ()
159177 session .execute (sa .text ("REFRESH TABLE foobar" ))
160178
161179 # Query record.
162- result = session .execute (sa .select (FooBar .name , FooBar .date , FooBar .datetime )).mappings ().first ()
180+ result = session .execute (sa .select (
181+ FooBar .name , FooBar .date , FooBar .datetime_notz , FooBar .datetime_tz )).mappings ().first ()
163182
164183 # Compare outcome.
165- assert result ["date" ].year == 2009
166- assert result ["datetime" ].year == 2009
167- assert result ["datetime" ].tzname () is None
168- assert result ["datetime" ].timetz () == dt .time (19 , 19 , 30 , 123000 )
169- assert result ["datetime" ].tzinfo is None
184+ assert result ["date" ] == OUTPUT_DATE
185+ assert result ["datetime_notz" ] == OUTPUT_DATETIME_TZ
186+ assert result ["datetime_notz" ].tzname () is None
187+ assert result ["datetime_notz" ].timetz () == OUTPUT_TIME
188+ assert result ["datetime_notz" ].tzinfo is None
189+ assert result ["datetime_tz" ] == OUTPUT_DATETIME_TZ
190+ assert result ["datetime_tz" ].tzname () is None
191+ assert result ["datetime_tz" ].timetz () == OUTPUT_TIME
192+ assert result ["datetime_tz" ].tzinfo is None
0 commit comments