parts/django/tests/regressiontests/m2m_through_regress/tests.py
changeset 69 c6bca38c1cbf
equal deleted inserted replaced
68:5ff1fc726848 69:c6bca38c1cbf
       
     1 try:
       
     2     from cStringIO import StringIO
       
     3 except ImportError:
       
     4     from StringIO import StringIO
       
     5 
       
     6 from django.core import management
       
     7 from django.contrib.auth.models import User
       
     8 from django.test import TestCase
       
     9 
       
    10 from models import Person, Group, Membership, UserMembership
       
    11 
       
    12 
       
    13 class M2MThroughTestCase(TestCase):
       
    14     def test_everything(self):
       
    15         bob = Person.objects.create(name="Bob")
       
    16         jim = Person.objects.create(name="Jim")
       
    17 
       
    18         rock = Group.objects.create(name="Rock")
       
    19         roll = Group.objects.create(name="Roll")
       
    20 
       
    21         frank = User.objects.create_user("frank", "frank@example.com", "password")
       
    22         jane = User.objects.create_user("jane", "jane@example.com", "password")
       
    23 
       
    24         Membership.objects.create(person=bob, group=rock)
       
    25         Membership.objects.create(person=bob, group=roll)
       
    26         Membership.objects.create(person=jim, group=rock)
       
    27 
       
    28         self.assertQuerysetEqual(
       
    29             bob.group_set.all(), [
       
    30                 "<Group: Rock>",
       
    31                 "<Group: Roll>",
       
    32             ]
       
    33         )
       
    34 
       
    35         self.assertQuerysetEqual(
       
    36             roll.members.all(), [
       
    37                 "<Person: Bob>",
       
    38             ]
       
    39         )
       
    40 
       
    41         self.assertRaises(AttributeError, setattr, bob, "group_set", [])
       
    42         self.assertRaises(AttributeError, setattr, roll, "members", [])
       
    43 
       
    44         self.assertRaises(AttributeError, rock.members.create, name="Anne")
       
    45         self.assertRaises(AttributeError, bob.group_set.create, name="Funk")
       
    46 
       
    47         UserMembership.objects.create(user=frank, group=rock)
       
    48         UserMembership.objects.create(user=frank, group=roll)
       
    49         UserMembership.objects.create(user=jane, group=rock)
       
    50 
       
    51         self.assertQuerysetEqual(
       
    52             frank.group_set.all(), [
       
    53                 "<Group: Rock>",
       
    54                 "<Group: Roll>",
       
    55             ]
       
    56         )
       
    57 
       
    58         self.assertQuerysetEqual(
       
    59             roll.user_members.all(), [
       
    60                 "<User: frank>",
       
    61             ]
       
    62         )
       
    63 
       
    64     def test_serialization(self):
       
    65         "m2m-through models aren't serialized as m2m fields. Refs #8134"
       
    66 
       
    67         p = Person.objects.create(name="Bob")
       
    68         g = Group.objects.create(name="Roll")
       
    69         m = Membership.objects.create(person=p, group=g)
       
    70 
       
    71         pks = {"p_pk": p.pk, "g_pk": g.pk, "m_pk": m.pk}
       
    72 
       
    73         out = StringIO()
       
    74         management.call_command("dumpdata", "m2m_through_regress", format="json", stdout=out)
       
    75         self.assertEqual(out.getvalue().strip(), """[{"pk": %(m_pk)s, "model": "m2m_through_regress.membership", "fields": {"person": %(p_pk)s, "price": 100, "group": %(g_pk)s}}, {"pk": %(p_pk)s, "model": "m2m_through_regress.person", "fields": {"name": "Bob"}}, {"pk": %(g_pk)s, "model": "m2m_through_regress.group", "fields": {"name": "Roll"}}]""" % pks)
       
    76 
       
    77         out = StringIO()
       
    78         management.call_command("dumpdata", "m2m_through_regress", format="xml",
       
    79             indent=2, stdout=out)
       
    80         self.assertEqual(out.getvalue().strip(), """
       
    81 <?xml version="1.0" encoding="utf-8"?>
       
    82 <django-objects version="1.0">
       
    83   <object pk="%(m_pk)s" model="m2m_through_regress.membership">
       
    84     <field to="m2m_through_regress.person" name="person" rel="ManyToOneRel">%(p_pk)s</field>
       
    85     <field to="m2m_through_regress.group" name="group" rel="ManyToOneRel">%(g_pk)s</field>
       
    86     <field type="IntegerField" name="price">100</field>
       
    87   </object>
       
    88   <object pk="%(p_pk)s" model="m2m_through_regress.person">
       
    89     <field type="CharField" name="name">Bob</field>
       
    90   </object>
       
    91   <object pk="%(g_pk)s" model="m2m_through_regress.group">
       
    92     <field type="CharField" name="name">Roll</field>
       
    93   </object>
       
    94 </django-objects>
       
    95         """.strip() % pks)
       
    96 
       
    97     def test_join_trimming(self):
       
    98         "Check that we don't involve too many copies of the intermediate table when doing a join. Refs #8046, #8254"
       
    99         bob  = Person.objects.create(name="Bob")
       
   100         jim = Person.objects.create(name="Jim")
       
   101 
       
   102         rock = Group.objects.create(name="Rock")
       
   103         roll = Group.objects.create(name="Roll")
       
   104 
       
   105         Membership.objects.create(person=bob, group=rock)
       
   106         Membership.objects.create(person=jim, group=rock, price=50)
       
   107         Membership.objects.create(person=bob, group=roll, price=50)
       
   108 
       
   109         self.assertQuerysetEqual(
       
   110             rock.members.filter(membership__price=50), [
       
   111                 "<Person: Jim>",
       
   112             ]
       
   113         )
       
   114 
       
   115         self.assertQuerysetEqual(
       
   116             bob.group_set.filter(membership__price=50), [
       
   117                 "<Group: Roll>",
       
   118             ]
       
   119         )
       
   120 
       
   121 class ThroughLoadDataTestCase(TestCase):
       
   122     fixtures = ["m2m_through"]
       
   123 
       
   124     def test_sequence_creation(self):
       
   125         "Check that sequences on an m2m_through are created for the through model, not a phantom auto-generated m2m table. Refs #11107"
       
   126         out = StringIO()
       
   127         management.call_command("dumpdata", "m2m_through_regress", format="json", stdout=out)
       
   128         self.assertEqual(out.getvalue().strip(), """[{"pk": 1, "model": "m2m_through_regress.usermembership", "fields": {"price": 100, "group": 1, "user": 1}}, {"pk": 1, "model": "m2m_through_regress.person", "fields": {"name": "Guido"}}, {"pk": 1, "model": "m2m_through_regress.group", "fields": {"name": "Python Core Group"}}]""")