async def test_intra_copy_file_different_provider(self, provider, other_provider,
                                                      provider_fixtures):
        src_path = WaterButlerPath('/pfile', prepend=provider.folder)

        url = provider.build_url('files', 'copy_reference', 'get')
        data = {'path': src_path.full_path.rstrip('/')},
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=provider_fixtures['intra_copy_file_metadata']
        )

        dest_path = WaterButlerPath('/pfile_renamed', prepend=other_provider.folder)

        url_1 = provider.build_url('files', 'copy_reference', 'save')
        data_1 = {'copy_reference': 'test', 'path': dest_path.full_path.rstrip('/')}
        aiohttpretty.register_json_uri(
            'POST',
            url_1,
            data=data_1,
            body=provider_fixtures['intra_copy_other_provider_file_metadata']
        )

        result = await provider.intra_copy(other_provider, src_path, dest_path)
        expected = (
            DropboxFileMetadata(
                provider_fixtures['intra_copy_other_provider_file_metadata']['metadata'],
                provider.folder
            ),
            True
        )

        assert result == expected
Beispiel #2
0
    async def test_intra_copy_folder(self, provider, provider_fixtures):
        src_path = WaterButlerPath('/pfile/', prepend=provider.folder)
        dest_path = WaterButlerPath('/pfile_renamed/', prepend=provider.folder)

        url = provider.build_url('files', 'copy_v2')
        data = {
            'from_path': src_path.full_path.rstrip('/'),
            'to_path': dest_path.full_path.rstrip('/')
        }
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=provider_fixtures['intra_move_copy_folder_metadata_v2'])

        url = provider.build_url('files', 'list_folder')
        data = {'path': dest_path.full_path}
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            status=HTTPStatus.OK,
            body=provider_fixtures['folder_children'])

        result = await provider.intra_copy(provider, src_path, dest_path)
        expected = DropboxFolderMetadata(
            provider_fixtures['intra_move_copy_folder_metadata_v2']
            ['metadata'], provider.folder)
        expected.children = [
            DropboxFileMetadata(item, provider.folder)
            for item in provider_fixtures['folder_children']['entries']
        ]

        assert expected == result[0]
