2
from cStringIO import StringIO
4
from StringIO import StringIO
6
from django.core import management
7
from django.contrib.auth.models import User
8
from django.test import TestCase
10
from models import Person, Group, Membership, UserMembership
13
class M2MThroughTestCase(TestCase):
14
def test_everything(self):
15
bob = Person.objects.create(name="Bob")
16
jim = Person.objects.create(name="Jim")
18
rock = Group.objects.create(name="Rock")
19
roll = Group.objects.create(name="Roll")
21
frank = User.objects.create_user("frank", "frank@example.com", "password")
22
jane = User.objects.create_user("jane", "jane@example.com", "password")
24
Membership.objects.create(person=bob, group=rock)
25
Membership.objects.create(person=bob, group=roll)
26
Membership.objects.create(person=jim, group=rock)
28
self.assertQuerysetEqual(
29
bob.group_set.all(), [
35
self.assertQuerysetEqual(
41
self.assertRaises(AttributeError, setattr, bob, "group_set", [])
42
self.assertRaises(AttributeError, setattr, roll, "members", [])
44
self.assertRaises(AttributeError, rock.members.create, name="Anne")
45
self.assertRaises(AttributeError, bob.group_set.create, name="Funk")
47
UserMembership.objects.create(user=frank, group=rock)
48
UserMembership.objects.create(user=frank, group=roll)
49
UserMembership.objects.create(user=jane, group=rock)
51
self.assertQuerysetEqual(
52
frank.group_set.all(), [
58
self.assertQuerysetEqual(
59
roll.user_members.all(), [
64
def test_serialization(self):
65
"m2m-through models aren't serialized as m2m fields. Refs #8134"
67
p = Person.objects.create(name="Bob")
68
g = Group.objects.create(name="Roll")
69
m = Membership.objects.create(person=p, group=g)
71
pks = {"p_pk": p.pk, "g_pk": g.pk, "m_pk": m.pk}
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)
78
management.call_command("dumpdata", "m2m_through_regress", format="xml",
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>
88
<object pk="%(p_pk)s" model="m2m_through_regress.person">
89
<field type="CharField" name="name">Bob</field>
91
<object pk="%(g_pk)s" model="m2m_through_regress.group">
92
<field type="CharField" name="name">Roll</field>
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")
102
rock = Group.objects.create(name="Rock")
103
roll = Group.objects.create(name="Roll")
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)
109
self.assertQuerysetEqual(
110
rock.members.filter(membership__price=50), [
115
self.assertQuerysetEqual(
116
bob.group_set.filter(membership__price=50), [
121
class ThroughLoadDataTestCase(TestCase):
122
fixtures = ["m2m_through"]
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"
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"}}]""")