(C) Questetra, Inc. (MIT License) 2 2022-11-29 This item copies the File and saves it in the specified Folder. この工程は、既存ファイルを複製し、指定フォルダに新規保存します。 https://support.questetra.com/bpmn-icons/box-file-copy/ https://support.questetra.com/ja/bpmn-icons/box-file-copy/ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEBElEQVRYR82Xb2jbRRjHP/fL2jXJ 0qSd65x11aK0YgJWZUwEWZ0DfSNaHYKKmgykbP7pH/SVghvCkIlb6kREwfyGOougbgxB2Yt1oGwg aietdOJoV21ty2ob26xdm+TkLsufJr+2Sdtt3pv8uDx3z+ee+z53zwmucRMF+ff/9ijEtwB1IDwI 9QtIOkGOA50I0UHIezTfeRcH8Pd64GITyGaE8OQ1sVQwIgiONsxqBTZvWxjA3+UHDuTtONuNBjEC mLcfmY9gfgB/dxBBU14rXsxIyiCmr8XKzBog0GWCeG6xeQv6X2JiegPZY3IBVnLlOVtCG6a3ObN7 LoDacyFCBa2sUGMpGjI1kQbQao/0Lllw+YJoYTqrk9mRAdC9G8Eb+c6zLDvJHkzvbjVHGiDQpXLX nZw4tOMGyp02Hjn457J8WQ5WUTB9ZWkAdcIJ+XWm8XCwFkexwLWrZ+UB9OmZ0EIiAhbKH2lLAKzZ eaUAEhmRAAh0dYBQZ3yqKQDnaoPDp8PUVZXo/pM9EV75Ylh/77q/jO2bSlmz2mBgLErjoUHad95I Z/80re0Jmw+e3UD1dcU8uP+8RRTlSUK++ssA3X3ATdkA61y2nIE/9k7Rd2GWx+4uxWZkAP8bo9Ru YAho+XyIUruNNxsqiMzE8bxgEUV1gZneO5MAMtuTioACUM7e+W4Uj8Pg5W1rdV9cwvSsxPx+nNPn LvLStnI2VdsZi8TwOGyMTsY0nNth493j/9DSPmSto5BXLAigsmDLW7388MeUnuDVh9ay74n1+vvI zxM0vJfOkNGDtdiLDH7pn+beW+3a5kRPhK37rMJ/mScDIGcLBvfXsM61isrWs4xMxPSIpza7+ayx Un8rbTz94UBqZX8fqNFp+82vkzTc5dL9n54K88xHaZu5YZBnCPnq5hXhqdequecWO2rPH3j7PBvc qzjWVEXN9cV6HhVmJbwvf5rgcGMlT2526y1wldiYiUl9wKhtUHp4/8TYIiK0SMP6WgdfvbiRMqeN yKU4NkNQUiToH51lcDyq4aIxtMjcdoOpGYkSkrJpOz6qt6OxvowLkzEqms7mAsjMNLQ4iNSIrbc5 2bu9QqdSNC7pHrjEjo8H+GssyifPV3JfjQNHscFQOMqeoyPsfXw9vw/P8HBbv3b4bWsVG8uL8L5+ zgIg8yBSf2cdxdayXaleGSbk0+Xd/+gyUtexiPRlXkgrtd4s9YeRzptzr2NldU0LkiTmlS3JUnVA 0t3VK0qRhwj5VJk/p12lsjxdAeUPoDWhCpW4KtFTlVJhwpRhpOFf2sMkpQn9NGtGyOb8QZRj/TQL Lu9plr1c/TiV9QipHqUeEHckTOQZYBwpOkF0LLTiwragsHgvyfo/g3CBMFgjn40AAAAASUVORK5C YII= { configs.put('conf_OAuth2', 'Box'); // 文字型データ項目を準備して、config に指定 const sourceFileIdDef = engine.createDataDefinition('コピー元ファイルID', 1, 'q_sourceFileId', 'STRING_TEXTFIELD'); configs.putObject('conf_SourceFileId', sourceFileIdDef); // 文字型データ項目の値(コピー元ファイルID)を指定 engine.setData(sourceFileIdDef, sourceFileId); configs.put('conf_NewFileName', newFileName); // 文字型データ項目を準備して、config に指定 const folderIdDef = engine.createDataDefinition('保存先フォルダID', 2, 'q_folderId', 'STRING_TEXTFIELD'); configs.putObject('conf_FolderId', folderIdDef); // 文字型データ項目の値(保存先フォルダID)を指定 engine.setData(folderIdDef, folderId); // 文字型データ項目を準備して、config に指定 const idDef = engine.createDataDefinition('ファイルID', 3, 'q_ids', 'STRING_TEXTAREA'); configs.putObject('conf_DataForId', idDef); // 文字型データ項目の値(ファイル ID を保存するデータ項目)を指定 engine.setData(idDef, '事前文字列'); // 文字型データ項目を準備して、config に指定 const urlDef = engine.createDataDefinition('ファイルURL', 4, 'q_urls', 'STRING_TEXTAREA'); configs.putObject('conf_DataForUrl', urlDef); // 文字型データ項目の値(ファイル URL を保存するデータ項目)を指定 engine.setData(urlDef, '事前文字列'); return { sourceFileIdDef, folderIdDef, idDef, urlDef }; }; /** * リクエストのテスト(ファイルが配置されているフォルダのIDを取得) * @param {Object} request * @param request.url * @param request.method * @param fileId */ const assertGetRequest = ({url, method}, fileId) => { expect(url).toEqual(`https://api.box.com/2.0/files/${fileId}?fields=parent`); expect(method).toEqual('GET'); }; /** * リクエストのテスト(ファイルコピー) * @param {Object} request * @param request.url * @param request.method * @param request.contentType * @param request.body * @param folderId * @param newFileName */ const assertPostRequest = ({url, method, contentType, body}, fileId, folderId, newFileName) => { expect(url).toEqual(`https://api.box.com/2.0/files/${fileId}/copy?fields=id`); expect(method).toEqual('POST'); expect(contentType).toEqual('application/json; charset=UTF-8'); const bodyObj = JSON.parse(body); expect(bodyObj.parent.id).toEqual(folderId); if ( newFileName !== "" && newFileName !== null ){ expect(bodyObj.name).toEqual(newFileName); }else{ //newFileName が空の場合、bodyObj に name の指定がないことを確認 expect(bodyObj.name === undefined).toEqual(true); } }; /** * conf_SourceFileId にデータ項目を設定しているが、そのデータ項目の値が空でエラーになる場合 */ test('No Source File ID - FileId specified by String Data', () => { prepareConfigs(null, '12345', 'test.txt'); expect(execute).toThrow('No Source File ID'); }); /** * conf_SourceFileId に固定値を指定しているが、その固定値が空でエラーになる場合 */ test('No Source File ID - FileId specified with fixed value ' , () => { prepareConfigs(null, '54321', 'test.pdf'); //conf_SourceFileId の設定値を固定値で上書き configs.put('conf_SourceFileId', ''); expect(execute).toThrow('No Source File ID'); }); /** * ファイル名が255文字を超えてエラーになる場合 */ test('File Name Length > 255', () => { let name = ''; while (name.length <= 255) { name += 'a'; } prepareConfigs('87654321', '54321', name); expect(execute).toThrow('File Name should be less than 256 characters'); }); /** * ファイル名に / が含まれている場合 */ test('File Name uses /', () => { prepareConfigs('23456789', '23456', 'sample/test'); expect(execute).toThrow('Invalid File Name'); }); /** * ファイル名に \\ が含まれている場合 */ test('File Name uses \\', () => { prepareConfigs('98765432', '65432', 'sample\\test'); expect(execute).toThrow('Invalid File Name'); }); /** * ファイル名が半角スペースから始まる場合 */ test('File Name starts with space', () => { prepareConfigs('12345678', '12345', ' test'); expect(execute).toThrow('Invalid File Name'); }); /** * ファイル名が半角スペースで終わる場合 */ test('File Name ends with space', () => { prepareConfigs('12345678', '12345', 'test '); expect(execute).toThrow('Invalid File Name'); }); /** * ファイル名が"."の場合 */ test('File Name is .', () => { prepareConfigs('12345678', '45678', '.'); expect(execute).toThrow('Invalid File Name'); }); /** * ファイル名が".."の場合 */ test('File Name is ..', () => { prepareConfigs('87654321', '87654', '..'); expect(execute).toThrow('Invalid File Name'); }); /** * Box への API リクエストでエラー * ファイルが配置されているフォルダの ID 取得失敗 */ test('GET Failed', () => { prepareConfigs('12345678', null, 'test.xml'); httpClient.setRequestHandler((request) => { assertGetRequest(request, '12345678'); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); expect(execute).toThrow('Failed to get parent folder. status: 400'); }); /** * Box への API リクエストでエラー * ファイルコピー失敗 * コピー先のフォルダ指定無 */ test('PUT Failed', () => { prepareConfigs('87654321', null, 'test.png'); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetRequest(request, '87654321'); //レスポンスは、簡易版レプリゼンテーション+ field で指定した属性 const responseGetObj = { "type": "file", "id": "87654321", "etag": "0", "parent": { "type": "folder", "id": "33333", "sequence_id": "0", "etag": "0", "name": "testfolder" } }; reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(responseGetObj)); } assertPostRequest(request, '87654321', '33333', 'test.png'); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); expect(execute).toThrow('Failed to copy. status: 400'); }); /** * コピー成功 * ファイル名指定、コピー先のフォルダ指定  */ test('201 Success - file folder', () => { const { sourceFileIdDef, folderIdDef, idDef, urlDef } = prepareConfigs('12345678', '12345', 'test.txt'); httpClient.setRequestHandler((request) => { assertPostRequest(request, '12345678', '12345', 'test.txt'); //レスポンスは、簡易版レプリゼンテーション const responsePostObj = { "type": "file", "id": "87654321", "etag": "0" }; return httpClient.createHttpResponse(201, 'application/json', JSON.stringify(responsePostObj)); }); //