def test_many_to_one_mapping_cache_with_save(self): """ Cache should be invalidated when calling 'save' on related objects """ car2 = CarFactory.create(make=self.manufacturer) len(Manufacturer.objects.get(id=self.manufacturer.id).cars.all()) car2.name = 'gti' car2.save() reset_queries() # Only 1 cache (the one for car selection query) will be invalidated # as we only update data on Car table len(Manufacturer.objects.get(id=self.manufacturer.id).cars.all()) self.assertEqual(len(connection.queries), 1)
def test_many_to_many_mapping_cache_with_add(self): """ Cache for both models in this many-to-many relationship should be updated when calling 'add' on related objects """ new_cars = CarFactory.create_batch(size=3) initial_count = len(Driver.objects.get(id=self.driver.id).cars.all()) self.driver.cars.add(*new_cars) reset_queries() # Cache for both models should be invalidated as add is an m2m change new_count = len(Driver.objects.get(id=self.driver.id).cars.all()) self.assertEqual(len(connection.queries), 2) self.assertEqual(initial_count + 3, new_count)
def test_many_to_many_mapping_cache_with_save(self): """ Cache should be invalidated when calling 'save' on related objects """ car2 = CarFactory.create() self.driver.cars.add(car2) Driver.objects.get(id=self.driver.id).cars.all()[0].year car2.name = 'gti' car2.save() reset_queries() # Only 1 cache (the one for car selection query) will be invalidated # as we only update data on Car table Driver.objects.get(id=self.driver.id).cars.all()[0].year self.assertEqual(len(connection.queries), 1)
def test_many_to_many_mapping_cache_with_delete(self): """ Cache should be invalidated when calling 'delete' on related objects """ car2 = CarFactory.create() self.driver.cars.add(car2) initial_count = len(Driver.objects.get(id=self.driver.id).cars.all()) car2.delete() reset_queries() # Only 1 cache (the one for car selection query) will be invalidated # as we only delete data on Car table new_count = len(Driver.objects.get(id=self.driver.id).cars.all()) self.assertEqual(len(connection.queries), 1) self.assertEqual(initial_count - 1, new_count)
def test_many_to_one_mapping_cache_with_save(self): """ Cache should be invalidated when calling 'save' on related objects """ car2 = CarFactory.create(make=self.manufacturer) len(Manufacturer.objects.get(id=self.manufacturer.id).cars.all()) car2.name = 'gti' car2.save() reset_queries() # Only 1 cache (the one for car selection query) will be invalidated # as we only update data on Car table len(Manufacturer.objects.get(id=self.manufacturer.id).cars.all()) # Because of m2m fix the no. of queries will be 2 instead of 1 self.assertEqual(len(connection.queries), 2)
def test_many_to_many_mapping_cache(self): """ Queries should be cached when making the same select queries on related objects repeatedly """ car2 = CarFactory.create() self.driver.cars.add(car2) reset_queries() for i in range(5): Driver.objects.get(id=self.driver.id).cars.all()[0].year # The above query is actually composed of 2 sql queries: # one for fetching drivers and the other cars. self.assertEqual(len(connection.queries), 2) # no. of cars for the driver increased by 1 self.assertEqual(len(self.driver.cars.all()), 2)
def test_many_to_many_mapping_cache_with_remove(self): """ Cache for both models in this many-to-many relationship should be updated when calling 'remove' on related objects """ new_car = CarFactory.create() self.driver.cars.add(new_car) Driver.objects.get(id=self.driver.id).cars.all()[0].year number_of_cars = len(self.driver.cars.all()) self.driver.cars.remove(self.car) reset_queries() # Cache for both models should be invalidated as remove is an m2m change Driver.objects.get(id=self.driver.id).cars.all()[0].year self.assertEqual(len(connection.queries), 2) # number of cars decreases by 1 self.assertEqual(len(self.driver.cars.all()), number_of_cars - 1)
def test_many_to_one_mapping_cache_with_delete(self): """ Cache should be invalidated when calling 'delete' on related objects """ car2 = CarFactory.create(make=self.manufacturer) initial_count = len( Manufacturer.objects.get(id=self.manufacturer.id).cars.all()) car2.delete() reset_queries() # Only 1 cache (the one for car selection query) will be invalidated # as we only delete data on Car table new_count = len( Manufacturer.objects.get(id=self.manufacturer.id).cars.all()) # Because of m2m fix the no. of queries will be 2 instead of 1 self.assertEqual(len(connection.queries), 2) self.assertEqual(initial_count - 1, new_count)
def setUp(self): self.manufacturers = ManufacturerFactory.create_batch(size=5) self.cars = CarFactory.create_batch(size=5, make=self.manufacturers[0]) self.drivers = DriverFactory.create_batch(size=5, cars=[self.cars[0]])
def setUp(self): self.manufacturer = ManufacturerFactory.create() self.car = CarFactory.create(make=self.manufacturer, year=2015) reset_queries()
def setUp(self): self.engine = EngineFactory.create(name='test_engine') self.car = CarFactory.create(engine=self.engine, year=2015) reset_queries()
def setUp(self): self.car = CarFactory.create(year=2015) self.driver = DriverFactory.create(cars=[self.car]) reset_queries()
def setUp(self): self.manufacturer = ManufacturerFactory.create(name='Honda') self.car = CarFactory.create(make=self.manufacturer, year=2015, model='Civic') reset_queries()
def test_cached_model_updated(self, update_model_cache): self.assertEqual(update_model_cache.call_count, 0) CarFactory.create() self.assertGreater(update_model_cache.call_count, 0)