Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / helpdesk / tests.py @ 2152dd3f

History | View | Annotate | Download (14.1 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 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 e407f159 Ilias Tsitsimpis
    def get_username(self, 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 e407f159 Ilias Tsitsimpis
    def get_uuid(self, 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 b4b82ec4 Giorgos Korfiatis
        request.user = {"access": {
87 b4b82ec4 Giorgos Korfiatis
                        "token": {
88 b4b82ec4 Giorgos Korfiatis
                            "expires": "2013-06-19T15:23:59.975572+00:00",
89 b4b82ec4 Giorgos Korfiatis
                            "id": "0000",
90 b4b82ec4 Giorgos Korfiatis
                            "tenant": {
91 b4b82ec4 Giorgos Korfiatis
                                "id": "test",
92 b4b82ec4 Giorgos Korfiatis
                                "name": "Firstname Lastname"
93 b4b82ec4 Giorgos Korfiatis
                                }
94 b4b82ec4 Giorgos Korfiatis
                            },
95 b4b82ec4 Giorgos Korfiatis
                        "serviceCatalog": [],
96 b4b82ec4 Giorgos Korfiatis
                        "user": {
97 b4b82ec4 Giorgos Korfiatis
                            "roles_links": [],
98 b4b82ec4 Giorgos Korfiatis
                            "id": "test",
99 b4b82ec4 Giorgos Korfiatis
                            "roles": [{"id": 1, "name": "default"}],
100 b4b82ec4 Giorgos Korfiatis
                            "name": "Firstname Lastname"}}
101 b4b82ec4 Giorgos Korfiatis
                        }
102 b4b82ec4 Giorgos Korfiatis
103 e892db2d Christos Stavrakakis
    if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0001':
104 e892db2d Christos Stavrakakis
        request.user_uniq = 'test'
105 b4b82ec4 Giorgos Korfiatis
        request.user = {"access": {
106 b4b82ec4 Giorgos Korfiatis
                        "token": {
107 b4b82ec4 Giorgos Korfiatis
                            "expires": "2013-06-19T15:23:59.975572+00:00",
108 b4b82ec4 Giorgos Korfiatis
                            "id": "0001",
109 b4b82ec4 Giorgos Korfiatis
                            "tenant": {
110 b4b82ec4 Giorgos Korfiatis
                                "id": "test",
111 b4b82ec4 Giorgos Korfiatis
                                "name": "Firstname Lastname"
112 b4b82ec4 Giorgos Korfiatis
                                }
113 b4b82ec4 Giorgos Korfiatis
                            },
114 b4b82ec4 Giorgos Korfiatis
                        "serviceCatalog": [],
115 b4b82ec4 Giorgos Korfiatis
                        "user": {
116 b4b82ec4 Giorgos Korfiatis
                            "roles_links": [],
117 b4b82ec4 Giorgos Korfiatis
                            "id": "test",
118 b4b82ec4 Giorgos Korfiatis
                            "roles": [{"id": 1, "name": "default"},
119 b4b82ec4 Giorgos Korfiatis
                                      {"id": 2, "name": "helpdesk"}],
120 b4b82ec4 Giorgos Korfiatis
                            "name": "Firstname Lastname"}}
121 b4b82ec4 Giorgos Korfiatis
                        }
122 e892db2d Christos Stavrakakis
123 f019f93d Ilias Tsitsimpis
124 e892db2d Christos Stavrakakis
@mock.patch("astakosclient.AstakosClient", new=AstakosClientMock)
125 e892db2d Christos Stavrakakis
@mock.patch("snf_django.lib.astakos.get_user", new=get_user_mock)
126 c4d1f3b7 Kostas Papadimitriou
class HelpdeskTests(TestCase):
127 c4d1f3b7 Kostas Papadimitriou
    """
128 c4d1f3b7 Kostas Papadimitriou
    Helpdesk tests. Test correctness of permissions and returned data.
129 c4d1f3b7 Kostas Papadimitriou
    """
130 c4d1f3b7 Kostas Papadimitriou
131 c4d1f3b7 Kostas Papadimitriou
    def setUp(self):
132 c4d1f3b7 Kostas Papadimitriou
        settings.SKIP_SSH_VALIDATION = True
133 9fd36718 Kostas Papadimitriou
        settings.HELPDESK_ENABLED = True
134 505a121e Kostas Papadimitriou
        self.client = AuthClient()
135 c4d1f3b7 Kostas Papadimitriou
136 040fcb12 Kostas Papadimitriou
        # init models
137 040fcb12 Kostas Papadimitriou
        vm1u1 = mfactory.VirtualMachineFactory(userid=USER1, name="user1 vm",
138 040fcb12 Kostas Papadimitriou
                                               pk=1001)
139 040fcb12 Kostas Papadimitriou
        vm1u2 = mfactory.VirtualMachineFactory(userid=USER2, name="user2 vm1",
140 040fcb12 Kostas Papadimitriou
                                               pk=1002)
141 040fcb12 Kostas Papadimitriou
        vm2u2 = mfactory.VirtualMachineFactory(userid=USER2, name="user2 vm2",
142 040fcb12 Kostas Papadimitriou
                                               pk=1003)
143 040fcb12 Kostas Papadimitriou
144 88329243 Christos Stavrakakis
        nic1 = mfactory.NetworkInterfaceFactory(machine=vm1u2,
145 88329243 Christos Stavrakakis
                                                userid=vm1u2.userid,
146 88329243 Christos Stavrakakis
                                                network__public=False,
147 88329243 Christos Stavrakakis
                                                network__userid=USER1)
148 88329243 Christos Stavrakakis
        ip2 = mfactory.IPv4AddressFactory(nic__machine=vm1u1,
149 88329243 Christos Stavrakakis
                                          userid=vm1u1.userid,
150 88329243 Christos Stavrakakis
                                          network__public=True,
151 88329243 Christos Stavrakakis
                                          network__userid=None,
152 88329243 Christos Stavrakakis
                                          address="195.251.222.211")
153 bbea0414 Christos Stavrakakis
        mfactory.IPAddressLogFactory(address=ip2.address,
154 bbea0414 Christos Stavrakakis
                                     server_id=vm1u1.id,
155 bbea0414 Christos Stavrakakis
                                     network_id=ip2.network.id,
156 bbea0414 Christos Stavrakakis
                                     active=True)
157 040fcb12 Kostas Papadimitriou
158 9fd36718 Kostas Papadimitriou
    def test_enabled_setting(self):
159 9fd36718 Kostas Papadimitriou
        settings.HELPDESK_ENABLED = False
160 9fd36718 Kostas Papadimitriou
161 9fd36718 Kostas Papadimitriou
        # helpdesk is disabled
162 9fd36718 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token="0001")
163 9fd36718 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
164 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
165 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
166 505a121e Kostas Papadimitriou
                            user_token="0001")
167 9fd36718 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
168 9fd36718 Kostas Papadimitriou
169 d59d86d4 Kostas Papadimitriou
    def test_ip_lookup(self):
170 d59d86d4 Kostas Papadimitriou
        # ip does not exist, proper message gets displayed
171 d59d86d4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
172 505a121e Kostas Papadimitriou
                            args=["195.251.221.122"]), user_token='0001')
