# Copyright 2015 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. import mock from uuid import uuid4 from cassandra import ConsistencyLevel as CL from cassandra.cqlengine import columns from cassandra.cqlengine.management import sync_table, drop_table from cassandra.cqlengine.models import Model from cassandra.cqlengine.query import BatchQuery from tests.integration.cqlengine.base import BaseCassEngTestCase class TestConsistencyModel(Model): id = columns.UUID(primary_key=True, default=lambda:uuid4()) count = columns.Integer() text = columns.Text(required=False) class BaseConsistencyTest(BaseCassEngTestCase): @classmethod def setUpClass(cls): super(BaseConsistencyTest, cls).setUpClass() sync_table(TestConsistencyModel) @classmethod def tearDownClass(cls): super(BaseConsistencyTest, cls).tearDownClass() drop_table(TestConsistencyModel) class TestConsistency(BaseConsistencyTest): def test_create_uses_consistency(self): qs = TestConsistencyModel.consistency(CL.ALL) with mock.patch.object(self.session, 'execute') as m: qs.create(text="i am not fault tolerant this way") args = m.call_args self.assertEqual(CL.ALL, args[0][0].consistency_level) def test_queryset_is_returned_on_create(self): qs = TestConsistencyModel.consistency(CL.ALL) self.assertTrue(isinstance(qs, TestConsistencyModel.__queryset__), type(qs)) def test_update_uses_consistency(self): t = TestConsistencyModel.create(text="bacon and eggs") t.text = "ham sandwich" with mock.patch.object(self.session, 'execute') as m: t.consistency(CL.ALL).save() args = m.call_args self.assertEqual(CL.ALL, args[0][0].consistency_level) def test_batch_consistency(self): with mock.patch.object(self.session, 'execute') as m: with BatchQuery(consistency=CL.ALL) as b: TestConsistencyModel.batch(b).create(text="monkey") args = m.call_args self.assertEqual(CL.ALL, args[0][0].consistency_level) with mock.patch.object(self.session, 'execute') as m: with BatchQuery() as b: TestConsistencyModel.batch(b).create(text="monkey") args = m.call_args self.assertNotEqual(CL.ALL, args[0][0].consistency_level) def test_blind_update(self): t = TestConsistencyModel.create(text="bacon and eggs") t.text = "ham sandwich" uid = t.id with mock.patch.object(self.session, 'execute') as m: TestConsistencyModel.objects(id=uid).consistency(CL.ALL).update(text="grilled cheese") args = m.call_args self.assertEqual(CL.ALL, args[0][0].consistency_level) def test_delete(self): # ensures we always carry consistency through on delete statements t = TestConsistencyModel.create(text="bacon and eggs") t.text = "ham and cheese sandwich" uid = t.id with mock.patch.object(self.session, 'execute') as m: t.consistency(CL.ALL).delete() with mock.patch.object(self.session, 'execute') as m: TestConsistencyModel.objects(id=uid).consistency(CL.ALL).delete() args = m.call_args self.assertEqual(CL.ALL, args[0][0].consistency_level)