def test_not_ordered_by_pk_field(): import random from corm import register_table, insert, sync_schema, select, obtain_session from corm.models import CORMBase from datetime import datetime class TestNotOrderedByPkField(CORMBase): __keyspace__ = 'mykeyspace' __primary_keys__ = ['one', 'two', 'three'] random_number: int created: datetime one: str two: str three: str register_table(TestNotOrderedByPkField) sync_schema() first_entry = TestNotOrderedByPkField(random.randint(0, 99999), datetime.utcnow(), 'one', 'one', 'beta') gamma = TestNotOrderedByPkField(random.randint(0, 99999), datetime.utcnow(), 'one', 'one', 'gamma') delta = TestNotOrderedByPkField(random.randint(0, 99999), datetime.utcnow(), 'one', 'one', 'delta') second_entry = TestNotOrderedByPkField(random.randint(0, 99999), datetime.utcnow(), 'one', 'one', 'alpha') insert([first_entry, gamma, delta, second_entry]) for idx, entry in enumerate(select(TestNotOrderedByPkField)): if idx == 0: assert entry.three != 'alpha'
def test_keyspace_api(): import hashlib import uuid from corm import register_table, insert, sync_schema, \ keyspace_exists, keyspace_destroy, keyspace_create from corm.datatypes import CassandraKeyspaceStrategy from corm.models import CORMBase # Keyspaces seem to have to start with Alpha-Letters keyspace_name = hashlib.md5(str(uuid.uuid4()).encode(ENCODING)).hexdigest() keyspace_name = f'abc_{keyspace_name}' assert keyspace_exists(keyspace_name) is False keyspace_create(keyspace_name, CassandraKeyspaceStrategy.Simple) assert keyspace_exists(keyspace_name) is True keyspace_destroy(keyspace_name) assert keyspace_exists(keyspace_name) is False class TestModelKeyspace(CORMBase): __keyspace__ = keyspace_name item: str register_table(TestModelKeyspace) assert keyspace_exists(keyspace_name) is False sync_schema() assert keyspace_exists(keyspace_name) is True one = TestModelKeyspace('one') insert([one]) keyspace_destroy(keyspace_name) assert keyspace_exists(keyspace_name) is False
def test__export_to_csv_from_uri(): import os import tempfile from corm import register_table, insert, sync_schema from corm.constants import ENCODING, CLUSTER_IPS, CLUSTER_PORT from corm.etl.datatypes import ConnectionInfo from corm.etl.utils import export_to_csv, run_command, container_ipaddress from corm.models import CORMBase class TestModelToCSV(CORMBase): __keyspace__ = 'mykeyspace' string_data: str float_data: float register_table(TestModelToCSV) sync_schema() insert_later = [] for idx in range(0, 100): instance = TestModelToCSV(generate_string(10), random.uniform(0, 1)) insert([instance]) cassandra_uri = f'cassandra://{CLUSTER_IPS[0]}:{CLUSTER_PORT}' conn_info = ConnectionInfo.From_URI(cassandra_uri) csv_filepath = tempfile.NamedTemporaryFile().name assert not os.path.exists(csv_filepath) or os.stat( csv_filepath).st_size == 0 export_to_csv(TestModelToCSV, csv_filepath, conn_info) assert os.stat(csv_filepath).st_size > 0 os.remove(csv_filepath)
def test__convert_data_to_postgresql(): import tempfile from corm import register_table, insert, sync_schema from corm.annotations import Set from corm.models import CORMBase from datetime import datetime class TestModelToPostgreSQL(CORMBase): __keyspace__ = 'mykeyspace' string_data: str float_data: float int_data: int text_data: str boolean_data: bool timestamp_data: datetime set_data: Set register_table(TestModelToPostgreSQL) sync_schema() insert_later = [] for idx in range(0, 100): instance = TestModelToPostgreSQL( generate_string(10), random.uniform(0, 1), random.randint(0, 100), generate_string(2048), bool(random.randint(0, 1)), datetime.utcnow() + timedelta(seconds=random.randint(0, 10)), [generate_string(10), generate_string(10)]) insert_later.append(instance) if len(insert_later) % 10 == 0: insert(insert_later) insert_later = [] if insert_later: insert(insert_later) from corm.constants import CLUSTER_IPS, CLUSTER_PORT from corm.etl.constants import PSQL_URI from corm.etl.datatypes import ConnectionInfo from corm.etl.utils import generate_sqlalchemy_metadata, generate_sqlalchemy_table, \ sync_sqlalchemy_schema, migrate_data_to_sqlalchemy_table cassandra_uri = f'cassandra://{CLUSTER_IPS[0]}:{CLUSTER_PORT}/' cassandra_info = ConnectionInfo.From_URI(cassandra_uri) psql_info = ConnectionInfo.From_URI(PSQL_URI) sql_metadata = generate_sqlalchemy_metadata(psql_info) sql_table = generate_sqlalchemy_table(TestModelToPostgreSQL, sql_metadata) sync_sqlalchemy_schema(sql_metadata) migrate_data_to_sqlalchemy_table(TestModelToPostgreSQL, sql_table, cassandra_info, psql_info)
def test_corm_auth(): import os os.environ['CLUSTER_PORT'] = '9043' os.environ['CLUSTER_USERNAME'] = '******' os.environ['CLUSTER_PASSWORD'] = '******' from corm import register_table, insert, sync_schema from corm.models import CORMBase class TestCORMAuth(CORMBase): one: str __keyspace__ = 'test_corm_auth' register_table(TestCORMAuth) sync_schema()
def test_float_api(): from corm import register_table, insert, sync_schema, select from corm.models import CORMBase class TestModelFloat(CORMBase): __keyspace__ = 'mykeyspace' input_one: float register_table(TestModelFloat) sync_schema() data = 324.593998934 one = TestModelFloat(data) insert([one]) for idx, entry in enumerate(select(TestModelFloat)): assert entry.input_one == data
def test_initial_api(): from corm import register_table, insert, sync_schema from corm.models import CORMBase class TestModel(CORMBase): __keyspace__ = 'mykeyspace' something: str other: str register_table(TestModel) sync_schema() one = TestModel('one', 'two') two = TestModel('one', 'two') three = TestModel('one', 'three') insert([one, two, three])
def test_datetime_api(): from corm import register_table, insert, sync_schema from corm.models import CORMBase from datetime import datetime class TestModelDatetime(CORMBase): __keyspace__ = 'mykeyspace' item: str created: datetime register_table(TestModelDatetime) sync_schema() one = TestModelDatetime('one', datetime.utcnow()) two = TestModelDatetime('two', datetime.utcnow()) insert([one, two])
def test_boolean_api(): from corm import register_table, insert, sync_schema from corm.models import CORMBase from datetime import datetime class TestModelBoolean(CORMBase): __keyspace__ = 'mykeyspace' item: str created: datetime value: bool register_table(TestModelBoolean) sync_schema() one = TestModelBoolean('one', datetime.utcnow(), True) two = TestModelBoolean('two', datetime.utcnow(), False) insert([one, two])
def test_corm_uuid(): import uuid from corm import register_table, insert, sync_schema, select from corm.models import CORMBase class TestCORMUUID(CORMBase): __keyspace__ = 'mykeyspace' identity_test: uuid.UUID register_table(TestCORMUUID) sync_schema() one = TestCORMUUID(uuid.uuid4()) insert([one]) for entry in select(TestCORMUUID): assert isinstance(entry.identity_test, uuid.UUID)
def test_set_api(): from corm import register_table, insert, sync_schema from corm.models import CORMBase from corm.annotations import Set class TestModelSet(CORMBase): __keyspace__ = 'mykeyspace' something: str other: Set register_table(TestModelSet) sync_schema() one = TestModelSet('one', {'first'}) two = TestModelSet('two', {'last', 'second-to-last'}) three = TestModelSet('three', {'last', 'second-to-last', 'last'}) four = TestModelSet('four', ['one', 'two', 'three', 'four']) insert([one, two, three, four])
def test_corm_where(): import enum from corm import register_table, insert, sync_schema, select, where, cp, Operator from corm.models import CORMBase class OptionList(enum.Enum): One = 'one' Two = 'two' class TestCORMWhere(CORMBase): __keyspace__ = 'test_corm_where' option: OptionList score: int register_table(TestCORMWhere) sync_schema() one = TestCORMWhere(OptionList.One, 1) two = TestCORMWhere(OptionList.One, 2) three = TestCORMWhere(OptionList.Two, 3) four = TestCORMWhere(OptionList.Two, 4) insert([one, two, three, four]) for idx, entry in enumerate(where(TestCORMWhere, [cp(Operator.Equal, 'score', 4)])): assert idx == 0 assert entry.score == 4 assert entry.option == OptionList.Two for idx, entry in enumerate(where(TestCORMWhere, [cp(Operator.Equal, 'score', 1)])): assert idx == 0 assert entry.score == 1 assert entry.option == OptionList.One for idx, entry in enumerate(where(TestCORMWhere, [cp(Operator.Equal, 'option', OptionList.One)])): assert idx in [0, 1] assert entry.score in [1, 2] assert entry.option == OptionList.One for idx, entry in enumerate(where(TestCORMWhere, [cp(Operator.Equal, 'option', OptionList.Two)])): assert idx in [0, 1] assert entry.score in [3, 4] assert entry.option == OptionList.Two
def test_alter_table_api(): from corm import register_table, insert, sync_schema, select, obtain_session from corm.models import CORMBase from datetime import datetime # Create Table or Delete Column on existing Table class TestModelAlter(CORMBase): __keyspace__ = 'mykeyspace' random_number: int created: datetime register_table(TestModelAlter) sync_schema() COL_CQL = f''' SELECT column_name, type FROM system_schema.columns WHERE table_name = '{TestModelAlter._corm_details.table_name}' AND keyspace_name = '{TestModelAlter._corm_details.keyspace}' ''' rows = [(row.column_name, row.type) for row in obtain_session('mykeyspace').execute(COL_CQL)] assert len(rows) == 3 # Add Column on existing Table class TestModelAlter(CORMBase): __keyspace__ = 'mykeyspace' random_number: int created: datetime new_column: str register_table(TestModelAlter) sync_schema() rows = [(row.column_name, row.type) for row in obtain_session('mykeyspace').execute(COL_CQL)] assert len(rows) == 4
def test_udt(): from corm import register_table, register_user_defined_type, sync_schema, insert from corm.models import CORMUDTBase, CORMBase class TestUDTDatum(CORMUDTBase): __keyspace__ = 'mykeyspace' alpha: str beta: str class TestUDTModel(CORMBase): __keyspace__ = 'mykeyspace' something: str other: str udt_datum: TestUDTDatum register_user_defined_type(TestUDTDatum) register_table(TestUDTModel) sync_schema() one = TestUDTModel('one', 'two', TestUDTDatum('no', 'yes')) two = TestUDTModel('one', 'three', TestUDTDatum('yes', 'no')) insert([one, two])
def test_select_api(): import random from corm import register_table, insert, sync_schema, select from corm.models import CORMBase from corm.annotations import Set from datetime import datetime MAX_INT = 1000 class TestModelSelect(CORMBase): __keyspace__ = 'mykeyspace' random_number: int created: datetime register_table(TestModelSelect) sync_schema() insert_later = [] values = [] for idx in range(0, 100): values.append({ 'random_number': random.randint(0, MAX_INT), 'created': datetime.utcnow() }) entry = TestModelSelect(values[-1]['random_number'], values[-1]['created']) insert_later.append(entry) if len(insert_later) > 20: insert(insert_later) insert_later = [] insert(insert_later) for idx, entry in enumerate(select(TestModelSelect, fetch_size=100)): assert isinstance(entry, TestModelSelect) # Order is not consistent # assert entry.random_number == values[idx]['random_number'] # assert entry.created == values[idx]['created'] assert idx > 0
def test_corm_enum(): import enum from corm import register_table, insert, sync_schema, select from corm.models import CORMBase class OptionList(enum.Enum): One = 'one' Two = 'two' class TestCormEnum(CORMBase): __keyspace__ = 'test_corm_enum' option: OptionList register_table(TestCormEnum) sync_schema() first = TestCormEnum(OptionList.One) second = TestCormEnum(OptionList.Two) insert([first, second]) for idx, entry in enumerate(select(TestCormEnum)): assert entry.option in OptionList.__members__.values()