Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / helpdesk / tests.py @ 0efb43cd

History | View | Annotate | Download (14.2 kB)

1 b4b82ec4 Giorgos Korfiatis
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 c4d1f3b7 Kostas Papadimitriou
#
3 c4d1f3b7 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 c4d1f3b7 Kostas Papadimitriou
# without modification, are permitted provided that the following
5 c4d1f3b7 Kostas Papadimitriou
# conditions are met:
6 c4d1f3b7 Kostas Papadimitriou
#
7 c4d1f3b7 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 c4d1f3b7 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 c4d1f3b7 Kostas Papadimitriou
#      disclaimer.
10 c4d1f3b7 Kostas Papadimitriou
#
11 c4d1f3b7 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 c4d1f3b7 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 c4d1f3b7 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 c4d1f3b7 Kostas Papadimitriou
#      provided with the distribution.
15 c4d1f3b7 Kostas Papadimitriou
#
16 c4d1f3b7 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 c4d1f3b7 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 c4d1f3b7 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 c4d1f3b7 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 c4d1f3b7 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 c4d1f3b7 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 c4d1f3b7 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 c4d1f3b7 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 c4d1f3b7 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 c4d1f3b7 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 c4d1f3b7 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 c4d1f3b7 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 c4d1f3b7 Kostas Papadimitriou
#
29 c4d1f3b7 Kostas Papadimitriou
# The views and conclusions contained in the software and
30 c4d1f3b7 Kostas Papadimitriou
# documentation are those of the authors and should not be
31 c4d1f3b7 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 c4d1f3b7 Kostas Papadimitriou
# or implied, of GRNET S.A.
33 c4d1f3b7 Kostas Papadimitriou
#
34 c4d1f3b7 Kostas Papadimitriou
35 cc5c8608 Kostas Papadimitriou
import mock
36 cc5c8608 Kostas Papadimitriou
37 c4d1f3b7 Kostas Papadimitriou
from django.test import TestCase, Client
38 c4d1f3b7 Kostas Papadimitriou
from django.conf import settings
39 c4d1f3b7 Kostas Papadimitriou
from django.core.urlresolvers import reverse
40 8c7f5877 Christos Stavrakakis
from snf_django.utils.testing import mocked_quotaholder
41 c4d1f3b7 Kostas Papadimitriou
42 d59d86d4 Kostas Papadimitriou
43 505a121e Kostas Papadimitriou
USER1 = "5edcb5aa-1111-4146-a8ed-2b6287824353"
44 505a121e Kostas Papadimitriou
USER2 = "5edcb5aa-2222-4146-a8ed-2b6287824353"
45 505a121e Kostas Papadimitriou
46 505a121e Kostas Papadimitriou
USERS_UUIDS = {}
47 505a121e Kostas Papadimitriou
USERS_UUIDS[USER1] = {'displayname': 'testuser@test.com'}
48 505a121e Kostas Papadimitriou
USERS_UUIDS[USER2] = {'displayname': 'testuser2@test.com'}
49 505a121e Kostas Papadimitriou
50 505a121e Kostas Papadimitriou
USERS_DISPLAYNAMES = dict(map(lambda k: (k[1]['displayname'], {'uuid': k[0]}),
51 505a121e Kostas Papadimitriou
                          USERS_UUIDS.iteritems()))
52 505a121e Kostas Papadimitriou
53 cc5c8608 Kostas Papadimitriou
from synnefo.db import models_factory as mfactory
54 cc5c8608 Kostas Papadimitriou
55 468ba00b Ilias Tsitsimpis
56 468ba00b Ilias Tsitsimpis
class AstakosClientMock():
57 468ba00b Ilias Tsitsimpis
    def __init__(*args, **kwargs):
58 468ba00b Ilias Tsitsimpis
        pass
59 468ba00b Ilias Tsitsimpis
60 e407f159 Ilias Tsitsimpis
    def get_username(self, uuid):
61 468ba00b Ilias Tsitsimpis
        try:
62 468ba00b Ilias Tsitsimpis
            return USERS_UUIDS.get(uuid)['displayname']
63 468ba00b Ilias Tsitsimpis
        except TypeError:
64 468ba00b Ilias Tsitsimpis
            return None
65 468ba00b Ilias Tsitsimpis
66 e407f159 Ilias Tsitsimpis
    def get_uuid(self, display_name):
67 468ba00b Ilias Tsitsimpis
        try:
68 468ba00b Ilias Tsitsimpis
            return USERS_DISPLAYNAMES.get(display_name)['uuid']
69 468ba00b Ilias Tsitsimpis
        except TypeError:
