2023-03-06 (C) Questetra, Inc. (MIT License) 2 This item uploads files to the specified folder on OneDrive. この工程は、OneDrive の指定フォルダにファイルをアップロードします。 https://support.questetra.com/bpmn-icons/onedrive-file-upload/ https://support.questetra.com/ja/bpmn-icons/onedrive-file-upload/ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADXUlEQVRYR8WXW0hUURSG/33GbC5e 8pJJF6nM6YKUmsFAIAZSONOM4FtqL/mQVg9GhXR5iCIiEAqF9KEMsvKpi06OZoRPGaRmVoSGU4om aqaMzeXYOLPjTJ7R41w8k8bZLwNn1r/Wt9dee+29CSQeRHR8vVEpd7vzGTAHKKXpADYDiJnTTwEY IIR0u+FuYxnmCYx6uxjfSwKotE2JbuoqB0EJALkYpwBYUNQwRHbDZtKNBtMEBVBqG0ooSAUAlcjA i81sBPSs3ZRXE0gfEECuM94mlJb+Y2CBjBJSzTbpT/jz5RdAoTU+BGjBSgSf90EeOUz6wsU+fQBW cuaLg/nLhABgbs2rV3bmQm8EtHRhTXgBPNUOV/8yCk4st42BbBu/O7wAitzGmyAoE+tlWXYUtxzN htOcj78AeqNS4aI/Q9jneH5Ng0x1DCLkMlhZFz59m0ZZ9UfPr4jBOmQkjmtWHgC5rqGIUFIXTHih QI3UzVHoH7HhsCYROzZF+JgPjNqxq/iViPgAJfQo25T3wAOg1BnvUkqP+VNGKsLQXpmF5PXCXmR1 zKJvyAqL3Yn4qHCoN0ZCHs6gvm0YxRXdS0IQQmrtTfpiD4BC2/gOANfffUbjVQ1yMtYKvnNZGJlg kZESDeVqGSy2WbzoHPdkpdtswcnKniUBAHQ7TIYMHmBywcEiEPfey0FSgsL7zWJzosc8jazdcQI7 l5tiwvIbUaowTE47UfXMjMqnX4OBTDlMhlgegC62TNmgwp0z6UhLjsaqMMbzN5f25o4x5O5bhwhF WNBZ2mdcyDn3Gu/NloB2DpOBBAToqs7GzqRIr/j7BIu+4V9I2xqN2KhwMSlGbcsgTlV9EAXgswSW Bp135pQCrV3jOJSZICowb2RjXWjtHEfh9U5/OsES+BThj8daqOQyb+q/DFuRkbImJADOmKuNg+Xt ePOZm6NgzBehv21YfzETek0iGIZgxun2OMjeEx8yACfIv/wWLR1jAq1gGwZqROePqLE/NRZjUzOo ezmE++V7ER8tbv35aFzm0o63+YALGlEorfhS0XZsSVSKysTgmANX6nr92QpbMWch7WHEncFSH8dc FiS9kPALJemVjIeQ9FL6PzIR8rWch5D0YcJDSPo0E3QQqR6nolreMoz+ACVfiTBvFfnjAAAAAElF TkSuQmCC { configs.put('conf_OAuth2', 'OneDrive'); const fileDef = engine.createDataDefinition('ファイル', 1, 'q_files', 'FILE'); configs.putObject('conf_uploadedFile', fileDef); engine.setData(fileDef, files); // アップロード先フォルダの URL が保存されている文字型データ項目(単一行)を準備 const folderUrlDef = engine.createDataDefinition('フォルダ URL', 2, 'q_folderUrl', 'STRING_TEXTFIELD'); engine.setData(folderUrlDef, folderUrl); configs.putObject('conf_folderUrl', folderUrlDef); configs.putObject('conf_shouldReplace', shouldReplace); // アップロードしたファイルの URL を保存する文字型データ項目(複数行)を準備 const fileUrlDef = engine.createDataDefinition('ファイル URL', 3, 'q_fileUrl', 'STRING_TEXTAREA'); engine.setData(fileUrlDef, '事前文字列'); configs.putObject('conf_fileUrl', fileUrlDef); return fileUrlDef; }; /** * 指定サイズのテキストファイルを作成 * @param name * @param size * @return qfile */ const createQfile = (name, size) => { let text = ''; if (size >= 4000) { text = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.repeat(100); // 40 * 100 = 4000 } while (text.length < size) { if (text.length !== 0 && text.length * 2 <= size) { text += text; } else if (text.length + 1000 <= size) { text += 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.repeat(25); // 40 * 25 = 1000 } else { text += 'a'; } } return engine.createQfile(name, 'text/plain; charset=US-ASCII', text); }; /** * ファイルが添付されていない */ test('File is null', () => { const fileUrlDef = prepareConfigs(null, null, false); execute(); // 文字型データ項目の値をチェック expect(engine.findData(fileUrlDef)).toEqual(''); }); /** * ファイルが複数添付されていて、URL を保存するデータ項目が単一行 */ test('Multiple files, Single-line data item', () => { const files = new java.util.ArrayList(); files.add(createQfile('ファイル1', 0)); files.add(createQfile('ファイル2', 0)); prepareConfigs(files, null, false); // アップロードしたファイルの URL を保存する文字型データ項目(単一行)を準備 const fileUrlDef = engine.createDataDefinition('ファイル URL (単一行)', 4, 'q_fileUrl_single', 'STRING_TEXTFIELD'); engine.setData(fileUrlDef, '事前文字列'); configs.putObject('conf_fileUrl', fileUrlDef); expect(execute).toThrow('Multiple files are set though the Data Item to save the output is Single-line String.'); }); /** * ファイル数が HTTP リクエスト数制限を超える */ test('File Count > requestingLimit', () => { const files = new java.util.ArrayList(); for (let i = 0; i < httpClient.getRequestingLimit() + 1; i++) { files.add(createQfile(`ファイル${i}`, 0)); } prepareConfigs(files, null, false); expect(execute).toThrow('Necessary HTTP requests exceeds the limit.'); }); /** * ファイル数が HTTP リクエスト数制限と同じ * アップロード先フォルダの URL が設定されている場合、1回多くリクエストが必要なためエラー */ test('File Count = requestingLimit, with Folder URL', () => { const files = new java.util.ArrayList(); for (let i = 0; i < httpClient.getRequestingLimit(); i++) { files.add(createQfile(`ファイル${i}`, 0)); } prepareConfigs(files, 'https://sample.com', false); expect(execute).toThrow('Necessary HTTP requests exceeds the limit.'); }); /** * ファイル数は HTTP リクエスト数制限を超えないが、 * サイズが大きいファイルがあり、リクエスト回数の合計が制限を超える */ test('Exceeds requestingLimit due to a large file', () => { const files = new java.util.ArrayList(); for (let i = 0; i < httpClient.getRequestingLimit() - 1; i++) { // (requestingLimit - 1) 回リクエスト files.add(createQfile(`ファイル${i}`, 0)); } files.add(createQfile('ファイル', SMALL_FILE_SIZE_LIMIT + 1)); // 2回リクエスト prepareConfigs(files, null, false); expect(execute).toThrow('Necessary HTTP requests exceeds the limit.'); }); /** * ファイル数は HTTP リクエスト数制限を超えないが、 * サイズが大きいファイルがあり、リクエスト回数の合計が制限を超える * パケット分割が複数回必要な場合 */ test('Exceeds requestingLimit due to a large file - requires several packets', () => { const files = new java.util.ArrayList(); for (let i = 0; i < httpClient.getRequestingLimit() - 2; i++) { // (requestingLimit - 2) 回リクエスト files.add(createQfile(`ファイル${i}`, 0)); } files.add(createQfile('ファイル', PACKET_SIZE_LIMIT * 2)); // 3回リクエスト prepareConfigs(files, null, false); expect(execute).toThrow('Necessary HTTP requests exceeds the limit.'); }); /** * 同じ名前のファイルが2つ以上 */ test('Two or more files have the same name', () => { const files = new java.util.ArrayList(); files.add(createQfile('ファイル1', 0)); files.add(createQfile('ファイル2', 0)); files.add(createQfile('ファイル1', 0)); // 名前が重複 prepareConfigs(files, null, false); expect(execute).toThrow('Two or more files to upload have the same name.'); }); /** * 4MB以下のファイルをアップロードする API リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param request.contentType * @param file * @param driveId * @param folderId * @param shouldReplace */ const assertUploadSmallFileRequest = ({url, method, contentType}, file, driveId, folderId, shouldReplace) => { let expectedUrl = `https://graph.microsoft.com/v1.0/${driveId}/items/${folderId}:/${encodeURIComponent(file.getName())}:/content`; if (!shouldReplace) { expectedUrl += `?${encodeURIComponent('@microsoft.graph.conflictBehavior')}=fail`; } expect(url).toEqual(expectedUrl); expect(method).toEqual('PUT'); expect(contentType).toEqual('application/octet-stream'); }; /** * 4MB以下のファイルのアップロードに失敗 */ test('Fail to upload a small file', () => { const files = new java.util.ArrayList(); files.add(createQfile('ファイル', SMALL_FILE_SIZE_LIMIT)); prepareConfigs(files, null, false); httpClient.setRequestHandler((request) => { assertUploadSmallFileRequest(request, files.get(0), 'me/drive', 'root', false); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); expect(execute).toThrow('Failed to upload'); }); /** * アップロード完了時のレスポンス文字列を作成する * @param index アップロードファイルの区別をつけるためのインデックス * @return response */ const createUploadedResponse = (index) => { const json = { 'webUrl': `https://sample.com/:f:/g/personal/test_user/uploaded_file_${index}` }; return JSON.stringify(json); }; /** * 4MB以下のファイル1個のアップロードに成功 * フォルダ指定なし (データ項目が設定されていて、値が空) * 上書きしない * ファイルが1個であれば、保存先データ項目が単一行でもエラーにならない */ test('Succeed to upload a small file', () => { const files = new java.util.ArrayList(); files.add(createQfile('ファイル', SMALL_FILE_SIZE_LIMIT)); prepareConfigs(files, null, false); // アップロードしたファイルの URL を保存する文字型データ項目(単一行)を準備 const fileUrlDef = engine.createDataDefinition('ファイル URL (単一行)', 4, 'q_fileUrl_single', 'STRING_TEXTFIELD'); engine.setData(fileUrlDef, '事前文字列'); configs.putObject('conf_fileUrl', fileUrlDef); httpClient.setRequestHandler((request) => { assertUploadSmallFileRequest(request, files.get(0), 'me/drive', 'root', false); return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(1)); }); execute(); // 文字型データ項目の値をチェック expect(engine.findData(fileUrlDef)).toEqual('https://sample.com/:f:/g/personal/test_user/uploaded_file_1'); }); /** * 4MB以下のファイル1個のアップロードに成功 * 保存先データ項目を指定しない場合 */ test('Succeed to upload a small file - file url not saved', () => { const files = new java.util.ArrayList(); files.add(createQfile('ファイル', SMALL_FILE_SIZE_LIMIT)); prepareConfigs(files, null, false); configs.put('conf_fileUrl', ''); // データ項目の選択を解除 httpClient.setRequestHandler((request) => { assertUploadSmallFileRequest(request, files.get(0), 'me/drive', 'root', false); return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(1)); }); execute(); }); /** * 4MB以下のファイル上限個のアップロードに成功 * フォルダ指定なし (固定値で空) * 上書きする */ test('Succeed to upload small files', () => { const files = new java.util.ArrayList(); const fileNum = httpClient.getRequestingLimit(); for (let i = 0; i < fileNum; i++) { // サイズを SMALL_FILE_SIZE_LIMIT にするとメモリが足りずエラーになるので、小さめの値を設定 const file = createQfile(`ファイル${i}`, 1000); files.add(file); } const fileUrlDef = prepareConfigs(files, 'dummy', true); configs.put('conf_folderUrl', ''); // 固定値で空 let reqCount = 0; httpClient.setRequestHandler((request) => { assertUploadSmallFileRequest(request, files.get(reqCount), 'me/drive', 'root', true); reqCount++; return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(reqCount)); }); execute(); // 文字型データ項目の値をチェック const fileUrls = []; for (let i = 0; i < fileNum; i++) { fileUrls.push(`https://sample.com/:f:/g/personal/test_user/uploaded_file_${i+1}`); } expect(engine.findData(fileUrlDef)).toEqual(fileUrls.join('\n')); }); /** * フォルダ情報取得の API リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param encodedFolderUrl */ const assertGetFolderInfoRequest = ({url, method}, encodedFolderUrl) => { expect(url).toEqual(`https://graph.microsoft.com/v1.0/shares/${encodedFolderUrl}/driveItem`); expect(method).toEqual('GET'); }; const FOLDER_URL_1 = 'https://sample.com/:f:/g/personal/test_user/abcd1234?e=efgh'; const ENCODED_FOLDER_URL_1 = 'u!aHR0cHM6Ly9zYW1wbGUuY29tLzpmOi9nL3BlcnNvbmFsL3Rlc3RfdXNlci9hYmNkMTIzND9lPWVmZ2g'; const FOLDER_URL_2 = 'https://sample.com/personal/test_user/Documents/test_folder'; const ENCODED_FOLDER_URL_2 = 'u!aHR0cHM6Ly9zYW1wbGUuY29tL3BlcnNvbmFsL3Rlc3RfdXNlci9Eb2N1bWVudHMvdGVzdF9mb2xkZXI'; const FOLDER_INFO_1 = { 'id': 'folder-id-1', 'parentReference': { 'driveId': 'drive-id-1' } }; const FOLDER_INFO_2 = { 'id': 'folder-id-2', 'parentReference': { 'driveId': 'drive-id-2' } }; /** * フォルダ情報の取得に失敗 */ test('Fail to get folder info', () => { const files = new java.util.ArrayList(); files.add(createQfile('ファイル', 0)); prepareConfigs(files, FOLDER_URL_1, false); httpClient.setRequestHandler((request) => { assertGetFolderInfoRequest(request, ENCODED_FOLDER_URL_1); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); expect(execute).toThrow('Failed to get drive item.'); }); /** * 4MB以下のファイル1個のアップロードに成功 * フォルダ指定あり (データ項目) */ test('Succeed to upload a small file - folder url specified via data item', () => { const files = new java.util.ArrayList(); files.add(createQfile('ファイル', 0)); const fileUrlDef = prepareConfigs(files, FOLDER_URL_1, false); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetFolderInfoRequest(request, ENCODED_FOLDER_URL_1); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(FOLDER_INFO_1)); } assertUploadSmallFileRequest(request, files.get(0), 'drives/drive-id-1', 'folder-id-1', false); return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(1)); }); execute(); // 文字型データ項目の値をチェック expect(engine.findData(fileUrlDef)).toEqual('https://sample.com/:f:/g/personal/test_user/uploaded_file_1'); }); /** * 4MB以下のファイル上限個のアップロードに成功 * フォルダ指定あり (固定値) */ test('Succeed to upload small files - folder url specified as fixed value', () => { const files = new java.util.ArrayList(); const fileNum = httpClient.getRequestingLimit() - 1; // フォルダを指定する場合、リクエストが1回増える for (let i = 0; i < fileNum; i++) { // サイズを SMALL_FILE_SIZE_LIMIT にするとメモリが足りずエラーになるので、小さめの値を設定 const file = createQfile(`ファイル${i}`, 1000); files.add(file); } const fileUrlDef = prepareConfigs(files, null, false); configs.put('conf_folderUrl', FOLDER_URL_2); // 固定値で指定 let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetFolderInfoRequest(request, ENCODED_FOLDER_URL_2); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(FOLDER_INFO_2)); } assertUploadSmallFileRequest(request, files.get(reqCount-1), 'drives/drive-id-2', 'folder-id-2', false); reqCount++; return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(reqCount-1)); }); execute(); // 文字型データ項目の値をチェック const fileUrls = []; for (let i = 0; i < fileNum; i++) { fileUrls.push(`https://sample.com/:f:/g/personal/test_user/uploaded_file_${i+1}`); } expect(engine.findData(fileUrlDef)).toEqual(fileUrls.join('\n')); }); /** * 4MBを超えるファイルをアップロードするためのセッションを作成する API リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param request.contentType * @param request.body * @param file * @param driveId * @param folderId * @param shouldReplace */ const assertCreateSessionRequest = ({url, method, contentType, body}, file, driveId, folderId, shouldReplace) => { const expectedUrl = `https://graph.microsoft.com/v1.0/${driveId}/items/${folderId}:/${encodeURIComponent(file.getName())}:/createUploadSession`; expect(url).toEqual(expectedUrl); expect(method).toEqual('POST'); if (!shouldReplace) { const bodyObj = JSON.parse(body); expect(bodyObj.item['@microsoft.graph.conflictBehavior']).toEqual('fail'); expect(contentType).toEqual('application/json; charset=UTF-8'); } }; /** * 4MBを超えるファイルのアップロードに失敗 * セッション作成のリクエストでエラー */ test('Fail to upload a large file - fail in creating session', () => { const files = new java.util.ArrayList(); files.add(createQfile('ファイル', SMALL_FILE_SIZE_LIMIT + 1)); prepareConfigs(files, null, false); httpClient.setRequestHandler((request) => { assertCreateSessionRequest(request, files.get(0), 'me/drive', 'root', false); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); expect(execute).toThrow('Failed to create upload session'); }); /** * 4MBを超えるファイルの各部分をアップロードする API リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param request.headers * @param request.contentType * @param uploadUrl * @param rangeFrom * @param rangeTo * @param fileSize */ const assertUploadPacketRequest = ({url, method, headers, contentType}, uploadUrl, rangeFrom, rangeTo, fileSize) => { expect(url).toEqual(uploadUrl); expect(method).toEqual('PUT'); expect(headers.get('Content-Range')).toEqual(`bytes ${rangeFrom}-${rangeTo}/${fileSize}`); expect(contentType).toEqual('application/octet-stream'); }; const SESSION_1 = { 'uploadUrl': 'https://sample.com/up/abc123' }; const SESSION_2 = { 'uploadUrl': 'https://sample.com/up/def789' }; /** * 4MBを超えるファイルのアップロードに失敗 * パケットアップロードのリクエストでエラー */ test('Fail to upload a large file - fail in uploading a packet', () => { const files = new java.util.ArrayList(); const fileSize = SMALL_FILE_SIZE_LIMIT + 1; files.add(createQfile('ファイル', fileSize)); prepareConfigs(files, null, false); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { // セッション作成 assertCreateSessionRequest(request, files.get(0), 'me/drive', 'root', false); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SESSION_1)); } assertUploadPacketRequest(request, SESSION_1.uploadUrl, 0, fileSize - 1, fileSize); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); expect(execute).toThrow('Failed to upload'); }); /** * 4MBを超えるファイルのアップロードに成功 * フォルダ指定なし * 上書きしない * パケットアップロードは1回のみ */ test('Succeed to upload a large file', () => { const files = new java.util.ArrayList(); const fileSize = SMALL_FILE_SIZE_LIMIT + 1; files.add(createQfile('ファイル', fileSize)); const fileUrlDef = prepareConfigs(files, null, false); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { // セッション作成 assertCreateSessionRequest(request, files.get(0), 'me/drive', 'root', false); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SESSION_1)); } // パケットのアップロード assertUploadPacketRequest(request, SESSION_1.uploadUrl, 0, fileSize - 1, fileSize); return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(1)); }); execute(); // 文字型データ項目の値をチェック expect(engine.findData(fileUrlDef)).toEqual('https://sample.com/:f:/g/personal/test_user/uploaded_file_1'); }); /** * 4MBを超えるファイルのアップロードに成功 * フォルダ指定あり (データ項目) * 上書きする * パケットアップロード複数回 */ test('Succeed to upload a large file - several upload requests required', () => { const files = new java.util.ArrayList(); const fileSize = PACKET_SIZE_LIMIT * 2 + 1; // パケットアップロード3回 files.add(createQfile('ファイル', fileSize)); const fileUrlDef = prepareConfigs(files, FOLDER_URL_1, true); let reqCount = 0; let rangeFrom = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { // フォルダ情報取得 assertGetFolderInfoRequest(request, ENCODED_FOLDER_URL_1); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(FOLDER_INFO_1)); } if (reqCount === 1) { // セッション作成 assertCreateSessionRequest(request, files.get(0), 'drives/drive-id-1', 'folder-id-1', true); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SESSION_2)); } // パケットのアップロード if (reqCount < 4) { assertUploadPacketRequest(request, SESSION_2.uploadUrl, rangeFrom, rangeFrom + PACKET_SIZE_LIMIT - 1, fileSize); reqCount++; rangeFrom += PACKET_SIZE_LIMIT; return httpClient.createHttpResponse(202, 'application/json', '{}'); } assertUploadPacketRequest(request, SESSION_2.uploadUrl, rangeFrom, fileSize - 1, fileSize); return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(1)); }); execute(); // 文字型データ項目の値をチェック expect(engine.findData(fileUrlDef)).toEqual('https://sample.com/:f:/g/personal/test_user/uploaded_file_1'); }); /** * アップロード成功 * 4MBを超えるファイルと超えないファイルが混在する場合 * リクエスト上限ぎりぎりのファイル数、ファイルサイズ */ test('Succeed to upload files - both small files and large files', () => { const files = new java.util.ArrayList(); const reqLimit = httpClient.getRequestingLimit(); const smallFileNum = reqLimit - 7; for (let i = 0; i < smallFileNum; i++) { // 小さいファイルを追加 files.add(createQfile(`ファイル${i+1}`, 0)); } // リクエストが計2回必要なファイルを先頭に追加 (セッション作成1回、パケットアップロード1回) const fileSize1 = SMALL_FILE_SIZE_LIMIT + 1; files.add(0, createQfile('ファイル0', fileSize1)); // リクエストが計4回必要なファイルを末尾に追加 (セッション作成1回、パケットアップロード3回) const fileSize2 = PACKET_SIZE_LIMIT * 2 + 1; files.add(createQfile(`ファイル${smallFileNum + 1}`, fileSize2)); const fileUrlDef = prepareConfigs(files, FOLDER_URL_2, false); let reqCount = 0; let fileCount = 0; let rangeFrom = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { // フォルダ情報取得 assertGetFolderInfoRequest(request, ENCODED_FOLDER_URL_2); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(FOLDER_INFO_2)); } if (reqCount === 1) { // セッション作成 assertCreateSessionRequest(request, files.get(fileCount), 'drives/drive-id-2', 'folder-id-2', false); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SESSION_1)); } if (reqCount === 2) { // パケットのアップロード assertUploadPacketRequest(request, SESSION_1.uploadUrl, 0, fileSize1 - 1, fileSize1); reqCount++; fileCount++; return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(fileCount)); } if (reqCount < smallFileNum + 3) { // 小さいファイルをアップロード assertUploadSmallFileRequest(request, files.get(fileCount), 'drives/drive-id-2', 'folder-id-2', false); reqCount++; fileCount++; return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(fileCount)); } if (reqCount === smallFileNum + 3) { // セッション作成 assertCreateSessionRequest(request, files.get(fileCount), 'drives/drive-id-2', 'folder-id-2', false); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SESSION_2)); } // パケットのアップロード if (reqCount < reqLimit - 1) { assertUploadPacketRequest(request, SESSION_2.uploadUrl, rangeFrom, rangeFrom + PACKET_SIZE_LIMIT - 1, fileSize2); reqCount++; rangeFrom += PACKET_SIZE_LIMIT; return httpClient.createHttpResponse(202, 'application/json', '{}'); } assertUploadPacketRequest(request, SESSION_2.uploadUrl, rangeFrom, fileSize2 - 1, fileSize2); fileCount++; return httpClient.createHttpResponse(200, 'application/json', createUploadedResponse(fileCount)); }); execute(); // 文字型データ項目の値をチェック const fileUrls = []; for (let i = 0; i < smallFileNum + 2; i++) { fileUrls.push(`https://sample.com/:f:/g/personal/test_user/uploaded_file_${i+1}`); } expect(engine.findData(fileUrlDef)).toEqual(fileUrls.join('\n')); }); ]]>