Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (12.2 kB)

1 c4d1f3b7 Kostas Papadimitriou
# Copyright 2011 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 c4d1f3b7 Kostas Papadimitriou
41 d59d86d4 Kostas Papadimitriou
42 505a121e Kostas Papadimitriou
USER1 = "5edcb5aa-1111-4146-a8ed-2b6287824353"
43 505a121e Kostas Papadimitriou
USER2 = "5edcb5aa-2222-4146-a8ed-2b6287824353"
44 505a121e Kostas Papadimitriou
45 505a121e Kostas Papadimitriou
USERS_UUIDS = {}
46 505a121e Kostas Papadimitriou
USERS_UUIDS[USER1] = {'displayname': 'testuser@test.com'}
47 505a121e Kostas Papadimitriou
USERS_UUIDS[USER2] = {'displayname': 'testuser2@test.com'}
48 505a121e Kostas Papadimitriou
49 505a121e Kostas Papadimitriou
USERS_DISPLAYNAMES = dict(map(lambda k: (k[1]['displayname'], {'uuid': k[0]}),
50 505a121e Kostas Papadimitriou
                          USERS_UUIDS.iteritems()))
51 505a121e Kostas Papadimitriou
52 cc5c8608 Kostas Papadimitriou
from synnefo.db import models_factory as mfactory
53 cc5c8608 Kostas Papadimitriou
54 468ba00b Ilias Tsitsimpis
55 468ba00b Ilias Tsitsimpis
class AstakosClientMock():
56 468ba00b Ilias Tsitsimpis
    def __init__(*args, **kwargs):
57 468ba00b Ilias Tsitsimpis
        pass
58 468ba00b Ilias Tsitsimpis
59 468ba00b Ilias Tsitsimpis
    def get_username(self, token, uuid):
60 468ba00b Ilias Tsitsimpis
        try:
61 468ba00b Ilias Tsitsimpis
            return USERS_UUIDS.get(uuid)['displayname']
62 468ba00b Ilias Tsitsimpis
        except TypeError:
63 468ba00b Ilias Tsitsimpis
            return None
64 468ba00b Ilias Tsitsimpis
65 468ba00b Ilias Tsitsimpis
    def get_uuid(self, token, display_name):
66 468ba00b Ilias Tsitsimpis
        try:
67 468ba00b Ilias Tsitsimpis
            return USERS_DISPLAYNAMES.get(display_name)['uuid']
68 468ba00b Ilias Tsitsimpis
        except TypeError:
69 468ba00b Ilias Tsitsimpis
            return None
70 468ba00b Ilias Tsitsimpis
71 468ba00b Ilias Tsitsimpis
72 505a121e Kostas Papadimitriou
class AuthClient(Client):
73 c4d1f3b7 Kostas Papadimitriou
74 c4d1f3b7 Kostas Papadimitriou
    def request(self, **request):
75 c4d1f3b7 Kostas Papadimitriou
        token = request.pop('user_token', '0000')
76 c4d1f3b7 Kostas Papadimitriou
        if token:
77 c4d1f3b7 Kostas Papadimitriou
            request['HTTP_X_AUTH_TOKEN'] = token
78 505a121e Kostas Papadimitriou
        return super(AuthClient, self).request(**request)
79 505a121e Kostas Papadimitriou
80 c4d1f3b7 Kostas Papadimitriou
81 e892db2d Christos Stavrakakis
def get_user_mock(request, *args, **kwargs):
82 e892db2d Christos Stavrakakis
    request.user_uniq = None
83 e892db2d Christos Stavrakakis
    request.user = None
84 e892db2d Christos Stavrakakis
    if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0000':
85 e892db2d Christos Stavrakakis
        request.user_uniq = 'test'
86 e892db2d Christos Stavrakakis
        request.user = {'uniq': 'test', 'auth_token': '0000'}
87 e892db2d Christos Stavrakakis
    if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0001':
88 e892db2d Christos Stavrakakis
        request.user_uniq = 'test'
89 e892db2d Christos Stavrakakis
        request.user = {'uniq': 'test', 'groups': ['default',
90 e892db2d Christos Stavrakakis
                                                   'helpdesk'],
91 e892db2d Christos Stavrakakis
                        'auth_token': '0001'}