70 468ba00b Ilias Tsitsimpis
            return None
71 468ba00b Ilias Tsitsimpis
72 468ba00b Ilias Tsitsimpis
73 505a121e Kostas Papadimitriou
class AuthClient(Client):
74 c4d1f3b7 Kostas Papadimitriou
75 c4d1f3b7 Kostas Papadimitriou
    def request(self, **request):
76 c4d1f3b7 Kostas Papadimitriou
        token = request.pop('user_token', '0000')
77 c4d1f3b7 Kostas Papadimitriou
        if token:
78 c4d1f3b7 Kostas Papadimitriou
            request['HTTP_X_AUTH_TOKEN'] = token
79 505a121e Kostas Papadimitriou
        return super(AuthClient, self).request(**request)
80 505a121e Kostas Papadimitriou
81 c4d1f3b7 Kostas Papadimitriou
82 e892db2d Christos Stavrakakis
def get_user_mock(request, *args, **kwargs):
83 e892db2d Christos Stavrakakis
    request.user_uniq = None
84 e892db2d Christos Stavrakakis
    request.user = None
85 e892db2d Christos Stavrakakis
    if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0000':
86 e892db2d Christos Stavrakakis
        request.user_uniq = 'test'
87 b4b82ec4 Giorgos Korfiatis
        request.user = {"access": {
88 b4b82ec4 Giorgos Korfiatis
                        "token": {
89 b4b82ec4 Giorgos Korfiatis
                            "expires": "2013-06-19T15:23:59.975572+00:00",
90 b4b82ec4 Giorgos Korfiatis
                            "id": "0000",
91 b4b82ec4 Giorgos Korfiatis
                            "tenant": {
92 b4b82ec4 Giorgos Korfiatis
                                "id": "test",
93 b4b82ec4 Giorgos Korfiatis
                                "name": "Firstname Lastname"
94 b4b82ec4 Giorgos Korfiatis
                                }
95 b4b82ec4 Giorgos Korfiatis
                            },
96 b4b82ec4 Giorgos Korfiatis
                        "serviceCatalog": [],
97 b4b82ec4 Giorgos Korfiatis
                        "user": {
98 b4b82ec4 Giorgos Korfiatis
                            "roles_links": [],
99 b4b82ec4 Giorgos Korfiatis
                            "id": "test",
100 b4b82ec4 Giorgos Korfiatis
                            "roles": [{"id": 1, "name": "default"}],
101 b4b82ec4 Giorgos Korfiatis
                            "name": "Firstname Lastname"}}
102 b4b82ec4 Giorgos Korfiatis
                        }
103 b4b82ec4 Giorgos Korfiatis
104 e892db2d Christos Stavrakakis
    if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0001':
105 e892db2d Christos Stavrakakis
        request.user_uniq = 'test'
106 b4b82ec4 Giorgos Korfiatis
        request.user = {"access": {
107 b4b82ec4 Giorgos Korfiatis
                        "token": {
108 b4b82ec4 Giorgos Korfiatis
                            "expires": "2013-06-19T15:23:59.975572+00:00",
109 b4b82ec4 Giorgos Korfiatis
                            "id": "0001",
110 b4b82ec4 Giorgos Korfiatis
                            "tenant": {
111 b4b82ec4 Giorgos Korfiatis
                                "id": "test",
112 b4b82ec4 Giorgos Korfiatis
                                "name": "Firstname Lastname"
113 b4b82ec4 Giorgos Korfiatis
                                }
114 b4b82ec4 Giorgos Korfiatis
                            },
115 b4b82ec4 Giorgos Korfiatis
                        "serviceCatalog": [],
116 b4b82ec4 Giorgos Korfiatis
                        "user": {
117 b4b82ec4 Giorgos Korfiatis
                            "roles_links": [],
118 b4b82ec4 Giorgos Korfiatis
                            "id": "test",
119 b4b82ec4 Giorgos Korfiatis
                            "roles": [{"id": 1, "name": "default"},
120 b4b82ec4 Giorgos Korfiatis
                                      {"id": 2, "name": "helpdesk"}],
121 b4b82ec4 Giorgos Korfiatis
                            "name": "Firstname Lastname"}}
122 b4b82ec4 Giorgos Korfiatis
                        }
