async def test_list_files(self, prepare_vfolder, get_headers, folder_mount,
                              folder_host, user_keypair):
        app, client, create_vfolder = prepare_vfolder
        folder_info = await create_vfolder()
        folder_path = (folder_mount / folder_host / folder_info['id'])
        with open(folder_path / 'hello.txt', 'w') as f:
            f.write('hello vfolder!')
        async with app['dbpool'].acquire() as conn:
            query = (vfolder_permissions.insert().values({
                'permission':
                'ro',
                'vfolder':
                folder_info['id'],
                'access_key':
                user_keypair['access_key']
            }))
            await conn.execute(query)

        url = f'/v3/folders/{folder_info["name"]}/files'
        req_bytes = json.dumps({'path': '.'}).encode()
        headers = get_headers('GET', url, req_bytes, keypair=user_keypair)
        ret = await client.get(url, data=req_bytes, headers=headers)
        rsp_json = await ret.json()
        files = json.loads(rsp_json['files'])

        assert files[0]['filename'] == 'hello.txt'
        assert rsp_json['folder_path'] == str(folder_path)
    async def test_cannot_delete_readonly_vfolder_files(
            self, prepare_vfolder, get_headers, folder_mount, folder_host,
            user_keypair):
        app, client, create_vfolder = prepare_vfolder

        folder_info = await create_vfolder()
        folder_path = (folder_mount / folder_host / folder_info['id'])
        with open(folder_path / 'hello.txt', 'w') as f:
            f.write('hello vfolder!')
        async with app['dbpool'].acquire() as conn:
            query = (vfolder_permissions.insert().values({
                'permission':
                'ro',
                'vfolder':
                folder_info['id'],
                'access_key':
                user_keypair['access_key']
            }))
            await conn.execute(query)

        assert (folder_path / 'hello.txt').exists()

        url = f'/v3/folders/{folder_info["name"]}/delete_files'
        req_bytes = json.dumps({'files': ['hello.txt']}).encode()
        headers = get_headers('DELETE', url, req_bytes, keypair=user_keypair)
        ret = await client.delete(url, data=req_bytes, headers=headers)

        assert ret.status == 404
        assert (folder_path / 'hello.txt').exists()
    async def test_get_info(self, prepare_vfolder, get_headers, user_keypair):
        app, client, create_vfolder = prepare_vfolder
        folder_info = await create_vfolder()
        async with app['dbpool'].acquire() as conn:
            query = (vfolder_permissions.insert().values({
                'permission':
                'ro',
                'vfolder':
                folder_info['id'],
                'access_key':
                user_keypair['access_key']
            }))
            await conn.execute(query)

        url = f'/v3/folders/{folder_info["name"]}'
        req_bytes = json.dumps({}).encode()
        headers = get_headers('GET', url, req_bytes, keypair=user_keypair)
        ret = await client.get(url, data=req_bytes, headers=headers)

        assert ret.status == 200
        rsp_json = await ret.json()
        assert rsp_json['id'] == folder_info['id']
        assert rsp_json['name'] == folder_info['name']
        assert not rsp_json['is_owner']
        assert rsp_json['permission'] == 'ro'
        assert rsp_json['numFiles'] == 0
    async def test_cannot_create_vfolder_when_joined_vfolder_has_duplicated_name(
            self, prepare_vfolder, get_headers, user_keypair):
        app, client, create_vfolder = prepare_vfolder

        # Create admin's vfolder.
        folder_info = await create_vfolder()

        # Create vfolder_permission.
        async with app['dbpool'].acquire() as conn:
            query = (vfolder_permissions.insert().values({
                'permission':
                'ro',
                'vfolder':
                folder_info['id'],
                'access_key':
                user_keypair['access_key']
            }))
            await conn.execute(query)

        url = '/v3/folders/'
        req_bytes = json.dumps({'name': folder_info['name']}).encode()
        headers = get_headers('POST', url, req_bytes, keypair=user_keypair)
        ret = await client.post(url, data=req_bytes, headers=headers)

        async with app['dbpool'].acquire() as conn:
            query = (sa.select('*').select_from(vfolders))
            result = await conn.execute(query)

        assert ret.status == 400
        assert result.rowcount == 1