92 e892db2d Christos Stavrakakis
93 e892db2d Christos Stavrakakis
94 e892db2d Christos Stavrakakis
@mock.patch("astakosclient.AstakosClient", new=AstakosClientMock)
95 e892db2d Christos Stavrakakis
@mock.patch("snf_django.lib.astakos.get_user", new=get_user_mock)
96 c4d1f3b7 Kostas Papadimitriou
class HelpdeskTests(TestCase):
97 c4d1f3b7 Kostas Papadimitriou
    """
98 c4d1f3b7 Kostas Papadimitriou
    Helpdesk tests. Test correctness of permissions and returned data.
99 c4d1f3b7 Kostas Papadimitriou
    """
100 c4d1f3b7 Kostas Papadimitriou
101 c4d1f3b7 Kostas Papadimitriou
    def setUp(self):
102 c4d1f3b7 Kostas Papadimitriou
        settings.SKIP_SSH_VALIDATION = True
103 9fd36718 Kostas Papadimitriou
        settings.HELPDESK_ENABLED = True
104 505a121e Kostas Papadimitriou
        self.client = AuthClient()
105 c4d1f3b7 Kostas Papadimitriou
106 040fcb12 Kostas Papadimitriou
        # init models
107 040fcb12 Kostas Papadimitriou
        vm1u1 = mfactory.VirtualMachineFactory(userid=USER1, name="user1 vm",
108 040fcb12 Kostas Papadimitriou
                                               pk=1001)
109 040fcb12 Kostas Papadimitriou
        vm1u2 = mfactory.VirtualMachineFactory(userid=USER2, name="user2 vm1",
110 040fcb12 Kostas Papadimitriou
                                               pk=1002)
111 040fcb12 Kostas Papadimitriou
        vm2u2 = mfactory.VirtualMachineFactory(userid=USER2, name="user2 vm2",
112 040fcb12 Kostas Papadimitriou
                                               pk=1003)
113 040fcb12 Kostas Papadimitriou
114 040fcb12 Kostas Papadimitriou
        netpub = mfactory.NetworkFactory(public=True)
115 040fcb12 Kostas Papadimitriou
        net1u1 = mfactory.NetworkFactory(public=False, userid=USER1)
116 040fcb12 Kostas Papadimitriou
117 040fcb12 Kostas Papadimitriou
        nic1 = mfactory.NetworkInterfaceFactory(machine=vm1u2, network=net1u1)
118 040fcb12 Kostas Papadimitriou
        nic2 = mfactory.NetworkInterfaceFactory(machine=vm1u1, network=netpub,
119 040fcb12 Kostas Papadimitriou
                                                ipv4="195.251.222.211")
120 040fcb12 Kostas Papadimitriou
121 9fd36718 Kostas Papadimitriou
    def test_enabled_setting(self):
122 9fd36718 Kostas Papadimitriou
        settings.HELPDESK_ENABLED = False
123 9fd36718 Kostas Papadimitriou
124 9fd36718 Kostas Papadimitriou
        # helpdesk is disabled
125 9fd36718 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token="0001")
126 9fd36718 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
127 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
128 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
129 505a121e Kostas Papadimitriou
                            user_token="0001")
130 9fd36718 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
131 9fd36718 Kostas Papadimitriou
132 d59d86d4 Kostas Papadimitriou
    def test_ip_lookup(self):
133 d59d86d4 Kostas Papadimitriou
        # ip does not exist, proper message gets displayed
134 d59d86d4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
135 505a121e Kostas Papadimitriou
                            args=["195.251.221.122"]), user_token='0001')
136 d59d86d4 Kostas Papadimitriou
        self.assertContains(r, 'User with IP')
137 d59d86d4 Kostas Papadimitriou
138 d59d86d4 Kostas Papadimitriou
        # ip exists, 'test' account discovered
139 d59d86d4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
140 505a121e Kostas Papadimitriou
                            args=["195.251.222.211"]), user_token='0001')
141 040fcb12 Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER1)
142 d59d86d4 Kostas Papadimitriou
143 505a121e Kostas Papadimitriou
    def test_vm_lookup(self):
144 505a121e Kostas Papadimitriou
        # vm id does not exist
145 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
146 505a121e Kostas Papadimitriou
                            args=["vm-123"]), user_token='0001')