123 e892db2d Christos Stavrakakis
124 f019f93d Ilias Tsitsimpis
125 e892db2d Christos Stavrakakis
@mock.patch("astakosclient.AstakosClient", new=AstakosClientMock)
126 e892db2d Christos Stavrakakis
@mock.patch("snf_django.lib.astakos.get_user", new=get_user_mock)
127 c4d1f3b7 Kostas Papadimitriou
class HelpdeskTests(TestCase):
128 c4d1f3b7 Kostas Papadimitriou
    """
129 c4d1f3b7 Kostas Papadimitriou
    Helpdesk tests. Test correctness of permissions and returned data.
130 c4d1f3b7 Kostas Papadimitriou
    """
131 c4d1f3b7 Kostas Papadimitriou
132 c4d1f3b7 Kostas Papadimitriou
    def setUp(self):
133 c4d1f3b7 Kostas Papadimitriou
        settings.SKIP_SSH_VALIDATION = True
134 9fd36718 Kostas Papadimitriou
        settings.HELPDESK_ENABLED = True
135 505a121e Kostas Papadimitriou
        self.client = AuthClient()
136 c4d1f3b7 Kostas Papadimitriou
137 040fcb12 Kostas Papadimitriou
        # init models
138 040fcb12 Kostas Papadimitriou
        vm1u1 = mfactory.VirtualMachineFactory(userid=USER1, name="user1 vm",
139 040fcb12 Kostas Papadimitriou
                                               pk=1001)
140 040fcb12 Kostas Papadimitriou
        vm1u2 = mfactory.VirtualMachineFactory(userid=USER2, name="user2 vm1",
141 040fcb12 Kostas Papadimitriou
                                               pk=1002)
142 040fcb12 Kostas Papadimitriou
        vm2u2 = mfactory.VirtualMachineFactory(userid=USER2, name="user2 vm2",
143 040fcb12 Kostas Papadimitriou
                                               pk=1003)
144 040fcb12 Kostas Papadimitriou
145 88329243 Christos Stavrakakis
        nic1 = mfactory.NetworkInterfaceFactory(machine=vm1u2,
146 88329243 Christos Stavrakakis
                                                userid=vm1u2.userid,
147 88329243 Christos Stavrakakis
                                                network__public=False,
148 88329243 Christos Stavrakakis
                                                network__userid=USER1)
149 88329243 Christos Stavrakakis
        ip2 = mfactory.IPv4AddressFactory(nic__machine=vm1u1,
150 88329243 Christos Stavrakakis
                                          userid=vm1u1.userid,
151 88329243 Christos Stavrakakis
                                          network__public=True,
152 88329243 Christos Stavrakakis
                                          network__userid=None,
153 88329243 Christos Stavrakakis
                                          address="195.251.222.211")
154 bbea0414 Christos Stavrakakis
        mfactory.IPAddressLogFactory(address=ip2.address,
155 bbea0414 Christos Stavrakakis
                                     server_id=vm1u1.id,
156 bbea0414 Christos Stavrakakis
                                     network_id=ip2.network.id,
157 bbea0414 Christos Stavrakakis
                                     active=True)
158 040fcb12 Kostas Papadimitriou
159 9fd36718 Kostas Papadimitriou
    def test_enabled_setting(self):
160 9fd36718 Kostas Papadimitriou
        settings.HELPDESK_ENABLED = False
161 9fd36718 Kostas Papadimitriou
162 9fd36718 Kostas Papadimitriou
        # helpdesk is disabled
163 9fd36718 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token="0001")
164 9fd36718 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
165 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
166 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
167 505a121e Kostas Papadimitriou
                            user_token="0001")
168 9fd36718 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
169 9fd36718 Kostas Papadimitriou
170 d59d86d4 Kostas Papadimitriou
    def test_ip_lookup(self):
171 d59d86d4 Kostas Papadimitriou
        # ip does not exist, proper message gets displayed
172 d59d86d4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
173 505a121e Kostas Papadimitriou
                            args=["195.251.221.122"]), user_token='0001')
174 bbea0414 Christos Stavrakakis
        self.assertFalse(r.context["ip_exists"])
175 bbea0414 Christos Stavrakakis
        self.assertEqual(list(r.context["ips"]), [])
176 d59d86d4 Kostas Papadimitriou
177 bbea0414 Christos Stavrakakis
        # ip exists
178 d59d86d4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
179 505a121e Kostas Papadimitriou
                            args=["195.251.222.211"]), user_token='0001')
180 bbea0414 Christos Stavrakakis
        self.assertTrue(r.context["ip_exists"])
181 bbea0414 Christos Stavrakakis
        ips = r.context["ips"]
182 bbea0414 Christos Stavrakakis
        for ip in ips:
183 bbea0414 Christos Stavrakakis
            self.assertEqual(ip.address, "195.251.222.211")
184 d59d86d4 Kostas Papadimitriou
185 505a121e Kostas Papadimitriou
    def test_vm_lookup(self):
