tests.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from django import db
  2. from django.conf import settings
  3. from django.test import TestCase
  4. from models import (User, UserProfile, UserStat, UserStatResult, StatDetails,
  5. AdvancedUserStat, Image, Product)
  6. class ReverseSelectRelatedTestCase(TestCase):
  7. def setUp(self):
  8. user = User.objects.create(username="test")
  9. userprofile = UserProfile.objects.create(user=user, state="KS",
  10. city="Lawrence")
  11. results = UserStatResult.objects.create(results='first results')
  12. userstat = UserStat.objects.create(user=user, posts=150,
  13. results=results)
  14. details = StatDetails.objects.create(base_stats=userstat, comments=259)
  15. user2 = User.objects.create(username="bob")
  16. results2 = UserStatResult.objects.create(results='moar results')
  17. advstat = AdvancedUserStat.objects.create(user=user2, posts=200, karma=5,
  18. results=results2)
  19. StatDetails.objects.create(base_stats=advstat, comments=250)
  20. def test_basic(self):
  21. def test():
  22. u = User.objects.select_related("userprofile").get(username="test")
  23. self.assertEqual(u.userprofile.state, "KS")
  24. self.assertNumQueries(1, test)
  25. def test_follow_next_level(self):
  26. def test():
  27. u = User.objects.select_related("userstat__results").get(username="test")
  28. self.assertEqual(u.userstat.posts, 150)
  29. self.assertEqual(u.userstat.results.results, 'first results')
  30. self.assertNumQueries(1, test)
  31. def test_follow_two(self):
  32. def test():
  33. u = User.objects.select_related("userprofile", "userstat").get(username="test")
  34. self.assertEqual(u.userprofile.state, "KS")
  35. self.assertEqual(u.userstat.posts, 150)
  36. self.assertNumQueries(1, test)
  37. def test_follow_two_next_level(self):
  38. def test():
  39. u = User.objects.select_related("userstat__results", "userstat__statdetails").get(username="test")
  40. self.assertEqual(u.userstat.results.results, 'first results')
  41. self.assertEqual(u.userstat.statdetails.comments, 259)
  42. self.assertNumQueries(1, test)
  43. def test_forward_and_back(self):
  44. def test():
  45. stat = UserStat.objects.select_related("user__userprofile").get(user__username="test")
  46. self.assertEqual(stat.user.userprofile.state, 'KS')
  47. self.assertEqual(stat.user.userstat.posts, 150)
  48. self.assertNumQueries(1, test)
  49. def test_back_and_forward(self):
  50. def test():
  51. u = User.objects.select_related("userstat").get(username="test")
  52. self.assertEqual(u.userstat.user.username, 'test')
  53. self.assertNumQueries(1, test)
  54. def test_not_followed_by_default(self):
  55. def test():
  56. u = User.objects.select_related().get(username="test")
  57. self.assertEqual(u.userstat.posts, 150)
  58. self.assertNumQueries(2, test)
  59. def test_follow_from_child_class(self):
  60. def test():
  61. stat = AdvancedUserStat.objects.select_related('user', 'statdetails').get(posts=200)
  62. self.assertEqual(stat.statdetails.comments, 250)
  63. self.assertEqual(stat.user.username, 'bob')
  64. self.assertNumQueries(1, test)
  65. def test_follow_inheritance(self):
  66. def test():
  67. stat = UserStat.objects.select_related('user', 'advanceduserstat').get(posts=200)
  68. self.assertEqual(stat.advanceduserstat.posts, 200)
  69. self.assertEqual(stat.user.username, 'bob')
  70. self.assertEqual(stat.advanceduserstat.user.username, 'bob')
  71. self.assertNumQueries(1, test)
  72. def test_nullable_relation(self):
  73. im = Image.objects.create(name="imag1")
  74. p1 = Product.objects.create(name="Django Plushie", image=im)
  75. p2 = Product.objects.create(name="Talking Django Plushie")
  76. self.assertEqual(len(Product.objects.select_related("image")), 2)