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'));
});
]]>