PageRenderTime 27ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/django-1.2/tests/modeltests/proxy_models/tests.py

https://github.com/theosp/google_appengine
Python | 314 lines | 295 code | 4 blank | 15 comment | 0 complexity | bca0601d10865ca67edfc2a5bacc9974 MD5 | raw file
  1. from django.test import TestCase
  2. from django.db import models, DEFAULT_DB_ALIAS
  3. from django.db.models import signals
  4. from django.core import management
  5. from django.core.exceptions import FieldError
  6. from django.contrib.contenttypes.models import ContentType
  7. from models import MyPerson, Person, StatusPerson, LowerStatusPerson
  8. from models import MyPersonProxy, Abstract, OtherPerson, User, UserProxy
  9. from models import UserProxyProxy, Country, State, StateProxy, TrackerUser
  10. from models import BaseUser, Bug, ProxyTrackerUser, Improvement, ProxyProxyBug
  11. from models import ProxyBug, ProxyImprovement
  12. class ProxyModelTests(TestCase):
  13. def test_same_manager_queries(self):
  14. """
  15. The MyPerson model should be generating the same database queries as
  16. the Person model (when the same manager is used in each case).
  17. """
  18. my_person_sql = MyPerson.other.all().query.get_compiler(
  19. DEFAULT_DB_ALIAS).as_sql()
  20. person_sql = Person.objects.order_by("name").query.get_compiler(
  21. DEFAULT_DB_ALIAS).as_sql()
  22. self.assertEqual(my_person_sql, person_sql)
  23. def test_inheretance_new_table(self):
  24. """
  25. The StatusPerson models should have its own table (it's using ORM-level
  26. inheritance).
  27. """
  28. sp_sql = StatusPerson.objects.all().query.get_compiler(
  29. DEFAULT_DB_ALIAS).as_sql()
  30. p_sql = Person.objects.all().query.get_compiler(
  31. DEFAULT_DB_ALIAS).as_sql()
  32. self.assertNotEqual(sp_sql, p_sql)
  33. def test_basic_proxy(self):
  34. """
  35. Creating a Person makes them accessible through the MyPerson proxy.
  36. """
  37. Person.objects.create(name="Foo McBar")
  38. self.assertEqual(len(Person.objects.all()), 1)
  39. self.assertEqual(len(MyPerson.objects.all()), 1)
  40. self.assertEqual(MyPerson.objects.get(name="Foo McBar").id, 1)
  41. self.assertFalse(MyPerson.objects.get(id=1).has_special_name())
  42. def test_no_proxy(self):
  43. """
  44. Person is not proxied by StatusPerson subclass.
  45. """
  46. Person.objects.create(name="Foo McBar")
  47. self.assertEqual(list(StatusPerson.objects.all()), [])
  48. def test_basic_proxy_reverse(self):
  49. """
  50. A new MyPerson also shows up as a standard Person.
  51. """
  52. MyPerson.objects.create(name="Bazza del Frob")
  53. self.assertEqual(len(MyPerson.objects.all()), 1)
  54. self.assertEqual(len(Person.objects.all()), 1)
  55. LowerStatusPerson.objects.create(status="low", name="homer")
  56. lsps = [lsp.name for lsp in LowerStatusPerson.objects.all()]
  57. self.assertEqual(lsps, ["homer"])
  58. def test_correct_type_proxy_of_proxy(self):
  59. """
  60. Correct type when querying a proxy of proxy
  61. """
  62. Person.objects.create(name="Foo McBar")
  63. MyPerson.objects.create(name="Bazza del Frob")
  64. LowerStatusPerson.objects.create(status="low", name="homer")
  65. pp = sorted([mpp.name for mpp in MyPersonProxy.objects.all()])
  66. self.assertEqual(pp, ['Bazza del Frob', 'Foo McBar', 'homer'])
  67. def test_proxy_included_in_ancestors(self):
  68. """
  69. Proxy models are included in the ancestors for a model's DoesNotExist
  70. and MultipleObjectsReturned
  71. """
  72. Person.objects.create(name="Foo McBar")
  73. MyPerson.objects.create(name="Bazza del Frob")
  74. LowerStatusPerson.objects.create(status="low", name="homer")
  75. max_id = Person.objects.aggregate(max_id=models.Max('id'))['max_id']
  76. self.assertRaises(Person.DoesNotExist,
  77. MyPersonProxy.objects.get,
  78. name='Zathras'
  79. )
  80. self.assertRaises(Person.MultipleObjectsReturned,
  81. MyPersonProxy.objects.get,
  82. id__lt=max_id+1
  83. )
  84. self.assertRaises(Person.DoesNotExist,
  85. StatusPerson.objects.get,
  86. name='Zathras'
  87. )
  88. sp1 = StatusPerson.objects.create(name='Bazza Jr.')
  89. sp2 = StatusPerson.objects.create(name='Foo Jr.')
  90. max_id = Person.objects.aggregate(max_id=models.Max('id'))['max_id']
  91. self.assertRaises(Person.MultipleObjectsReturned,
  92. StatusPerson.objects.get,
  93. id__lt=max_id+1
  94. )
  95. def test_abc(self):
  96. """
  97. All base classes must be non-abstract
  98. """
  99. def build_abc():
  100. class NoAbstract(Abstract):
  101. class Meta:
  102. proxy = True
  103. self.assertRaises(TypeError, build_abc)
  104. def test_no_cbc(self):
  105. """
  106. The proxy must actually have one concrete base class
  107. """
  108. def build_no_cbc():
  109. class TooManyBases(Person, Abstract):
  110. class Meta:
  111. proxy = True
  112. self.assertRaises(TypeError, build_no_cbc)
  113. def test_no_base_classes(self):
  114. def build_no_base_classes():
  115. class NoBaseClasses(models.Model):
  116. class Meta:
  117. proxy = True
  118. self.assertRaises(TypeError, build_no_base_classes)
  119. def test_new_fields(self):
  120. def build_new_fields():
  121. class NoNewFields(Person):
  122. newfield = models.BooleanField()
  123. class Meta:
  124. proxy = True
  125. self.assertRaises(FieldError, build_new_fields)
  126. def test_myperson_manager(self):
  127. Person.objects.create(name="fred")
  128. Person.objects.create(name="wilma")
  129. Person.objects.create(name="barney")
  130. resp = [p.name for p in MyPerson.objects.all()]
  131. self.assertEqual(resp, ['barney', 'fred'])
  132. resp = [p.name for p in MyPerson._default_manager.all()]
  133. self.assertEqual(resp, ['barney', 'fred'])
  134. def test_otherperson_manager(self):
  135. Person.objects.create(name="fred")
  136. Person.objects.create(name="wilma")
  137. Person.objects.create(name="barney")
  138. resp = [p.name for p in OtherPerson.objects.all()]
  139. self.assertEqual(resp, ['barney', 'wilma'])
  140. resp = [p.name for p in OtherPerson.excluder.all()]
  141. self.assertEqual(resp, ['barney', 'fred'])
  142. resp = [p.name for p in OtherPerson._default_manager.all()]
  143. self.assertEqual(resp, ['barney', 'wilma'])
  144. def test_proxy_model_signals(self):
  145. """
  146. Test save signals for proxy models
  147. """
  148. output = []
  149. def make_handler(model, event):
  150. def _handler(*args, **kwargs):
  151. output.append('%s %s save' % (model, event))
  152. return _handler
  153. h1 = make_handler('MyPerson', 'pre')
  154. h2 = make_handler('MyPerson', 'post')
  155. h3 = make_handler('Person', 'pre')
  156. h4 = make_handler('Person', 'post')
  157. signals.pre_save.connect(h1, sender=MyPerson)
  158. signals.post_save.connect(h2, sender=MyPerson)
  159. signals.pre_save.connect(h3, sender=Person)
  160. signals.post_save.connect(h4, sender=Person)
  161. dino = MyPerson.objects.create(name=u"dino")
  162. self.assertEqual(output, [
  163. 'MyPerson pre save',
  164. 'MyPerson post save'
  165. ])
  166. output = []
  167. h5 = make_handler('MyPersonProxy', 'pre')
  168. h6 = make_handler('MyPersonProxy', 'post')
  169. signals.pre_save.connect(h5, sender=MyPersonProxy)
  170. signals.post_save.connect(h6, sender=MyPersonProxy)
  171. dino = MyPersonProxy.objects.create(name=u"pebbles")
  172. self.assertEqual(output, [
  173. 'MyPersonProxy pre save',
  174. 'MyPersonProxy post save'
  175. ])
  176. signals.pre_save.disconnect(h1, sender=MyPerson)
  177. signals.post_save.disconnect(h2, sender=MyPerson)
  178. signals.pre_save.disconnect(h3, sender=Person)
  179. signals.post_save.disconnect(h4, sender=Person)
  180. signals.pre_save.disconnect(h5, sender=MyPersonProxy)
  181. signals.post_save.disconnect(h6, sender=MyPersonProxy)
  182. def test_content_type(self):
  183. ctype = ContentType.objects.get_for_model
  184. self.assertTrue(ctype(Person) is ctype(OtherPerson))
  185. def test_user_userproxy_userproxyproxy(self):
  186. User.objects.create(name='Bruce')
  187. resp = [u.name for u in User.objects.all()]
  188. self.assertEqual(resp, ['Bruce'])
  189. resp = [u.name for u in UserProxy.objects.all()]
  190. self.assertEqual(resp, ['Bruce'])
  191. resp = [u.name for u in UserProxyProxy.objects.all()]
  192. self.assertEqual(resp, ['Bruce'])
  193. def test_proxy_delete(self):
  194. """
  195. Proxy objects can be deleted
  196. """
  197. User.objects.create(name='Bruce')
  198. u2 = UserProxy.objects.create(name='George')
  199. resp = [u.name for u in UserProxy.objects.all()]
  200. self.assertEqual(resp, ['Bruce', 'George'])
  201. u2.delete()
  202. resp = [u.name for u in UserProxy.objects.all()]
  203. self.assertEqual(resp, ['Bruce'])
  204. def test_select_related(self):
  205. """
  206. We can still use `select_related()` to include related models in our
  207. querysets.
  208. """
  209. country = Country.objects.create(name='Australia')
  210. state = State.objects.create(name='New South Wales', country=country)
  211. resp = [s.name for s in State.objects.select_related()]
  212. self.assertEqual(resp, ['New South Wales'])
  213. resp = [s.name for s in StateProxy.objects.select_related()]
  214. self.assertEqual(resp, ['New South Wales'])
  215. self.assertEqual(StateProxy.objects.get(name='New South Wales').name,
  216. 'New South Wales')
  217. resp = StateProxy.objects.select_related().get(name='New South Wales')
  218. self.assertEqual(resp.name, 'New South Wales')
  219. def test_proxy_bug(self):
  220. contributor = TrackerUser.objects.create(name='Contributor',
  221. status='contrib')
  222. someone = BaseUser.objects.create(name='Someone')
  223. Bug.objects.create(summary='fix this', version='1.1beta',
  224. assignee=contributor, reporter=someone)
  225. pcontributor = ProxyTrackerUser.objects.create(name='OtherContributor',
  226. status='proxy')
  227. Improvement.objects.create(summary='improve that', version='1.1beta',
  228. assignee=contributor, reporter=pcontributor,
  229. associated_bug=ProxyProxyBug.objects.all()[0])
  230. # Related field filter on proxy
  231. resp = ProxyBug.objects.get(version__icontains='beta')
  232. self.assertEqual(repr(resp), '<ProxyBug: ProxyBug:fix this>')
  233. # Select related + filter on proxy
  234. resp = ProxyBug.objects.select_related().get(version__icontains='beta')
  235. self.assertEqual(repr(resp), '<ProxyBug: ProxyBug:fix this>')
  236. # Proxy of proxy, select_related + filter
  237. resp = ProxyProxyBug.objects.select_related().get(
  238. version__icontains='beta'
  239. )
  240. self.assertEqual(repr(resp), '<ProxyProxyBug: ProxyProxyBug:fix this>')
  241. # Select related + filter on a related proxy field
  242. resp = ProxyImprovement.objects.select_related().get(
  243. reporter__name__icontains='butor'
  244. )
  245. self.assertEqual(repr(resp),
  246. '<ProxyImprovement: ProxyImprovement:improve that>'
  247. )
  248. # Select related + filter on a related proxy of proxy field
  249. resp = ProxyImprovement.objects.select_related().get(
  250. associated_bug__summary__icontains='fix'
  251. )
  252. self.assertEqual(repr(resp),
  253. '<ProxyImprovement: ProxyImprovement:improve that>'
  254. )
  255. def test_proxy_load_from_fixture(self):
  256. management.call_command('loaddata', 'mypeople.json', verbosity=0, commit=False)
  257. p = MyPerson.objects.get(pk=100)
  258. self.assertEqual(p.name, 'Elvis Presley')