173 bbea0414 Christos Stavrakakis
        self.assertFalse(r.context["ip_exists"])
174 bbea0414 Christos Stavrakakis
        self.assertEqual(list(r.context["ips"]), [])
175 d59d86d4 Kostas Papadimitriou
176 bbea0414 Christos Stavrakakis
        # ip exists
177 d59d86d4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
178 505a121e Kostas Papadimitriou
                            args=["195.251.222.211"]), user_token='0001')
179 bbea0414 Christos Stavrakakis
        self.assertTrue(r.context["ip_exists"])
180 bbea0414 Christos Stavrakakis
        ips = r.context["ips"]
181 bbea0414 Christos Stavrakakis
        for ip in ips:
182 bbea0414 Christos Stavrakakis
            self.assertEqual(ip.address, "195.251.222.211")
183 d59d86d4 Kostas Papadimitriou
184 505a121e Kostas Papadimitriou
    def test_vm_lookup(self):
185 505a121e Kostas Papadimitriou
        # vm id does not exist
186 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
187 505a121e Kostas Papadimitriou
                            args=["vm-123"]), user_token='0001')
188 505a121e Kostas Papadimitriou
        self.assertContains(r, 'User with Virtual Machine')
189 505a121e Kostas Papadimitriou
190 505a121e Kostas Papadimitriou
        # vm exists, 'test' account discovered
191 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
192 505a121e Kostas Papadimitriou
                            args=["vm1001"]), user_token='0001')
