예제 #1
0
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'
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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()
예제 #6
0
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
예제 #7
0
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])
예제 #8
0
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])
예제 #9
0
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])
예제 #10
0
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)
예제 #11
0
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])
예제 #12
0
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
예제 #13
0
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
예제 #14
0
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])
예제 #15
0
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
예제 #16
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()