Example #5
0
    async def test_list_vfolders(self, prepare_vfolder, get_headers,
                                 user_keypair):
        app, client, create_vfolder = prepare_vfolder

        # Create admin's vfolder.
        folder_info = await create_vfolder()

        # Create vfolder_permission.
        async with app['dbpool'].acquire() as conn:
            query = (vfolder_permissions.insert().values({
                'permission':
                VFolderPermission.READ_ONLY,
                'vfolder':
                folder_info['id'],
                'access_key':
                user_keypair['access_key']
            }))
            await conn.execute(query)

        url = '/v3/folders/'
        req_bytes = json.dumps({}).encode()
        headers = get_headers('GET', url, req_bytes, keypair=user_keypair)
        ret = await client.get(url, data=req_bytes, headers=headers)
        rsp_json = await ret.json()

        assert ret.status == 200
        assert len(rsp_json) == 1
        assert rsp_json[0]['id'] == folder_info['id']
        assert rsp_json[0]['name'] == folder_info['name']
        assert not rsp_json[0]['is_owner']
        assert rsp_json[0]['permission'] == VFolderPermission.READ_ONLY.value
    async def test_cannot_upload_file_to_read_only_vfolders(
            self, prepare_vfolder, get_headers, tmpdir, folder_mount,
            folder_host, user_keypair):
        app, client, create_vfolder = prepare_vfolder
        folder_info = await create_vfolder()
        async with app['dbpool'].acquire() as conn:
            query = (vfolder_permissions.insert().values({
                'permission':
                'ro',
                'vfolder':
                folder_info['id'],
                'access_key':
                user_keypair['access_key']
            }))
            await conn.execute(query)

        # Prepare file to be uploaded.
        p1 = tmpdir.join('test1.txt')
        p1.write('1357')
        data = aiohttp.FormData()
        data.add_field('file', open(p1, 'rb'))

        # Upload the file
        url = f'/v3/folders/{folder_info["name"]}/upload'
        headers = get_headers('POST',
                              url,
                              b'',
                              ctype='multipart/form-data',
                              keypair=user_keypair)
        ret = await client.post(url, data=data, headers=headers)

        # Get paths for files uploaded to virtual folder
        vf_fname1 = p1.strpath.split('/')[-1]
        folder_path = (folder_mount / folder_host / folder_info['id'])

        assert ret.status == 404
        assert not (folder_path / vf_fname1).exists()
    async def test_download(self, prepare_vfolder, get_headers, folder_mount,
                            folder_host, user_keypair):
        app, client, create_vfolder = prepare_vfolder
        folder_info = await create_vfolder()
        folder_path = (folder_mount / folder_host / folder_info['id'])
        with open(folder_path / 'hello.txt', 'w') as f:
            f.write('hello vfolder!')
        async with app['dbpool'].acquire() as conn:
            query = (vfolder_permissions.insert().values({
                'permission':
                'ro',
                'vfolder':
                folder_info['id'],
                'access_key':
                user_keypair['access_key']
            }))
            await conn.execute(query)

        assert (folder_path / 'hello.txt').exists()

        url = f'/v3/folders/{folder_info["name"]}/download'
        req_bytes = json.dumps({'files': ['hello.txt']}).encode()
        headers = get_headers('GET', url, req_bytes, keypair=user_keypair)
        ret = await client.get(url, data=req_bytes, headers=headers)

        # Decode multipart response. Here, there's only one part.
        reader = aiohttp.MultipartReader.from_response(ret)
        part = await reader.next()
        encoding = part.headers['Content-Encoding']
        zlib_mode = (16 +
                     zlib.MAX_WBITS if encoding == 'gzip' else -zlib.MAX_WBITS)
        decompressor = zlib.decompressobj(wbits=zlib_mode)
        content = decompressor.decompress(await part.read())

        assert content == b'hello vfolder!'
        assert ret.status == 200