82
82
class AnonymousFileStorageAPITest(FileStorageAPITestMixin, MAASServerTestCase):
84
84
def test_get_works_anonymously(self):
85
storage = factory.make_file_storage()
85
storage = factory.make_FileStorage()
86
86
response = self.make_API_GET_request("get", storage.filename)
88
88
self.assertEqual(storage.content, response.content)
91
91
def test_get_fetches_the_most_recent_file(self):
92
92
filename = factory.make_name('file')
93
factory.make_file_storage(filename=filename, owner=factory.make_user())
94
storage = factory.make_file_storage(
95
filename=filename, owner=factory.make_user())
93
factory.make_FileStorage(filename=filename, owner=factory.make_User())
94
storage = factory.make_FileStorage(
95
filename=filename, owner=factory.make_User())
96
96
response = self.make_API_GET_request("get", filename)
98
98
self.assertEqual(httplib.OK, response.status_code)
99
99
self.assertEqual(storage.content, response.content)
101
101
def test_get_by_key_works_anonymously(self):
102
storage = factory.make_file_storage()
102
storage = factory.make_FileStorage()
103
103
response = self.client.get(
104
104
reverse('files_handler'), {'key': storage.key, 'op': 'get_by_key'})
107
107
self.assertEqual(storage.content, response.content)
109
109
def test_anon_resource_uri_allows_anonymous_access(self):
110
storage = factory.make_file_storage()
110
storage = factory.make_FileStorage()
111
111
response = self.client.get(storage.anon_resource_uri)
112
112
self.assertEqual(httplib.OK, response.status_code)
113
113
self.assertEqual(storage.content, response.content)
115
115
def test_anon_cannot_list_files(self):
116
factory.make_file_storage()
116
factory.make_FileStorage()
117
117
response = self.make_API_GET_request("list")
118
118
# The 'list' operation is not available to anon users.
119
119
self.assertEqual(httplib.BAD_REQUEST, response.status_code)
121
121
def test_anon_cannot_get_file(self):
122
storage = factory.make_file_storage()
122
storage = factory.make_FileStorage()
123
123
response = self.client.get(
124
124
reverse('file_handler', args=[storage.filename]))
125
125
self.assertEqual(httplib.UNAUTHORIZED, response.status_code)
127
127
def test_anon_cannot_delete_file(self):
128
storage = factory.make_file_storage()
128
storage = factory.make_FileStorage()
129
129
response = self.client.delete(
130
130
reverse('file_handler', args=[storage.filename]))
131
131
self.assertEqual(httplib.UNAUTHORIZED, response.status_code)
215
215
self.assertEqual(b"file two", response.content)
217
217
def test_get_file_succeeds(self):
218
factory.make_file_storage(
218
factory.make_FileStorage(
219
219
filename="foofilers", content=b"give me rope")
220
220
response = self.make_API_GET_request("get", "foofilers")
239
239
def test_list_files_returns_ordered_list(self):
240
240
filenames = ["myfiles/a", "myfiles/z", "myfiles/b"]
241
241
for filename in filenames:
242
factory.make_file_storage(
242
factory.make_FileStorage(
243
243
filename=filename, content=b"test content",
244
244
owner=self.logged_in_user)
245
245
response = self.make_API_GET_request("list")
249
249
self.assertEqual(sorted(filenames), filenames)
251
251
def test_list_files_filters_by_owner(self):
252
factory.make_file_storage(owner=factory.make_user())
252
factory.make_FileStorage(owner=factory.make_User())
253
253
response = self.make_API_GET_request("list")
254
254
self.assertEqual(httplib.OK, response.status_code)
255
255
parsed_results = json.loads(response.content)
259
259
filenames_with_prefix = ["prefix-file1", "prefix-file2"]
260
260
filenames = filenames_with_prefix + ["otherfile", "otherfile2"]
261
261
for filename in filenames:
262
factory.make_file_storage(
262
factory.make_FileStorage(
263
263
filename=filename, content=b"test content",
264
264
owner=self.logged_in_user)
265
265
response = self.client.get(
270
270
self.assertItemsEqual(filenames_with_prefix, filenames)
272
272
def test_list_files_does_not_include_file_content(self):
273
factory.make_file_storage(
273
factory.make_FileStorage(
274
274
filename="filename", content=b"test content",
275
275
owner=self.logged_in_user)
276
276
response = self.make_API_GET_request("list")
280
280
def test_files_resource_uri_supports_slashes_in_filenames(self):
281
281
filename = "a/filename/with/slashes/in/it/"
282
factory.make_file_storage(
282
factory.make_FileStorage(
283
283
filename=filename, content=b"test content",
284
284
owner=self.logged_in_user)
285
285
response = self.make_API_GET_request("list")
305
305
def test_get_file_returns_file_object_with_content_base64_encoded(self):
306
306
filename = factory.make_name("file")
307
307
content = sample_binary_data
308
factory.make_file_storage(
308
factory.make_FileStorage(
309
309
filename=filename, content=content, owner=self.logged_in_user)
310
310
response = self.client.get(
311
311
reverse('file_handler', args=[filename]))
320
320
def test_get_file_returns_file_object_with_resource_uri(self):
321
321
filename = factory.make_name("file")
322
322
content = sample_binary_data
323
factory.make_file_storage(
323
factory.make_FileStorage(
324
324
filename=filename, content=content, owner=self.logged_in_user)
325
325
response = self.client.get(
326
326
reverse('file_handler', args=[filename]))
333
333
# If both an owned file and a non-owned file are present (with the
334
334
# same name), the owned file is returned.
335
335
filename = factory.make_name("file")
336
factory.make_file_storage(filename=filename, owner=None)
336
factory.make_FileStorage(filename=filename, owner=None)
337
337
content = sample_binary_data
338
storage = factory.make_file_storage(
338
storage = factory.make_FileStorage(
339
339
filename=filename, content=content, owner=self.logged_in_user)
340
340
response = self.client.get(
341
341
reverse('file_handler', args=[filename]))
370
370
def test_delete_filters_by_owner(self):
371
storage = factory.make_file_storage(owner=factory.make_user())
371
storage = factory.make_FileStorage(owner=factory.make_User())
372
372
response = self.client.delete(
373
373
reverse('file_handler', args=[storage.filename]))
374
374
self.assertEqual(httplib.NOT_FOUND, response.status_code)
378
378
def test_delete_file_deletes_file(self):
379
379
filename = factory.make_name('file')
380
factory.make_file_storage(
380
factory.make_FileStorage(
381
381
filename=filename, content=b"test content",
382
382
owner=self.logged_in_user)
383
383
response = self.client.delete(