Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / userdata / tests.py @ 16a7ced5

History | View | Annotate | Download (9 kB)

1 b4b82ec4 Giorgos Korfiatis
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 c6c99d99 Vangelis Koukis
#
3 c6c99d99 Vangelis Koukis
# Redistribution and use in source and binary forms, with or
4 c6c99d99 Vangelis Koukis
# without modification, are permitted provided that the following
5 c6c99d99 Vangelis Koukis
# conditions are met:
6 c6c99d99 Vangelis Koukis
#
7 c6c99d99 Vangelis Koukis
#   1. Redistributions of source code must retain the above
8 c6c99d99 Vangelis Koukis
#      copyright notice, this list of conditions and the following
9 c6c99d99 Vangelis Koukis
#      disclaimer.
10 c6c99d99 Vangelis Koukis
#
11 c6c99d99 Vangelis Koukis
#   2. Redistributions in binary form must reproduce the above
12 c6c99d99 Vangelis Koukis
#      copyright notice, this list of conditions and the following
13 c6c99d99 Vangelis Koukis
#      disclaimer in the documentation and/or other materials
14 c6c99d99 Vangelis Koukis
#      provided with the distribution.
15 c6c99d99 Vangelis Koukis
#
16 c6c99d99 Vangelis Koukis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 c6c99d99 Vangelis Koukis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 c6c99d99 Vangelis Koukis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 c6c99d99 Vangelis Koukis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 c6c99d99 Vangelis Koukis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 c6c99d99 Vangelis Koukis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 c6c99d99 Vangelis Koukis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 c6c99d99 Vangelis Koukis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 c6c99d99 Vangelis Koukis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 c6c99d99 Vangelis Koukis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 c6c99d99 Vangelis Koukis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 c6c99d99 Vangelis Koukis
# POSSIBILITY OF SUCH DAMAGE.
28 c6c99d99 Vangelis Koukis
#
29 c6c99d99 Vangelis Koukis
# The views and conclusions contained in the software and
30 c6c99d99 Vangelis Koukis
# documentation are those of the authors and should not be
31 c6c99d99 Vangelis Koukis
# interpreted as representing official policies, either expressed
32 c6c99d99 Vangelis Koukis
# or implied, of GRNET S.A.
33 c6c99d99 Vangelis Koukis
#
34 eee0487e Kostas Papadimitriou
35 aaaf78f2 Giorgos Korfiatis
from django import http
36 39c542df Vangelis Koukis
from django.test import TransactionTestCase
37 eee0487e Kostas Papadimitriou
from django.conf import settings
38 eee0487e Kostas Papadimitriou
from django.test.client import Client
39 6ab78e7c Kostas Papadimitriou
from django.utils import simplejson as json
40 be2c0c51 Kostas Papadimitriou
from django.core.urlresolvers import reverse
41 d495600d Ilias Tsitsimpis
from mock import patch
42 eee0487e Kostas Papadimitriou
43 d3e9d04b Ilias Tsitsimpis
from synnefo.userdata.models import PublicKeyPair
44 244c552b Giorgos Verigakis
45 eee0487e Kostas Papadimitriou
46 d495600d Ilias Tsitsimpis
def get_user_mock(request, *args, **kwargs):
47 d495600d Ilias Tsitsimpis
    if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0000':
48 d495600d Ilias Tsitsimpis
        request.user_uniq = 'test'
49 b4b82ec4 Giorgos Korfiatis
        request.user = {"access": {
50 b4b82ec4 Giorgos Korfiatis
                        "token": {
51 b4b82ec4 Giorgos Korfiatis
                            "expires": "2013-06-19T15:23:59.975572+00:00",
52 b4b82ec4 Giorgos Korfiatis
                            "id": "token",
53 b4b82ec4 Giorgos Korfiatis
                            "tenant": {
54 b4b82ec4 Giorgos Korfiatis
                                "id": "test",
55 b4b82ec4 Giorgos Korfiatis
                                "name": "Firstname Lastname"
56 b4b82ec4 Giorgos Korfiatis
                                }
57 b4b82ec4 Giorgos Korfiatis
                            },
58 b4b82ec4 Giorgos Korfiatis
                        "serviceCatalog": [],
59 b4b82ec4 Giorgos Korfiatis
                        "user": {
60 b4b82ec4 Giorgos Korfiatis
                            "roles_links": [],
61 b4b82ec4 Giorgos Korfiatis
                            "id": "test",
62 b4b82ec4 Giorgos Korfiatis
                            "roles": [{"id": 1, "name": "default"}],
63 b4b82ec4 Giorgos Korfiatis
                            "name": "Firstname Lastname"}}
64 b4b82ec4 Giorgos Korfiatis
                        }
