92 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from uuid import uuid4
 | |
| 
 | |
| from mock import patch
 | |
| from cqlengine.exceptions import ValidationError
 | |
| 
 | |
| from cqlengine.tests.base import BaseCassEngTestCase
 | |
| from cqlengine.models import Model
 | |
| from cqlengine import columns
 | |
| from cqlengine.management import sync_table, drop_table
 | |
| 
 | |
| 
 | |
| class TestUpdateModel(Model):
 | |
|     __keyspace__ = 'test'
 | |
|     partition   = columns.UUID(primary_key=True, default=uuid4)
 | |
|     cluster     = columns.UUID(primary_key=True, default=uuid4)
 | |
|     count       = columns.Integer(required=False)
 | |
|     text        = columns.Text(required=False, index=True)
 | |
| 
 | |
| 
 | |
| class ModelUpdateTests(BaseCassEngTestCase):
 | |
| 
 | |
|     @classmethod
 | |
|     def setUpClass(cls):
 | |
|         super(ModelUpdateTests, cls).setUpClass()
 | |
|         sync_table(TestUpdateModel)
 | |
| 
 | |
|     @classmethod
 | |
|     def tearDownClass(cls):
 | |
|         super(ModelUpdateTests, cls).tearDownClass()
 | |
|         drop_table(TestUpdateModel)
 | |
| 
 | |
|     def test_update_model(self):
 | |
|         """ tests calling udpate on models with no values passed in """
 | |
|         m0 = TestUpdateModel.create(count=5, text='monkey')
 | |
| 
 | |
|         # independently save over a new count value, unknown to original instance
 | |
|         m1 = TestUpdateModel.get(partition=m0.partition, cluster=m0.cluster)
 | |
|         m1.count = 6
 | |
|         m1.save()
 | |
| 
 | |
|         # update the text, and call update
 | |
|         m0.text = 'monkey land'
 | |
|         m0.update()
 | |
| 
 | |
|         # database should reflect both updates
 | |
|         m2 = TestUpdateModel.get(partition=m0.partition, cluster=m0.cluster)
 | |
|         self.assertEqual(m2.count, m1.count)
 | |
|         self.assertEqual(m2.text, m0.text)
 | |
| 
 | |
|     def test_update_values(self):
 | |
|         """ tests calling update on models with values passed in """
 | |
|         m0 = TestUpdateModel.create(count=5, text='monkey')
 | |
| 
 | |
|         # independently save over a new count value, unknown to original instance
 | |
|         m1 = TestUpdateModel.get(partition=m0.partition, cluster=m0.cluster)
 | |
|         m1.count = 6
 | |
|         m1.save()
 | |
| 
 | |
|         # update the text, and call update
 | |
|         m0.update(text='monkey land')
 | |
|         self.assertEqual(m0.text, 'monkey land')
 | |
| 
 | |
|         # database should reflect both updates
 | |
|         m2 = TestUpdateModel.get(partition=m0.partition, cluster=m0.cluster)
 | |
|         self.assertEqual(m2.count, m1.count)
 | |
|         self.assertEqual(m2.text, m0.text)
 | |
| 
 | |
|     def test_noop_model_update(self):
 | |
|         """ tests that calling update on a model with no changes will do nothing. """
 | |
|         m0 = TestUpdateModel.create(count=5, text='monkey')
 | |
| 
 | |
|         with patch.object(self.session, 'execute') as execute:
 | |
|             m0.update()
 | |
|         assert execute.call_count == 0
 | |
| 
 | |
|         with patch.object(self.session, 'execute') as execute:
 | |
|             m0.update(count=5)
 | |
|         assert execute.call_count == 0
 | |
| 
 | |
|     def test_invalid_update_kwarg(self):
 | |
|         """ tests that passing in a kwarg to the update method that isn't a column will fail """
 | |
|         m0 = TestUpdateModel.create(count=5, text='monkey')
 | |
|         with self.assertRaises(ValidationError):
 | |
|             m0.update(numbers=20)
 | |
| 
 | |
|     def test_primary_key_update_failure(self):
 | |
|         """ tests that attempting to update the value of a primary key will fail """
 | |
|         m0 = TestUpdateModel.create(count=5, text='monkey')
 | |
|         with self.assertRaises(ValidationError):
 | |
|             m0.update(partition=uuid4())
 | |
| 
 | 
