175 lines
5.5 KiB
Python
175 lines
5.5 KiB
Python
# Copyright 2013-2017 DataStax, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from cassandra.cqlengine import columns
|
|
from cassandra.cqlengine.management import drop_keyspace, sync_table, create_keyspace_simple
|
|
from cassandra.cqlengine.models import Model
|
|
from cassandra.cqlengine.query import ContextQuery
|
|
from tests.integration.cqlengine.base import BaseCassEngTestCase
|
|
|
|
|
|
class TestModel(Model):
|
|
|
|
__keyspace__ = 'ks1'
|
|
|
|
partition = columns.Integer(primary_key=True)
|
|
cluster = columns.Integer(primary_key=True)
|
|
count = columns.Integer()
|
|
text = columns.Text()
|
|
|
|
|
|
class ContextQueryTests(BaseCassEngTestCase):
|
|
|
|
KEYSPACES = ('ks1', 'ks2', 'ks3', 'ks4')
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(ContextQueryTests, cls).setUpClass()
|
|
for ks in cls.KEYSPACES:
|
|
create_keyspace_simple(ks, 1)
|
|
sync_table(TestModel, keyspaces=cls.KEYSPACES)
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(ContextQueryTests, cls).tearDownClass()
|
|
for ks in cls.KEYSPACES:
|
|
drop_keyspace(ks)
|
|
|
|
|
|
def setUp(self):
|
|
super(ContextQueryTests, self).setUp()
|
|
for ks in self.KEYSPACES:
|
|
with ContextQuery(TestModel, keyspace=ks) as tm:
|
|
for obj in tm.all():
|
|
obj.delete()
|
|
|
|
def test_context_manager(self):
|
|
"""
|
|
Validates that when a context query is constructed that the
|
|
keyspace of the returned model is toggled appropriately
|
|
|
|
@since 3.6
|
|
@jira_ticket PYTHON-598
|
|
@expected_result default keyspace should be used
|
|
|
|
@test_category query
|
|
"""
|
|
# model keyspace write/read
|
|
for ks in self.KEYSPACES:
|
|
with ContextQuery(TestModel, keyspace=ks) as tm:
|
|
self.assertEqual(tm.__keyspace__, ks)
|
|
|
|
self.assertEqual(TestModel._get_keyspace(), 'ks1')
|
|
|
|
def test_default_keyspace(self):
|
|
"""
|
|
Tests the use of context queries with the default model keyspsace
|
|
|
|
@since 3.6
|
|
@jira_ticket PYTHON-598
|
|
@expected_result default keyspace should be used
|
|
|
|
@test_category query
|
|
"""
|
|
# model keyspace write/read
|
|
for i in range(5):
|
|
TestModel.objects.create(partition=i, cluster=i)
|
|
|
|
with ContextQuery(TestModel) as tm:
|
|
self.assertEqual(5, len(tm.objects.all()))
|
|
|
|
with ContextQuery(TestModel, keyspace='ks1') as tm:
|
|
self.assertEqual(5, len(tm.objects.all()))
|
|
|
|
for ks in self.KEYSPACES[1:]:
|
|
with ContextQuery(TestModel, keyspace=ks) as tm:
|
|
self.assertEqual(0, len(tm.objects.all()))
|
|
|
|
def test_context_keyspace(self):
|
|
"""
|
|
Tests the use of context queries with non default keyspaces
|
|
|
|
@since 3.6
|
|
@jira_ticket PYTHON-598
|
|
@expected_result queries should be routed to appropriate keyspaces
|
|
|
|
@test_category query
|
|
"""
|
|
for i in range(5):
|
|
with ContextQuery(TestModel, keyspace='ks4') as tm:
|
|
tm.objects.create(partition=i, cluster=i)
|
|
|
|
with ContextQuery(TestModel, keyspace='ks4') as tm:
|
|
self.assertEqual(5, len(tm.objects.all()))
|
|
|
|
self.assertEqual(0, len(TestModel.objects.all()))
|
|
|
|
for ks in self.KEYSPACES[:2]:
|
|
with ContextQuery(TestModel, keyspace=ks) as tm:
|
|
self.assertEqual(0, len(tm.objects.all()))
|
|
|
|
# simple data update
|
|
with ContextQuery(TestModel, keyspace='ks4') as tm:
|
|
obj = tm.objects.get(partition=1)
|
|
obj.update(count=42)
|
|
|
|
self.assertEqual(42, tm.objects.get(partition=1).count)
|
|
|
|
def test_context_multiple_models(self):
|
|
"""
|
|
Tests the use of multiple models with the context manager
|
|
|
|
@since 3.7
|
|
@jira_ticket PYTHON-613
|
|
@expected_result all models are properly updated with the context
|
|
|
|
@test_category query
|
|
"""
|
|
|
|
with ContextQuery(TestModel, TestModel, keyspace='ks4') as (tm1, tm2):
|
|
|
|
self.assertNotEqual(tm1, tm2)
|
|
self.assertEqual(tm1.__keyspace__, 'ks4')
|
|
self.assertEqual(tm2.__keyspace__, 'ks4')
|
|
|
|
def test_context_invalid_parameters(self):
|
|
"""
|
|
Tests that invalid parameters are raised by the context manager
|
|
|
|
@since 3.7
|
|
@jira_ticket PYTHON-613
|
|
@expected_result a ValueError is raised when passing invalid parameters
|
|
|
|
@test_category query
|
|
"""
|
|
|
|
with self.assertRaises(ValueError):
|
|
with ContextQuery(keyspace='ks2'):
|
|
pass
|
|
|
|
with self.assertRaises(ValueError):
|
|
with ContextQuery(42) as tm:
|
|
pass
|
|
|
|
with self.assertRaises(ValueError):
|
|
with ContextQuery(TestModel, 42):
|
|
pass
|
|
|
|
with self.assertRaises(ValueError):
|
|
with ContextQuery(TestModel, unknown_param=42):
|
|
pass
|
|
|
|
with self.assertRaises(ValueError):
|
|
with ContextQuery(TestModel, keyspace='ks2', unknown_param=42):
|
|
pass |