65 d495600d Ilias Tsitsimpis
66 d495600d Ilias Tsitsimpis
67 eee0487e Kostas Papadimitriou
class AaiClient(Client):
68 eee0487e Kostas Papadimitriou
69 eee0487e Kostas Papadimitriou
    def request(self, **request):
70 d495600d Ilias Tsitsimpis
        # mock the astakos authentication function
71 d495600d Ilias Tsitsimpis
        with patch("synnefo.userdata.rest.get_user",
72 d495600d Ilias Tsitsimpis
                   new=get_user_mock):
73 d495600d Ilias Tsitsimpis
            with patch("synnefo.userdata.views.get_user",
74 d495600d Ilias Tsitsimpis
                       new=get_user_mock):
75 d495600d Ilias Tsitsimpis
                request['HTTP_X_AUTH_TOKEN'] = '0000'
76 d495600d Ilias Tsitsimpis
                return super(AaiClient, self).request(**request)
77 d495600d Ilias Tsitsimpis
78 eee0487e Kostas Papadimitriou
79 39c542df Vangelis Koukis
class TestRestViews(TransactionTestCase):
80 eee0487e Kostas Papadimitriou
81 eee0487e Kostas Papadimitriou
    fixtures = ['users']
82 eee0487e Kostas Papadimitriou
83 eee0487e Kostas Papadimitriou
    def setUp(self):
84 aaaf78f2 Giorgos Korfiatis
        settings.USERDATA_MAX_SSH_KEYS_PER_USER = 10
85 aaaf78f2 Giorgos Korfiatis
86 7469ff7d Kostas Papadimitriou
        settings.SKIP_SSH_VALIDATION = True
87 eee0487e Kostas Papadimitriou
        self.client = AaiClient()
88 244c552b Giorgos Verigakis
        self.user = 'test'
89 d194e869 Kostas Papadimitriou
        self.keys_url = reverse('ui_keys_collection')
90 eee0487e Kostas Papadimitriou
91 eee0487e Kostas Papadimitriou
    def test_keys_collection_get(self):
92 be2c0c51 Kostas Papadimitriou
        resp = self.client.get(self.keys_url)
93 eee0487e Kostas Papadimitriou
        self.assertEqual(resp.content, "[]")
94 eee0487e Kostas Papadimitriou
95 eee0487e Kostas Papadimitriou
        PublicKeyPair.objects.create(user=self.user, name="key pair 1",
96 d3e9d04b Ilias Tsitsimpis
                                     content="content1")
97 eee0487e Kostas Papadimitriou
98 be2c0c51 Kostas Papadimitriou
        resp = self.client.get(self.keys_url)
99 d3e9d04b Ilias Tsitsimpis
        resp_list = json.loads(resp.content)
100 be2c0c51 Kostas Papadimitriou
        exp_list = [{"content": "content1", "id": 1,
101 d3e9d04b Ilias Tsitsimpis
                     "uri": self.keys_url + "/1", "name": "key pair 1",
102 d3e9d04b Ilias Tsitsimpis
                     "fingerprint": "unknown fingerprint"}]
103 be2c0c51 Kostas Papadimitriou
        self.assertEqual(resp_list, exp_list)
104 eee0487e Kostas Papadimitriou
105 eee0487e Kostas Papadimitriou
        PublicKeyPair.objects.create(user=self.user, name="key pair 2",
106 d3e9d04b Ilias Tsitsimpis
                                     content="content2")
107 eee0487e Kostas Papadimitriou
108 be2c0c51 Kostas Papadimitriou
        resp = self.client.get(self.keys_url)
109 be2c0c51 Kostas Papadimitriou
        resp_list = json.loads(resp.content)
110 be2c0c51 Kostas Papadimitriou
        exp_list = [{"content": "content1", "id": 1,
111 be2c0c51 Kostas Papadimitriou
                     "uri": self.keys_url + "/1", "name": "key pair 1",
112 be2c0c51 Kostas Papadimitriou
                     "fingerprint": "unknown fingerprint"},
113 be2c0c51 Kostas Papadimitriou
                    {"content": "content2", "id": 2,
114 be2c0c51 Kostas Papadimitriou
                     "uri": self.keys_url + "/2",
115 be2c0c51 Kostas Papadimitriou
                     "name": "key pair 2",
116 be2c0c51 Kostas Papadimitriou
                     "fingerprint": "unknown fingerprint"}]
117 be2c0c51 Kostas Papadimitriou
118 be2c0c51 Kostas Papadimitriou
        self.assertEqual(resp_list, exp_list)
119 eee0487e Kostas Papadimitriou
120 eee0487e Kostas Papadimitriou
    def test_keys_resourse_get(self):
