1
# Copyright 2014 Canonical Ltd. This software is licensed under the
2
# GNU Affero General Public License version 3 (see the file LICENSE).
4
"""Tests for the ssl key API."""
6
from __future__ import (
20
from django.core.urlresolvers import reverse
21
from maasserver.models import SSLKey
22
from maasserver.testing import get_data
23
from maasserver.testing.api import APITestCase
24
from maasserver.testing.factory import factory
25
from maasserver.utils.orm import get_one
28
class TestSSLKeyHandlers(APITestCase):
30
def test_sslkeys_handler_path(self):
32
'/api/1.0/account/prefs/sslkeys/', reverse('sslkeys_handler'))
34
def test_sslkey_handler_path(self):
36
'/api/1.0/account/prefs/sslkeys/key/',
37
reverse('sslkey_handler', args=['key']))
39
def test_list_works(self):
40
_, keys = factory.make_user_with_ssl_keys(
41
n_keys=2, user=self.logged_in_user)
42
params = dict(op="list")
43
response = self.client.get(
44
reverse('sslkeys_handler'), params)
45
self.assertEqual(httplib.OK, response.status_code, response)
46
parsed_result = json.loads(response.content)
47
parsed_result = [result['resource_uri'] for result in parsed_result]
49
reverse('sslkey_handler', args=[keys[0].id]),
50
reverse('sslkey_handler', args=[keys[1].id]),
52
self.assertItemsEqual(expected_result, parsed_result)
54
def test_list_sorts_output(self):
55
_, keys = factory.make_user_with_ssl_keys(
56
n_keys=2, user=self.logged_in_user)
57
params = dict(op="list")
58
response = self.client.get(
59
reverse('sslkeys_handler'), params)
60
self.assertEqual(httplib.OK, response.status_code, response)
61
parsed_result = json.loads(response.content)
62
parsed_result = [result['resource_uri'] for result in parsed_result]
64
reverse('sslkey_handler', args=[keys[0].id]),
65
reverse('sslkey_handler', args=[keys[1].id]),
67
self.assertEqual(expected_result, parsed_result)
69
def test_list_only_shows_user_keys(self):
71
factory.make_user_with_ssl_keys(n_keys=2)
72
_, keys = factory.make_user_with_ssl_keys(
73
n_keys=2, user=self.logged_in_user)
74
params = dict(op="list")
75
response = self.client.get(
76
reverse('sslkeys_handler'), params)
77
self.assertEqual(httplib.OK, response.status_code, response)
78
parsed_result = json.loads(response.content)
79
parsed_result = [result['resource_uri'] for result in parsed_result]
81
reverse('sslkey_handler', args=[keys[0].id]),
82
reverse('sslkey_handler', args=[keys[1].id]),
84
self.assertItemsEqual(expected_result, parsed_result)
86
def test_list_only_shows_user_keys_for_admin(self):
88
factory.make_user_with_ssl_keys(n_keys=2)
89
_, keys = factory.make_user_with_ssl_keys(
90
n_keys=2, user=self.logged_in_user)
92
params = dict(op="list")
93
response = self.client.get(
94
reverse('sslkeys_handler'), params)
95
self.assertEqual(httplib.OK, response.status_code, response)
96
parsed_result = json.loads(response.content)
97
parsed_result = [result['resource_uri'] for result in parsed_result]
99
reverse('sslkey_handler', args=[keys[0].id]),
100
reverse('sslkey_handler', args=[keys[1].id]),
102
self.assertItemsEqual(expected_result, parsed_result)
104
def test_get_by_id_works(self):
105
_, keys = factory.make_user_with_ssl_keys(
106
n_keys=1, user=self.logged_in_user)
108
response = self.client.get(
109
reverse('sslkey_handler', args=[key.id]))
110
self.assertEqual(httplib.OK, response.status_code, response)
111
parsed_result = json.loads(response.content)
115
resource_uri=reverse('sslkey_handler', args=[key.id]),
117
self.assertEqual(expected, parsed_result)
119
def test_get_by_id_fails_for_non_owner(self):
120
_, keys = factory.make_user_with_ssl_keys(n_keys=1)
121
factory.make_user_with_ssl_keys(
122
n_keys=1, user=self.logged_in_user)
124
response = self.client.get(
125
reverse('sslkey_handler', args=[key.id]))
126
self.assertEqual(httplib.FORBIDDEN, response.status_code, response)
128
def test_get_by_id_fails_for_non_owner_as_admin(self):
129
_, keys = factory.make_user_with_ssl_keys(n_keys=1)
130
factory.make_user_with_ssl_keys(
131
n_keys=1, user=self.logged_in_user)
134
response = self.client.get(
135
reverse('sslkey_handler', args=[key.id]))
136
self.assertEqual(httplib.FORBIDDEN, response.status_code, response)
138
def test_delete_by_id_works(self):
139
_, keys = factory.make_user_with_ssl_keys(
140
n_keys=2, user=self.logged_in_user)
141
response = self.client.delete(
142
reverse('sslkey_handler', args=[keys[0].id]))
143
self.assertEqual(httplib.NO_CONTENT, response.status_code, response)
144
keys_after = SSLKey.objects.filter(user=self.logged_in_user)
145
self.assertEqual(1, len(keys_after))
146
self.assertEqual(keys[1].id, keys_after[0].id)
148
def test_delete_fails_if_not_your_key(self):
149
user, keys = factory.make_user_with_ssl_keys(n_keys=1)
150
response = self.client.delete(
151
reverse('sslkey_handler', args=[keys[0].id]))
152
self.assertEqual(httplib.FORBIDDEN, response.status_code, response)
153
self.assertEqual(1, len(SSLKey.objects.filter(user=user)))
155
def test_adding_works(self):
156
key_string = get_data('data/test_x509_0.pem')
157
response = self.client.post(
158
reverse('sslkeys_handler'),
159
data=dict(op="new", key=key_string))
160
self.assertEqual(httplib.CREATED, response.status_code)
161
parsed_response = json.loads(response.content)
162
self.assertEqual(key_string, parsed_response["key"])
163
added_key = get_one(SSLKey.objects.filter(user=self.logged_in_user))
164
self.assertEqual(key_string, added_key.key)
166
def test_adding_catches_key_validation_errors(self):
167
key_string = factory.getRandomString()
168
response = self.client.post(
169
reverse('sslkeys_handler'),
170
data=dict(op='new', key=key_string))
171
self.assertEqual(httplib.BAD_REQUEST, response.status_code, response)
172
self.assertIn("Invalid", response.content)
174
def test_adding_returns_badrequest_when_key_not_in_form(self):
175
response = self.client.post(
176
reverse('sslkeys_handler'),
178
self.assertEqual(httplib.BAD_REQUEST, response.status_code, response)
180
dict(key=["This field is required."]),
181
json.loads(response.content))