|
14 | 14 |
|
15 | 15 | from uuid import uuid4, UUID |
16 | 16 | import random |
| 17 | +import unittest |
17 | 18 | from datetime import datetime, date, time |
18 | 19 | from decimal import Decimal |
19 | 20 | from operator import itemgetter |
|
25 | 26 | from cassandra.cqlengine.models import Model |
26 | 27 | from cassandra.util import Date, Time |
27 | 28 |
|
| 29 | +from tests.integration import PROTOCOL_VERSION |
28 | 30 | from tests.integration.cqlengine.base import BaseCassEngTestCase |
29 | 31 |
|
30 | 32 | class TestModel(Model): |
@@ -148,40 +150,72 @@ class AllDatatypesModel(Model): |
148 | 150 | b = columns.BigInt() |
149 | 151 | c = columns.Blob() |
150 | 152 | d = columns.Boolean() |
151 | | - e = columns.Date() |
152 | | - f = columns.DateTime() |
153 | | - g = columns.Decimal() |
154 | | - h = columns.Double() |
155 | | - i = columns.Float(double_precision=False) |
156 | | - j = columns.Inet() |
157 | | - k = columns.Integer() |
158 | | - l = columns.SmallInt() |
159 | | - m = columns.Text() |
160 | | - n = columns.Time() |
161 | | - o = columns.TimeUUID() |
162 | | - p = columns.TinyInt() |
163 | | - q = columns.UUID() |
164 | | - r = columns.VarInt() |
| 153 | + e = columns.DateTime() |
| 154 | + f = columns.Decimal() |
| 155 | + g = columns.Double() |
| 156 | + h = columns.Float(double_precision=False) |
| 157 | + i = columns.Inet() |
| 158 | + j = columns.Integer() |
| 159 | + k = columns.Text() |
| 160 | + l = columns.TimeUUID() |
| 161 | + m = columns.UUID() |
| 162 | + n = columns.VarInt() |
165 | 163 |
|
166 | 164 | sync_table(AllDatatypesModel) |
167 | 165 |
|
168 | | - input = ['ascii', 2 ** 63 - 1, bytearray(b'hello world'), True, Date(date(1970, 1, 1)), |
169 | | - datetime.utcfromtimestamp(872835240), Decimal('12.3E+7'), 2.39, |
170 | | - 3.4028234663852886e+38, '123.123.123.123', 2147483647, 32523, 'text', Time(time(16, 47, 25, 7)), |
171 | | - UUID('FE2B4360-28C6-11E2-81C1-0800200C9A66'), 123, UUID('067e6162-3b6f-4ae2-a171-2470b63dff00'), |
| 166 | + input = ['ascii', 2 ** 63 - 1, bytearray(b'hello world'), True, datetime.utcfromtimestamp(872835240), |
| 167 | + Decimal('12.3E+7'), 2.39, 3.4028234663852886e+38, '123.123.123.123', 2147483647, 'text', |
| 168 | + UUID('FE2B4360-28C6-11E2-81C1-0800200C9A66'), UUID('067e6162-3b6f-4ae2-a171-2470b63dff00'), |
172 | 169 | int(str(2147483647) + '000')] |
173 | 170 |
|
174 | | - AllDatatypesModel.create(id=0, a='ascii', b=2 ** 63 - 1, c=bytearray(b'hello world'), d=True, e=date(1970, 1, 1), |
175 | | - f=datetime.utcfromtimestamp(872835240), g=Decimal('12.3E+7'), h=2.39, |
176 | | - i=3.4028234663852886e+38, j='123.123.123.123', k=2147483647, l=32523, m='text', |
177 | | - n=time(16, 47, 25, 7), o=UUID('FE2B4360-28C6-11E2-81C1-0800200C9A66'), |
178 | | - p=123, q=UUID('067e6162-3b6f-4ae2-a171-2470b63dff00'), |
179 | | - r=int(str(2147483647) + '000')) |
| 171 | + AllDatatypesModel.create(id=0, a='ascii', b=2 ** 63 - 1, c=bytearray(b'hello world'), d=True, |
| 172 | + e=datetime.utcfromtimestamp(872835240), f=Decimal('12.3E+7'), g=2.39, |
| 173 | + h=3.4028234663852886e+38, i='123.123.123.123', j=2147483647, k='text', |
| 174 | + l=UUID('FE2B4360-28C6-11E2-81C1-0800200C9A66'), |
| 175 | + m=UUID('067e6162-3b6f-4ae2-a171-2470b63dff00'), n=int(str(2147483647) + '000')) |
180 | 176 |
|
181 | 177 | self.assertEqual(1, AllDatatypesModel.objects.count()) |
182 | 178 | output = AllDatatypesModel.objects().first() |
183 | 179 |
|
184 | | - for i, i_char in enumerate(range(ord('a'), ord('a') + 15)): |
| 180 | + for i, i_char in enumerate(range(ord('a'), ord('a') + 14)): |
| 181 | + self.assertEqual(input[i], output[chr(i_char)]) |
| 182 | + |
| 183 | + def test_can_insert_model_with_all_protocol_v4_column_types(self): |
| 184 | + """ |
| 185 | + Test for inserting all protocol v4 column types into a Model |
| 186 | +
|
| 187 | + test_can_insert_model_with_all_protocol_v4_column_types tests that each cqlengine protocol v4 column type can be |
| 188 | + inserted into a Model. It first creates a Model that has each cqlengine protocol v4 column type. It then creates |
| 189 | + a Model instance where all the fields have corresponding data, which performs the insert into the Cassandra table. |
| 190 | + Finally, it verifies that each column read from the Model from Cassandra is the same as the input parameters. |
| 191 | +
|
| 192 | + @since 2.6.0 |
| 193 | + @jira_ticket PYTHON-245 |
| 194 | + @expected_result The Model is inserted with each protocol v4 column type, and the resulting read yields proper data for each column. |
| 195 | +
|
| 196 | + @test_category data_types:primitive |
| 197 | + """ |
| 198 | + |
| 199 | + if PROTOCOL_VERSION < 4: |
| 200 | + raise unittest.SkipTest("Protocol v4 datatypes require native protocol 4+, currently using: {0}".format(PROTOCOL_VERSION)) |
| 201 | + |
| 202 | + class AllDatatypesModel(Model): |
| 203 | + id = columns.Integer(primary_key=True) |
| 204 | + a = columns.Date() |
| 205 | + b = columns.SmallInt() |
| 206 | + c = columns.Time() |
| 207 | + d = columns.TinyInt() |
| 208 | + |
| 209 | + sync_table(AllDatatypesModel) |
| 210 | + |
| 211 | + input = [Date(date(1970, 1, 1)), 32523, Time(time(16, 47, 25, 7)), 123] |
| 212 | + |
| 213 | + AllDatatypesModel.create(id=0, a=date(1970, 1, 1), b=32523, c=time(16, 47, 25, 7), d=123) |
| 214 | + |
| 215 | + self.assertEqual(1, AllDatatypesModel.objects.count()) |
| 216 | + output = AllDatatypesModel.objects().first() |
| 217 | + |
| 218 | + for i, i_char in enumerate(range(ord('a'), ord('a') + 3)): |
185 | 219 | self.assertEqual(input[i], output[chr(i_char)]) |
186 | 220 |
|
187 | 221 | def test_can_insert_double_and_float(self): |
@@ -399,6 +433,9 @@ class TestQuerying(BaseCassEngTestCase): |
399 | 433 |
|
400 | 434 | @classmethod |
401 | 435 | def setUpClass(cls): |
| 436 | + if PROTOCOL_VERSION < 4: |
| 437 | + raise unittest.SkipTest("Date query tests require native protocol 4+, currently using: {0}".format(PROTOCOL_VERSION)) |
| 438 | + |
402 | 439 | super(TestQuerying, cls).setUpClass() |
403 | 440 | drop_table(TestQueryModel) |
404 | 441 | sync_table(TestQueryModel) |
|
0 commit comments