Statistics
| Branch: | Tag: | Revision:

root / logic / tests.py @ 44193110

History | View | Annotate | Download (5 kB)

1 09c936a7 Vassilios Karakoidas
#
2 09c936a7 Vassilios Karakoidas
# Unit Tests for logic
3 09c936a7 Vassilios Karakoidas
#
4 09c936a7 Vassilios Karakoidas
# Provides automated tests for logic module
5 09c936a7 Vassilios Karakoidas
#
6 09c936a7 Vassilios Karakoidas
# Copyright 2010 Greek Research and Technology Network
7 09c936a7 Vassilios Karakoidas
#
8 92c53da1 Vassilios Karakoidas
9 420f2c20 Georgios Gousios
from synnefo.db.models import *
10 420f2c20 Georgios Gousios
from synnefo.logic import credits
11 420f2c20 Georgios Gousios
from synnefo.logic import users
12 92c53da1 Vassilios Karakoidas
from django.test import TestCase
13 44193110 Georgios Gousios
from django.core.exceptions import ObjectDoesNotExist
14 44193110 Georgios Gousios
15 44193110 Georgios Gousios
import hashlib
16 92c53da1 Vassilios Karakoidas
17 8d97deff Vassilios Karakoidas
class CostsTestCase(TestCase):
18 8d97deff Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
19 8d97deff Vassilios Karakoidas
20 8d97deff Vassilios Karakoidas
    def test_get_costs(self):
21 8d97deff Vassilios Karakoidas
        """Test the Flavor cost-related methods method"""
22 8d97deff Vassilios Karakoidas
        # first an easy test, a Flavor with only one FlavorCost entry
23 8d97deff Vassilios Karakoidas
        flavor = Flavor.objects.get(pk=30001)
24 8d97deff Vassilios Karakoidas
25 8d97deff Vassilios Karakoidas
        start_date = datetime.datetime(year=2010, month=1, day=1)
26 8d97deff Vassilios Karakoidas
        end_date = datetime.datetime(year=2010, month=1, day=2)
27 8d97deff Vassilios Karakoidas
28 8d97deff Vassilios Karakoidas
        # we now that the cost should be 5*24 (inactive) and 10*24 (active)
29 8d97deff Vassilios Karakoidas
        r_active = credits.get_cost_active(flavor, start_date, end_date)
30 8d97deff Vassilios Karakoidas
        r_inactive = credits.get_cost_inactive(flavor, start_date, end_date)
31 8d97deff Vassilios Karakoidas
32 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_active), 1, 'get_cost_active() should have returned 1 entry (%d)' %(len(r_active),))
33 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_inactive), 1, 'get_cost_inactive() should have returned 1 entry (%d)'% (len(r_inactive),))
34 8d97deff Vassilios Karakoidas
35 8d97deff Vassilios Karakoidas
        self.assertEqual(10*24, r_active[0][1], 'get_cost_active() is not working properly (%d!=%d)' % (r_active[0][1], 10*24))
36 8d97deff Vassilios Karakoidas
        self.assertEqual(5*24, r_inactive[0][1], 'get_cost_inactive() is not working properly (%d!=%d)' % (r_inactive[0][1], 5*24))
37 8d97deff Vassilios Karakoidas
38 8d97deff Vassilios Karakoidas
        # The second test, will involve a more complex cost example
39 8d97deff Vassilios Karakoidas
        # The overall cost will be calculated by two FlavorCost entries
40 8d97deff Vassilios Karakoidas
41 8d97deff Vassilios Karakoidas
        flavor = Flavor.objects.get(pk=30000)
42 8d97deff Vassilios Karakoidas
43 8d97deff Vassilios Karakoidas
        start_date = datetime.datetime(year=2010, month=12, day=31)
44 8d97deff Vassilios Karakoidas
        end_date = datetime.datetime(year=2011, month=01, day=2)
45 8d97deff Vassilios Karakoidas
46 8d97deff Vassilios Karakoidas
        # this is more complicated, active costs are 5*24 + 10*24 = 360
47 8d97deff Vassilios Karakoidas
        # and inactive costs are 2*24 + 5*24 = 168
48 8d97deff Vassilios Karakoidas
49 8d97deff Vassilios Karakoidas
        r_active = credits.get_cost_active(flavor, start_date, end_date)
50 8d97deff Vassilios Karakoidas
        r_inactive = credits.get_cost_inactive(flavor, start_date, end_date)
51 8d97deff Vassilios Karakoidas
52 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_active), 2, 'get_cost_active() should have returned 2 entries (%d)' %(len(r_active),))
53 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_inactive), 2, 'get_cost_inactive() should have returned 2 entries (%d)'% (len(r_inactive),))
54 8d97deff Vassilios Karakoidas
55 8d97deff Vassilios Karakoidas
        ta_cost = sum([x[1] for x in r_active])
56 8d97deff Vassilios Karakoidas
        tia_cost = sum([x[1] for x in r_inactive])
57 8d97deff Vassilios Karakoidas
58 8d97deff Vassilios Karakoidas
        self.assertEqual(360, ta_cost, 'get_cost_active() is not working properly (%d!=%d)' % (ta_cost, 360))
59 8d97deff Vassilios Karakoidas
        self.assertEqual(168, tia_cost, 'get_cost_inactive() is not working properly (%d!=%d)' % (tia_cost, 168))
60 92c53da1 Vassilios Karakoidas
61 8d97deff Vassilios Karakoidas
        
62 92c53da1 Vassilios Karakoidas
class ChargeTestCase(TestCase):
63 92c53da1 Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
64 92c53da1 Vassilios Karakoidas
65 92c53da1 Vassilios Karakoidas
    def test_charge_method(self):
