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
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