193 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER1)
194 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
195 505a121e Kostas Papadimitriou
                            args=["vm1002"]), user_token='0001')
196 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER2)
197 505a121e Kostas Papadimitriou
        # dash also works
198 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
199 505a121e Kostas Papadimitriou
                            args=["vm-1002"]), user_token='0001')
200 505a121e Kostas Papadimitriou
        self.assertEqual(r.context['account'], USER2)
201 c4d1f3b7 Kostas Papadimitriou
202 505a121e Kostas Papadimitriou
    def test_view_permissions(self):
203 c4d1f3b7 Kostas Papadimitriou
        # anonymous user gets 403
204 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token=None)
205 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
206 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
207 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
208 505a121e Kostas Papadimitriou
                            user_token=None)
209 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
210 c4d1f3b7 Kostas Papadimitriou
211 c4d1f3b7 Kostas Papadimitriou
        # user not in helpdesk group gets 403
212 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'))
213 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
214 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
215 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']))
216 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
217 c4d1f3b7 Kostas Papadimitriou
218 c4d1f3b7 Kostas Papadimitriou
        # user with helpdesk group gets 200
219 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token="0001")
220 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
221 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
222 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
223 505a121e Kostas Papadimitriou
                            user_token="0001")
224 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
225 c4d1f3b7 Kostas Papadimitriou
226 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)))
227 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-suspend-vm', args=(1001,)),
228 505a121e Kostas Papadimitriou
                            user_token="0001", data={'token': '1234'})
229 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
230 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-suspend-vm', args=(1001,)),
231 505a121e Kostas Papadimitriou
                            user_token="0001")
232 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
233 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)),
234 505a121e Kostas Papadimitriou
                             user_token="0001", data={'token': '0001'})
235 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
236 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(1001,)),
237 505a121e Kostas Papadimitriou
                             user_token="0000", data={'token': '0000'})
238 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
239 505a121e Kostas Papadimitriou
240 505a121e Kostas Papadimitriou
    def test_suspend_vm(self):
241 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
242 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
243 505a121e Kostas Papadimitriou
                            user_token="0001")
244 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
245 505a121e Kostas Papadimitriou
        vmid = r.context['vms'][0].pk
246 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm', args=(vmid,)),
247 505a121e Kostas Papadimitriou
                             data={'token': '0001'}, user_token="0001")
248 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
249 505a121e Kostas Papadimitriou
250 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
251 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
252 505a121e Kostas Papadimitriou
                            user_token="0001")
253 505a121e Kostas Papadimitriou
        self.assertTrue(r.context['vms'][0].suspended)
254 505a121e Kostas Papadimitriou
255 505a121e Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-suspend-vm-release',
256 505a121e Kostas Papadimitriou
                                     args=(vmid,)), data={'token': '0001'},
257 505a121e Kostas Papadimitriou
                             user_token="0001")
258 505a121e Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
259 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
260 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
261 505a121e Kostas Papadimitriou
                            user_token="0001")
262 505a121e Kostas Papadimitriou
        self.assertFalse(r.context['vms'][0].suspended)
263 505a121e Kostas Papadimitriou
264 c4d1f3b7 Kostas Papadimitriou
    def test_results_get_filtered(self):
265 c4d1f3b7 Kostas Papadimitriou
        """
266 c4d1f3b7 Kostas Papadimitriou
        Test that view context data are filtered based on userid provided.
267 c4d1f3b7 Kostas Papadimitriou
        Check helpdesk_test.json to see the existing database data.
268 c4d1f3b7 Kostas Papadimitriou
        """
269 c4d1f3b7 Kostas Papadimitriou
270 505a121e Kostas Papadimitriou
        # 'testuser@test.com' details, see
271 505a121e Kostas Papadimitriou
        # helpdes/fixtures/helpdesk_test.json for more details
272 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
273 505a121e Kostas Papadimitriou
                                    args=['testuser@test.com']),
274 505a121e Kostas Papadimitriou
                            user_token="0001")
275 c4d1f3b7 Kostas Papadimitriou
        account = r.context['account']
276 c4d1f3b7 Kostas Papadimitriou
        vms = r.context['vms']
277 c4d1f3b7 Kostas Papadimitriou
        nets = r.context['networks']
278 505a121e Kostas Papadimitriou
        self.assertEqual(account, USER1)
