Skip to content

Commit

Permalink
STAR-254 add DateRange and Geo tests (#9)
Browse files Browse the repository at this point in the history
* STAR-254 add tests for geo and date range types
  • Loading branch information
jtgrabowski authored Apr 20, 2021
1 parent 353b1f1 commit d15a708
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 0 deletions.
76 changes: 76 additions & 0 deletions cqlsh_tests/test_cqlsh_copy.py
Original file line number Diff line number Diff line change
Expand Up @@ -3330,3 +3330,79 @@ def _test_invalid_data_for_maps():
_test_invalid_data_for_sets()
_test_invalid_data_for_lists()
_test_invalid_data_for_maps()

@since('4.0')
def test_geotypes_copy(self):
"""
Tests whether cqlsh COPY properly handles geo types with empty and null values.
@since 4.0.0
Steps:
* insert several geoTypes with null and empty values among them into a table
* cqlsh copy contents to .csv file and save them in a list
* wipe the table comletely of all data
* cqlsh copy contents from .csv back into the table
* get the contents of the table into a list
* assert the pre wiped data is the same as the newly copied data
:return
"""
self.prepare()

self.session.execute("create table geo (k int primary key, point 'PointType', line 'LineStringType', poly 'PolygonType');")
self.session.execute("insert into geo (k, point, line, poly) VALUES (0, 'point(1.2 3.4)', 'linestring(1.0 1.1, 2.0 2.1, 3.0 3.1)', 'POLYGON ((10.1 10.0, 110.0 10.0, 110.0 110.0, 10.0 110.0, 10.0 10.0), (20.0 20.0, 20.0 30.0, 30.0 30.0, 30.0 20.0, 20.0 20.0))');")
self.session.execute("insert into geo (k, point, line, poly) VALUES (2, 'point(1.2 3.4)', 'linestring EMPTY', 'POLYGON EMPTY');")
self.session.execute("insert into geo (k) VALUES (1);")

# make sure data is inserted
data_actual = rows_to_list(self.session.execute("select * from geo;"))
assert len(data_actual) == 3

# dump data to CSV and truncate
tempfile = self.get_temp_file()
self.run_cqlsh(cmds="COPY ks.geo TO '{name}'".format(name=tempfile.name))
self.run_cqlsh(cmds="truncate ks.geo;")

# import data back
self.run_cqlsh(cmds="COPY ks.geo FROM '{name}'".format(name=tempfile.name))
data_copy = rows_to_list(self.session.execute("select * from geo;"))

assert data_actual == data_copy

@since("4.0")
def test_date_range_copy(self):
"""
DateRangeTests.test_copy_command
Tests whether cqlsh COPY properly handles date_range types, including null values.
@note we cannot insert empty value ('') as it is not presented as null in cqlsh but it is in COPY
"""
self.prepare()

self.session.execute("create table incomes (org text, period 'DateRangeType', incomes int, ver 'DateRangeType', primary key (org, period));")
# insert some data
self.session.execute("insert into incomes(org, period, incomes) values ('A','2014', 20140);")
self.session.execute("insert into incomes(org, period, incomes) values ('A','2015', 201500);")
self.session.execute("insert into incomes(org, period, incomes) values ('A','[2016-01-01 TO 2016-06-30]', 1007);")
self.session.execute("insert into incomes(org, period, incomes) values ('B','[2017-02-12 12:30:07 TO 2017-02-17 13:39:43.789]', 777);")
self.session.execute("insert into incomes(org, period, incomes, ver) values ('X','2011', 0, null);")
self.session.execute("insert into incomes(org, period, incomes) values ('C','*', 996);")
self.session.execute("insert into incomes(org, period, incomes) values ('C','[* TO *]', 997);")
self.session.execute("insert into incomes(org, period, incomes) values ('C','[* TO 2015-01]', 998);")
self.session.execute("insert into incomes(org, period, incomes) values ('C','[2015-01 TO *]', 999);")

# make sure data is inserted
data_actual = rows_to_list(self.session.execute("select * from incomes;"))
assert len(data_actual) == 9

# dump data to CSV and truncate
tempfile = self.get_temp_file()
self.run_cqlsh(cmds="COPY ks.incomes TO '{name}'".format(name=tempfile.name))
self.run_cqlsh(cmds="truncate ks.incomes;")

# import data back
self.run_cqlsh(cmds="COPY ks.incomes FROM '{name}'".format(name=tempfile.name))
data_copy = rows_to_list(self.session.execute("select * from incomes;"))

assert data_actual == data_copy

67 changes: 67 additions & 0 deletions cqlsh_tests/test_cqlsh_types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import logging
import pytest

from dtest import Tester, create_ks

logger = logging.getLogger(__name__)
since = pytest.mark.since


@since("4.0")
class TestCqlshTypes(Tester):

def prepare(self, workload=None):
if not self.cluster.nodelist():
self.allow_log_errors = True
self.cluster.populate(1)
if workload is not None:
for node in self.cluster.nodelist():
node.set_workload(workload)
logger.debug('About to start cluster')
self.cluster.start()
logger.debug('Cluster started')
for node in self.cluster.nodelist():
node.watch_log_for('Starting listening for CQL clients', timeout=60)
self.cluster.nodelist()[0].watch_log_for('Created default superuser')
self.node = self.cluster.nodelist()[0]

conn = self.patient_cql_connection(self.node)
create_ks(conn, 'ks', 1)

logger.debug('prepare completed')

def test_point(self):
self.prepare()

expected = 'POINT (1.2 2.3)'
self.node.run_cqlsh("CREATE TABLE ks.point_tbl (k INT PRIMARY KEY, point 'PointType');")
self.node.run_cqlsh("INSERT INTO ks.point_tbl (k, point) VALUES (1, '{}')".format(expected))
result = self.node.run_cqlsh("SELECT * FROM ks.point_tbl;")
assert expected in result[0], result

def test_linestring(self):
self.prepare()

expected = 'LINESTRING (30.0 10.0, 10.0 30.0, 40.0 40.0)'
self.node.run_cqlsh("CREATE TABLE ks.line_tbl (k INT PRIMARY KEY, linestring 'LineStringType');")
self.node.run_cqlsh("INSERT INTO ks.line_tbl (k, linestring) VALUES (1, '{}')".format(expected))
result = self.node.run_cqlsh("SELECT * FROM ks.line_tbl;")
assert expected in result[0], result

def test_polygon(self):
self.prepare()

expected = 'POLYGON ((30.0 10.0, 40.0 40.0, 20.0 40.0, 10.0 20.0, 30.0 10.0))'
self.node.run_cqlsh("CREATE TABLE ks.polygon_tbl (k INT PRIMARY KEY, polygon 'PolygonType');")
self.node.run_cqlsh("INSERT INTO ks.polygon_tbl (k, polygon) VALUES (1, '{}')".format(expected))
result = self.node.run_cqlsh("SELECT * FROM ks.polygon_tbl;")
assert expected in result[0], result

def test_date_range(self):
self.prepare()

expected = '[2015-01 TO *]'
self.node.run_cqlsh("CREATE TABLE ks.date_range_tbl (k INT PRIMARY KEY, date_range_tbl 'DateRangeType');")
self.node.run_cqlsh("INSERT INTO ks.date_range_tbl (k, date_range_tbl) VALUES (1, '{}')".format(expected))
result = self.node.run_cqlsh("SELECT * FROM ks.date_range_tbl;")
assert expected in result[0], result

0 comments on commit d15a708

Please sign in to comment.