147 505a121e Kostas Papadimitriou
        self.assertContains(r, 'User with Virtual Machine')
148 505a121e Kostas Papadimitriou
149 505a121e Kostas Papadimitriou
        # vm exists, 'test' account discovered
150 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
151 505a121e Kostas Papadimitriou
                            args=["vm1001"]), user_token='0001')
152 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER1)
153 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
154 505a121e Kostas Papadimitriou
                            args=["vm1002"]), user_token='0001')
155 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER2)
156 505a121e Kostas Papadimitriou
        # dash also works
157 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
158 505a121e Kostas Papadimitriou
                            args=["vm-1002"]), user_token='0001')
159 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER2)
160 c4d1f3b7 Kostas Papadimitriou
161 505a121e Kostas Papadimitriou
    def test_view_permissions(self):
162 c4d1f3b7 Kostas Papadimitriou
        # anonymous user gets 403
163 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token=None)
164 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
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=None)
168 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
169 c4d1f3b7 Kostas Papadimitriou
170 c4d1f3b7 Kostas Papadimitriou
        # user not in helpdesk group gets 403
171 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'))
172 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
173 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
174 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']))
175 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
176 c4d1f3b7 Kostas Papadimitriou
177 c4d1f3b7 Kostas Papadimitriou
        # user with helpdesk group gets 200
178 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token="0001")
179 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
180 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
181 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
182 505a121e Kostas Papadimitriou
                            user_token="0001")
183 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
184 c4d1f3b7 Kostas Papadimitriou
185 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)))
186 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-suspend-vm', args=(1001,)),
187 505a121e Kostas Papadimitriou
                            user_token="0001", data={'token': '1234'})
188 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
189 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-suspend-vm', args=(1001,)),
190 505a121e Kostas Papadimitriou
                            user_token="0001")
191 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
192 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)),
193 505a121e Kostas Papadimitriou
                             user_token="0001", data={'token': '0001'})
194 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
195 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)),
196 505a121e Kostas Papadimitriou
                             user_token="0000", data={'token': '0000'})
197 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
198 505a121e Kostas Papadimitriou
199 505a121e Kostas Papadimitriou
    def test_suspend_vm(self):
200 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
201 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
202 505a121e Kostas Papadimitriou
                            user_token="0001")
203 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
204 505a121e Kostas Papadimitriou
        vmid = r.context['vms'][0].pk
205 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(vmid,)),
206 505a121e Kostas Papadimitriou
                             data={'token': '0001'}, user_token="0001")
207 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
208 505a121e Kostas Papadimitriou
209 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
210 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
211 505a121e Kostas Papadimitriou
                            user_token="0001")
212 505a121e Kostas Papadimitriou
        self.assertTrue(r.context['vms'][0].suspended)
213 505a121e Kostas Papadimitriou
214 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm-release',
215 505a121e Kostas Papadimitriou
                                     args=(vmid,)), data={'token': '0001'},
216 505a121e Kostas Papadimitriou
                             user_token="0001")
217 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
218 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
219 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
220 505a121e Kostas Papadimitriou
                            user_token="0001")
221 505a121e Kostas Papadimitriou
        self.assertFalse(r.context['vms'][0].suspended)
222 505a121e Kostas Papadimitriou
223 c4d1f3b7 Kostas Papadimitriou
    def test_results_get_filtered(self):
224 c4d1f3b7 Kostas Papadimitriou
        """
225 c4d1f3b7 Kostas Papadimitriou
        Test that view context data are filtered based on userid provided.
226 c4d1f3b7 Kostas Papadimitriou
        Check helpdesk_test.json to see the existing database data.
227 c4d1f3b7 Kostas Papadimitriou
        """
228 c4d1f3b7 Kostas Papadimitriou
229 505a121e Kostas Papadimitriou
        # 'testuser@test.com' details, see
230 505a121e Kostas Papadimitriou
        # helpdes/fixtures/helpdesk_test.json for more details
231 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
232 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
233 505a121e Kostas Papadimitriou
                            user_token="0001")
234 c4d1f3b7 Kostas Papadimitriou
        account = r.context['account']
235 c4d1f3b7 Kostas Papadimitriou
        vms = r.context['vms']
236 c4d1f3b7 Kostas Papadimitriou
        nets = r.context['networks']
