Ticket #10399: 0001-Fixed-10399-Tested-that-o2o-field-updates-are-not-co.patch

File 0001-Fixed-10399-Tested-that-o2o-field-updates-are-not-co.patch, 4.4 KB (added by Simon Charette, 12 years ago)

Testcase

  • django/test/testcases.py

    From 1730c8c7d9c2941b1a6650f21c40d32187e0170c Mon Sep 17 00:00:00 2001
    From: Simon Charette <charette.s@gmail.com>
    Date: Thu, 28 Feb 2013 18:22:17 -0500
    Subject: [PATCH] Fixed #10399 -- Tested that o2o field updates are not
     constrained by an inner query.
    
    ---
     django/test/testcases.py         |   36 +++++++++++++++++++++++++++---------
     tests/model_inheritance/tests.py |   26 +++++++++++++++++++++++++-
     2 files changed, 52 insertions(+), 10 deletions(-)
    
    diff --git a/django/test/testcases.py b/django/test/testcases.py
    index f9d028b..208cba0 100644
    a b class DocTestRunner(doctest.DocTestRunner):  
    168168            transaction.rollback_unless_managed(using=conn)
    169169
    170170
    171 class _AssertNumQueriesContext(object):
    172     def __init__(self, test_case, num, connection):
    173         self.test_case = test_case
    174         self.num = num
     171class CaptureQueriesContext(object):
     172    def __init__(self, connection):
    175173        self.connection = connection
    176174
     175    def __iter__(self):
     176        return iter(self.captured_queries)
     177
     178    def __getitem__(self, key):
     179        return self.captured_queries[key]
     180
     181    @property
     182    def captured_queries(self):
     183        return self.connection.queries[self.initial_queries:self.final_queries]
     184
    177185    def __enter__(self):
    178         self.old_debug_cursor = self.connection.use_debug_cursor
     186        self.use_debug_cursor = self.connection.use_debug_cursor
    179187        self.connection.use_debug_cursor = True
    180         self.starting_queries = len(self.connection.queries)
     188        self.initial_queries = len(self.connection.queries)
     189        self.final_queries = None
    181190        request_started.disconnect(reset_queries)
    182191        return self
    183192
    184193    def __exit__(self, exc_type, exc_value, traceback):
    185         self.connection.use_debug_cursor = self.old_debug_cursor
     194        self.connection.use_debug_cursor = self.use_debug_cursor
    186195        request_started.connect(reset_queries)
    187196        if exc_type is not None:
    188197            return
    189198
    190         final_queries = len(self.connection.queries)
    191         executed = final_queries - self.starting_queries
     199        self.final_queries = len(self.connection.queries)
    192200
     201
     202class _AssertNumQueriesContext(CaptureQueriesContext):
     203    def __init__(self, test_case, num, connection):
     204        self.test_case = test_case
     205        self.num = num
     206        super(_AssertNumQueriesContext, self).__init__(connection)
     207
     208    def __exit__(self, exc_type, exc_value, traceback):
     209        super(_AssertNumQueriesContext, self).__exit__(exc_type, exc_value, traceback)
     210        executed = len(self.captured_queries)
    193211        self.test_case.assertEqual(
    194212            executed, self.num, "%d queries executed, %d expected" % (
    195213                executed, self.num
  • tests/model_inheritance/tests.py

    diff --git a/tests/model_inheritance/tests.py b/tests/model_inheritance/tests.py
    index 16d2242..46cef3a 100644
    a b  
    1 from __future__ import absolute_import
     1from __future__ import absolute_import, unicode_literals
    22
    33from operator import attrgetter
    44
    55from django.core.exceptions import FieldError
     6from django.db import connection
    67from django.test import TestCase
     8from django.test.testcases import CaptureQueriesContext
    79from django.utils import six
    810
    911from .models import (Chef, CommonInfo, ItalianRestaurant, ParkingLot, Place,
    class ModelInheritanceTests(TestCase):  
    294296        )
    295297        with self.assertNumQueries(6):
    296298            ir.save()
     299
     300    def test_update_parent_filtering(self):
     301        """
     302        Test that updating a field of a model subclass doesn't issue an UPDATE
     303        query constrained by an inner query.
     304        Refs #10399
     305        """
     306        supplier = Supplier.objects.create(
     307            name='Central market',
     308            address='610 some street'
     309        )
     310        # Capture the expected query in a database agnostic way
     311        with CaptureQueriesContext(connection) as captured_queries:
     312            Place.objects.filter(pk=supplier.pk).update(name=supplier.name)
     313        expected_sql = captured_queries[0]['sql']
     314        # Capture the queries executed when a subclassed model instance is saved.
     315        with CaptureQueriesContext(connection) as captured_queries:
     316            supplier.save(update_fields=('name',))
     317        for query in captured_queries:
     318            sql = query['sql']
     319            if 'UPDATE' in sql:
     320                self.assertEqual(expected_sql, sql)
Back to Top