def delete_files(config_file, google_secrets_file, file_id): """ Deletes the specified Google Drive files by ID. """ LOG('Starting Drive file deletion using config file "{}" and Google config "{}"' .format(config_file, google_secrets_file)) # The file_id option collects *all* file_id options from the command-line. # So there's likely multiple file IDs to process. Rename this option for clarity. file_ids = file_id if not config_file: FAIL(ERR_NO_CONFIG, 'No config file passed in.') if not google_secrets_file: FAIL(ERR_NO_SECRETS, 'No secrets file passed in.') if not file_ids: FAIL(ERR_NO_FILE_IDS, 'No file IDs were specified.') if len(file_ids) > MAX_FILE_IDS: FAIL( ERR_TOO_MANY_FILE_IDS, "Too many file IDs specfied: {}. Maximum is {}".format( len(file_ids), MAX_FILE_IDS)) config = CONFIG_WITH_DRIVE_OR_EXIT(config_file, google_secrets_file) try: drive = DriveApi(config['google_secrets_file']) drive.delete_files(file_ids) LOG('All files deleted successfully.') except Exception as exc: # pylint: disable=broad-except FAIL_EXCEPTION(ERR_DELETING_FILES, 'Unexpected error occurred!', exc)
def test_delete_file_with_nonexistent_file(self, mock_from_service_account_file): # pylint: disable=unused-argument """ Test case for deleting files where some are nonexistent. """ fake_file_id_non_existent = 'fake-file-id1' fake_file_id_exists = 'fake-file-id2' batch_response = b'''--batch_foobarbaz Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <response+0> HTTP/1.1 404 NOT FOUND Content-Type: application/json Content-length: 266 ETag: "etag/pony"\r\n\r\n{ "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "File not found: fake-file-id1.", "locationType": "parameter", "location": "fileId" } ], "code": 404, "message": "File not found: fake-file-id1." } } --batch_foobarbaz Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <response+1> HTTP/1.1 204 OK ETag: "etag/sheep"\r\n\r\n --batch_foobarbaz--''' http_mock_sequence = HttpMockSequence([ # First, a request is made to the discovery API to construct a client object for Drive. ({'status': '200'}, self.mock_discovery_response_content), # Then, a request is made to delete files. ({'status': '200', 'content-type': 'multipart/mixed; boundary="batch_foobarbaz"'}, batch_response), ]) test_client = DriveApi('non-existent-secrets.json', http=http_mock_sequence) if sys.version_info < (3, 4): # This is a simple smoke-test without checking the output because # python 2 doesn't support assertLogs. with self.assertRaises(BatchRequestError): test_client.delete_files([fake_file_id_non_existent, fake_file_id_exists]) else: # This is the full test case, which only runs under python 3. with self.assertLogs(level='INFO') as captured_logs: # pylint: disable=no-member with self.assertRaises(BatchRequestError): test_client.delete_files([fake_file_id_non_existent, fake_file_id_exists]) assert sum('Error processing request' in msg for msg in captured_logs.output) == 1 assert sum('Successfully processed request' in msg for msg in captured_logs.output) == 1
def test_delete_file_success(self, mock_from_service_account_file): # pylint: disable=unused-argument """ Test normal case for deleting files. """ fake_file_ids = ['fake-file-id1', 'fake-file-id2'] batch_response = b'''--batch_foobarbaz Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <response+0> HTTP/1.1 204 OK ETag: "etag/pony"\r\n\r\n --batch_foobarbaz Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <response+1> HTTP/1.1 204 OK ETag: "etag/sheep"\r\n\r\n --batch_foobarbaz--''' http_mock_sequence = HttpMockSequence([ # First, a request is made to the discovery API to construct a client object for Drive. ({'status': '200'}, self.mock_discovery_response_content), # Then, a request is made to delete files. ({'status': '200', 'content-type': 'multipart/mixed; boundary="batch_foobarbaz"'}, batch_response), ]) test_client = DriveApi('non-existent-secrets.json', http=http_mock_sequence) if sys.version_info < (3, 4): # This is a simple smoke-test without checking the output because # python <3.4 doesn't support assertLogs. test_client.delete_files(fake_file_ids) else: # This is the full test case, which only runs under python 3.4+. with self.assertLogs(level='INFO') as captured_logs: # pylint: disable=no-member test_client.delete_files(fake_file_ids) assert sum( 'Successfully processed request' in msg for msg in captured_logs.output ) == 2