28
28
from horizon import api
29
29
from horizon import test
30
30
from .tables import ContainersTable, ObjectsTable
33
34
CONTAINER_INDEX_URL = reverse('horizon:nova:containers:index')
36
class ContainerViewTests(test.BaseViewTests):
38
super(ContainerViewTests, self).setUp()
39
self.container = api.Container(None)
40
self.container.name = 'containerName'
41
self.container.size_used = 128
42
self.containers = (self.container,)
37
class ContainerViewTests(test.TestCase):
44
38
def test_index(self):
39
containers = self.containers.list()
45
40
self.mox.StubOutWithMock(api, 'swift_get_containers')
46
api.swift_get_containers(
47
IsA(http.HttpRequest), marker=None).AndReturn(
48
([self.container], False))
41
api.swift_get_containers(IsA(http.HttpRequest), marker=None) \
42
.AndReturn((containers, False))
50
43
self.mox.ReplayAll()
52
45
res = self.client.get(CONTAINER_INDEX_URL)
54
47
self.assertTemplateUsed(res, 'nova/containers/index.html')
55
48
self.assertIn('table', res.context)
56
containers = res.context['table'].data
58
self.assertEqual(len(containers), 1)
59
self.assertEqual(containers[0].name, 'containerName')
49
resp_containers = res.context['table'].data
50
self.assertEqual(len(resp_containers), len(containers))
61
52
def test_delete_container(self):
62
self.mox.StubOutWithMock(api, 'swift_delete_container')
53
container = self.containers.get(name="container_two")
54
self.mox.StubOutWithMock(api, 'swift_delete_container')
55
api.swift_delete_container(IsA(http.HttpRequest), container.name)
58
action_string = "containers__delete__%s" % container.name
59
form_data = {"action": action_string}
60
req = self.factory.post(CONTAINER_INDEX_URL, form_data)
61
table = ContainersTable(req, self.containers.list())
62
handled = table.maybe_handle()
63
self.assertEqual(handled['location'], CONTAINER_INDEX_URL)
65
def test_delete_container_nonempty(self):
66
container = self.containers.first()
67
self.mox.StubOutWithMock(api, 'swift_delete_container')
68
exc = ContainerNotEmpty('containerNotEmpty')
63
69
api.swift_delete_container(IsA(http.HttpRequest),
68
action_string = "containers__delete__%s" % self.container.name
69
form_data = {"action": action_string}
70
req = self.factory.post(CONTAINER_INDEX_URL, form_data)
71
table = ContainersTable(req, self.containers)
72
handled = table.maybe_handle()
74
self.assertEqual(handled['location'], CONTAINER_INDEX_URL)
76
def test_delete_container_nonempty(self):
77
self.mox.StubOutWithMock(api, 'swift_delete_container')
79
exception = ContainerNotEmpty('containerNotEmpty')
80
api.swift_delete_container(
81
IsA(http.HttpRequest),
82
'containerName').AndRaise(exception)
86
action_string = "containers__delete__%s" % self.container.name
87
form_data = {"action": action_string}
88
req = self.factory.post(CONTAINER_INDEX_URL, form_data)
89
table = ContainersTable(req, self.containers)
90
handled = table.maybe_handle()
70
container.name).AndRaise(exc)
73
action_string = "containers__delete__%s" % container.name
74
form_data = {"action": action_string}
75
req = self.factory.post(CONTAINER_INDEX_URL, form_data)
76
table = ContainersTable(req, self.containers.list())
77
handled = table.maybe_handle()
92
78
self.assertEqual(handled['location'], CONTAINER_INDEX_URL)
94
80
def test_create_container_get(self):
95
81
res = self.client.get(reverse('horizon:nova:containers:create'))
97
82
self.assertTemplateUsed(res, 'nova/containers/create.html')
99
84
def test_create_container_post(self):
100
formData = {'name': 'containerName',
101
'method': 'CreateContainer'}
103
85
self.mox.StubOutWithMock(api, 'swift_create_container')
104
api.swift_create_container(
105
IsA(http.HttpRequest), u'containerName')
86
api.swift_create_container(IsA(http.HttpRequest),
87
self.containers.first().name)
107
88
self.mox.ReplayAll()
90
formData = {'name': self.containers.first().name,
91
'method': forms.CreateContainer.__name__}
109
92
res = self.client.post(reverse('horizon:nova:containers:create'),
112
94
self.assertRedirectsNoFollow(res, CONTAINER_INDEX_URL)
115
class ObjectViewTests(test.BaseViewTests):
116
CONTAINER_NAME = 'containerName'
119
class FakeCloudFile(object):
123
def sync_metadata(self):
126
super(ObjectViewTests, self).setUp()
127
swift_object = api.swift.SwiftObject(FakeCloudFile())
128
swift_object.name = u"test_object"
129
swift_object.size = '128'
130
swift_object.container = api.swift.Container(None)
131
swift_object.container.name = self.CONTAINER_NAME
132
self.swift_objects = [swift_object]
97
class ObjectViewTests(test.TestCase):
134
98
def test_index(self):
135
99
self.mox.StubOutWithMock(api, 'swift_get_objects')
136
api.swift_get_objects(
137
IsA(http.HttpRequest),
139
marker=None).AndReturn((self.swift_objects, False))
100
ret = (self.objects.list(), False)
101
api.swift_get_objects(IsA(http.HttpRequest),
102
self.containers.first().name,
103
marker=None).AndReturn(ret)
141
104
self.mox.ReplayAll()
143
106
res = self.client.get(reverse('horizon:nova:containers:object_index',
144
args=[self.CONTAINER_NAME]))
107
args=[self.containers.first().name]))
145
108
self.assertTemplateUsed(res, 'nova/objects/index.html')
146
self.assertItemsEqual(res.context['table'].data, self.swift_objects)
109
expected = [obj.name for obj in self.objects.list()]
110
self.assertQuerysetEqual(res.context['table'].data,
112
lambda obj: obj.name)
148
114
def test_upload_index(self):
149
115
res = self.client.get(reverse('horizon:nova:containers:object_upload',
150
args=[self.CONTAINER_NAME]))
116
args=[self.containers.first().name]))
152
117
self.assertTemplateUsed(res, 'nova/objects/upload.html')
154
119
def test_upload(self):
120
container = self.containers.first()
121
obj = self.objects.first()
155
122
OBJECT_DATA = 'objectData'
156
OBJECT_FILE = tempfile.TemporaryFile()
157
OBJECT_FILE.write(OBJECT_DATA)
160
OBJECT_NAME = 'objectName'
162
formData = {'method': 'UploadObject',
163
'container_name': self.CONTAINER_NAME,
165
'object_file': OBJECT_FILE}
124
temp_file = tempfile.TemporaryFile()
125
temp_file.write(OBJECT_DATA)
167
129
self.mox.StubOutWithMock(api, 'swift_upload_object')
168
130
api.swift_upload_object(IsA(http.HttpRequest),
169
unicode(self.CONTAINER_NAME),
170
unicode(OBJECT_NAME),
171
OBJECT_DATA).AndReturn(self.swift_objects[0])
133
OBJECT_DATA).AndReturn(obj)
134
self.mox.StubOutWithMock(obj, 'sync_metadata')
173
136
self.mox.ReplayAll()
175
res = self.client.get(reverse('horizon:nova:containers:object_upload',
176
args=[self.CONTAINER_NAME]))
137
upload_url = reverse('horizon:nova:containers:object_upload',
138
args=[container.name])
139
res = self.client.get(upload_url)
178
140
self.assertContains(res, 'enctype="multipart/form-data"')
180
res = self.client.post(reverse('horizon:nova:containers:object_upload',
181
args=[self.CONTAINER_NAME]),
142
formData = {'method': forms.UploadObject.__name__,
143
'container_name': container.name,
145
'object_file': temp_file}
146
res = self.client.post(upload_url, formData)
184
self.assertRedirectsNoFollow(res,
185
reverse('horizon:nova:containers:object_index',
186
args=[self.CONTAINER_NAME]))
148
index_url = reverse('horizon:nova:containers:object_index',
149
args=[container.name])
150
self.assertRedirectsNoFollow(res, index_url)
188
152
def test_delete(self):
153
container = self.containers.first()
154
obj = self.objects.first()
155
index_url = reverse('horizon:nova:containers:object_index',
156
args=[container.name])
189
157
self.mox.StubOutWithMock(api, 'swift_delete_object')
190
api.swift_delete_object(
191
IsA(http.HttpRequest),
192
self.CONTAINER_NAME, self.swift_objects[0].name)
158
api.swift_delete_object(IsA(http.HttpRequest),
194
161
self.mox.ReplayAll()
196
OBJECT_INDEX_URL = reverse('horizon:nova:containers:object_index',
197
args=[self.CONTAINER_NAME])
198
action_string = "objects__delete__%s" % self.swift_objects[0].name
163
action_string = "objects__delete__%s" % obj.name
199
164
form_data = {"action": action_string}
200
req = self.factory.post(OBJECT_INDEX_URL, form_data)
201
kwargs = {"container_name": self.CONTAINER_NAME}
202
table = ObjectsTable(req, self.swift_objects, **kwargs)
165
req = self.factory.post(index_url, form_data)
166
kwargs = {"container_name": container.name}
167
table = ObjectsTable(req, self.objects.list(), **kwargs)
203
168
handled = table.maybe_handle()
205
self.assertEqual(handled['location'], OBJECT_INDEX_URL)
169
self.assertEqual(handled['location'], index_url)
207
171
def test_download(self):
172
container = self.containers.first()
173
obj = self.objects.first()
208
174
OBJECT_DATA = 'objectData'
209
OBJECT_NAME = 'objectName'
211
176
self.mox.StubOutWithMock(api, 'swift_get_object_data')
212
177
self.mox.StubOutWithMock(api.swift, 'swift_get_object')
214
178
api.swift.swift_get_object(IsA(http.HttpRequest),
215
unicode(self.CONTAINER_NAME),
216
unicode(OBJECT_NAME)) \
217
.AndReturn(self.swift_objects[0])
180
obj.name).AndReturn(obj)
218
181
api.swift_get_object_data(IsA(http.HttpRequest),
219
unicode(self.CONTAINER_NAME),
220
unicode(OBJECT_NAME)).AndReturn(OBJECT_DATA)
183
obj.name).AndReturn(OBJECT_DATA)
222
184
self.mox.ReplayAll()
224
res = self.client.get(reverse(
225
'horizon:nova:containers:object_download',
226
args=[self.CONTAINER_NAME, OBJECT_NAME]))
186
download_url = reverse('horizon:nova:containers:object_download',
187
args=[container.name, obj.name])
188
res = self.client.get(download_url)
228
189
self.assertEqual(res.content, OBJECT_DATA)
229
190
self.assertTrue(res.has_header('Content-Disposition'))
231
192
def test_copy_index(self):
232
OBJECT_NAME = 'objectName'
234
container = self.mox.CreateMock(api.Container)
235
container.name = self.CONTAINER_NAME
237
193
self.mox.StubOutWithMock(api, 'swift_get_containers')
238
api.swift_get_containers(
239
IsA(http.HttpRequest)).AndReturn(([container], False))
194
ret = (self.containers.list(), False)
195
api.swift_get_containers(IsA(http.HttpRequest)).AndReturn(ret)
241
196
self.mox.ReplayAll()
243
198
res = self.client.get(reverse('horizon:nova:containers:object_copy',
244
args=[self.CONTAINER_NAME,
199
args=[self.containers.first().name,
200
self.objects.first().name]))
247
201
self.assertTemplateUsed(res, 'nova/objects/copy.html')
249
203
def test_copy(self):
250
NEW_CONTAINER_NAME = self.CONTAINER_NAME
251
NEW_OBJECT_NAME = 'newObjectName'
252
ORIG_CONTAINER_NAME = 'origContainerName'
253
ORIG_OBJECT_NAME = 'origObjectName'
255
formData = {'method': 'CopyObject',
256
'new_container_name': NEW_CONTAINER_NAME,
257
'new_object_name': NEW_OBJECT_NAME,
258
'orig_container_name': ORIG_CONTAINER_NAME,
259
'orig_object_name': ORIG_OBJECT_NAME}
261
container = self.mox.CreateMock(api.Container)
262
container.name = self.CONTAINER_NAME
204
container_1 = self.containers.get(name="container_one")
205
container_2 = self.containers.get(name="container_two")
206
obj = self.objects.first()
264
208
self.mox.StubOutWithMock(api, 'swift_get_containers')
265
api.swift_get_containers(
266
IsA(http.HttpRequest)).AndReturn(([container], False))
268
209
self.mox.StubOutWithMock(api, 'swift_copy_object')
210
ret = (self.containers.list(), False)
211
api.swift_get_containers(IsA(http.HttpRequest)).AndReturn(ret)
269
212
api.swift_copy_object(IsA(http.HttpRequest),
275
217
self.mox.ReplayAll()
277
res = self.client.post(reverse('horizon:nova:containers:object_copy',
278
args=[ORIG_CONTAINER_NAME,
282
self.assertRedirectsNoFollow(res,
283
reverse('horizon:nova:containers:object_index',
284
args=[NEW_CONTAINER_NAME]))
219
formData = {'method': forms.CopyObject.__name__,
220
'new_container_name': container_2.name,
221
'new_object_name': obj.name,
222
'orig_container_name': container_1.name,
223
'orig_object_name': obj.name}
224
copy_url = reverse('horizon:nova:containers:object_copy',
225
args=[container_1.name, obj.name])
226
res = self.client.post(copy_url, formData)
227
index_url = reverse('horizon:nova:containers:object_index',
228
args=[container_2.name])
229
self.assertRedirectsNoFollow(res, index_url)