22
22
from django.conf import settings
23
23
from django.core import urlresolvers
24
from django import http
25
24
from django.test.client import Client
26
25
from django.utils.importlib import import_module
26
from django.utils.translation import ugettext_lazy as _
30
from horizon import api
31
29
from horizon import base
32
30
from horizon import test
33
31
from horizon import users
32
from horizon.dashboards.nova.dashboard import Nova
33
from horizon.dashboards.syspanel.dashboard import Syspanel
34
from horizon.dashboards.settings.dashboard import Settings
35
from horizon.tests.test_dashboards.cats.dashboard import Cats
36
from horizon.tests.test_dashboards.cats.kittens.panel import Kittens
37
from horizon.tests.test_dashboards.cats.tigers.panel import Tigers
38
from horizon.tests.test_dashboards.dogs.dashboard import Dogs
39
from horizon.tests.test_dashboards.dogs.puppies.panel import Puppies
36
42
class MyDash(horizon.Dashboard):
43
name = _("My Dashboard")
39
45
default_panel = "myslug"
42
48
class MyPanel(horizon.Panel):
45
51
services = ("compute",)
46
52
urls = 'horizon.tests.test_panel_urls'
55
class AdminPanel(horizon.Panel):
56
name = _("Admin Panel")
59
urls = 'horizon.tests.test_panel_urls'
49
62
class BaseHorizonTests(test.TestCase):
51
64
super(BaseHorizonTests, self).setUp()
65
# Adjust our horizon config and register our custom dashboards/panels.
66
self.old_default_dash = settings.HORIZON_CONFIG['default_dashboard']
67
settings.HORIZON_CONFIG['default_dashboard'] = 'cats'
68
self.old_dashboards = settings.HORIZON_CONFIG['dashboards']
69
settings.HORIZON_CONFIG['dashboards'] = ('cats', 'dogs')
70
base.Horizon.register(Cats)
71
base.Horizon.register(Dogs)
72
Cats.register(Kittens)
74
Dogs.register(Puppies)
52
75
# Trigger discovery, registration, and URLconf generation if it
53
76
# hasn't happened yet.
54
77
base.Horizon._urls()
59
82
for dash in self._discovered_dashboards:
60
83
panels = base.Horizon._registry[dash]._registry.keys()
61
84
self._discovered_panels[dash] = panels
85
# Remove the OpenStack dashboards for test isolation.
86
base.Horizon.unregister(Nova)
87
base.Horizon.unregister(Syspanel)
88
base.Horizon.unregister(Settings)
63
90
def tearDown(self):
64
91
super(BaseHorizonTests, self).tearDown()
92
# Restore our settings
93
settings.HORIZON_CONFIG['default_dashboard'] = self.old_default_dash
94
settings.HORIZON_CONFIG['dashboards'] = self.old_dashboards
65
95
# Destroy our singleton and re-create it.
66
96
base.HorizonSite._instance = None
68
98
base.Horizon = base.HorizonSite()
99
# Re-register the OpenStack dashboards that we removed.
100
base.Horizon.register(Nova)
101
base.Horizon.register(Syspanel)
102
base.Horizon.register(Settings)
69
103
# Reload the convenience references to Horizon stored in __init__
70
104
reload(import_module("horizon"))
71
105
# Re-register our original dashboards and panels.
72
106
# This is necessary because autodiscovery only works on the first
73
107
# import, and calling reload introduces innumerable additional
74
108
# problems. Manual re-registration is the only good way for testing.
109
self._discovered_dashboards.remove(Cats)
110
self._discovered_dashboards.remove(Dogs)
75
111
for dash in self._discovered_dashboards:
76
112
base.Horizon.register(dash)
77
113
for panel in self._discovered_panels[dash]:
114
150
with self.assertRaises(base.NotRegistered):
115
151
horizon.get_dashboard("fake")
116
152
self.assertQuerysetEqual(horizon.get_dashboards(),
117
['<Dashboard: nova>',
118
'<Dashboard: syspanel>',
119
'<Dashboard: settings>',
153
['<Dashboard: cats>',
120
155
'<Dashboard: mydash>'])
123
self.assertEqual(len(base.Horizon._registry), 4)
158
self.assertEqual(len(base.Horizon._registry), 3)
124
159
horizon.unregister(MyDash)
125
self.assertEqual(len(base.Horizon._registry), 3)
160
self.assertEqual(len(base.Horizon._registry), 2)
126
161
with self.assertRaises(base.NotRegistered):
127
162
horizon.get_dashboard(MyDash)
129
164
def test_site(self):
130
165
self.assertEqual(unicode(base.Horizon), "Horizon")
131
166
self.assertEqual(repr(base.Horizon), "<Site: horizon>")
132
dash = base.Horizon.get_dashboard('nova')
167
dash = base.Horizon.get_dashboard('cats')
133
168
self.assertEqual(base.Horizon.get_default_dashboard(), dash)
134
169
user = users.User()
135
170
self.assertEqual(base.Horizon.get_user_home(user),
136
171
dash.get_absolute_url())
138
173
def test_dashboard(self):
139
syspanel = horizon.get_dashboard("syspanel")
140
self.assertEqual(syspanel._registered_with, base.Horizon)
141
self.assertQuerysetEqual(syspanel.get_panels(),
142
['<Panel: overview>',
143
'<Panel: instances>',
150
self.assertEqual(syspanel.get_absolute_url(), "/syspanel/")
174
cats = horizon.get_dashboard("cats")
175
self.assertEqual(cats._registered_with, base.Horizon)
176
self.assertQuerysetEqual(cats.get_panels(),
179
self.assertEqual(cats.get_absolute_url(), "/cats/")
152
181
# Test registering a module with a dashboard that defines panels
154
syspanel.register(MyPanel)
155
self.assertQuerysetEqual(syspanel.get_panel_groups()['other'],
183
cats.register(MyPanel)
184
self.assertQuerysetEqual(cats.get_panel_groups()['other'],
156
185
['<Panel: myslug>'])
158
187
# Test that panels defined as a tuple still return a PanelGroup
159
settings_dash = horizon.get_dashboard("settings")
160
self.assertQuerysetEqual(settings_dash.get_panel_groups().values(),
188
dogs = horizon.get_dashboard("dogs")
189
self.assertQuerysetEqual(dogs.get_panel_groups().values(),
161
190
['<PanelGroup: default>'])
163
192
# Test registering a module with a dashboard that defines panels
165
settings_dash = horizon.get_dashboard("settings")
166
settings_dash.register(MyPanel)
167
self.assertQuerysetEqual(settings_dash.get_panels(),
194
dogs = horizon.get_dashboard("dogs")
195
dogs.register(MyPanel)
196
self.assertQuerysetEqual(dogs.get_panels(),
171
198
'<Panel: myslug>'])
173
200
def test_panels(self):
174
syspanel = horizon.get_dashboard("syspanel")
175
instances = syspanel.get_panel("instances")
176
self.assertEqual(instances._registered_with, syspanel)
177
self.assertEqual(instances.get_absolute_url(), "/syspanel/instances/")
201
cats = horizon.get_dashboard("cats")
202
tigers = cats.get_panel("tigers")
203
self.assertEqual(tigers._registered_with, cats)
204
self.assertEqual(tigers.get_absolute_url(), "/cats/tigers/")
179
206
def test_index_url_name(self):
180
syspanel = horizon.get_dashboard("syspanel")
181
instances = syspanel.get_panel("instances")
182
instances.index_url_name = "does_not_exist"
207
cats = horizon.get_dashboard("cats")
208
tigers = cats.get_panel("tigers")
209
tigers.index_url_name = "does_not_exist"
183
210
with self.assertRaises(urlresolvers.NoReverseMatch):
184
instances.get_absolute_url()
185
instances.index_url_name = "index"
186
self.assertEqual(instances.get_absolute_url(), "/syspanel/instances/")
211
tigers.get_absolute_url()
212
tigers.index_url_name = "index"
213
self.assertEqual(tigers.get_absolute_url(), "/cats/tigers/")
188
215
def test_lazy_urls(self):
189
216
urlpatterns = horizon.urls[0]
195
222
def test_horizon_test_isolation_1(self):
196
223
""" Isolation Test Part 1: sets a value. """
197
syspanel = horizon.get_dashboard("syspanel")
224
cats = horizon.get_dashboard("cats")
200
227
def test_horizon_test_isolation_2(self):
201
228
""" Isolation Test Part 2: The value set in part 1 should be gone. """
202
syspanel = horizon.get_dashboard("syspanel")
203
self.assertFalse(hasattr(syspanel, "evil"))
229
cats = horizon.get_dashboard("cats")
230
self.assertFalse(hasattr(cats, "evil"))
205
232
def test_public(self):
206
233
users.get_user_from_request = self._real_get_user_from_request
207
settings = horizon.get_dashboard("settings")
234
dogs = horizon.get_dashboard("dogs")
208
235
# Known to have no restrictions on it other than being logged in.
209
user_panel = settings.get_panel("user")
210
url = user_panel.get_absolute_url()
236
puppies = dogs.get_panel("puppies")
237
url = puppies.get_absolute_url()
211
238
# Get a clean, logged out client instance.
212
239
client = Client()
258
285
service_catalog=self.service_catalog,
261
resp = self.client.get(user_panel.get_absolute_url())
288
resp = self.client.get(panel.get_absolute_url())
262
289
self.assertEqual(resp.status_code, 302)
264
resp = self.client.get(user_panel.get_absolute_url(),
291
resp = self.client.get(panel.get_absolute_url(),
266
293
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
267
294
self.assertEqual(resp.status_code, 401)
269
self.mox.StubOutWithMock(api, 'flavor_list')
270
api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list())
271
api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list())
274
296
# Set roles for admin user
275
297
self.setActiveUser(token=self.token.id,
276
298
username=self.user.name,
278
300
service_catalog=self.request.user.service_catalog,
279
301
roles=[{'name': 'admin'}])
281
resp = self.client.get(
282
urlresolvers.reverse('horizon:syspanel:flavors:create'))
303
resp = self.client.get(panel.get_absolute_url())
283
304
self.assertEqual(resp.status_code, 200)
284
self.assertTemplateUsed(resp, "syspanel/flavors/create.html")
286
306
# Test modal form
287
resp = self.client.get(
288
urlresolvers.reverse('horizon:syspanel:flavors:create'),
290
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
307
resp = self.client.get(panel.get_absolute_url(),
309
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
291
310
self.assertEqual(resp.status_code, 200)
292
self.assertTemplateUsed(resp, "syspanel/flavors/_create.html")