121 be2c0c51 Kostas Papadimitriou
        resp = self.client.get(self.keys_url + "/1")
122 6ab78e7c Kostas Papadimitriou
        self.assertEqual(resp.status_code, 404)
123 6ab78e7c Kostas Papadimitriou
124 6ab78e7c Kostas Papadimitriou
        # create a public key
125 6ab78e7c Kostas Papadimitriou
        PublicKeyPair.objects.create(user=self.user, name="key pair 1",
126 d3e9d04b Ilias Tsitsimpis
                                     content="content1")
127 be2c0c51 Kostas Papadimitriou
        resp = self.client.get(self.keys_url + "/1")
128 d3e9d04b Ilias Tsitsimpis
        resp_dict = json.loads(resp.content)
129 be2c0c51 Kostas Papadimitriou
        exp_dict = {"content": "content1", "id": 1,
130 be2c0c51 Kostas Papadimitriou
                    "uri": self.keys_url + "/1", "name": "key pair 1",
131 be2c0c51 Kostas Papadimitriou
                    "fingerprint": "unknown fingerprint"}
132 be2c0c51 Kostas Papadimitriou
        self.assertEqual(resp_dict, exp_dict)
133 6ab78e7c Kostas Papadimitriou
134 6ab78e7c Kostas Papadimitriou
        # update
135 be2c0c51 Kostas Papadimitriou
        resp = self.client.put(self.keys_url + "/1",
136 d3e9d04b Ilias Tsitsimpis
                               json.dumps({'name': 'key pair 1 new name'}),
137 be2c0c51 Kostas Papadimitriou
                               content_type='application/json')
138 be2c0c51 Kostas Papadimitriou
139 6ab78e7c Kostas Papadimitriou
        pk = PublicKeyPair.objects.get(pk=1)
140 6ab78e7c Kostas Papadimitriou
        self.assertEqual(pk.name, "key pair 1 new name")
141 6ab78e7c Kostas Papadimitriou
142 6ab78e7c Kostas Papadimitriou
        # delete
143 be2c0c51 Kostas Papadimitriou
        resp = self.client.delete(self.keys_url + "/1")
144 6ab78e7c Kostas Papadimitriou
        self.assertEqual(PublicKeyPair.objects.count(), 0)
145 6ab78e7c Kostas Papadimitriou
146 be2c0c51 Kostas Papadimitriou
        resp = self.client.get(self.keys_url + "/1")
147 6ab78e7c Kostas Papadimitriou
        self.assertEqual(resp.status_code, 404)
148 6ab78e7c Kostas Papadimitriou
149 be2c0c51 Kostas Papadimitriou
        resp = self.client.get(self.keys_url)
150 6ab78e7c Kostas Papadimitriou
        self.assertEqual(resp.content, "[]")
151 9829e3b6 Kostas Papadimitriou
152 9829e3b6 Kostas Papadimitriou
        # test rest create
153 be2c0c51 Kostas Papadimitriou
        resp = self.client.post(self.keys_url,
154 d3e9d04b Ilias Tsitsimpis
                                json.dumps({'name': 'key pair 2',
155 d3e9d04b Ilias Tsitsimpis
                                            'content': """key 2 content"""}),
156 be2c0c51 Kostas Papadimitriou
                                content_type='application/json')
157 9829e3b6 Kostas Papadimitriou
        self.assertEqual(PublicKeyPair.objects.count(), 1)
158 aaaf78f2 Giorgos Korfiatis
        pk = PublicKeyPair.objects.get()
159 9829e3b6 Kostas Papadimitriou
        self.assertEqual(pk.name, "key pair 2")
160 9829e3b6 Kostas Papadimitriou
        self.assertEqual(pk.content, "key 2 content")
161 9829e3b6 Kostas Papadimitriou
162 3548024c Kostas Papadimitriou
    def test_generate_views(self):
163 3548024c Kostas Papadimitriou
        import base64
164 3548024c Kostas Papadimitriou
165 3548024c Kostas Papadimitriou
        # just test that
166 be2c0c51 Kostas Papadimitriou
        resp = self.client.post(self.keys_url + "/generate")
167 3548024c Kostas Papadimitriou
        self.assertNotEqual(resp, "")
168 3548024c Kostas Papadimitriou
169 3548024c Kostas Papadimitriou
        data = json.loads(resp.content)
170 d3e9d04b Ilias Tsitsimpis
        self.assertEqual('private' in data, True)
171 d3e9d04b Ilias Tsitsimpis
        self.assertEqual('private' in data, True)
172 3548024c Kostas Papadimitriou
173 3548024c Kostas Papadimitriou
        # public key is base64 encoded
