from datetime import datetime, timedelta from uuid import uuid4 from cqlengine.tests.base import BaseCassEngTestCase from cqlengine.exceptions import ModelException from cqlengine.management import sync_table from cqlengine.management import drop_table from cqlengine.models import Model from cqlengine import columns from cqlengine import query class DateTimeQueryTestModel(Model): __keyspace__ = 'test' user = columns.Integer(primary_key=True) day = columns.DateTime(primary_key=True) data = columns.Text() class TestDateTimeQueries(BaseCassEngTestCase): @classmethod def setUpClass(cls): super(TestDateTimeQueries, cls).setUpClass() sync_table(DateTimeQueryTestModel) cls.base_date = datetime.now() - timedelta(days=10) for x in range(7): for y in range(10): DateTimeQueryTestModel.create( user=x, day=(cls.base_date+timedelta(days=y)), data=str(uuid4()) ) @classmethod def tearDownClass(cls): super(TestDateTimeQueries, cls).tearDownClass() drop_table(DateTimeQueryTestModel) def test_range_query(self): """ Tests that loading from a range of dates works properly """ start = datetime(*self.base_date.timetuple()[:3]) end = start + timedelta(days=3) results = DateTimeQueryTestModel.filter(user=0, day__gte=start, day__lt=end) assert len(results) == 3 def test_datetime_precision(self): """ Tests that millisecond resolution is preserved when saving datetime objects """ now = datetime.now() pk = 1000 obj = DateTimeQueryTestModel.create(user=pk, day=now, data='energy cheese') load = DateTimeQueryTestModel.get(user=pk) assert abs(now - load.day).total_seconds() < 0.001 obj.delete()