Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / helpdesk / tests.py @ 9fd36718

History | View | Annotate | Download (7.3 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 c4d1f3b7 Kostas Papadimitriou
from django.test import TestCase, Client
36 c4d1f3b7 Kostas Papadimitriou
from django.conf import settings
37 c4d1f3b7 Kostas Papadimitriou
from django.core.urlresolvers import reverse
38 c4d1f3b7 Kostas Papadimitriou
39 d59d86d4 Kostas Papadimitriou
from synnefo.db import models
40 d59d86d4 Kostas Papadimitriou
41 c4d1f3b7 Kostas Papadimitriou
class AaiClient(Client):
42 c4d1f3b7 Kostas Papadimitriou
43 c4d1f3b7 Kostas Papadimitriou
    def request(self, **request):
44 c4d1f3b7 Kostas Papadimitriou
        token = request.pop('user_token', '0000')
45 c4d1f3b7 Kostas Papadimitriou
        if token:
46 c4d1f3b7 Kostas Papadimitriou
            request['HTTP_X_AUTH_TOKEN'] = token
47 c4d1f3b7 Kostas Papadimitriou
        return super(AaiClient, self).request(**request)
48 c4d1f3b7 Kostas Papadimitriou
49 c4d1f3b7 Kostas Papadimitriou
class HelpdeskTests(TestCase):
50 c4d1f3b7 Kostas Papadimitriou
    """
51 c4d1f3b7 Kostas Papadimitriou
    Helpdesk tests. Test correctness of permissions and returned data.
52 c4d1f3b7 Kostas Papadimitriou
    """
53 c4d1f3b7 Kostas Papadimitriou
54 c4d1f3b7 Kostas Papadimitriou
    fixtures = ['helpdesk_test']
55 c4d1f3b7 Kostas Papadimitriou
56 c4d1f3b7 Kostas Papadimitriou
    def setUp(self):
57 c4d1f3b7 Kostas Papadimitriou
58 c4d1f3b7 Kostas Papadimitriou
        def get_user_mock(request, *args, **kwargs):
59 c4d1f3b7 Kostas Papadimitriou
            if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0000':
60 c4d1f3b7 Kostas Papadimitriou
                request.user_uniq = 'test'
61 c4d1f3b7 Kostas Papadimitriou
                request.user = {'uniq': 'test'}
62 c4d1f3b7 Kostas Papadimitriou
            if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0001':
63 c4d1f3b7 Kostas Papadimitriou
                request.user_uniq = 'test'
64 c4d1f3b7 Kostas Papadimitriou
                request.user = {'uniq': 'test', 'groups':['default','helpdesk']}
65 c4d1f3b7 Kostas Papadimitriou
66 c4d1f3b7 Kostas Papadimitriou
        # mock the astakos authentication function
67 c4d1f3b7 Kostas Papadimitriou
        from synnefo.lib import astakos
68 c4d1f3b7 Kostas Papadimitriou
        astakos.get_user = get_user_mock
69 c4d1f3b7 Kostas Papadimitriou
70 c4d1f3b7 Kostas Papadimitriou
        settings.SKIP_SSH_VALIDATION = True
71 9fd36718 Kostas Papadimitriou
        settings.HELPDESK_ENABLED = True
72 c4d1f3b7 Kostas Papadimitriou
        self.client = AaiClient()
73 c4d1f3b7 Kostas Papadimitriou
        self.user = 'test'
74 c4d1f3b7 Kostas Papadimitriou
        self.keys_url = reverse('ui_keys_collection')
75 c4d1f3b7 Kostas Papadimitriou
76 9fd36718 Kostas Papadimitriou
    def test_enabled_setting(self):
77 9fd36718 Kostas Papadimitriou
        settings.HELPDESK_ENABLED = False
78 9fd36718 Kostas Papadimitriou
79 9fd36718 Kostas Papadimitriou
        # helpdesk is disabled
80 9fd36718 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token="0001")
81 9fd36718 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
82 9fd36718 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details', args=['testuser@test.com']),
83 9fd36718 Kostas Papadimitriou
                user_token="0001")
84 9fd36718 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
85 9fd36718 Kostas Papadimitriou
86 d59d86d4 Kostas Papadimitriou
    def test_ip_lookup(self):
87 d59d86d4 Kostas Papadimitriou
        # ip does not exist, proper message gets displayed
88 d59d86d4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
89 d59d86d4 Kostas Papadimitriou
            args=["195.251.221.122"]), user_token='0001')
90 d59d86d4 Kostas Papadimitriou
        self.assertContains(r, 'User with IP')
91 d59d86d4 Kostas Papadimitriou
92 d59d86d4 Kostas Papadimitriou
        # ip exists, 'test' account discovered
93 d59d86d4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details',
94 d59d86d4 Kostas Papadimitriou
            args=["195.251.222.211"]), user_token='0001')
95 d59d86d4 Kostas Papadimitriou
        self.assertEqual(r.context['account'], 'testuser2@test.com')
96 d59d86d4 Kostas Papadimitriou
97 c4d1f3b7 Kostas Papadimitriou
    def test_view_permissions(self):
98 c4d1f3b7 Kostas Papadimitriou
99 c4d1f3b7 Kostas Papadimitriou
        # anonymous user gets 403
100 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token=None)
101 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
102 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details', args=['testuser@test.com']),
103 c4d1f3b7 Kostas Papadimitriou
                user_token=None)