Beispiel #3
0
    async def test_intra_move_replace_file(self, provider, provider_fixtures,
                                           error_fixtures):
        url = provider.build_url('files', 'delete_v2')
        path = await provider.validate_path('/The past')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri('POST',
                                       url,
                                       data=data,
                                       status=HTTPStatus.OK)

        src_path = WaterButlerPath('/pfile', prepend=provider.folder)
        dest_path = WaterButlerPath('/pfile_renamed', prepend=provider.folder)

        url = provider.build_url('files', 'move_v2')
        data = {
            'from_path': src_path.full_path.rstrip('/'),
            'to_path': dest_path.full_path.rstrip('/')
        }
        aiohttpretty.register_json_uri(
            'POST', url, **{
                "responses": [
                    {
                        'headers': {
                            'Content-Type': 'application/json'
                        },
                        'data':
                        data,
                        'body':
                        json.dumps(
                            error_fixtures['rename_conflict_file_metadata']).
                        encode('utf-8'),
                        'status':
                        HTTPStatus.CONFLICT
                    },
                    {
                        'headers': {
                            'Content-Type': 'application/json'
                        },
                        'data':
                        data,
                        'body':
                        json.dumps(provider_fixtures[
                            'intra_move_copy_file_metadata_v2']).encode(
                                'utf-8')
                    },
                ]
            })

        result = await provider.intra_move(provider, src_path, dest_path)
        expected = (DropboxFileMetadata(
            provider_fixtures['intra_move_copy_file_metadata_v2']['metadata'],
            provider.folder), False)

        assert expected == result
    async def test_upload(self, provider, provider_fixtures, error_fixtures, file_stream):
        path = await provider.validate_path('/phile')
        metadata_url = provider.build_url('files', 'get_metadata')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri(
            'POST',
            metadata_url,
            data=data,
            status=HTTPStatus.CONFLICT,
            body=error_fixtures['not_found_metadata_data']
        )

        url = provider._build_content_url('files', 'upload')
        aiohttpretty.register_json_uri(
            'POST',
            url,
            status=HTTPStatus.OK,
            body=provider_fixtures['file_metadata']
        )

        metadata, created = await provider.upload(file_stream, path)
        expected = DropboxFileMetadata(provider_fixtures['file_metadata'], provider.folder)

        assert created is True
        assert metadata == expected
        assert aiohttpretty.has_call(method='POST', uri=url)
    async def test_already_exists(self, provider):
        path = WaterButlerPath('/newfolder/', prepend=provider.folder)
        url = provider.build_url('files', 'create_folder_v2')
        data = build_folder_metadata_data(path)
        body = {
            "error_summary": "path/conflict/folder/...",
            "error": {
                ".tag": "path",
                "path": {
                    ".tag": "conflict",
                    "conflict": {".tag": "folder"}
                }
            }
        }
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            status=HTTPStatus.CONFLICT,
            body=body
        )

        with pytest.raises(DropboxNamingConflictError) as e:
            await provider.create_folder(path)

        assert e.value.code == HTTPStatus.CONFLICT
        assert e.value.message == (
            'Cannot complete action: file or folder already exists at /newfolder'
        )
    async def test_validate_v1_path_folder(self, provider, provider_fixtures):
        folder_path = '/Photos'
        data = {"path": folder_path}
        metadata_url = provider.build_url('files', 'get_metadata')
        aiohttpretty.register_json_uri(
            'POST',
            metadata_url,
            data=data,
            body=provider_fixtures['folder_metadata']
        )

        try:
            wb_path_v1 = await provider.validate_v1_path(folder_path + '/')
        except Exception as exc:
            pytest.fail(str(exc))
            wb_path_v1 = None

        with pytest.raises(core_exceptions.NotFoundError) as exc:
            await provider.validate_v1_path(folder_path)

        assert exc.value.code == HTTPStatus.NOT_FOUND

        wb_path_v0 = await provider.validate_path(folder_path + '/')

        assert wb_path_v1 == wb_path_v0
    async def test_intra_move_file(self, provider, provider_fixtures):
        src_path = WaterButlerPath('/pfile', prepend=provider.folder)
        dest_path = WaterButlerPath('/pfile_renamed', prepend=provider.folder)

        url = provider.build_url('files', 'move_v2')
        data = {
            'from_path': src_path.full_path.rstrip('/'),
            'to_path': dest_path.full_path.rstrip('/')
        }
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=provider_fixtures['intra_move_copy_file_metadata_v2']
        )

        result = await provider.intra_move(provider, src_path, dest_path)
        expected = (
            DropboxFileMetadata(
                provider_fixtures['intra_move_copy_file_metadata_v2']['metadata'],
                provider.folder
            ),
            True
        )

        assert result == expected
    async def test_delete_file(self, provider):
        url = provider.build_url('files', 'delete_v2')
        path = await provider.validate_path('/The past')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri('POST', url, data=data, status=HTTPStatus.OK)

        await provider.delete(path)

        assert aiohttpretty.has_call(method='POST', uri=url)
    async def test_delete_root(self, provider, provider_fixtures):
        url = provider.build_url('files', 'list_folder')
        path = await provider.validate_path('/')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=provider_fixtures['folder_children'],
            status=HTTPStatus.OK
        )

        path2 = await provider.validate_path('/photos/flower.jpg')
        url = provider.build_url('files', 'delete_v2')
        data = {'path': provider.folder.rstrip('/') + '/' + path2.path.rstrip('/')}
        aiohttpretty.register_json_uri('POST', url, data=data, status=HTTPStatus.OK)

        await provider.delete(path, 1)

        assert aiohttpretty.has_call(method='POST', uri=url)
    async def test_delete_root_bad(self, provider):
        url = provider.build_url('files', 'delete_v2')
        path = await provider.validate_path('/')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri('POST', url, data=data, status=HTTPStatus.OK)

        with pytest.raises(core_exceptions.DeleteError) as e:
            await provider.delete(path)

        assert e.value.code == HTTPStatus.BAD_REQUEST
        assert e.value.message == 'confirm_delete=1 is required for deleting root provider folder'
    async def test_raises_on_errors(self, provider):
        path = WaterButlerPath('/newfolder/', prepend=provider.folder)
        url = provider.build_url('files', 'create_folder_v2')
        data = build_folder_metadata_data(path)

        # return silly status code 418 ("I'm a teapot") to simulate unexpected error
        aiohttpretty.register_json_uri('POST', url, data=data, status=418, body={})

        with pytest.raises(core_exceptions.CreateFolderError) as e:
            await provider.create_folder(path)

        assert e.value.code == 418
Beispiel #12
0
    async def test_metadata_missing(self, provider, error_fixtures):
        path = WaterButlerPath('/pfile', prepend=provider.folder)
        url = provider.build_url('files', 'get_metadata')
        data = {"path": "/pfile"}
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=error_fixtures['not_found_metadata_data'],
            status=HTTPStatus.CONFLICT)

        with pytest.raises(core_exceptions.NotFoundError):
            await provider.metadata(path)
Beispiel #13
0
    async def test_metadata(self, provider, provider_fixtures):
        path = await provider.validate_path('/')
        url = provider.build_url('files', 'list_folder')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri(
            'POST', url, data=data, body=provider_fixtures['folder_children'])

        result = await provider.metadata(path)

        assert isinstance(result, list)
        assert len(result) == 1
        assert result[0].kind == 'file'
        assert result[0].name == 'flower.jpg'
        assert result[0].path == '/flower.jpg'
Beispiel #14
0
    async def test_file_metadata_folder_tag(self, provider, error_fixtures):
        path = WaterButlerPath('/pfile', prepend=provider.folder)
        url = provider.build_url('files', 'get_metadata')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=error_fixtures['file_metadata_folder_tag'])

        with pytest.raises(core_exceptions.MetadataError) as e:
            await provider.metadata(path)

        assert e.value.code == HTTPStatus.NOT_FOUND
