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_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
def test_basic_batch_query(self): """ Test Batch queries with connections explicitly set @since 3.7 @jira_ticket PYTHON-613 @expected_result queries should execute appropriately @test_category object_mapper """ # No connection with a QuerySet (default is a fake one) with self.assertRaises(NoHostAvailable): with BatchQuery() as b: TestModel.objects.batch(b).create(partition=1, cluster=1) # Explicit connection with a QuerySet with BatchQuery(connection='cluster') as b: TestModel.objects.batch(b).create(partition=1, cluster=1) # Get an object from the BD with ContextQuery(TestModel, connection='cluster') as tm: obj = tm.objects.get(partition=1, cluster=1) obj.__connection__ = None # No connection with a model (default is a fake one) with self.assertRaises(NoHostAvailable): with BatchQuery() as b: obj.count = 2 obj.batch(b).save() # Explicit connection with a model with BatchQuery(connection='cluster') as b: obj.count = 2 obj.batch(b).save()
def test_keyspace(self): self._reset_data() with ContextQuery(TestModel, connection='cluster') as tm: # keyspace Model class tm.objects.using(keyspace='ks2').create(partition=1, cluster=1) tm.objects.using(keyspace='ks2').create(partition=2, cluster=2) with self.assertRaises(TestModel.DoesNotExist): tm.objects.get(partition=1, cluster=1) # default keyspace ks1 obj1 = tm.objects.using(keyspace='ks2').get(partition=1, cluster=1) obj1.count = 2 obj1.save() with self.assertRaises(NoHostAvailable): TestModel.objects.using(keyspace='ks2').get(partition=1, cluster=1) obj2 = TestModel.objects.using(connection='cluster', keyspace='ks2').get(partition=1, cluster=1) self.assertEqual(obj2.count, 2) # Update test TestModel.objects(partition=2, cluster=2).using(connection='cluster', keyspace='ks2').update(count=5) obj3 = TestModel.objects.using(connection='cluster', keyspace='ks2').get(partition=2, cluster=2) self.assertEqual(obj3.count, 5) TestModel.objects(partition=2, cluster=2).using(connection='cluster', keyspace='ks2').delete() with self.assertRaises(TestModel.DoesNotExist): TestModel.objects.using(connection='cluster', keyspace='ks2').get(partition=2, cluster=2)
def test_batch_query_connection_override(self): """ Test that we cannot override a BatchQuery connection per model @since 3.7 @jira_ticket PYTHON-613 @expected_result Proper exceptions should be raised @test_category object_mapper """ with self.assertRaises(CQLEngineException): with BatchQuery(connection='cluster') as b: TestModel.batch(b).using(connection='test').save() with self.assertRaises(CQLEngineException): with BatchQuery(connection='cluster') as b: TestModel.using(connection='test').batch(b).save() with ContextQuery(TestModel, AnotherTestModel, connection='cluster') as (tm, atm): obj1 = tm.objects.get(partition=1, cluster=1) obj1.__connection__ = None with self.assertRaises(CQLEngineException): with BatchQuery(connection='cluster') as b: obj1.using(connection='test').batch(b).save() with self.assertRaises(CQLEngineException): with BatchQuery(connection='cluster') as b: obj1.batch(b).using(connection='test').save()
def test_batch_query_different_connection(self): """Test BatchQuery with Models that have a different connection""" # Testing on a model class TestModel.__connection__ = 'cluster' AnotherTestModel.__connection__ = 'cluster2' with self.assertRaises(CQLEngineException): with BatchQuery() as b: TestModel.objects.batch(b).create(partition=1, cluster=1) AnotherTestModel.objects.batch(b).create(partition=1, cluster=1) TestModel.__connection__ = None AnotherTestModel.__connection__ = None with BatchQuery(connection='cluster') as b: TestModel.objects.batch(b).create(partition=1, cluster=1) AnotherTestModel.objects.batch(b).create(partition=1, cluster=1) # Testing on a model instance with ContextQuery(TestModel, AnotherTestModel, connection='cluster') as (tm, atm): obj1 = tm.objects.get(partition=1, cluster=1) obj2 = atm.objects.get(partition=1, cluster=1) obj1.__connection__ = 'cluster' obj2.__connection__ = 'cluster2' obj1.count = 4 obj2.count = 4 with self.assertRaises(CQLEngineException): with BatchQuery() as b: obj1.batch(b).save() obj2.batch(b).save()
def test_basic_batch_query(self): """Test BatchQuery requests""" # No connection with a QuerySet (default is a fake one) with self.assertRaises(NoHostAvailable): with BatchQuery() as b: TestModel.objects.batch(b).create(partition=1, cluster=1) # Explicit connection with a QuerySet with BatchQuery(connection='cluster') as b: TestModel.objects.batch(b).create(partition=1, cluster=1) # Get an object from the BD with ContextQuery(TestModel, connection='cluster') as tm: obj = tm.objects.get(partition=1, cluster=1) obj.__connection__ = None # No connection with a model (default is a fake one) with self.assertRaises(NoHostAvailable): with BatchQuery() as b: obj.count = 2 obj.batch(b).save() # Explicit connection with a model with BatchQuery(connection='cluster') as b: obj.count = 2 obj.batch(b).save()
def setUpClass(cls): super(ContextQueryConnectionTests, cls).setUpClass() create_keyspace_simple('ks1', 1) conn.unregister_connection('default') conn.register_connection('fake_cluster', ['127.0.0.100'], lazy_connect=True, retry_connect=True, default=True) conn.register_connection('cluster', ['127.0.0.1']) with ContextQuery(TestModel, connection='cluster') as tm: sync_table(tm)
def tearDownClass(cls): super(ContextQueryConnectionTests, cls).tearDownClass() with ContextQuery(TestModel, connection='cluster') as tm: drop_table(tm) drop_keyspace('ks1', connections=['cluster']) # reset the default connection conn.unregister_connection('fake_cluster') conn.unregister_connection('cluster') setup_connection(DEFAULT_KEYSPACE)
def test_context_connection_priority(self): """ Tests to ensure the proper connection priority is honored. Explicit connection should have higest priority, Followed by context query connection Default connection should be honored last. @since 3.7 @jira_ticket PYTHON-613 @expected_result priorities should be honored @test_category object_mapper """ # model keyspace write/read # Set the default connection on the Model TestModel.__connection__ = 'cluster' with ContextQuery(TestModel) as tm: tm.objects.create(partition=1, cluster=1) # ContextQuery connection should have priority over default one with ContextQuery(TestModel, connection='fake_cluster') as tm: with self.assertRaises(NoHostAvailable): tm.objects.create(partition=1, cluster=1) # Explicit connection should have priority over ContextQuery one with ContextQuery(TestModel, connection='fake_cluster') as tm: tm.objects.using(connection='cluster').create(partition=1, cluster=1) # Reset the default conn of the model TestModel.__connection__ = None # No model connection and an invalid default connection with ContextQuery(TestModel) as tm: with self.assertRaises(NoHostAvailable): tm.objects.create(partition=1, cluster=1)
def test_context_connection_priority(self): # Set the default connection on the Model TestModel.__connection__ = 'cluster' with ContextQuery(TestModel) as tm: tm.objects.create(partition=1, cluster=1) # ContextQuery connection should have priority over default one with ContextQuery(TestModel, connection='fake_cluster') as tm: with self.assertRaises(NoHostAvailable): tm.objects.create(partition=1, cluster=1) # Explicit connection should have priority over ContextQuery one with ContextQuery(TestModel, connection='fake_cluster') as tm: tm.objects.using(connection='cluster').create(partition=1, cluster=1) # Reset the default conn of the model TestModel.__connection__ = None # No model connection and an invalid default connection with ContextQuery(TestModel) as tm: with self.assertRaises(NoHostAvailable): tm.objects.create(partition=1, cluster=1)
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_connection_with_keyspace(self): """ Tests to ensure keyspace param is honored @since 3.7 @jira_ticket PYTHON-613 @expected_result Invalid request is thrown @test_category object_mapper """ # ks2 doesn't exist with ContextQuery(TestModel, connection='cluster', keyspace='ks2') as tm: with self.assertRaises(InvalidRequest): tm.objects.create(partition=1, cluster=1)
def test_keyspace(self): """ Test keyspace segregation when same connection is used @since 3.7 @jira_ticket PYTHON-613 @expected_result Keyspace segration is honored @test_category object_mapper """ self._reset_data() with ContextQuery(TestModel, connection='cluster') as tm: # keyspace Model class tm.objects.using(keyspace='ks2').create(partition=1, cluster=1) tm.objects.using(keyspace='ks2').create(partition=2, cluster=2) with self.assertRaises(TestModel.DoesNotExist): tm.objects.get(partition=1, cluster=1) # default keyspace ks1 obj1 = tm.objects.using(keyspace='ks2').get(partition=1, cluster=1) obj1.count = 2 obj1.save() with self.assertRaises(NoHostAvailable): TestModel.objects.using(keyspace='ks2').get(partition=1, cluster=1) obj2 = TestModel.objects.using(connection='cluster', keyspace='ks2').get(partition=1, cluster=1) self.assertEqual(obj2.count, 2) # Update test TestModel.objects(partition=2, cluster=2).using(connection='cluster', keyspace='ks2').update(count=5) obj3 = TestModel.objects.using(connection='cluster', keyspace='ks2').get(partition=2, cluster=2) self.assertEqual(obj3.count, 5) TestModel.objects(partition=2, cluster=2).using(connection='cluster', keyspace='ks2').delete() with self.assertRaises(TestModel.DoesNotExist): TestModel.objects.using(connection='cluster', keyspace='ks2').get(partition=2, cluster=2)
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_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_batch_query_different_connection(self): """ Test BatchQuery with Models that have a different connection @since 3.7 @jira_ticket PYTHON-613 @expected_result queries should execute appropriately @test_category object_mapper """ # Testing on a model class TestModel.__connection__ = 'cluster' AnotherTestModel.__connection__ = 'cluster2' with self.assertRaises(CQLEngineException): with BatchQuery() as b: TestModel.objects.batch(b).create(partition=1, cluster=1) AnotherTestModel.objects.batch(b).create(partition=1, cluster=1) TestModel.__connection__ = None AnotherTestModel.__connection__ = None with BatchQuery(connection='cluster') as b: TestModel.objects.batch(b).create(partition=1, cluster=1) AnotherTestModel.objects.batch(b).create(partition=1, cluster=1) # Testing on a model instance with ContextQuery(TestModel, AnotherTestModel, connection='cluster') as (tm, atm): obj1 = tm.objects.get(partition=1, cluster=1) obj2 = atm.objects.get(partition=1, cluster=1) obj1.__connection__ = 'cluster' obj2.__connection__ = 'cluster2' obj1.count = 4 obj2.count = 4 with self.assertRaises(CQLEngineException): with BatchQuery() as b: obj1.batch(b).save() obj2.batch(b).save()
def test_batch_query_connection_override(self): """Test that we cannot override a BatchQuery connection per model""" with self.assertRaises(CQLEngineException): with BatchQuery(connection='cluster') as b: TestModel.batch(b).using(connection='test').save() with self.assertRaises(CQLEngineException): with BatchQuery(connection='cluster') as b: TestModel.using(connection='test').batch(b).save() with ContextQuery(TestModel, AnotherTestModel, connection='cluster') as (tm, atm): obj1 = tm.objects.get(partition=1, cluster=1) obj1.__connection__ = None with self.assertRaises(CQLEngineException): with BatchQuery(connection='cluster') as b: obj1.using(connection='test').batch(b).save() with self.assertRaises(CQLEngineException): with BatchQuery(connection='cluster') as b: obj1.batch(b).using(connection='test').save()
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_connection_with_keyspace(self): # ks2 doesn't exist with ContextQuery(TestModel, connection='cluster', keyspace='ks2') as tm: with self.assertRaises(InvalidRequest): tm.objects.create(partition=1, cluster=1)