Esempio n. 1
0
 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),
             }
Esempio n. 2
0
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)
Esempio n. 3
0
 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
Esempio n. 4
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)
Esempio n. 6
0
    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
Esempio n. 7
0
 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)}