104 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
105 c4d1f3b7 Kostas Papadimitriou
106 c4d1f3b7 Kostas Papadimitriou
        # user not in helpdesk group gets 403
107 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'))
108 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
109 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details', args=['testuser@test.com']))
110 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
111 c4d1f3b7 Kostas Papadimitriou
112 c4d1f3b7 Kostas Papadimitriou
        # user with helpdesk group gets 200
113 c4d1f3b7 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-index'), user_token="0001")
114 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
115 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details', args=['testuser@test.com']),
116 c4d1f3b7 Kostas Papadimitriou
                user_token="0001")
117 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
118 c4d1f3b7 Kostas Papadimitriou
119 c4d1f3b7 Kostas Papadimitriou
    def test_results_get_filtered(self):
120 c4d1f3b7 Kostas Papadimitriou
        """
121 c4d1f3b7 Kostas Papadimitriou
        Test that view context data are filtered based on userid provided.
122 c4d1f3b7 Kostas Papadimitriou
        Check helpdesk_test.json to see the existing database data.
123 c4d1f3b7 Kostas Papadimitriou
        """
124 c4d1f3b7 Kostas Papadimitriou
125 9e3519e0 Kostas Papadimitriou
        # 'testuser@test.com' details, see helpdes/fixtures/helpdesk_test.json for
126 9e3519e0 Kostas Papadimitriou
        # more details
127 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details', args=['testuser@test.com']),
128 9e3519e0 Kostas Papadimitriou
                user_token="0001")
129 c4d1f3b7 Kostas Papadimitriou
        account = r.context['account']
130 c4d1f3b7 Kostas Papadimitriou
        vms = r.context['vms']
131 c4d1f3b7 Kostas Papadimitriou
        nets = r.context['networks']
132 9e3519e0 Kostas Papadimitriou
        self.assertEqual(account, "testuser@test.com")
133 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms[0].name, "user1 vm")
134 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms.count(), 1)
135 9e3519e0 Kostas Papadimitriou
        self.assertEqual(len(nets), 2)
136 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], True)
137 c4d1f3b7 Kostas Papadimitriou
138 c4d1f3b7 Kostas Papadimitriou
139 9e3519e0 Kostas Papadimitriou
        # 'testuser2@test.com' details, see helpdes/fixtures/helpdesk_test.json for
140 9e3519e0 Kostas Papadimitriou
        # more details
141 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details', args=['testuser2@test.com']),
142 c4d1f3b7 Kostas Papadimitriou
                user_token="0001")
143 c4d1f3b7 Kostas Papadimitriou
        account = r.context['account']
144 c4d1f3b7 Kostas Papadimitriou
        vms = r.context['vms']
145 c4d1f3b7 Kostas Papadimitriou
        nets = r.context['networks']
146 9e3519e0 Kostas Papadimitriou
        self.assertEqual(account, "testuser2@test.com")
147 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms[0].name, "user2 vm1")
148 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms[1].name, "user2 vm2")
149 c4d1f3b7 Kostas Papadimitriou
        self.assertEqual(vms.count(), 2)
150 9e3519e0 Kostas Papadimitriou
        self.assertEqual(len(nets), 1)
151 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], True)
152 9e3519e0 Kostas Papadimitriou
153 9e3519e0 Kostas Papadimitriou
        # 'testuser5@test.com' does not exist, should be redirected to helpdesk home
154 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-details', args=['testuser5@test.com']),
155 9e3519e0 Kostas Papadimitriou
                user_token="0001")
156 9e3519e0 Kostas Papadimitriou
        vms = r.context['vms']
157 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], False)
158 9e3519e0 Kostas Papadimitriou
        self.assertEqual(vms.count(), 0)
159 9e3519e0 Kostas Papadimitriou
        # 1 public network
160 9e3519e0 Kostas Papadimitriou
        self.assertEqual(len(nets), 1)
161 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.context['account_exists'], False)
162 9e3519e0 Kostas Papadimitriou
163 9e3519e0 Kostas Papadimitriou
    def test_json_users(self):
164 9e3519e0 Kostas Papadimitriou
        # invalid prefix gives 404 response
165 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-userslist') + "?prefix=test",
166 9e3519e0 Kostas Papadimitriou
                user_token="0001")
167 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
168 c4d1f3b7 Kostas Papadimitriou
169 9e3519e0 Kostas Papadimitriou
        # no users exist
170 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-userslist') + "?prefix=test@",
171 9e3519e0 Kostas Papadimitriou
                user_token="0001")
172 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
173 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.content, "[]")
174 9e3519e0 Kostas Papadimitriou
175 ebda2ad4 Kostas Papadimitriou
        # 1 user exists
176 9e3519e0 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-userslist') + "?prefix=testuser@",
177 9e3519e0 Kostas Papadimitriou
                user_token="0001")
178 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
179 9e3519e0 Kostas Papadimitriou
        self.assertEqual(r.content, '["testuser@test.com"]')
180 ebda2ad4 Kostas Papadimitriou
        r = self.client.get(reverse('helpdesk-userslist') + "?prefix=testuser@t",
181 ebda2ad4 Kostas Papadimitriou
                user_token="0001")
182 ebda2ad4 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
183 ebda2ad4 Kostas Papadimitriou
        self.assertEqual(r.content, '["testuser@test.com"]')