1
# Copyright 2016 Canonical Ltd. This software is licensed under the
2
# GNU Affero General Public License version 3 (see the file LICENSE).
4
"""Tests for `maasserver.websockets.handlers.dhcpsnippet`"""
8
from email.utils import format_datetime
11
import maasserver.forms_dhcpsnippet as forms_dhcpsnippet_module
12
from maasserver.models import (
16
from maasserver.testing.factory import factory
17
from maasserver.testing.testcase import MAASServerTestCase
18
from maasserver.utils.orm import reload_object
19
from maasserver.websockets.base import (
20
HandlerPermissionError,
21
HandlerValidationError,
23
from maasserver.websockets.handlers.dhcpsnippet import DHCPSnippetHandler
24
from maasserver.websockets.handlers.timestampedmodel import dehydrate_datetime
27
class TestDHCPSnippetHandler(MAASServerTestCase):
32
forms_dhcpsnippet_module, 'validate_dhcp_config').return_value = []
34
def dehydrate_dhcp_snippet(self, dhcp_snippet):
37
if dhcp_snippet.subnet is not None:
38
subnet_id = dhcp_snippet.subnet.id
39
elif dhcp_snippet.node is not None:
40
node_system_id = dhcp_snippet.node.system_id
42
'id': dhcp_snippet.id,
43
'name': dhcp_snippet.name,
44
'description': dhcp_snippet.description,
45
'value': dhcp_snippet.value.data,
50
'created': format_datetime(value.created),
52
for value in dhcp_snippet.value.previous_versions()],
53
'enabled': dhcp_snippet.enabled,
54
'node': node_system_id,
56
'updated': dehydrate_datetime(dhcp_snippet.updated),
57
'created': dehydrate_datetime(dhcp_snippet.created),
60
def test_get_global(self):
61
user = factory.make_User()
62
handler = DHCPSnippetHandler(user, {})
63
dhcp_snippet = factory.make_DHCPSnippet()
65
self.dehydrate_dhcp_snippet(dhcp_snippet),
66
handler.get({'id': dhcp_snippet.id}))
68
def test_get_with_subnet(self):
69
user = factory.make_User()
70
handler = DHCPSnippetHandler(user, {})
71
subnet = factory.make_Subnet()
72
dhcp_snippet = factory.make_DHCPSnippet(subnet=subnet)
74
self.dehydrate_dhcp_snippet(dhcp_snippet),
75
handler.get({'id': dhcp_snippet.id}))
77
def test_get_with_node(self):
78
user = factory.make_User()
79
handler = DHCPSnippetHandler(user, {})
80
node = factory.make_Node()
81
dhcp_snippet = factory.make_DHCPSnippet(node=node)
83
self.dehydrate_dhcp_snippet(dhcp_snippet),
84
handler.get({'id': dhcp_snippet.id}))
87
user = factory.make_User()
88
handler = DHCPSnippetHandler(user, {})
89
expected_dhcp_snippets = [
90
self.dehydrate_dhcp_snippet(factory.make_DHCPSnippet())
93
self.assertItemsEqual(expected_dhcp_snippets, handler.list({}))
95
def test_create_is_admin_only(self):
96
user = factory.make_User()
97
handler = DHCPSnippetHandler(user, {})
99
HandlerPermissionError,
102
def test_create(self):
103
user = factory.make_admin()
104
handler = DHCPSnippetHandler(user, {})
105
dhcp_snippet_name = factory.make_name('dhcp_snippet_name')
107
'name': dhcp_snippet_name,
108
'value': factory.make_string(),
110
self.assertIsNotNone(DHCPSnippet.objects.get(name=dhcp_snippet_name))
112
def test_update_is_admin_only(self):
113
user = factory.make_User()
114
handler = DHCPSnippetHandler(user, {})
116
HandlerPermissionError,
119
def test_update(self):
120
user = factory.make_admin()
121
handler = DHCPSnippetHandler(user, {})
122
dhcp_snippet = factory.make_DHCPSnippet()
123
node = factory.make_Node()
125
'id': dhcp_snippet.id,
126
'node': node.system_id
128
dhcp_snippet = reload_object(dhcp_snippet)
129
self.assertEquals(node, dhcp_snippet.node)
131
def test_delete_is_admin_only(self):
132
user = factory.make_User()
133
handler = DHCPSnippetHandler(user, {})
135
HandlerPermissionError,
138
def test_delete(self):
139
user = factory.make_admin()
140
handler = DHCPSnippetHandler(user, {})
141
dhcp_snippet = factory.make_DHCPSnippet()
142
handler.delete({'id': dhcp_snippet.id})
144
DHCPSnippet.DoesNotExist,
145
DHCPSnippet.objects.get, id=dhcp_snippet.id)
147
def test_revert_is_admin_only(self):
148
user = factory.make_User()
149
handler = DHCPSnippetHandler(user, {})
151
HandlerPermissionError,
154
def test_revert(self):
155
user = factory.make_admin()
156
handler = DHCPSnippetHandler(user, {})
157
dhcp_snippet = factory.make_DHCPSnippet()
158
textfile_ids = [dhcp_snippet.value.id]
160
dhcp_snippet.value = dhcp_snippet.value.update(
161
factory.make_string())
163
textfile_ids.append(dhcp_snippet.value.id)
164
revert_to = random.randint(-10, -1)
165
reverted_ids = textfile_ids[revert_to:]
166
remaining_ids = textfile_ids[:revert_to]
167
handler.revert({'id': dhcp_snippet.id, 'to': revert_to})
168
dhcp_snippet = reload_object(dhcp_snippet)
170
VersionedTextFile.objects.get(
171
id=textfile_ids[revert_to - 1]).data,
172
dhcp_snippet.value.data)
173
for i in reverted_ids:
175
VersionedTextFile.DoesNotExist,
176
VersionedTextFile.objects.get, id=i)
177
for i in remaining_ids:
178
self.assertIsNotNone(VersionedTextFile.objects.get(id=i))
180
def test_revert_requires_to(self):
181
user = factory.make_admin()
182
handler = DHCPSnippetHandler(user, {})
183
dhcp_snippet = factory.make_DHCPSnippet()
185
HandlerValidationError,
186
handler.revert, {'id': dhcp_snippet.id})
188
def test_revert_requires_to_to_be_an_int(self):
189
user = factory.make_admin()
190
handler = DHCPSnippetHandler(user, {})
191
dhcp_snippet = factory.make_DHCPSnippet()
193
HandlerValidationError,
195
{'id': dhcp_snippet.id, 'to': factory.make_name('to')})
197
def test_revert_errors_on_invalid_id(self):
198
user = factory.make_admin()
199
handler = DHCPSnippetHandler(user, {})
200
dhcp_snippet = factory.make_DHCPSnippet()
201
textfile = VersionedTextFile.objects.create(data=factory.make_string())
203
HandlerValidationError,
205
{'id': dhcp_snippet.id, 'to': textfile.id})