Beispiel #15
0
    async def test_forbidden(self, provider):
        path = WaterButlerPath('/newfolder/', prepend=provider.folder)
        url = provider.build_url('files', 'create_folder_v2')
        data = build_folder_metadata_data(path)
        aiohttpretty.register_json_uri('POST',
                                       url,
                                       data=data,
                                       status=HTTPStatus.FORBIDDEN,
                                       body={'error': 'forbidden'})

        with pytest.raises(core_exceptions.CreateFolderError) as e:
            await provider.create_folder(path)

        assert e.value.code == HTTPStatus.FORBIDDEN
        assert e.value.data['error'] == 'forbidden'
    async def test_deleted_revision_metadata(self, provider, revision_fixtures):
        path = WaterButlerPath('/pfile', prepend=provider.folder)
        url = provider.build_url('files', 'list_revisions')
        data = {'path': path.full_path.rstrip('/'), 'limit': 100}
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=revision_fixtures['deleted_file_revision_metadata']
        )

        with pytest.raises(core_exceptions.RevisionsError) as e:
            await provider.revisions(path)

        assert e.value.code == HTTPStatus.NOT_FOUND
        assert e.value.message == "Could not retrieve '/pfile'"
Beispiel #17
0
    async def test_returns_metadata(self, provider, provider_fixtures):
        path = WaterButlerPath('/newfolder/', prepend=provider.folder)
        url = provider.build_url('files', 'create_folder_v2')
        data = build_folder_metadata_data(path)
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            status=HTTPStatus.OK,
            body=provider_fixtures['folder_metadata_v2'])

        resp = await provider.create_folder(path)

        assert resp.kind == 'folder'
        assert resp.name == 'newfolder'
        assert resp.path == '/newfolder/'
Beispiel #18
0
    async def test_revision_metadata(self, provider, revision_fixtures):
        path = await provider.validate_path('/testfile')
        url = provider.build_url('files', 'get_metadata')
        revision = 'c5bb27d11'
        data = {'path': 'rev:' + revision}
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=revision_fixtures['single_file_revision_metadata'])

        result = await provider.metadata(path, revision)
        expected = DropboxFileMetadata(
            revision_fixtures['single_file_revision_metadata'],
            provider.folder)

        assert result == expected
Beispiel #19
0
    async def test_get_revisions(self, provider, revision_fixtures):
        path = WaterButlerPath('/pfile', prepend=provider.folder)
        url = provider.build_url('files', 'list_revisions')
        data = {'path': path.full_path.rstrip('/'), 'limit': 100}
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=revision_fixtures['file_revision_metadata'])

        result = await provider.revisions(path)
        expected = [
            DropboxRevision(item)
            for item in revision_fixtures['file_revision_metadata']['entries']
        ]

        assert result == expected
        assert len(result) == 3
    async def test_already_exists_unhandled_conflict(self, provider, provider_fixtures):
        # This test is just to hit the last line of dropbox_conflict_error_handler and not much else
        path = WaterButlerPath('/newfolder/', prepend=provider.folder)
        url = provider.build_url('files', 'create_folder_v2')
        data = build_folder_metadata_data(path)

        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            status=HTTPStatus.CONFLICT,
            body=provider_fixtures['folder_metadata']
        )

        with pytest.raises(DropboxUnhandledConflictError) as e:
            await provider.create_folder(path)

        assert e.value.code == HTTPStatus.CONFLICT
    async def test_folder_with_subdirectory_metadata(self, provider, provider_fixtures):
        path = await provider.validate_path('/')
        url = provider.build_url('files', 'list_folder')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri(
            'POST',
            url,
            data=data,
            body=provider_fixtures['folder_with_subdirectory_metadata']
        )

        result = await provider.metadata(path)

        assert isinstance(result, list)
        assert len(result) == 2
        assert result[0].kind == 'folder'
        assert result[0].name == 'randomfolder'
        assert result[0].path == '/conflict folder/randomfolder/'
Beispiel #22
0
    async def test_metadata_root_file(self, provider, provider_fixtures):
        path = WaterButlerPath('/pfile', prepend=provider.folder)
        url = provider.build_url('files', 'get_metadata')
        data = {'path': path.full_path}
        aiohttpretty.register_json_uri('POST',
                                       url,
                                       data=data,
                                       body=provider_fixtures['file_metadata'])

        result = await provider.metadata(path)

        assert isinstance(result, core_metadata.BaseMetadata)
        assert result.kind == 'file'
        assert result.name == 'Getting_Started.pdf'
        assert result.path == '/Getting_Started.pdf'
        assert result.extra == {
            'revisionId': '2ba1017a0c1e',
            'id': 'id:8y8sAJlrhuAAAAAAAAAAAQ',
            'hashes': {
                'dropbox': 'meow'
            },
        }