test_models.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import datetime
  2. from django.test import TestCase
  3. from django.core.exceptions import ValidationError
  4. from ..models import (
  5. Cost, CostUse, Document, Good, GoodUse, Service)
  6. class ServiceTests(TestCase):
  7. def setUp(self):
  8. self.doc = Document.objects.create(name='budget')
  9. self.electricity_cost = Cost.objects.create(
  10. name='electricity',
  11. price=10,
  12. document=self.doc,
  13. )
  14. self.server = Good.objects.create(
  15. name="Computer",
  16. price=10,
  17. document=self.doc,
  18. provisioning_duration=datetime.timedelta(days=365*3),
  19. )
  20. def test_get_prices_zero(self):
  21. s = Service.objects.create(name='Foo', document=self.doc)
  22. self.assertEqual(s.get_prices(), {
  23. 'total_costs_price': 0,
  24. 'unit_costs_price': 0,
  25. 'unit_goods_value_share': 0,
  26. 'total_goods_value_share': 0,
  27. })
  28. def test_get_prices_w_costs(self):
  29. s = Service.objects.create(name='Foo', document=self.doc)
  30. CostUse.objects.create(
  31. service=s, resource=self.electricity_cost, share=0.4)
  32. self.assertEqual(s.get_prices(), {
  33. 'total_costs_price': 10,
  34. 'unit_costs_price': 0,
  35. 'unit_goods_value_share': 0,
  36. 'total_goods_value_share': 0,
  37. })
  38. s.subscriptions_count = 2
  39. s.save()
  40. self.assertEqual(s.get_prices(), {
  41. 'total_costs_price': 10,
  42. 'unit_costs_price': 5,
  43. 'unit_goods_value_share': 0,
  44. 'total_goods_value_share': 0,
  45. })
  46. def test_get_prices_w_goods(self):
  47. s = Service.objects.create(
  48. name='Foo', document=self.doc, subscriptions_count=0)
  49. GoodUse.objects.create(
  50. service=s, resource=self.server, share=0.4)
  51. self.assertEqual(s.get_prices(), {
  52. 'total_costs_price': 10/(365*3)*365.25/12,
  53. 'unit_costs_price': 0,
  54. 'unit_goods_value_share': 0,
  55. 'total_goods_value_share': 10.0,
  56. })
  57. s.subscriptions_count = 2
  58. s.save()
  59. self.assertEqual(s.get_prices(), {
  60. 'total_costs_price': 10/(365*3)*365.25/12,
  61. 'unit_costs_price': 10/(365*3)*365.25/12/2,
  62. 'unit_goods_value_share': 5,
  63. 'total_goods_value_share': 10,
  64. })
  65. class AbstractUseTests(TestCase):
  66. """ Testing AbstractUseTests through CostUse
  67. """
  68. def setUp(self):
  69. self.doc = Document.objects.create(name='budget')
  70. self.hosting_service = Service.objects.create(
  71. name='Physical hosting', document=self.doc)
  72. self.mailbox_service = Service.objects.create(
  73. name='Mailbox', document=self.doc)
  74. self.electricity_cost = Cost.objects.create(
  75. name='electricity',
  76. price=10,
  77. document=self.doc,
  78. capacity_unit='A',
  79. total_capacity=4,
  80. )
  81. def test_can_add_service_share(self):
  82. use = CostUse(
  83. service=self.hosting_service,
  84. resource=self.electricity_cost,
  85. share=0.4)
  86. use.full_clean()
  87. use.save()
  88. def test_can_add_service_share_with_custom_unity(self):
  89. use = CostUse(
  90. service=self.hosting_service,
  91. resource=self.electricity_cost,
  92. share=2) # means 2 Amps
  93. self.hosting_service.subscriptions_count = 2
  94. self.hosting_service.save()
  95. use.full_clean()
  96. use.save()
  97. self.assertEqual(use.share, 2.0)
  98. self.assertEqual(use.real_share(), 4.0)
  99. self.assertEqual(use.cost_share(), 10)
  100. self.assertEqual(use.unit_cost_share(), 5)
  101. def test_cannot_add_excess_share_one(self):
  102. use = CostUse(
  103. service=self.hosting_service,
  104. resource=self.electricity_cost,
  105. share=40.1)
  106. with self.assertRaises(ValidationError):
  107. use.full_clean()
  108. use.save()
  109. def test_add_several_service_share(self):
  110. u1 = CostUse(
  111. service=self.hosting_service,
  112. resource=self.electricity_cost,
  113. share=0.4)
  114. u1.full_clean()
  115. u1.save()
  116. u2 = CostUse(
  117. service=self.mailbox_service,
  118. resource=self.electricity_cost,
  119. share=0.6)
  120. u2.full_clean()
  121. u2.save()
  122. def test_add_several_service_share_excessive_sum(self):
  123. u1 = CostUse(
  124. service=self.hosting_service,
  125. resource=self.electricity_cost,
  126. share=3)
  127. u1.full_clean()
  128. u1.save()
  129. u2 = CostUse(
  130. service=self.mailbox_service,
  131. resource=self.electricity_cost,
  132. share=1.1)
  133. # Would be 4.1 out of 4 amp...
  134. with self.assertRaises(ValidationError):
  135. u2.full_clean()
  136. u2.save()
  137. def test_modify_service_share_no_error(self):
  138. u1 = CostUse(
  139. service=self.hosting_service,
  140. resource=self.electricity_cost,
  141. share=1)
  142. u1.full_clean()
  143. u1.save()
  144. u1.full_clean()
  145. u1.save()
  146. def test_real_shares(self):
  147. u1 = CostUse.objects.create(
  148. service=self.hosting_service,
  149. resource=self.electricity_cost,
  150. share=1.6)
  151. u2 = CostUse.objects.create(
  152. service=self.hosting_service,
  153. resource=self.electricity_cost,
  154. share=0.6)
  155. self.assertEqual(u1.real_share() + u2.real_share(), 4)
  156. self.assertEqual(u1.share/u2.share, u1.real_share()/u2.real_share())
  157. def test_unit_value_share(self):
  158. self.mailbox_service.subscriptions_count = 2
  159. self.mailbox_service.share = 0.5
  160. self.hosting_service.save()
  161. self.hosting_service.subscriptions_count = 1
  162. self.hosting_service.share = 0.5
  163. self.hosting_service.save()
  164. mailbox_use = CostUse.objects.create(
  165. service=self.mailbox_service,
  166. resource=self.electricity_cost,
  167. share=2)
  168. hosting_use = CostUse.objects.create(
  169. service=self.hosting_service,
  170. resource=self.electricity_cost,
  171. share=2)
  172. self.assertEqual(mailbox_use.value_share(), 5)
  173. self.assertEqual(mailbox_use.unit_value_share(), 2.5)
  174. self.assertEqual(hosting_use.value_share(), 5)
  175. self.assertEqual(hosting_use.unit_value_share(), 5)
  176. def test_used(self):
  177. CostUse.objects.create(
  178. service=self.mailbox_service,
  179. resource=self.electricity_cost,
  180. share=0.5)
  181. self.assertEqual(self.electricity_cost.used(), 0.5)
  182. self.assertEqual(self.electricity_cost.unused(), 3.5)