tests.py 7.7 KB

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