def test_folder_moved(self, create_shared_folder, managed_folder, create_file, create_webhook_event, ddb_items): folder = create_shared_folder(parent_folder=managed_folder) file1 = create_file(parent_folder=folder) file2 = create_file(parent_folder=folder) ddb_items.append({ "filepath": "some/old/path1.dat", "box_file_id": file1.id, "download_url": "some-download-url" }) ddb_items.append({ "filepath": "some/old/path2.dat", "box_file_id": file2.id, "download_url": "some-download-url" }) event = create_webhook_event("FOLDER.MOVED", folder) handle_event(event) assert len(ddb_items) == 4 assert {i["filepath"] for i in ddb_items} == { "some/old/path1.dat", "some/old/path2.dat", common.get_filepath(file1), common.get_filepath(file2), }
def test_get_filepath(create_folder, create_shared_file, managed_folder): shared_file = create_shared_file() assert common.get_filepath(shared_file) == shared_file.name nested_folder_one = create_folder(parent_folder=managed_folder) nested_folder_two = create_folder(parent_folder=nested_folder_one) nested_file = create_shared_file(parent_folder=nested_folder_two) expected_path = f"{nested_folder_one.name}/{nested_folder_two.name}/{nested_file.name}" assert common.get_filepath(nested_file) == expected_path root_file = create_shared_file(parent_folder=conftest.ROOT_FOLDER) with pytest.raises(ValueError): common.get_filepath(root_file)
def test_shared_link_deleted(self, create_webhook_event, create_file, ddb_items, managed_folder): file = create_file(parent_folder=managed_folder) ddb_items.append({"filepath": common.get_filepath(file)}) event = create_webhook_event("SHARED_LINK.DELETED", file) handle_event(event) assert len(ddb_items) == 0
def test_get_download_url(create_shared_file, mock_ddb_table, ddb_items): file = create_shared_file() ddb_items.append(common.make_ddb_item(file)) assert common.get_download_url( mock_ddb_table, common.get_filepath(file)) == file.shared_link["download_url"] assert common.get_download_url(mock_ddb_table, "non/existant/file.dat") is None
def lambda_handler(event, context): ddb_table = common.get_ddb_table() box_client, _ = common.get_box_client() root_folder = common.get_folder(box_client, common.BOX_FOLDER_ID) root_shared = common.is_box_object_public(root_folder) LOGGER.info("Checking files in Box") shared_file_ids = set() shared_filepaths = set() count = 0 for file, shared in common.iterate_files(root_folder, shared=root_shared): count += 1 if (not common.is_box_object_public(file)) and shared: # this includes an API call file = common.create_shared_link(box_client, file, access="open", allow_download=True) elif (common.is_box_object_public(file)) and (not shared): file = common.remove_shared_link(box_client, file) if common.is_box_object_public(file): shared_file_ids.add(file.id) shared_filepaths.add(common.get_filepath(file)) common.put_file_item(ddb_table, file) else: common.delete_file_item(ddb_table, file) LOGGER.info("Processed %s files", count) LOGGER.info("Checking items in DynamoDB") count = 0 scan_response = ddb_table.scan() delete_keys = set() while True: for item in scan_response["Items"]: count += 1 if (item["box_file_id"] not in shared_file_ids) or (item["filepath"] not in shared_filepaths): delete_keys.add(item["filepath"]) # If the data returned by a scan would exceed 1MB, DynamoDB will begin paging. # The LastEvaluatedKey field is the placeholder used to request the next page. if scan_response.get("LastEvaluatedKey"): scan_response = ddb_table.scan( ExclusiveStartKey=scan_response["LastEvaluatedKey"]) else: # this clause isn't reached by testing atm break for key in delete_keys: ddb_table.delete_item(Key={"filepath": key}) LOGGER.info("Processed %s items", count)
def test_sync( self, ddb_items, create_folder, create_file, create_shared_file, create_shared_folder, managed_folder, create_shared_link, mock_box_client, ): # supposed to exist after sync shared_folder = create_shared_folder(parent_folder=managed_folder) correct_file = create_shared_file(parent_folder=shared_folder) ddb_items.append(common.make_ddb_item(correct_file)) # supposed to exist after sync missing_file = create_shared_file(parent_folder=shared_folder) # not supposed to exist after sync no_longer_shared_file = create_file(parent_folder=managed_folder) ddb_items.append( { "filepath": common.get_filepath(no_longer_shared_file), "box_file_id": no_longer_shared_file.id, "download_url": "some-bogus-download-url", } ) # not supposed to exist after sync ddb_items.append( { "filepath": "some/deleted/file.dat", "box_file_id": "123456789", "download_url": "some-other-bogus-download-url", } ) # file in a shared folder that's missing from ddb # supposed to exist after sync unshared_file = create_file(parent_folder=shared_folder) # shared file in an unshared folder, not supposed to exist after sync unshared_folder = create_folder(parent=managed_folder) shared_file = create_shared_file(parent=unshared_folder) sync.lambda_handler({}, None) assert len(ddb_items) == 3 file_ids = {i["box_file_id"] for i in ddb_items} assert file_ids == {correct_file.id, missing_file.id, unshared_file.id} assert common.is_box_object_public(shared_file) is False
def test_file_moved( self, create_webhook_event, create_file, create_folder, ddb_items, box_files, managed_folder, create_shared_folder, ): folder = create_shared_folder(parent_folder=managed_folder) file = create_file(parent_folder=folder) ddb_items.append({ "filepath": "some/old/path.dat", "box_file_id": file.id, "download_url": "some-download-url" }) event = create_webhook_event("FILE.MOVED", file) handle_event(event) assert len(ddb_items) == 2 assert {i["filepath"] for i in ddb_items } == {"some/old/path.dat", common.get_filepath(file)}