diff --git a/tests/base_test_with_data.py b/tests/base_test_with_data.py index 6530681..17da512 100644 --- a/tests/base_test_with_data.py +++ b/tests/base_test_with_data.py @@ -1,12 +1,11 @@ # -*- coding: utf-8 -*- +import logging import unittest from clickhouse_orm.database import Database -from clickhouse_orm.models import Model -from clickhouse_orm.fields import * from clickhouse_orm.engines import * - -import logging +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model logging.getLogger("requests").setLevel(logging.WARNING) diff --git a/tests/sample_migrations/0001_initial.py b/tests/sample_migrations/0001_initial.py index 920fa16..b3c8066 100644 --- a/tests/sample_migrations/0001_initial.py +++ b/tests/sample_migrations/0001_initial.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.CreateTable(Model1)] diff --git a/tests/sample_migrations/0002.py b/tests/sample_migrations/0002.py index d289805..44855c0 100644 --- a/tests/sample_migrations/0002.py +++ b/tests/sample_migrations/0002.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.DropTable(Model1)] diff --git a/tests/sample_migrations/0003.py b/tests/sample_migrations/0003.py index 920fa16..b3c8066 100644 --- a/tests/sample_migrations/0003.py +++ b/tests/sample_migrations/0003.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.CreateTable(Model1)] diff --git a/tests/sample_migrations/0004.py b/tests/sample_migrations/0004.py index 3ae6701..c945596 100644 --- a/tests/sample_migrations/0004.py +++ b/tests/sample_migrations/0004.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.AlterTable(Model2)] diff --git a/tests/sample_migrations/0005.py b/tests/sample_migrations/0005.py index e938ee4..fb4837a 100644 --- a/tests/sample_migrations/0005.py +++ b/tests/sample_migrations/0005.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.AlterTable(Model3)] diff --git a/tests/sample_migrations/0006.py b/tests/sample_migrations/0006.py index ec1a204..9b0d410 100644 --- a/tests/sample_migrations/0006.py +++ b/tests/sample_migrations/0006.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.CreateTable(EnumModel1)] diff --git a/tests/sample_migrations/0007.py b/tests/sample_migrations/0007.py index 2138fbb..ee33343 100644 --- a/tests/sample_migrations/0007.py +++ b/tests/sample_migrations/0007.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.AlterTable(EnumModel2)] diff --git a/tests/sample_migrations/0008.py b/tests/sample_migrations/0008.py index a452642..912b573 100644 --- a/tests/sample_migrations/0008.py +++ b/tests/sample_migrations/0008.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.CreateTable(MaterializedModel)] diff --git a/tests/sample_migrations/0009.py b/tests/sample_migrations/0009.py index 65731ca..d411f53 100644 --- a/tests/sample_migrations/0009.py +++ b/tests/sample_migrations/0009.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.CreateTable(AliasModel)] diff --git a/tests/sample_migrations/0010.py b/tests/sample_migrations/0010.py index 81c53c3..175e2d5 100644 --- a/tests/sample_migrations/0010.py +++ b/tests/sample_migrations/0010.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.CreateTable(Model4Buffer)] diff --git a/tests/sample_migrations/0011.py b/tests/sample_migrations/0011.py index 1bee2fe..59e3b08 100644 --- a/tests/sample_migrations/0011.py +++ b/tests/sample_migrations/0011.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.AlterTableWithBuffer(Model4Buffer_changed)] diff --git a/tests/sample_migrations/0013.py b/tests/sample_migrations/0013.py index ade30c5..2b50fb1 100644 --- a/tests/sample_migrations/0013.py +++ b/tests/sample_migrations/0013.py @@ -1,8 +1,9 @@ import datetime -from clickhouse_orm import migrations from test_migrations import Model3 +from clickhouse_orm import migrations + def forward(database): database.insert([Model3(date=datetime.date(2016, 1, 4), f1=4, f3=1, f4="test4")]) diff --git a/tests/sample_migrations/0014.py b/tests/sample_migrations/0014.py index 47b3a12..1823f77 100644 --- a/tests/sample_migrations/0014.py +++ b/tests/sample_migrations/0014.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.AlterTable(MaterializedModel1), migrations.AlterTable(AliasModel1)] diff --git a/tests/sample_migrations/0015.py b/tests/sample_migrations/0015.py index 02c5d15..0d03f6e 100644 --- a/tests/sample_migrations/0015.py +++ b/tests/sample_migrations/0015.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.AlterTable(Model4_compressed), migrations.AlterTable(Model2LowCardinality)] diff --git a/tests/sample_migrations/0016.py b/tests/sample_migrations/0016.py index 6c11dfc..b0da930 100644 --- a/tests/sample_migrations/0016.py +++ b/tests/sample_migrations/0016.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.CreateTable(ModelWithConstraints)] diff --git a/tests/sample_migrations/0017.py b/tests/sample_migrations/0017.py index 4fb2e8f..abe414c 100644 --- a/tests/sample_migrations/0017.py +++ b/tests/sample_migrations/0017.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.AlterConstraints(ModelWithConstraints2)] diff --git a/tests/sample_migrations/0018.py b/tests/sample_migrations/0018.py index 0c52095..a39a44b 100644 --- a/tests/sample_migrations/0018.py +++ b/tests/sample_migrations/0018.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.CreateTable(ModelWithIndex)] diff --git a/tests/sample_migrations/0019.py b/tests/sample_migrations/0019.py index 328f5e7..6221e4b 100644 --- a/tests/sample_migrations/0019.py +++ b/tests/sample_migrations/0019.py @@ -1,4 +1,5 @@ from clickhouse_orm import migrations + from ..test_migrations import * operations = [migrations.AlterIndexes(ModelWithIndex2, reindex=True)] diff --git a/tests/test_alias_fields.py b/tests/test_alias_fields.py index 52da31e..710cddb 100644 --- a/tests/test_alias_fields.py +++ b/tests/test_alias_fields.py @@ -1,75 +1,75 @@ -import unittest -from datetime import date - -from clickhouse_orm.database import Database -from clickhouse_orm.models import Model, NO_VALUE -from clickhouse_orm.fields import * -from clickhouse_orm.engines import * -from clickhouse_orm.funcs import F - - -class AliasFieldsTest(unittest.TestCase): - def setUp(self): - self.database = Database("test-db", log_statements=True) - self.database.create_table(ModelWithAliasFields) - - def tearDown(self): - self.database.drop_database() - - def test_insert_and_select(self): - instance = ModelWithAliasFields(date_field="2016-08-30", int_field=-10, str_field="TEST") - self.database.insert([instance]) - # We can't select * from table, as it doesn't select materialized and alias fields - query = ( - "SELECT date_field, int_field, str_field, alias_int, alias_date, alias_str, alias_func" - " FROM $db.%s ORDER BY alias_date" % ModelWithAliasFields.table_name() - ) - for model_cls in (ModelWithAliasFields, None): - results = list(self.database.select(query, model_cls)) - self.assertEqual(len(results), 1) - self.assertEqual(results[0].date_field, instance.date_field) - self.assertEqual(results[0].int_field, instance.int_field) - self.assertEqual(results[0].str_field, instance.str_field) - self.assertEqual(results[0].alias_int, instance.int_field) - self.assertEqual(results[0].alias_str, instance.str_field) - self.assertEqual(results[0].alias_date, instance.date_field) - self.assertEqual(results[0].alias_func, 201608) - - def test_assignment_error(self): - # I can't prevent assigning at all, in case db.select statements with model provided sets model fields. - instance = ModelWithAliasFields() - for value in ("x", [date.today()], ["aaa"], [None]): - with self.assertRaises(ValueError): - instance.alias_date = value - - def test_wrong_field(self): - with self.assertRaises(AssertionError): - StringField(alias=123) - - def test_duplicate_default(self): - with self.assertRaises(AssertionError): - StringField(alias="str_field", default="with default") - - with self.assertRaises(AssertionError): - StringField(alias="str_field", materialized="str_field") - - def test_default_value(self): - instance = ModelWithAliasFields() - self.assertEqual(instance.alias_str, NO_VALUE) - # Check that NO_VALUE can be assigned to a field - instance.str_field = NO_VALUE - # Check that NO_VALUE can be assigned when creating a new instance - instance2 = ModelWithAliasFields(**instance.to_dict()) - - -class ModelWithAliasFields(Model): - int_field = Int32Field() - date_field = DateField() - str_field = StringField() - - alias_str = StringField(alias=u"str_field") - alias_int = Int32Field(alias="int_field") - alias_date = DateField(alias="date_field") - alias_func = Int32Field(alias=F.toYYYYMM(date_field)) - - engine = MergeTree("date_field", ("date_field",)) +import unittest +from datetime import date + +from clickhouse_orm.database import Database +from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.funcs import F +from clickhouse_orm.models import NO_VALUE, Model + + +class AliasFieldsTest(unittest.TestCase): + def setUp(self): + self.database = Database("test-db", log_statements=True) + self.database.create_table(ModelWithAliasFields) + + def tearDown(self): + self.database.drop_database() + + def test_insert_and_select(self): + instance = ModelWithAliasFields(date_field="2016-08-30", int_field=-10, str_field="TEST") + self.database.insert([instance]) + # We can't select * from table, as it doesn't select materialized and alias fields + query = ( + "SELECT date_field, int_field, str_field, alias_int, alias_date, alias_str, alias_func" + " FROM $db.%s ORDER BY alias_date" % ModelWithAliasFields.table_name() + ) + for model_cls in (ModelWithAliasFields, None): + results = list(self.database.select(query, model_cls)) + self.assertEqual(len(results), 1) + self.assertEqual(results[0].date_field, instance.date_field) + self.assertEqual(results[0].int_field, instance.int_field) + self.assertEqual(results[0].str_field, instance.str_field) + self.assertEqual(results[0].alias_int, instance.int_field) + self.assertEqual(results[0].alias_str, instance.str_field) + self.assertEqual(results[0].alias_date, instance.date_field) + self.assertEqual(results[0].alias_func, 201608) + + def test_assignment_error(self): + # I can't prevent assigning at all, in case db.select statements with model provided sets model fields. + instance = ModelWithAliasFields() + for value in ("x", [date.today()], ["aaa"], [None]): + with self.assertRaises(ValueError): + instance.alias_date = value + + def test_wrong_field(self): + with self.assertRaises(AssertionError): + StringField(alias=123) + + def test_duplicate_default(self): + with self.assertRaises(AssertionError): + StringField(alias="str_field", default="with default") + + with self.assertRaises(AssertionError): + StringField(alias="str_field", materialized="str_field") + + def test_default_value(self): + instance = ModelWithAliasFields() + self.assertEqual(instance.alias_str, NO_VALUE) + # Check that NO_VALUE can be assigned to a field + instance.str_field = NO_VALUE + # Check that NO_VALUE can be assigned when creating a new instance + instance2 = ModelWithAliasFields(**instance.to_dict()) + + +class ModelWithAliasFields(Model): + int_field = Int32Field() + date_field = DateField() + str_field = StringField() + + alias_str = StringField(alias=u"str_field") + alias_int = Int32Field(alias="int_field") + alias_date = DateField(alias="date_field") + alias_func = Int32Field(alias=F.toYYYYMM(date_field)) + + engine = MergeTree("date_field", ("date_field",)) diff --git a/tests/test_array_fields.py b/tests/test_array_fields.py index ea92644..f9fe301 100644 --- a/tests/test_array_fields.py +++ b/tests/test_array_fields.py @@ -2,9 +2,9 @@ import unittest from datetime import date from clickhouse_orm.database import Database -from clickhouse_orm.models import Model -from clickhouse_orm.fields import * from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model class ArrayFieldsTest(unittest.TestCase): diff --git a/tests/test_buffer.py b/tests/test_buffer.py index 24be02e..98d5785 100644 --- a/tests/test_buffer.py +++ b/tests/test_buffer.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- import unittest -from clickhouse_orm.models import BufferModel from clickhouse_orm.engines import * +from clickhouse_orm.models import BufferModel + from .base_test_with_data import * diff --git a/tests/test_compressed_fields.py b/tests/test_compressed_fields.py index b514853..8b26227 100644 --- a/tests/test_compressed_fields.py +++ b/tests/test_compressed_fields.py @@ -1,11 +1,12 @@ -import unittest import datetime +import unittest + import pytz from clickhouse_orm.database import Database -from clickhouse_orm.models import Model, NO_VALUE -from clickhouse_orm.fields import * from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.models import NO_VALUE, Model from clickhouse_orm.utils import parse_tsv diff --git a/tests/test_constraints.py b/tests/test_constraints.py index a849c93..c2dfa0d 100644 --- a/tests/test_constraints.py +++ b/tests/test_constraints.py @@ -1,6 +1,7 @@ import unittest from clickhouse_orm import * + from .base_test_with_data import Person diff --git a/tests/test_custom_fields.py b/tests/test_custom_fields.py index 26e82d8..aa1655c 100644 --- a/tests/test_custom_fields.py +++ b/tests/test_custom_fields.py @@ -1,8 +1,9 @@ import unittest + from clickhouse_orm.database import Database +from clickhouse_orm.engines import Memory from clickhouse_orm.fields import Field, Int16Field from clickhouse_orm.models import Model -from clickhouse_orm.engines import Memory class CustomFieldsTest(unittest.TestCase): diff --git a/tests/test_database.py b/tests/test_database.py index b3c1ca6..bb73327 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- -import unittest import datetime +import unittest -from clickhouse_orm.database import ServerError, DatabaseException -from clickhouse_orm.models import Model +from clickhouse_orm.database import DatabaseException, ServerError from clickhouse_orm.engines import Memory from clickhouse_orm.fields import * from clickhouse_orm.funcs import F +from clickhouse_orm.models import Model from clickhouse_orm.query import Q + from .base_test_with_data import * diff --git a/tests/test_datetime_fields.py b/tests/test_datetime_fields.py index 9d8f2bd..7b8e231 100644 --- a/tests/test_datetime_fields.py +++ b/tests/test_datetime_fields.py @@ -1,11 +1,12 @@ -import unittest import datetime +import unittest + import pytz from clickhouse_orm.database import Database -from clickhouse_orm.models import Model -from clickhouse_orm.fields import * from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model class DateFieldsTest(unittest.TestCase): diff --git a/tests/test_decimal_fields.py b/tests/test_decimal_fields.py index ec463f8..245360f 100644 --- a/tests/test_decimal_fields.py +++ b/tests/test_decimal_fields.py @@ -3,9 +3,9 @@ import unittest from decimal import Decimal from clickhouse_orm.database import Database, ServerError -from clickhouse_orm.models import Model -from clickhouse_orm.fields import * from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model class DecimalFieldsTest(unittest.TestCase): diff --git a/tests/test_dictionaries.py b/tests/test_dictionaries.py index 15f17aa..39e1f3b 100644 --- a/tests/test_dictionaries.py +++ b/tests/test_dictionaries.py @@ -1,5 +1,5 @@ -import unittest import logging +import unittest from clickhouse_orm import * diff --git a/tests/test_engines.py b/tests/test_engines.py index a2775fb..f796a27 100644 --- a/tests/test_engines.py +++ b/tests/test_engines.py @@ -1,10 +1,9 @@ -import unittest import datetime +import logging +import unittest from clickhouse_orm import * -import logging - logging.getLogger("requests").setLevel(logging.WARNING) diff --git a/tests/test_enum_fields.py b/tests/test_enum_fields.py index 004c0da..05ad366 100644 --- a/tests/test_enum_fields.py +++ b/tests/test_enum_fields.py @@ -1,11 +1,10 @@ import unittest +from enum import Enum from clickhouse_orm.database import Database -from clickhouse_orm.models import Model -from clickhouse_orm.fields import * from clickhouse_orm.engines import * - -from enum import Enum +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model class EnumFieldsTest(unittest.TestCase): diff --git a/tests/test_fixed_string_fields.py b/tests/test_fixed_string_fields.py index fc41478..d1bce32 100644 --- a/tests/test_fixed_string_fields.py +++ b/tests/test_fixed_string_fields.py @@ -2,9 +2,9 @@ import unittest from clickhouse_orm.database import Database -from clickhouse_orm.models import Model -from clickhouse_orm.fields import * from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model class FixedStringFieldsTest(unittest.TestCase): diff --git a/tests/test_funcs.py b/tests/test_funcs.py index 87ca724..2d46550 100644 --- a/tests/test_funcs.py +++ b/tests/test_funcs.py @@ -1,15 +1,17 @@ -import unittest -from .base_test_with_data import * -from .test_querysets import SampleModel -from datetime import date, datetime, tzinfo, timedelta -import pytz -from ipaddress import IPv4Address, IPv6Address import logging +import unittest +from datetime import date, datetime, timedelta, tzinfo from decimal import Decimal +from ipaddress import IPv4Address, IPv6Address + +import pytz from clickhouse_orm.database import ServerError -from clickhouse_orm.utils import NO_VALUE from clickhouse_orm.funcs import F +from clickhouse_orm.utils import NO_VALUE + +from .base_test_with_data import * +from .test_querysets import SampleModel class FuncsTestCase(TestCaseWithData): diff --git a/tests/test_inheritance.py b/tests/test_inheritance.py index ae36be0..622167f 100644 --- a/tests/test_inheritance.py +++ b/tests/test_inheritance.py @@ -1,11 +1,12 @@ -import unittest import datetime +import unittest + import pytz from clickhouse_orm.database import Database -from clickhouse_orm.models import Model -from clickhouse_orm.fields import * from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model class InheritanceTestCase(unittest.TestCase): diff --git a/tests/test_ip_fields.py b/tests/test_ip_fields.py index 2f81064..f5db64e 100644 --- a/tests/test_ip_fields.py +++ b/tests/test_ip_fields.py @@ -1,9 +1,10 @@ import unittest from ipaddress import IPv4Address, IPv6Address + from clickhouse_orm.database import Database +from clickhouse_orm.engines import Memory from clickhouse_orm.fields import Int16Field, IPv4Field, IPv6Field from clickhouse_orm.models import Model -from clickhouse_orm.engines import Memory class IPFieldsTest(unittest.TestCase): diff --git a/tests/test_join.py b/tests/test_join.py index 2a72b41..58d1f73 100644 --- a/tests/test_join.py +++ b/tests/test_join.py @@ -1,48 +1,48 @@ -import unittest -import json - -from clickhouse_orm import database, engines, fields, models - - -class JoinTest(unittest.TestCase): - def setUp(self): - self.database = database.Database("test-db", log_statements=True) - self.database.create_table(Foo) - self.database.create_table(Bar) - self.database.insert([Foo(id=i) for i in range(3)]) - self.database.insert([Bar(id=i, b=i * i) for i in range(3)]) - - def print_res(self, query): - print(query) - print(json.dumps([row.to_dict() for row in self.database.select(query)])) - - def test_without_db_name(self): - self.print_res("SELECT * FROM {}".format(Foo.table_name())) - self.print_res("SELECT * FROM {}".format(Bar.table_name())) - self.print_res("SELECT b FROM {} ALL LEFT JOIN {} USING id".format(Foo.table_name(), Bar.table_name())) - - def test_with_db_name(self): - self.print_res("SELECT * FROM $db.{}".format(Foo.table_name())) - self.print_res("SELECT * FROM $db.{}".format(Bar.table_name())) - self.print_res("SELECT b FROM $db.{} ALL LEFT JOIN $db.{} USING id".format(Foo.table_name(), Bar.table_name())) - - def test_with_subquery(self): - self.print_res( - "SELECT b FROM {} ALL LEFT JOIN (SELECT * from {}) subquery USING id".format( - Foo.table_name(), Bar.table_name() - ) - ) - self.print_res( - "SELECT b FROM $db.{} ALL LEFT JOIN (SELECT * from $db.{}) subquery USING id".format( - Foo.table_name(), Bar.table_name() - ) - ) - - -class Foo(models.Model): - id = fields.UInt8Field() - engine = engines.Memory() - - -class Bar(Foo): - b = fields.UInt8Field() +import json +import unittest + +from clickhouse_orm import database, engines, fields, models + + +class JoinTest(unittest.TestCase): + def setUp(self): + self.database = database.Database("test-db", log_statements=True) + self.database.create_table(Foo) + self.database.create_table(Bar) + self.database.insert([Foo(id=i) for i in range(3)]) + self.database.insert([Bar(id=i, b=i * i) for i in range(3)]) + + def print_res(self, query): + print(query) + print(json.dumps([row.to_dict() for row in self.database.select(query)])) + + def test_without_db_name(self): + self.print_res("SELECT * FROM {}".format(Foo.table_name())) + self.print_res("SELECT * FROM {}".format(Bar.table_name())) + self.print_res("SELECT b FROM {} ALL LEFT JOIN {} USING id".format(Foo.table_name(), Bar.table_name())) + + def test_with_db_name(self): + self.print_res("SELECT * FROM $db.{}".format(Foo.table_name())) + self.print_res("SELECT * FROM $db.{}".format(Bar.table_name())) + self.print_res("SELECT b FROM $db.{} ALL LEFT JOIN $db.{} USING id".format(Foo.table_name(), Bar.table_name())) + + def test_with_subquery(self): + self.print_res( + "SELECT b FROM {} ALL LEFT JOIN (SELECT * from {}) subquery USING id".format( + Foo.table_name(), Bar.table_name() + ) + ) + self.print_res( + "SELECT b FROM $db.{} ALL LEFT JOIN (SELECT * from $db.{}) subquery USING id".format( + Foo.table_name(), Bar.table_name() + ) + ) + + +class Foo(models.Model): + id = fields.UInt8Field() + engine = engines.Memory() + + +class Bar(Foo): + b = fields.UInt8Field() diff --git a/tests/test_materialized_fields.py b/tests/test_materialized_fields.py index b03f211..ab68a09 100644 --- a/tests/test_materialized_fields.py +++ b/tests/test_materialized_fields.py @@ -1,71 +1,71 @@ -import unittest -from datetime import date - -from clickhouse_orm.database import Database -from clickhouse_orm.models import Model, NO_VALUE -from clickhouse_orm.fields import * -from clickhouse_orm.engines import * -from clickhouse_orm.funcs import F - - -class MaterializedFieldsTest(unittest.TestCase): - def setUp(self): - self.database = Database("test-db", log_statements=True) - self.database.create_table(ModelWithMaterializedFields) - - def tearDown(self): - self.database.drop_database() - - def test_insert_and_select(self): - instance = ModelWithMaterializedFields(date_time_field="2016-08-30 11:00:00", int_field=-10, str_field="TEST") - self.database.insert([instance]) - # We can't select * from table, as it doesn't select materialized and alias fields - query = ( - "SELECT date_time_field, int_field, str_field, mat_int, mat_date, mat_str, mat_func" - " FROM $db.%s ORDER BY mat_date" % ModelWithMaterializedFields.table_name() - ) - for model_cls in (ModelWithMaterializedFields, None): - results = list(self.database.select(query, model_cls)) - self.assertEqual(len(results), 1) - self.assertEqual(results[0].date_time_field, instance.date_time_field) - self.assertEqual(results[0].int_field, instance.int_field) - self.assertEqual(results[0].str_field, instance.str_field) - self.assertEqual(results[0].mat_int, abs(instance.int_field)) - self.assertEqual(results[0].mat_str, instance.str_field.lower()) - self.assertEqual(results[0].mat_date, instance.date_time_field.date()) - self.assertEqual(results[0].mat_func, instance.str_field.lower()) - - def test_assignment_error(self): - # I can't prevent assigning at all, in case db.select statements with model provided sets model fields. - instance = ModelWithMaterializedFields() - for value in ("x", [date.today()], ["aaa"], [None]): - with self.assertRaises(ValueError): - instance.mat_date = value - - def test_wrong_field(self): - with self.assertRaises(AssertionError): - StringField(materialized=123) - - def test_duplicate_default(self): - with self.assertRaises(AssertionError): - StringField(materialized="str_field", default="with default") - - with self.assertRaises(AssertionError): - StringField(materialized="str_field", alias="str_field") - - def test_default_value(self): - instance = ModelWithMaterializedFields() - self.assertEqual(instance.mat_str, NO_VALUE) - - -class ModelWithMaterializedFields(Model): - int_field = Int32Field() - date_time_field = DateTimeField() - str_field = StringField() - - mat_str = StringField(materialized="lower(str_field)") - mat_int = Int32Field(materialized="abs(int_field)") - mat_date = DateField(materialized=u"toDate(date_time_field)") - mat_func = StringField(materialized=F.lower(str_field)) - - engine = MergeTree("mat_date", ("mat_date",)) +import unittest +from datetime import date + +from clickhouse_orm.database import Database +from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.funcs import F +from clickhouse_orm.models import NO_VALUE, Model + + +class MaterializedFieldsTest(unittest.TestCase): + def setUp(self): + self.database = Database("test-db", log_statements=True) + self.database.create_table(ModelWithMaterializedFields) + + def tearDown(self): + self.database.drop_database() + + def test_insert_and_select(self): + instance = ModelWithMaterializedFields(date_time_field="2016-08-30 11:00:00", int_field=-10, str_field="TEST") + self.database.insert([instance]) + # We can't select * from table, as it doesn't select materialized and alias fields + query = ( + "SELECT date_time_field, int_field, str_field, mat_int, mat_date, mat_str, mat_func" + " FROM $db.%s ORDER BY mat_date" % ModelWithMaterializedFields.table_name() + ) + for model_cls in (ModelWithMaterializedFields, None): + results = list(self.database.select(query, model_cls)) + self.assertEqual(len(results), 1) + self.assertEqual(results[0].date_time_field, instance.date_time_field) + self.assertEqual(results[0].int_field, instance.int_field) + self.assertEqual(results[0].str_field, instance.str_field) + self.assertEqual(results[0].mat_int, abs(instance.int_field)) + self.assertEqual(results[0].mat_str, instance.str_field.lower()) + self.assertEqual(results[0].mat_date, instance.date_time_field.date()) + self.assertEqual(results[0].mat_func, instance.str_field.lower()) + + def test_assignment_error(self): + # I can't prevent assigning at all, in case db.select statements with model provided sets model fields. + instance = ModelWithMaterializedFields() + for value in ("x", [date.today()], ["aaa"], [None]): + with self.assertRaises(ValueError): + instance.mat_date = value + + def test_wrong_field(self): + with self.assertRaises(AssertionError): + StringField(materialized=123) + + def test_duplicate_default(self): + with self.assertRaises(AssertionError): + StringField(materialized="str_field", default="with default") + + with self.assertRaises(AssertionError): + StringField(materialized="str_field", alias="str_field") + + def test_default_value(self): + instance = ModelWithMaterializedFields() + self.assertEqual(instance.mat_str, NO_VALUE) + + +class ModelWithMaterializedFields(Model): + int_field = Int32Field() + date_time_field = DateTimeField() + str_field = StringField() + + mat_str = StringField(materialized="lower(str_field)") + mat_int = Int32Field(materialized="abs(int_field)") + mat_date = DateField(materialized=u"toDate(date_time_field)") + mat_func = StringField(materialized=F.lower(str_field)) + + engine = MergeTree("mat_date", ("mat_date",)) diff --git a/tests/test_migrations.py b/tests/test_migrations.py index 093fd41..fd226a1 100644 --- a/tests/test_migrations.py +++ b/tests/test_migrations.py @@ -1,15 +1,15 @@ -import unittest - -from clickhouse_orm.database import Database, ServerError -from clickhouse_orm.models import Model, BufferModel, Constraint, Index -from clickhouse_orm.fields import * -from clickhouse_orm.engines import * -from clickhouse_orm.migrations import MigrationHistory - -from enum import Enum +import os # Add tests to path so that migrations will be importable -import sys, os +import sys +import unittest +from enum import Enum + +from clickhouse_orm.database import Database, ServerError +from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.migrations import MigrationHistory +from clickhouse_orm.models import BufferModel, Constraint, Index, Model sys.path.append(os.path.dirname(__file__)) diff --git a/tests/test_models.py b/tests/test_models.py index fd28034..a6a4917 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,11 +1,12 @@ -import unittest import datetime +import unittest + import pytz -from clickhouse_orm.models import Model, NO_VALUE -from clickhouse_orm.fields import * from clickhouse_orm.engines import * +from clickhouse_orm.fields import * from clickhouse_orm.funcs import F +from clickhouse_orm.models import NO_VALUE, Model class ModelTestCase(unittest.TestCase): diff --git a/tests/test_mutations.py b/tests/test_mutations.py index 89b0146..afbb1ed 100644 --- a/tests/test_mutations.py +++ b/tests/test_mutations.py @@ -1,8 +1,10 @@ import unittest -from clickhouse_orm import F -from .base_test_with_data import * from time import sleep +from clickhouse_orm import F + +from .base_test_with_data import * + class MutationsTestCase(TestCaseWithData): def setUp(self): diff --git a/tests/test_nullable_fields.py b/tests/test_nullable_fields.py index 3c33e21..8b81ef2 100644 --- a/tests/test_nullable_fields.py +++ b/tests/test_nullable_fields.py @@ -1,14 +1,14 @@ import unittest +from datetime import date, datetime + import pytz from clickhouse_orm.database import Database -from clickhouse_orm.models import Model -from clickhouse_orm.fields import * from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model from clickhouse_orm.utils import comma_join -from datetime import date, datetime - class NullableFieldsTest(unittest.TestCase): def setUp(self): diff --git a/tests/test_querysets.py b/tests/test_querysets.py index 719541e..d021029 100644 --- a/tests/test_querysets.py +++ b/tests/test_querysets.py @@ -1,15 +1,16 @@ # -*- coding: utf-8 -*- import unittest -from clickhouse_orm.database import Database -from clickhouse_orm.query import Q -from clickhouse_orm.funcs import F -from .base_test_with_data import * from datetime import date, datetime -from enum import Enum from decimal import Decimal - +from enum import Enum from logging import getLogger +from clickhouse_orm.database import Database +from clickhouse_orm.funcs import F +from clickhouse_orm.query import Q + +from .base_test_with_data import * + logger = getLogger("tests") diff --git a/tests/test_readonly.py b/tests/test_readonly.py index c085215..9d3174a 100644 --- a/tests/test_readonly.py +++ b/tests/test_readonly.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from clickhouse_orm.database import DatabaseException, ServerError + from .base_test_with_data import * diff --git a/tests/test_simple_fields.py b/tests/test_simple_fields.py index 46ebc04..3611bd9 100644 --- a/tests/test_simple_fields.py +++ b/tests/test_simple_fields.py @@ -1,8 +1,10 @@ import unittest -from clickhouse_orm.fields import * from datetime import date, datetime + import pytz +from clickhouse_orm.fields import * + class SimpleFieldsTest(unittest.TestCase): diff --git a/tests/test_system_models.py b/tests/test_system_models.py index e295f3c..7f7d82f 100644 --- a/tests/test_system_models.py +++ b/tests/test_system_models.py @@ -1,128 +1,127 @@ -import unittest -from datetime import date - -import os - -from clickhouse_orm.database import Database, DatabaseException -from clickhouse_orm.engines import * -from clickhouse_orm.fields import * -from clickhouse_orm.models import Model -from clickhouse_orm.system_models import SystemPart - - -class SystemTest(unittest.TestCase): - def setUp(self): - self.database = Database("test-db", log_statements=True) - - def tearDown(self): - self.database.drop_database() - - def test_insert_system(self): - m = SystemPart() - with self.assertRaises(DatabaseException): - self.database.insert([m]) - - def test_create_readonly_table(self): - with self.assertRaises(DatabaseException): - self.database.create_table(SystemTestModel) - - def test_drop_readonly_table(self): - with self.assertRaises(DatabaseException): - self.database.drop_table(SystemTestModel) - - -class SystemPartTest(unittest.TestCase): - - BACKUP_DIRS = ["/var/lib/clickhouse/shadow", "/opt/clickhouse/shadow/"] - - def setUp(self): - self.database = Database("test-db", log_statements=True) - self.database.create_table(TestTable) - self.database.create_table(CustomPartitionedTable) - self.database.insert([TestTable(date_field=date.today())]) - self.database.insert([CustomPartitionedTable(date_field=date.today(), group_field=13)]) - - def tearDown(self): - self.database.drop_database() - - def _get_backups(self): - for dir in self.BACKUP_DIRS: - if os.path.exists(dir): - _, dirnames, _ = next(os.walk(dir)) - return dirnames - raise unittest.SkipTest("Cannot find backups dir") - - def test_is_read_only(self): - self.assertTrue(SystemPart.is_read_only()) - - def test_is_system_model(self): - self.assertTrue(SystemPart.is_system_model()) - - def test_get_all(self): - parts = SystemPart.get(self.database) - self.assertEqual(len(list(parts)), 2) - - def test_get_active(self): - parts = list(SystemPart.get_active(self.database)) - self.assertEqual(len(parts), 2) - parts[0].detach() - parts = list(SystemPart.get_active(self.database)) - self.assertEqual(len(parts), 1) - - def test_get_conditions(self): - parts = list(SystemPart.get(self.database, conditions="table='testtable'")) - self.assertEqual(len(parts), 1) - parts = list(SystemPart.get(self.database, conditions=u"table='custompartitionedtable'")) - self.assertEqual(len(parts), 1) - parts = list(SystemPart.get(self.database, conditions=u"table='invalidtable'")) - self.assertEqual(len(parts), 0) - - def test_attach_detach(self): - parts = list(SystemPart.get_active(self.database)) - self.assertEqual(len(parts), 2) - for p in parts: - p.detach() - self.assertEqual(len(list(SystemPart.get_active(self.database))), 0) - for p in parts: - p.attach() - self.assertEqual(len(list(SystemPart.get_active(self.database))), 2) - - def test_drop(self): - parts = list(SystemPart.get_active(self.database)) - for p in parts: - p.drop() - self.assertEqual(len(list(SystemPart.get_active(self.database))), 0) - - def test_freeze(self): - parts = list(SystemPart.get(self.database)) - # There can be other backups in the folder - prev_backups = set(self._get_backups()) - for p in parts: - p.freeze() - backups = set(self._get_backups()) - self.assertEqual(len(backups), len(prev_backups) + 2) - - def test_fetch(self): - # TODO Not tested, as I have no replication set - pass - - def test_query(self): - SystemPart.objects_in(self.database).count() - list(SystemPart.objects_in(self.database).filter(table="testtable")) - - -class TestTable(Model): - date_field = DateField() - - engine = MergeTree("date_field", ("date_field",)) - - -class CustomPartitionedTable(Model): - date_field = DateField() - group_field = UInt32Field() - - engine = MergeTree(order_by=("date_field", "group_field"), partition_key=("toYYYYMM(date_field)", "group_field")) - - -class SystemTestModel(Model): - _system = True +import os +import unittest +from datetime import date + +from clickhouse_orm.database import Database, DatabaseException +from clickhouse_orm.engines import * +from clickhouse_orm.fields import * +from clickhouse_orm.models import Model +from clickhouse_orm.system_models import SystemPart + + +class SystemTest(unittest.TestCase): + def setUp(self): + self.database = Database("test-db", log_statements=True) + + def tearDown(self): + self.database.drop_database() + + def test_insert_system(self): + m = SystemPart() + with self.assertRaises(DatabaseException): + self.database.insert([m]) + + def test_create_readonly_table(self): + with self.assertRaises(DatabaseException): + self.database.create_table(SystemTestModel) + + def test_drop_readonly_table(self): + with self.assertRaises(DatabaseException): + self.database.drop_table(SystemTestModel) + + +class SystemPartTest(unittest.TestCase): + + BACKUP_DIRS = ["/var/lib/clickhouse/shadow", "/opt/clickhouse/shadow/"] + + def setUp(self): + self.database = Database("test-db", log_statements=True) + self.database.create_table(TestTable) + self.database.create_table(CustomPartitionedTable) + self.database.insert([TestTable(date_field=date.today())]) + self.database.insert([CustomPartitionedTable(date_field=date.today(), group_field=13)]) + + def tearDown(self): + self.database.drop_database() + + def _get_backups(self): + for dir in self.BACKUP_DIRS: + if os.path.exists(dir): + _, dirnames, _ = next(os.walk(dir)) + return dirnames + raise unittest.SkipTest("Cannot find backups dir") + + def test_is_read_only(self): + self.assertTrue(SystemPart.is_read_only()) + + def test_is_system_model(self): + self.assertTrue(SystemPart.is_system_model()) + + def test_get_all(self): + parts = SystemPart.get(self.database) + self.assertEqual(len(list(parts)), 2) + + def test_get_active(self): + parts = list(SystemPart.get_active(self.database)) + self.assertEqual(len(parts), 2) + parts[0].detach() + parts = list(SystemPart.get_active(self.database)) + self.assertEqual(len(parts), 1) + + def test_get_conditions(self): + parts = list(SystemPart.get(self.database, conditions="table='testtable'")) + self.assertEqual(len(parts), 1) + parts = list(SystemPart.get(self.database, conditions=u"table='custompartitionedtable'")) + self.assertEqual(len(parts), 1) + parts = list(SystemPart.get(self.database, conditions=u"table='invalidtable'")) + self.assertEqual(len(parts), 0) + + def test_attach_detach(self): + parts = list(SystemPart.get_active(self.database)) + self.assertEqual(len(parts), 2) + for p in parts: + p.detach() + self.assertEqual(len(list(SystemPart.get_active(self.database))), 0) + for p in parts: + p.attach() + self.assertEqual(len(list(SystemPart.get_active(self.database))), 2) + + def test_drop(self): + parts = list(SystemPart.get_active(self.database)) + for p in parts: + p.drop() + self.assertEqual(len(list(SystemPart.get_active(self.database))), 0) + + def test_freeze(self): + parts = list(SystemPart.get(self.database)) + # There can be other backups in the folder + prev_backups = set(self._get_backups()) + for p in parts: + p.freeze() + backups = set(self._get_backups()) + self.assertEqual(len(backups), len(prev_backups) + 2) + + def test_fetch(self): + # TODO Not tested, as I have no replication set + pass + + def test_query(self): + SystemPart.objects_in(self.database).count() + list(SystemPart.objects_in(self.database).filter(table="testtable")) + + +class TestTable(Model): + date_field = DateField() + + engine = MergeTree("date_field", ("date_field",)) + + +class CustomPartitionedTable(Model): + date_field = DateField() + group_field = UInt32Field() + + engine = MergeTree(order_by=("date_field", "group_field"), partition_key=("toYYYYMM(date_field)", "group_field")) + + +class SystemTestModel(Model): + _system = True diff --git a/tests/test_uuid_fields.py b/tests/test_uuid_fields.py index da5f4f6..af17738 100644 --- a/tests/test_uuid_fields.py +++ b/tests/test_uuid_fields.py @@ -1,9 +1,10 @@ import unittest from uuid import UUID + from clickhouse_orm.database import Database +from clickhouse_orm.engines import Memory from clickhouse_orm.fields import Int16Field, UUIDField from clickhouse_orm.models import Model -from clickhouse_orm.engines import Memory class UUIDFieldsTest(unittest.TestCase):