174 d3e9d04b Ilias Tsitsimpis
        base64.b64decode(data['public'].replace("ssh-rsa ", ""))
175 3548024c Kostas Papadimitriou
176 3548024c Kostas Papadimitriou
        # remove header/footer
177 3548024c Kostas Papadimitriou
        private = "".join(data['private'].split("\n")[1:-1])
178 3548024c Kostas Papadimitriou
179 3548024c Kostas Papadimitriou
        # private key is base64 encoded
180 3548024c Kostas Papadimitriou
        base64.b64decode(private)
181 3548024c Kostas Papadimitriou
182 386481eb Kostas Papadimitriou
        new_key = PublicKeyPair()
183 386481eb Kostas Papadimitriou
        new_key.content = data['public']
184 386481eb Kostas Papadimitriou
        new_key.name = "new key"
185 244c552b Giorgos Verigakis
        new_key.user = 'test'
186 386481eb Kostas Papadimitriou
        new_key.full_clean()
187 386481eb Kostas Papadimitriou
        new_key.save()
188 386481eb Kostas Papadimitriou
189 aaaf78f2 Giorgos Korfiatis
    def test_generate_limit(self):
190 aaaf78f2 Giorgos Korfiatis
        settings.USERDATA_MAX_SSH_KEYS_PER_USER = 1
191 d3e9d04b Ilias Tsitsimpis
        self.client.post(self.keys_url,
192 d3e9d04b Ilias Tsitsimpis
                         json.dumps({'name': 'key1',
193 d3e9d04b Ilias Tsitsimpis
                                     'content': """key 1 content"""}),
194 d3e9d04b Ilias Tsitsimpis
                         content_type='application/json')
195 aaaf78f2 Giorgos Korfiatis
        genpath = self.keys_url + "/generate"
196 aaaf78f2 Giorgos Korfiatis
        r = self.client.post(genpath)
197 aaaf78f2 Giorgos Korfiatis
        assert isinstance(r, http.HttpResponseServerError)
198 aaaf78f2 Giorgos Korfiatis
199 c72a830d Kostas Papadimitriou
    def test_invalid_data(self):
200 be2c0c51 Kostas Papadimitriou
        resp = self.client.post(self.keys_url,
201 d3e9d04b Ilias Tsitsimpis
                                json.dumps({'content': """key 2 content"""}),
202 be2c0c51 Kostas Papadimitriou
                                content_type='application/json')
203 c72a830d Kostas Papadimitriou
204 c72a830d Kostas Papadimitriou
        self.assertEqual(resp.status_code, 500)
205 d3e9d04b Ilias Tsitsimpis
        self.assertEqual(resp.content,
206 d3e9d04b Ilias Tsitsimpis
                         """{"non_field_key": "__all__", "errors": """
207 d3e9d04b Ilias Tsitsimpis
                         """{"name": ["This field cannot be blank."]}}""")
208 c72a830d Kostas Papadimitriou
209 1a97a220 Kostas Papadimitriou
        settings.USERDATA_MAX_SSH_KEYS_PER_USER = 2
210 c72a830d Kostas Papadimitriou
211 c72a830d Kostas Papadimitriou
        # test ssh limit
212 be2c0c51 Kostas Papadimitriou
        resp = self.client.post(self.keys_url,
213 d3e9d04b Ilias Tsitsimpis
                                json.dumps({'name': 'key1',
214 d3e9d04b Ilias Tsitsimpis
                                            'content': """key 1 content"""}),
215 be2c0c51 Kostas Papadimitriou
                                content_type='application/json')
216 be2c0c51 Kostas Papadimitriou
        resp = self.client.post(self.keys_url,
217 d3e9d04b Ilias Tsitsimpis
                                json.dumps({'name': 'key1',
218 d3e9d04b Ilias Tsitsimpis
                                            'content': """key 1 content"""}),
219 be2c0c51 Kostas Papadimitriou
                                content_type='application/json')
220 be2c0c51 Kostas Papadimitriou
        resp = self.client.post(self.keys_url,
221 d3e9d04b Ilias Tsitsimpis
                                json.dumps({'name': 'key1',
222 d3e9d04b Ilias Tsitsimpis
                                            'content': """key 1 content"""}),
223 be2c0c51 Kostas Papadimitriou
                                content_type='application/json')
224 c72a830d Kostas Papadimitriou
        self.assertEqual(resp.status_code, 500)
225 d3e9d04b Ilias Tsitsimpis
        self.assertEqual(resp.content,
226 d3e9d04b Ilias Tsitsimpis
                         """{"non_field_key": "__all__", "errors": """
227 d3e9d04b Ilias Tsitsimpis
                         """{"__all__": ["SSH keys limit exceeded."]}}""")