66 92c53da1 Vassilios Karakoidas
        """Test VirtualMachine.charge() method"""
67 92c53da1 Vassilios Karakoidas
68 92c53da1 Vassilios Karakoidas
        # Since we have tested the costs, with this test
69 92c53da1 Vassilios Karakoidas
        # we must ensure the following:
70 92c53da1 Vassilios Karakoidas
        # 1. The vm.charged is updated
71 92c53da1 Vassilios Karakoidas
        # 2. Users credits are decreased
72 92c53da1 Vassilios Karakoidas
73 92c53da1 Vassilios Karakoidas
        vm_started = VirtualMachine.objects.get(pk=30000)
74 92c53da1 Vassilios Karakoidas
75 92c53da1 Vassilios Karakoidas
        initial_date = vm_started.charged
76 92c53da1 Vassilios Karakoidas
        initial_credits = vm_started.owner.credit
77 92c53da1 Vassilios Karakoidas
78 92c53da1 Vassilios Karakoidas
        credits.charge(vm_started)
79 92c53da1 Vassilios Karakoidas
80 92c53da1 Vassilios Karakoidas
        self.assertTrue(vm_started.charged > initial_date, 'Initial charged date should not be greater')
81 92c53da1 Vassilios Karakoidas
        self.assertTrue(initial_credits > vm_started.owner.credit, 'The user should have less credits now! (%d>%d)' % (initial_credits, vm_started.owner.credit))
82 92c53da1 Vassilios Karakoidas
83 92c53da1 Vassilios Karakoidas
84 8d97deff Vassilios Karakoidas
class DebitAccountTestCase(TestCase):
85 92c53da1 Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
86 92c53da1 Vassilios Karakoidas
87 8d97deff Vassilios Karakoidas
    def test_debit_account(self):
88 92c53da1 Vassilios Karakoidas
        """Test a SynnefoUser object"""
89 92c53da1 Vassilios Karakoidas
        s_user = SynnefoUser.objects.get(pk=30000)
90 92c53da1 Vassilios Karakoidas
        v_machine = VirtualMachine.objects.get(pk=30000)
91 92c53da1 Vassilios Karakoidas
92 92c53da1 Vassilios Karakoidas
        # charge the user
93 92c53da1 Vassilios Karakoidas
        credits.debit_account(s_user, 10, v_machine, "This should be a structured debit message!")
94 92c53da1 Vassilios Karakoidas
95 92c53da1 Vassilios Karakoidas
        # should have only one debit object
96 92c53da1 Vassilios Karakoidas
        d_list = Debit.objects.all()
97 92c53da1 Vassilios Karakoidas
98 8d97deff Vassilios Karakoidas
        self.assertEqual(len(d_list), 1, 'debit_account() writes more than one or zero (%d) debit entries!' % ( len(d_list), ))
99 92c53da1 Vassilios Karakoidas
100 92c53da1 Vassilios Karakoidas
        # retrieve the user, now he/she should have zero credits
101 92c53da1 Vassilios Karakoidas
        s_user = SynnefoUser.objects.get(pk=30000)
102 92c53da1 Vassilios Karakoidas
103 92c53da1 Vassilios Karakoidas
        self.assertEqual(0, s_user.credit, 'SynnefoUser (pk=30000) should have zero credits (%d)' % ( s_user.credit, ))
104 420f2c20 Georgios Gousios
105 420f2c20 Georgios Gousios
class AuthTestCase(TestCase):
106 420f2c20 Georgios Gousios
    fixtures = [ 'db_test_data' ]
107 44193110 Georgios Gousios
108 44193110 Georgios Gousios
    def _register_user(self):
109 420f2c20 Georgios Gousios
        users.register_student ("Jimmy Page", "jpage", "jpage@zoso.com")
110 420f2c20 Georgios Gousios
        user = SynnefoUser.objects.get(name = "jpage")
111 76cc889c Georgios Gousios
112 44193110 Georgios Gousios
        return user
113 44193110 Georgios Gousios
114 44193110 Georgios Gousios
    def test_register(self):
115 44193110 Georgios Gousios
        """ test user registration
116 44193110 Georgios Gousios
        """
117 44193110 Georgios Gousios
        user = self._register_user()
118 44193110 Georgios Gousios
        self.assertNotEquals(user, None)
119 44193110 Georgios Gousios
        
120 44193110 Georgios Gousios
        #Check hash generation
121 44193110 Georgios Gousios
        md5 = hashlib.md5()
122 44193110 Georgios Gousios
        md5.update(user.uniq)
123 44193110 Georgios Gousios
        md5.update(user.name)
124 44193110 Georgios Gousios
125 44193110 Georgios Gousios
        self.assertEquals(user.auth_token, md5.hexdigest())
126 44193110 Georgios Gousios
127 44193110 Georgios Gousios
    def test_del_user(self):
128 44193110 Georgios Gousios
        """ test user deletion
129 44193110 Georgios Gousios
        """
130 44193110 Georgios Gousios
        user = self._register_user()
131 44193110 Georgios Gousios
        users.delete_user(user)
132 44193110 Georgios Gousios
        user1 = None
133 44193110 Georgios Gousios
134 44193110 Georgios Gousios
        try:
135 44193110 Georgios Gousios
            user1 = SynnefoUser.objects.get(name = "jpage")
136 44193110 Georgios Gousios
        except ObjectDoesNotExist:
137 44193110 Georgios Gousios
            self.assertEquals(user1, None)