279 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms[0].name, "user1 vm")
280 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms.count(), 1)
281 040fcb12 Kostas Papadimitriou
        self.assertEqual(len(nets), 2)
282 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], True)
283 c4d1f3b7 Kostas Papadimitriou
284 505a121e Kostas Papadimitriou
        # 'testuser2@test.com' details, see helpdesk
285 505a121e Kostas Papadimitriou
        # /fixtures/helpdesk_test.json for more details
286 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
287 505a121e Kostas Papadimitriou
                                    args=['testuser2@test.com']),
288 505a121e Kostas Papadimitriou
                            user_token="0001")
289 c4d1f3b7 Kostas Papadimitriou
        account = r.context['account']
290 c4d1f3b7 Kostas Papadimitriou
        vms = r.context['vms']
291 c4d1f3b7 Kostas Papadimitriou
        nets = r.context['networks']
292 505a121e Kostas Papadimitriou
        self.assertEqual(account, USER2)
293 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms.count(), 2)
294 d91de78c Christos Stavrakakis
        self.assertEqual(sorted([vms[0].name, vms[1].name]),
295 d91de78c Christos Stavrakakis
                         sorted(["user2 vm1", "user2 vm2"]))
296 505a121e Kostas Papadimitriou
        self.assertEqual(len(nets), 0)
297 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], True)
298 9e3519e0 Kostas Papadimitriou
299 505a121e Kostas Papadimitriou
        # 'testuser5@test.com' does not exist, should be redirected to
300 505a121e Kostas Papadimitriou
        # helpdesk home
301 505a121e Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
302 505a121e Kostas Papadimitriou
                                    args=['testuser5@test.com']),
303 505a121e Kostas Papadimitriou
                            user_token="0001")
304 9e3519e0 Kostas Papadimitriou
        vms = r.context['vms']
305 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], False)
306 9e3519e0 Kostas Papadimitriou
        self.assertEqual(vms.count(), 0)
307 cc5c8608 Kostas Papadimitriou
308 cc5c8608 Kostas Papadimitriou
    def test_start_shutdown(self):
309 cc5c8608 Kostas Papadimitriou
        from synnefo.logic import backend
310 cc5c8608 Kostas Papadimitriou
311 cc5c8608 Kostas Papadimitriou
        self.vm1 = mfactory.VirtualMachineFactory(userid=USER1)
312 cc5c8608 Kostas Papadimitriou
        pk = self.vm1.pk
313 cc5c8608 Kostas Papadimitriou
314 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)))
315 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
316 cc5c8608 Kostas Papadimitriou
317 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)),
318 cc5c8608 Kostas Papadimitriou
                             data={'token': '0001'})
319 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
320 cc5c8608 Kostas Papadimitriou
321 cc5c8608 Kostas Papadimitriou
        backend.shutdown_instance = shutdown = mock.Mock()
322 41a7fae7 Christos Stavrakakis
        shutdown.return_value = 1
323 cc5c8608 Kostas Papadimitriou
        self.vm1.operstate = 'STARTED'
324 cc5c8608 Kostas Papadimitriou
        self.vm1.save()
325 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-shutdown', args=(pk,)),
326 cc5c8608 Kostas Papadimitriou
                             data={'token': '0001'}, user_token='0001')
327 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
328 cc5c8608 Kostas Papadimitriou
        self.assertTrue(shutdown.called)
329 cc5c8608 Kostas Papadimitriou
        self.assertEqual(len(shutdown.mock_calls), 1)
330 cc5c8608 Kostas Papadimitriou
331 cc5c8608 Kostas Papadimitriou
        backend.startup_instance = startup = mock.Mock()
332 41a7fae7 Christos Stavrakakis
        startup.return_value = 2
333 cc5c8608 Kostas Papadimitriou
        self.vm1.operstate = 'STOPPED'
334 cc5c8608 Kostas Papadimitriou
        self.vm1.save()
335 cc5c8608 Kostas Papadimitriou
        r = self.client.post(reverse('helpdesk-vm-start', args=(pk,)),
336 cc5c8608 Kostas Papadimitriou
                             data={'token': '0001'}, user_token='0001')
337 cc5c8608 Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
338 cc5c8608 Kostas Papadimitriou
        self.assertTrue(startup.called)
339 cc5c8608 Kostas Papadimitriou
        self.assertEqual(len(startup.mock_calls), 1)