237 505a121e Kostas Papadimitriou
        self.assertEqual(account, USER1)
238 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms[0].name, "user1 vm")
239 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms.count(), 1)
240 040fcb12 Kostas Papadimitriou
        self.assertEqual(len(nets), 2)
241 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], True)
242 c4d1f3b7 Kostas Papadimitriou
243 505a121e Kostas Papadimitriou
        # 'testuser2@test.com' details, see helpdesk
244 505a121e Kostas Papadimitriou
        # /fixtures/helpdesk_test.json for more details
245 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
246 505a121e Kostas Papadimitriou
                                    args=['testuser2@test.com']),
247 505a121e Kostas Papadimitriou
                            user_token="0001")
248 c4d1f3b7 Kostas Papadimitriou
        account = r.context['account']
249 c4d1f3b7 Kostas Papadimitriou
        vms = r.context['vms']
250 c4d1f3b7 Kostas Papadimitriou
        nets = r.context['networks']
251 505a121e Kostas Papadimitriou
        self.assertEqual(account, USER2)
252 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms.count(), 2)
253 d91de78c Christos Stavrakakis
        self.assertEqual(sorted([vms[0].name, vms[1].name]),
254 d91de78c Christos Stavrakakis
                         sorted(["user2 vm1", "user2 vm2"]))
255 505a121e Kostas Papadimitriou
        self.assertEqual(len(nets), 0)
256 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], True)
257 9e3519e0 Kostas Papadimitriou
258 505a121e Kostas Papadimitriou
        # 'testuser5@test.com' does not exist, should be redirected to
259 505a121e Kostas Papadimitriou
        # helpdesk home
260 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
261 505a121e Kostas Papadimitriou
                                    args=['testuser5@test.com']),
262 505a121e Kostas Papadimitriou
                            user_token="0001")
263 9e3519e0 Kostas Papadimitriou
        vms = r.context['vms']
264 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], False)
265 9e3519e0 Kostas Papadimitriou
        self.assertEqual(vms.count(), 0)
266 cc5c8608 Kostas Papadimitriou
267 cc5c8608 Kostas Papadimitriou
    def test_start_shutdown(self):
268 cc5c8608 Kostas Papadimitriou
        from synnefo.logic import backend
269 cc5c8608 Kostas Papadimitriou
270 cc5c8608 Kostas Papadimitriou
        self.vm1 = mfactory.VirtualMachineFactory(userid=USER1)
271 cc5c8608 Kostas Papadimitriou
        pk = self.vm1.pk
272 cc5c8608 Kostas Papadimitriou
273 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)))
274 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
275 cc5c8608 Kostas Papadimitriou
276 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)),
277 cc5c8608 Kostas Papadimitriou
                             data={'token': '0001'})
278 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
279 cc5c8608 Kostas Papadimitriou
280 cc5c8608 Kostas Papadimitriou
        backend.shutdown_instance = shutdown = mock.Mock()
281 41a7fae7 Christos Stavrakakis
        shutdown.return_value = 1
282 cc5c8608 Kostas Papadimitriou
        self.vm1.operstate = 'STARTED'
283 cc5c8608 Kostas Papadimitriou
        self.vm1.save()
284 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)),
285 cc5c8608 Kostas Papadimitriou
                             data={'token': '0001'}, user_token='0001')
286 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
287 cc5c8608 Kostas Papadimitriou
        self.assertTrue(shutdown.called)
288 cc5c8608 Kostas Papadimitriou
        self.assertEqual(len(shutdown.mock_calls), 1)
289 cc5c8608 Kostas Papadimitriou
290 cc5c8608 Kostas Papadimitriou
        backend.startup_instance = startup = mock.Mock()
291 41a7fae7 Christos Stavrakakis
        startup.return_value = 2
292 cc5c8608 Kostas Papadimitriou
        self.vm1.operstate = 'STOPPED'
293 cc5c8608 Kostas Papadimitriou
        self.vm1.save()
294 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-start', args=(pk,)),
295 cc5c8608 Kostas Papadimitriou
                             data={'token': '0001'}, user_token='0001')
296 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
297 cc5c8608 Kostas Papadimitriou
        self.assertTrue(startup.called)
298 cc5c8608 Kostas Papadimitriou
        self.assertEqual(len(startup.mock_calls), 1)