def test_get_file_succeeds(self): factory.make_file_storage( filename="foofilers", content=b"give me rope") response = self.make_API_GET_request("get", "foofilers") self.assertEqual(httplib.OK, response.status_code) self.assertEqual(b"give me rope", response.content)
def test_list_files_does_not_include_file_content(self): factory.make_file_storage( filename="filename", content=b"test content", owner=self.logged_in_user) response = self.make_API_GET_request("list") parsed_results = json.loads(response.content) self.assertNotIn('content', parsed_results[0].keys())
def test_storage_can_be_retrieved(self): filename = factory.getRandomString() content = self.make_data() factory.make_file_storage(filename=filename, content=content) storage = FileStorage.objects.get(filename=filename) self.assertEqual((filename, content), (storage.filename, storage.content))
def test_storage_can_be_retrieved(self): filename = factory.getRandomString() content = self.make_data() factory.make_file_storage(filename=filename, content=content) storage = FileStorage.objects.get(filename=filename) self.assertEqual( (filename, content), (storage.filename, storage.content))
def test_migrate_all_nodes_to_new_legacy_user_when_multiple_users(self): factory.make_file_storage(owner=None) user1 = factory.make_user() node1 = factory.make_node(owner=user1) user2 = factory.make_user() node2 = factory.make_node(owner=user2) migrate() self.assertNotIn(reload_object(node1).owner, {user1, user2, None}) self.assertNotIn(reload_object(node2).owner, {user1, user2, None})
def test_get_fetches_the_most_recent_file(self): filename = factory.make_name('file') factory.make_file_storage(filename=filename, owner=factory.make_user()) storage = factory.make_file_storage( filename=filename, owner=factory.make_user()) response = self.make_API_GET_request("get", filename) self.assertEqual(httplib.OK, response.status_code) self.assertEqual(storage.content, response.content)
def test_get_unowned_files(self): user = factory.make_user() files = [ factory.make_file_storage(owner=None), factory.make_file_storage(owner=user), factory.make_file_storage(owner=None), ] self.assertSetEqual( {files[0], files[2]}, set(get_unowned_files()))
def test_delete_file_deletes_file(self): filename = factory.make_name('file') factory.make_file_storage( filename=filename, content=b"test content", owner=self.logged_in_user) response = self.client.delete( reverse('file_handler', args=[filename])) self.assertEqual(httplib.NO_CONTENT, response.status_code) files = FileStorage.objects.filter(filename=filename) self.assertEqual([], list(files))
def test_files_resource_uri_supports_slashes_in_filenames(self): filename = "a/filename/with/slashes/in/it/" factory.make_file_storage( filename=filename, content=b"test content", owner=self.logged_in_user) response = self.make_API_GET_request("list") parsed_results = json.loads(response.content) resource_uri = parsed_results[0]['resource_uri'] expected_uri = reverse('file_handler', args=[filename]) self.assertEqual(expected_uri, resource_uri)
def test_list_files_returns_ordered_list(self): filenames = ["myfiles/a", "myfiles/z", "myfiles/b"] for filename in filenames: factory.make_file_storage( filename=filename, content=b"test content", owner=self.logged_in_user) response = self.make_API_GET_request("list") self.assertEqual(httplib.OK, response.status_code) parsed_results = json.loads(response.content) filenames = [result['filename'] for result in parsed_results] self.assertEqual(sorted(filenames), filenames)
def test_get_file_returns_file_object_with_resource_uri(self): filename = factory.make_name("file") content = sample_binary_data factory.make_file_storage( filename=filename, content=content, owner=self.logged_in_user) response = self.client.get( reverse('file_handler', args=[filename])) parsed_result = json.loads(response.content) self.assertEqual( reverse('file_handler', args=[filename]), parsed_result['resource_uri'])
def test_overwrites_file(self): # If a file of the same name has already been stored, the # reference to the old data gets overwritten with one to the new # data. filename = factory.make_name('filename') old_storage = factory.make_file_storage( filename=filename, content=self.make_data('old data')) new_data = self.make_data('new-data') new_storage = factory.make_file_storage( filename=filename, content=new_data) self.assertEqual(old_storage.filename, new_storage.filename) self.assertEqual( new_data, FileStorage.objects.get(filename=filename).content)
def test_list_files_lists_files_with_prefix(self): filenames_with_prefix = ["prefix-file1", "prefix-file2"] filenames = filenames_with_prefix + ["otherfile", "otherfile2"] for filename in filenames: factory.make_file_storage( filename=filename, content=b"test content", owner=self.logged_in_user) response = self.client.get( reverse('files_handler'), {"op": "list", "prefix": "prefix-"}) self.assertEqual(httplib.OK, response.status_code) parsed_results = json.loads(response.content) filenames = [result['filename'] for result in parsed_results] self.assertItemsEqual(filenames_with_prefix, filenames)
def test_overwrites_file(self): # If a file of the same name has already been stored, the # reference to the old data gets overwritten with one to the new # data. filename = factory.make_name('filename') old_storage = factory.make_file_storage( filename=filename, content=self.make_data('old data')) new_data = self.make_data('new-data') new_storage = factory.make_file_storage(filename=filename, content=new_data) self.assertEqual(old_storage.filename, new_storage.filename) self.assertEqual(new_data, FileStorage.objects.get(filename=filename).content)
def test_get_file_returns_file_object_with_content_base64_encoded(self): filename = factory.make_name("file") content = sample_binary_data factory.make_file_storage( filename=filename, content=content, owner=self.logged_in_user) response = self.client.get( reverse('file_handler', args=[filename])) parsed_result = json.loads(response.content) self.assertEqual( (filename, content), ( parsed_result['filename'], b64decode(parsed_result['content']) ))
def test_migrate_all_files_to_new_legacy_user_when_multiple_users(self): stored = factory.make_file_storage(owner=None) user1 = factory.make_user() user2 = factory.make_user() migrate() stored = reload_object(stored) self.assertNotIn(stored.owner, {user1, user2, None})
def test_delete_filters_by_owner(self): storage = factory.make_file_storage(owner=factory.make_user()) response = self.client.delete( reverse('file_handler', args=[storage.filename])) self.assertEqual(httplib.NOT_FOUND, response.status_code) files = FileStorage.objects.filter(filename=storage.filename) self.assertEqual([storage], list(files))
def test_get_by_key_works_anonymously(self): storage = factory.make_file_storage() response = self.client.get( reverse('files_handler'), {'key': storage.key, 'op': 'get_by_key'}) self.assertEqual(httplib.OK, response.status_code) self.assertEqual(storage.content, response.content)
def test_get_file_returns_owned_file(self): # If both an owned file and a non-owned file are present (with the # same name), the owned file is returned. filename = factory.make_name("file") factory.make_file_storage(filename=filename, owner=None) content = sample_binary_data storage = factory.make_file_storage( filename=filename, content=content, owner=self.logged_in_user) response = self.client.get( reverse('file_handler', args=[filename])) parsed_result = json.loads(response.content) self.assertEqual( (filename, storage.anon_resource_uri, content), ( parsed_result['filename'], parsed_result['anon_resource_uri'], b64decode(parsed_result['content']) ))
def make_provider_state_file(node=None): """Create a 'provider-state' file with a reference (zookeeper-instances) to a node. """ if node is None: node = factory.make_node() node_link = reverse('node_handler', args=[node.system_id]) content = 'zookeeper-instances: [%s]\n' % node_link content_data = content.encode('ascii') return factory.make_file_storage( filename=PROVIDER_STATE_FILENAME, content=content_data, owner=None)
def make_provider_state_file(node=None): """Create a 'provider-state' file with a reference (zookeeper-instances) to a node. """ if node is None: node = factory.make_node() node_link = reverse('node_handler', args=[node.system_id]) content = 'zookeeper-instances: [%s]\n' % node_link content_data = content.encode('ascii') return factory.make_file_storage(filename=PROVIDER_STATE_FILENAME, content=content_data, owner=None)
def test_migrate_ancillary_data_to_legacy_user_when_multiple_users(self): factory.make_file_storage(owner=None) # Create two users, both with API credentials, an SSH key and a node. user1 = factory.make_user() consumer1, token1 = user1.get_profile().create_authorisation_token() key1 = factory.make_sshkey(user1, get_ssh_key_string(1)) node1 = factory.make_node(owner=user1) user2 = factory.make_user() consumer2, token2 = user2.get_profile().create_authorisation_token() key2 = factory.make_sshkey(user2, get_ssh_key_string(2)) node2 = factory.make_node(owner=user2) migrate() # The SSH keys have been copied to the legacy user. legacy_user = get_legacy_user() legacy_users_ssh_keys = get_ssh_keys(legacy_user) self.assertSetEqual({key1.key, key2.key}, set(legacy_users_ssh_keys)) # The API credentials have been moved to the legacy user. legacy_users_nodes = Node.objects.filter(owner=legacy_user) self.assertSetEqual({node1, node2}, set(legacy_users_nodes)) self.assertEqual( (legacy_user, legacy_user, legacy_user, legacy_user), (reload_object(consumer1).user, reload_object(token1).user, reload_object(consumer2).user, reload_object(token2).user))
def test_give_unowned_file(self): user = factory.make_user() file = factory.make_file_storage(owner=None) give_file_to_user(file, user) self.assertEqual(user, file.owner)
def test_give_owned_file(self): user1 = factory.make_user() user2 = factory.make_user() file = factory.make_file_storage(owner=user1) give_file_to_user(file, user2) self.assertEqual(user2, file.owner)
def test_file_saved(self): user = factory.make_user() file = factory.make_file_storage(owner=None) save = self.patch(file, "save") give_file_to_user(file, user) save.assert_called_once()
def test_migrate_runs_when_no_unowned_files_exist(self): factory.make_file_storage(owner=factory.make_user()) migrate()
def test_stores_binary_data(self): storage = factory.make_file_storage(content=sample_binary_data) self.assertEqual(sample_binary_data, storage.content)
def test_returns_None_if_invalid_yaml(self): invalid_content = '%'.encode('ascii') factory.make_file_storage( filename=PROVIDER_STATE_FILENAME, content=invalid_content) self.assertIsNone(get_bootstrap_node_owner())
def test_get_works_anonymously(self): storage = factory.make_file_storage() response = self.make_API_GET_request("get", storage.filename) self.assertEqual(storage.content, response.content) self.assertEqual(httplib.OK, response.status_code)
def test_key_gets_generated(self): # The generated system_id looks good. storage = factory.make_file_storage() self.assertEqual(len(storage.key), 36)
def test_anon_cannot_delete_file(self): storage = factory.make_file_storage() response = self.client.delete( reverse('file_handler', args=[storage.filename])) self.assertEqual(httplib.UNAUTHORIZED, response.status_code)
def test_anon_cannot_list_files(self): factory.make_file_storage() response = self.make_API_GET_request("list") # The 'list' operation is not available to anon users. self.assertEqual(httplib.BAD_REQUEST, response.status_code)
def test_anon_resource_uri_allows_anonymous_access(self): storage = factory.make_file_storage() response = self.client.get(storage.anon_resource_uri) self.assertEqual(httplib.OK, response.status_code) self.assertEqual(storage.content, response.content)
def test_key_includes_random_part(self): storage1 = factory.make_file_storage() storage2 = factory.make_file_storage() self.assertNotEqual(storage1.key, storage2.key)
def test_list_files_filters_by_owner(self): factory.make_file_storage(owner=factory.make_user()) response = self.make_API_GET_request("list") self.assertEqual(httplib.OK, response.status_code) parsed_results = json.loads(response.content) self.assertEqual([], parsed_results)
def test_migrate_all_files_to_single_user_when_only_one_user(self): user = factory.make_user() stored = factory.make_file_storage(owner=None) migrate() self.assertEqual(user, reload_object(stored).owner)
def test_returns_None_if_invalid_yaml(self): invalid_content = '%'.encode('ascii') factory.make_file_storage(filename=PROVIDER_STATE_FILENAME, content=invalid_content) self.assertIsNone(get_bootstrap_node_owner())