tests.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. from django.test import TestCase, Client
  4. from coin.members.tests import MemberTestsUtils
  5. from coin.members.models import Member, LdapUser
  6. from coin.billing.models import Invoice
  7. from coin.offers.models import Offer, Service, OfferSubscription
  8. from coin.billing.create_subscriptions_invoices import create_member_invoice_for_a_period
  9. class BillingInvoiceCreationTests(TestCase):
  10. def test_first_subscription_invoice_has_initial_fees(self):
  11. """
  12. Test que la première facture générée pour un abonnement possède les
  13. frais de mise en service
  14. """
  15. # Créé une offre
  16. service = Service(name='ServiceTest')
  17. service.save()
  18. offer = Offer(name='Offre', billing_period=3, period_fees=30,
  19. initial_fees=50, service=service)
  20. offer.save()
  21. # Créé un membre
  22. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  23. member = Member(first_name='Balthazar', last_name='Picsou',
  24. ldap_cn=ldap_cn)
  25. member.save()
  26. # Créé un abonnement
  27. subscription = OfferSubscription(
  28. subscription_date=datetime.date(2014, 1, 1),
  29. member=member,
  30. offer=offer)
  31. subscription.save()
  32. # Demande la création de la première facture
  33. invoice = create_member_invoice_for_a_period(
  34. member, datetime.date(2014, 1, 1))
  35. # La facture doit avoir les frais de mise en service
  36. # Pour tester cela on tri par montant d'item décroissant.
  37. # Comme dans l'offre créé, les initial_fees sont plus élevées que
  38. # les period_fees, il doit sortir en premier
  39. self.assertEqual(invoice.details.order_by('-amount').first().amount, 50)
  40. def test_subscription_cant_be_charged_twice(self):
  41. """
  42. Test qu'un abonnement ne peut pas être facturé deux fois
  43. (pas de chevauchement possible)
  44. """
  45. # Créé une offre
  46. service = Service(name='ServiceTest')
  47. service.save()
  48. offer = Offer(name='Offre', billing_period=3, period_fees=30,
  49. initial_fees=0, service=service)
  50. offer.save()
  51. # Créé un membre
  52. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  53. member = Member(first_name='Balthazar', last_name='Picsou',
  54. ldap_cn=ldap_cn)
  55. member.save()
  56. # Créé un abonnement
  57. subscription = OfferSubscription(
  58. subscription_date=datetime.date(2014, 1, 1),
  59. member=member,
  60. offer=offer)
  61. subscription.save()
  62. # Créé une facture
  63. invoice = Invoice(member=member)
  64. invoice.save()
  65. # Créé une facturation pour cet abonnement pour la première période
  66. # de janvier à mars
  67. invoice.details.create(label=offer.name,
  68. amount=offer.period_fees,
  69. offersubscription=subscription,
  70. period_from=datetime.date(2014, 1, 1),
  71. period_to=datetime.date(2014, 3, 31))
  72. # Créé une facturation pour cet abonnement pour une seconde période
  73. # de juin à aout
  74. invoice.details.create(label=offer.name,
  75. amount=offer.period_fees,
  76. offersubscription=subscription,
  77. period_from=datetime.date(2014, 6, 1),
  78. period_to=datetime.date(2014, 8, 31))
  79. # Demande la génération d'une facture pour février
  80. # Elle doit renvoyer None car l'offre est déjà facturée de
  81. # janvier à mars
  82. invoice_test_1 = create_member_invoice_for_a_period(
  83. member, datetime.date(2014, 2, 1))
  84. self.assertEqual(invoice_test_1, None)
  85. # Demande la création d'une facture pour avril
  86. # Elle doit fonctionner, mais devrait avoir une période de facturation
  87. # que de 2 mois, d'avril à mai car il y a déjà une facture pour
  88. # la période de juin à aout
  89. invoice_test_2 = create_member_invoice_for_a_period(
  90. member, datetime.date(2014, 4, 1))
  91. self.assertEqual(invoice_test_2.details.first().period_from,
  92. datetime.date(2014, 4, 1))
  93. self.assertEqual(invoice_test_2.details.first().period_to,
  94. datetime.date(2014, 5, 31))
  95. LdapUser.objects.get(pk=ldap_cn).delete()
  96. class BillingPDFTests(TestCase):
  97. def test_download_invoice_pdf_return_a_pdf(self):
  98. """
  99. Test que le téléchargement d'une facture en format pdf retourne bien un
  100. pdf
  101. """
  102. # Créé un membre
  103. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  104. member = Member(first_name='A', last_name='A',
  105. ldap_cn=ldap_cn)
  106. member.save()
  107. member.change_password('1234')
  108. # Créé une facture
  109. invoice = Invoice(member=member)
  110. invoice.save()
  111. # Se connect en tant que le membre
  112. client = Client()
  113. client.login(username=ldap_cn, password='1234')
  114. # Tente de télécharger la facture
  115. response = client.get('/billing/invoice/%i/pdf' % invoice.id)
  116. # Vérifie return code 200 et contient chaine %PDF-1.
  117. self.assertContains(response, '%PDF-1.', status_code=200, html=False)
  118. LdapUser.objects.get(pk=ldap_cn).delete()
  119. def test_that_only_owner_of_invoice_can_download_it_as_pdf(self):
  120. """
  121. Test qu'une facture ne peut pas être téléchargée par quelqu'un qui n'en
  122. est pas le propriétaire.
  123. Test qu'une erreur 403 est bien retournée en cas de tentative
  124. infructueuse
  125. """
  126. # Créé un membre B
  127. member_a_login = MemberTestsUtils.get_random_ldap_cn()
  128. member_a_pwd = '1234'
  129. member_a = Member(first_name='A', last_name='A',
  130. ldap_cn=member_a_login)
  131. member_a.save()
  132. member_a.change_password(member_a_pwd)
  133. # Créé un membre B
  134. member_b_login = MemberTestsUtils.get_random_ldap_cn()
  135. member_b_pwd = '1234'
  136. member_b = Member(first_name='B', last_name='B',
  137. ldap_cn=member_b_login)
  138. member_b.save()
  139. member_b.change_password(member_b_pwd)
  140. # Créé une facture pour le membre A
  141. invoice_a = Invoice(member=member_a)
  142. invoice_a.save()
  143. # Simule une connexion en tant que A
  144. client = Client()
  145. client.login(username=member_a_login, password=member_a_pwd)
  146. # Tente de télécharger la facture de A en tant que A
  147. response = client.get('/billing/invoice/%i/pdf' % invoice_a.id)
  148. # Vérifie que B a reçu retour OK 200
  149. self.assertEqual(response.status_code, 200)
  150. # Simule une connexion en tant que B
  151. client = Client()
  152. client.login(username=member_b_login, password=member_b_pwd)
  153. # Tente de télécharger la facture de A en tant que B
  154. response = client.get('/billing/invoice/%i/pdf' % invoice_a.id)
  155. # Vérifie que B a reçu retour Forbidden 403
  156. self.assertEqual(response.status_code, 403)
  157. LdapUser.objects.get(pk=member_a_login).delete()
  158. LdapUser.objects.get(pk=member_b_login).delete()