186 505a121e Kostas Papadimitriou
        # vm id does not exist
187 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
188 505a121e Kostas Papadimitriou
                            args=["vm-123"]), user_token='0001')
189 505a121e Kostas Papadimitriou
        self.assertContains(r, 'User with Virtual Machine')
190 505a121e Kostas Papadimitriou
191 505a121e Kostas Papadimitriou
        # vm exists, 'test' account discovered
192 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
193 505a121e Kostas Papadimitriou
                            args=["vm1001"]), user_token='0001')
194 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER1)
195 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
196 505a121e Kostas Papadimitriou
                            args=["vm1002"]), user_token='0001')
197 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER2)
198 505a121e Kostas Papadimitriou
        # dash also works
199 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
200 505a121e Kostas Papadimitriou
                            args=["vm-1002"]), user_token='0001')
201 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER2)
202 c4d1f3b7 Kostas Papadimitriou
203 505a121e Kostas Papadimitriou
    def test_view_permissions(self):
204 c4d1f3b7 Kostas Papadimitriou
        # anonymous user gets 403
205 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token=None)
206 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
207 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
208 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
209 505a121e Kostas Papadimitriou
                            user_token=None)
210 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
211 c4d1f3b7 Kostas Papadimitriou
212 c4d1f3b7 Kostas Papadimitriou
        # user not in helpdesk group gets 403
213 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'))
214 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
215 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
216 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']))
217 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
218 c4d1f3b7 Kostas Papadimitriou
219 c4d1f3b7 Kostas Papadimitriou
        # user with helpdesk group gets 200
220 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token="0001")
221 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
222 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
223 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
224 505a121e Kostas Papadimitriou
                            user_token="0001")
225 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
226 c4d1f3b7 Kostas Papadimitriou
227 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)))
228 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-suspend-vm', args=(1001,)),
229 505a121e Kostas Papadimitriou
                            user_token="0001", data={'token': '1234'})
230 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
231 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-suspend-vm', args=(1001,)),
232 505a121e Kostas Papadimitriou
                            user_token="0001")
233 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
234 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)),
235 505a121e Kostas Papadimitriou
                             user_token="0001", data={'token': '0001'})
236 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
237 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)),
238 505a121e Kostas Papadimitriou
                             user_token="0000", data={'token': '0000'})
239 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
240 505a121e Kostas Papadimitriou
241 505a121e Kostas Papadimitriou
    def test_suspend_vm(self):
242 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
243 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
244 505a121e Kostas Papadimitriou
                            user_token="0001")
245 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
246 505a121e Kostas Papadimitriou
        vmid = r.context['vms'][0].pk
247 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(vmid,)),
248 505a121e Kostas Papadimitriou
                             data={'token': '0001'}, user_token="0001")
249 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
250 505a121e Kostas Papadimitriou
251 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
252 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
253 505a121e Kostas Papadimitriou
                            user_token="0001")
254 505a121e Kostas Papadimitriou
        self.assertTrue(r.context['vms'][0].suspended)
255 505a121e Kostas Papadimitriou
256 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm-release',
257 505a121e Kostas Papadimitriou
                                     args=(vmid,)), data={'token': '0001'},
258 505a121e Kostas Papadimitriou
                             user_token="0001")
259 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
260 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
261 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
262 505a121e Kostas Papadimitriou
                            user_token="0001")
263 505a121e Kostas Papadimitriou
        self.assertFalse(r.context['vms'][0].suspended)
264 505a121e Kostas Papadimitriou
265 c4d1f3b7 Kostas Papadimitriou
    def test_results_get_filtered(self):
266 c4d1f3b7 Kostas Papadimitriou
        """
267 c4d1f3b7 Kostas Papadimitriou
        Test that view context data are filtered based on userid provided.
268 c4d1f3b7 Kostas Papadimitriou
        Check helpdesk_test.json to see the existing database data.
269 c4d1f3b7 Kostas Papadimitriou
        """
270 c4d1f3b7 Kostas Papadimitriou
271 505a121e Kostas Papadimitriou
        # 'testuser@test.com' details, see
272 505a121e Kostas Papadimitriou
        # helpdes/fixtures/helpdesk_test.json for more details
273 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
274 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
275 505a121e Kostas Papadimitriou
                            user_token="0001")
276 c4d1f3b7 Kostas Papadimitriou
        account = r.context['account']
277 c4d1f3b7 Kostas Papadimitriou
        vms = r.context['vms']
278 c4d1f3b7 Kostas Papadimitriou
        nets = r.context['networks']
279 505a121e Kostas Papadimitriou
        self.assertEqual(account, USER1)
280 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms[0].name, "user1 vm")
281 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms.count(), 1)
282 040fcb12 Kostas Papadimitriou
        self.assertEqual(len(nets), 2)
283 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], True)
284 c4d1f3b7 Kostas Papadimitriou
285 505a121e Kostas Papadimitriou
        # 'testuser2@test.com' details, see helpdesk
286 505a121e Kostas Papadimitriou
        # /fixtures/helpdesk_test.json for more details
287 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
288 505a121e Kostas Papadimitriou
                                    args=['testuser2@test.com']),
289 505a121e Kostas Papadimitriou
                            user_token="0001")
290 c4d1f3b7 Kostas Papadimitriou
        account = r.context['account']
291 c4d1f3b7 Kostas Papadimitriou
        vms = r.context['vms']
292 c4d1f3b7 Kostas Papadimitriou
        nets = r.context['networks']
293 505a121e Kostas Papadimitriou
        self.assertEqual(account, USER2)
294 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms.count(), 2)
295 d91de78c Christos Stavrakakis
        self.assertEqual(sorted([vms[0].name, vms[1].name]),
296 d91de78c Christos Stavrakakis
                         sorted(["user2 vm1", "user2 vm2"]))
297 505a121e Kostas Papadimitriou
        self.assertEqual(len(nets), 0)
298 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], True)
299 9e3519e0 Kostas Papadimitriou
300 505a121e Kostas Papadimitriou
        # 'testuser5@test.com' does not exist, should be redirected to
301 505a121e Kostas Papadimitriou
        # helpdesk home
302 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
303 505a121e Kostas Papadimitriou
                                    args=['testuser5@test.com']),
304 505a121e Kostas Papadimitriou
                            user_token="0001")
305 9e3519e0 Kostas Papadimitriou
        vms = r.context['vms']
306 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], False)
307 9e3519e0 Kostas Papadimitriou
        self.assertEqual(vms.count(), 0)
308 cc5c8608 Kostas Papadimitriou
309 cc5c8608 Kostas Papadimitriou
    def test_start_shutdown(self):
310 cc5c8608 Kostas Papadimitriou
        from synnefo.logic import backend
311 cc5c8608 Kostas Papadimitriou
312 cc5c8608 Kostas Papadimitriou
        self.vm1 = mfactory.VirtualMachineFactory(userid=USER1)
313 cc5c8608 Kostas Papadimitriou
        pk = self.vm1.pk
314 cc5c8608 Kostas Papadimitriou
315 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)))
316 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
317 cc5c8608 Kostas Papadimitriou
318 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)),
319 cc5c8608 Kostas Papadimitriou
                             data={'token': '0001'})
320 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
321 cc5c8608 Kostas Papadimitriou
322 cc5c8608 Kostas Papadimitriou
        backend.shutdown_instance = shutdown = mock.Mock()
323 41a7fae7 Christos Stavrakakis
        shutdown.return_value = 1
324 cc5c8608 Kostas Papadimitriou
        self.vm1.operstate = 'STARTED'
325 cc5c8608 Kostas Papadimitriou
        self.vm1.save()
326 8c7f5877 Christos Stavrakakis
        with mocked_quotaholder():
327 8c7f5877 Christos Stavrakakis
            r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)),
328 8c7f5877 Christos Stavrakakis
                                 data={'token': '0001'}, user_token='0001')
329 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
330 cc5c8608 Kostas Papadimitriou
        self.assertTrue(shutdown.called)
331 cc5c8608 Kostas Papadimitriou
        self.assertEqual(len(shutdown.mock_calls), 1)
332 cc5c8608 Kostas Papadimitriou
333 cc5c8608 Kostas Papadimitriou
        backend.startup_instance = startup = mock.Mock()
334 41a7fae7 Christos Stavrakakis
        startup.return_value = 2
335 cc5c8608 Kostas Papadimitriou
        self.vm1.operstate = 'STOPPED'
336 cc5c8608 Kostas Papadimitriou
        self.vm1.save()
337 8c7f5877 Christos Stavrakakis
        with mocked_quotaholder():
338 8c7f5877 Christos Stavrakakis
            r = self.client.post(reverse('helpdesk-vm-start', args=(pk,)),
339 8c7f5877 Christos Stavrakakis
                                 data={'token': '0001'}, user_token='0001')
340 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
341 cc5c8608 Kostas Papadimitriou
        self.assertTrue(startup.called)
342 cc5c8608 Kostas Papadimitriou
        self.assertEqual(len(startup.mock_calls), 1)