2024-02-08 (C) Questetra, Inc. (MIT License) 3 2 This item gets values of a list item on Microsoft Lists. この工程は、Microsoft Lists のリストアイテム(1件)の内容を取得します。 https://support.questetra.com/bpmn-icons/service-task-microsoft-lists-listitem-get/ https://support.questetra.com/ja/bpmn-icons/service-task-microsoft-lists-listitem-get/ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABFlJREFUWEfF l3tsU3UUx7/nrqVlbPiAZbjhhhLCdAYXxKBolKi49VZ0+KiKYbgIoa1mwbJuREKCJurWLghlrh1O EFgwARPjY+0GkqB/CD7+mDMb8lhSjchkKDKY69b1HtLbdbCtt/dmML1/3dyex+c8fud3SvifH9Lq v6Fw881hXeRxgJcw406AbiHiDFmfcZaBLoDaCTigj6R8tarF8bcW26oAHz5Znd4fEd4C82tEpNNi lJkHAfIMsuHNskBZTzIdRQAGk090rwShCqBMLY5HyzBzF0GosPrXNRKIE9lQBKgT3U4CqkFQzVJS OAYzwWFvcm7RBLDvuX0p53qDO4ioZDxRK+kwsGV6am65Zb8lcrXMmOjqzO61BLx3PZ3HbTHw+uhM jADwiTVLJJKaCSRMDABLBEG0NZW3xO0PA+xcvMkYmpIaTNZwt86fhQfXPAqQelv8e74Xn1V+PDYO xpm+8ymzHUccfdEfhy15Rdd6EL2rFHnOgttQuKEY39QewO+tv8piUkQCS1eam4SYOSLC895S7Hyh NqG5q0sha0SPnFd0/0FEMxJpxJ0frPoCwe9OaapOyW4bdpd4E8syzlj95dnRoykD1Jmq7yNBOJJI OnteDpa+bcHJwx043fabJudRoUWrH8EOi0dRniXpfnug8mgMwOyuIqAykXTRxmLcNHMaLp7tgaAT kJmXhdM/jQRhSQIJI/t2ZkEuthdvVgYAqu1NzvUxANF1mIgeTiRt2rgMnd+ewIlD7TBOnYxnt65A Y+l21Uy8vPdVfLT8fWUA5q/t/orFcYBfiGjufwxw3O6vyJMBvKLrHxDdoASQNS8H4dAAhBQBxvTJ 6L8UUs2AIc0I39IaZTnmCzZ/xY1DGXCHiGBQAgj+0IljzW1Iy0hHsetFTSVYscuKPSt9mgGCRMjV BrAcjaX1qhlQA2DmKyWoE91HibBQCUCfOgndJ7swKc2IOQ/lod3fqgqQby5AwzNbtTWhV3T7QFij BGBIN+Kv4DnojXrc/sAcHD/UkRQg77F89F/qVx5EselXb/M7rXIP+ERXERMFtJ2CkqQlKNzwFGbc kY29qxsQ7htQBCVmk9Vf0SwDeEweg55CfyY6CdE5EPy+E8da2lTnQHRoZc7NUnXOjJ7pU3ozLPs3 DQxfRkrT8O6n78V8y0JEwhH5ktEZdAiHwrHIovdQ1AID0YtooLcfn6zdkzTyITV5CkbfhwE8Js9U HYVOEVFs052gh5m7DTqe/crnlRdHAMgDyVxTyJD8E7mQCCwUWf3lB+Pxjdks1PaCa0mM6koWN+4V XR+AaNW1OBujO3TsRn9X3K28pup1IMF9PdZyMMpsAWfC9Sjpcud9wr0MjG0AsseVDeYgBHLYvnR+ qqSvul3W31OvlzIvvARQGYAC1YywfDhbQVw7LXXWrtH/AzSXIBGxx/ROhp50ZgYWALiLiPKH5kEH g38m4McwDzaVBd7o1pox1QxoNTReucsdycEwUqG3yAAAAABJRU5ErkJggg== } dataDefs */ const prepareConfigs = (siteUrl, listTitle, listItemIdDef, columnNames, valueDefTypes) => { const oauth2 = httpClient.createAuthSettingOAuth2( 'OneDrive', 'https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize', 'https://login.microsoftonline.com/organizations/oauth2/v2.0/token', 'https://graph.microsoft.com/Sites.ReadWrite.All offline_access', 'client_id', 'client_secret', 'access_token' ); configs.putObject('conf_OAuth2', oauth2); configs.put('conf_SiteUrl', siteUrl); configs.put('conf_ListTitle', listTitle); configs.putObject('conf_ListItemId', listItemIdDef); // 列の名前と、値を保存するデータ項目を準備し、設定 const valueDefs = []; for (let i = 0; i < COLUMN_NUM; i++) { configs.put(`conf_ColumnName${i + 1}`, columnNames[i]); const valueDefType = valueDefTypes[i]; if (valueDefType === '') { valueDefs.push(null); continue; } else { const valueDef = engine.createDataDefinition(`Value of Cell ${i + 1}`, i + 1, `q_value${i + 1}`, valueDefType); configs.putObject(`conf_ColumnValue${i + 1}`, valueDef); valueDefs.push(valueDef); // 初期値を設定しておく if (valueDefType.startsWith('STRING')) { engine.setData(valueDef, '事前文字列'); } else if (valueDefType === 'DECIMAL') { engine.setData(valueDef, new java.math.BigDecimal(9999999)); } else if (valueDefType.startsWith('SELECT')) { const select = new java.util.ArrayList(); const item = engine.createItem('事前選択肢の値', '事前選択肢のラベル'); select.add(item); engine.setData(valueDef, select); } else if (valueDefType === 'DATETIME') { engine.setData(valueDef, java.sql.Timestamp.valueOf('2000-01-01 12:12:12')); } else if (valueDefType === 'DATE') { engine.setData(valueDef, java.sql.Date.valueOf('2000-01-01')); } } } return valueDefs; }; /** * リストアイテム ID の準備(文字型データ項目の場合) * @param listItemId * @return listItemIdDef */ const preparelistItemIdStringDef = (listItemId) => { // 文字型データ項目(単一行)を準備 const listItemIdDef = engine.createDataDefinition('リストアイテム ID', 1, 'q_listItemId', 'STRING_TEXTFIELD'); engine.setData(listItemIdDef, listItemId); return listItemIdDef; }; /** * リストアイテム ID の準備(選択型データ項目の場合) * @param listItemId * @return listItemIdDef */ const preparelistItemIdSelectDef = (listItemId) => { // 選択型データ項目を準備 const listItemIdDef = engine.createDataDefinition('リストアイテム ID', 1, 'q_listItemId', 'SELECT_SINGLE'); const select = new java.util.ArrayList(); const item = engine.createItem(listItemId, `${listItemId} を選択`); select.add(item); engine.setData(listItemIdDef, select); return listItemIdDef; }; /** * 異常系のテスト * @param errorMsg */ const assertError = (errorMsg) => { let failed = false; try { main(); } catch (e) { failed = true; expect(e.message).toEqual(errorMsg); } if (!failed) { fail('No error was thrown.'); } }; const BLANKS = ['', '', '', '', '', '', '']; const SAMPLE_COLUMN_NAMES = [ 'SingleLineOfText', 'MultiLineOfText', 'Number', 'ChoiceSingle', 'ChoiceMultiple', 'Datetime', 'Date' ]; const SAMPLE_COLUMN_VALUES = [ 'text', 'text\nwith\nline\nbreaks', 123, 'Choice 1', ['Choice 1', 'Choice 2'], '2022-02-22T12:34:56Z', '2022-02-22T15:00:00Z' // Lists の日付は、サイトのタイムゾーン設定における 0 時 0 分の日時 ]; const SAMPLE_DEF_TYPES = [ 'STRING_TEXTFIELD', 'STRING_TEXTAREA', 'DECIMAL', 'SELECT_SINGLE', 'SELECT_CHECKBOX', 'DATETIME', 'DATE' ]; /** * リストアイテム ID を文字型データ項目で設定し、値が空 */ test('List Item ID is blank', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemIdDef = preparelistItemIdStringDef(null); prepareConfigs(siteUrl, listTitle, listItemIdDef, SAMPLE_COLUMN_NAMES, SAMPLE_DEF_TYPES); assertError('List Item ID is blank.'); }); /** * リストアイテム ID を選択型データ項目で設定し、値が空 */ test('List Item ID is not selected', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemIdDef = preparelistItemIdSelectDef('dummy'); engine.setData(listItemIdDef, null); // 選択を解除 prepareConfigs(siteUrl, listTitle, listItemIdDef, SAMPLE_COLUMN_NAMES, SAMPLE_DEF_TYPES); assertError('List Item ID is not selected.'); }); /** * 列がひとつも指定されていない */ test('No data item to save the result', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); prepareConfigs(siteUrl, listTitle, listItemIdDef, BLANKS, BLANKS); assertError('No data item to save the result.'); }); /** * 値を保存するデータ項目だけ指定されている組がある */ test('Data item to save value is specified while its column name is blank', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const valueDefTypes = JSON.parse(JSON.stringify(BLANKS)); // ディープコピー valueDefTypes[1] = 'STRING_TEXTFIELD'; prepareConfigs(siteUrl, listTitle, listItemIdDef, BLANKS, valueDefTypes); assertError('Field name and data item for Column 2 must be specified at the same time.'); }); /** * 列の名前だけ指定されている組がある */ test('Column name is specified while data item to save the value is not selected', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const columnNames = JSON.parse(JSON.stringify(BLANKS)); // ディープコピー columnNames[2] = 'Title'; prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, BLANKS); assertError('Field name and data item for Column 3 must be specified at the same time.'); }); /** * データ項目の指定が重複 */ test('The same data item is set multiple times', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, SAMPLE_COLUMN_NAMES, SAMPLE_DEF_TYPES); configs.putObject('conf_ColumnValue4', valueDefs[0]); assertError('The same data item is set multiple times.'); }); /** * サイト情報取得の GET リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param request.headers * @param siteUrl */ const assertGetSiteInfoRequest = ({ url, method, headers }, siteUrl) => { const encodedUrl = encodeSharingUrl(siteUrl); const expectedUrl = `${GRAPH_URI}shares/${encodedUrl}/site?select=id`; expect(url).toEqual(expectedUrl); expect(method).toEqual('GET'); expect(headers.Authorization).toEqual('Bearer access_token'); }; /** * サイト情報取得の GET リクエストでエラー */ test('Fail in 1st GET request', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); prepareConfigs(siteUrl, listTitle, listItemIdDef, SAMPLE_COLUMN_NAMES, SAMPLE_DEF_TYPES); httpClient.setRequestHandler((request) => { assertGetSiteInfoRequest(request, siteUrl); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); assertError('Failed to get site info. status: 400'); }); /** * クエリパラメータのテスト用の文字列を生成する * @param key * @param value * @returns {String} */ const generateQueryString = (key, value) => { const encodedKey = encodeURIComponent(key); const encodedValue = encodeURIComponent(value) .replace(/%20/g, '+') // HttpRequestWrapper#formParam() はスペースを + に置き換える .replace(/'/g, '%27') // encodeURIComponent() でエンコードされない文字をエンコード .replace(/\(/g, '%28') .replace(/\)/g, '%29'); return `${encodedKey}=${encodedValue}`; }; /** * 列情報取得の GET リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param request.headers * @param siteId * @param listTitle */ const assertGetColumnsRequest = ({ url, method, headers }, siteId, listTitle) => { const expectedUrl = `${GRAPH_URI}sites/${encodeURIComponent(siteId)}/lists/${encodeURIComponent(listTitle)}/columns` + `?${generateQueryString('$select', 'name')}`; expect(url).toEqual(expectedUrl); expect(method).toEqual('GET'); expect(headers.Authorization).toEqual('Bearer access_token'); }; /** * 列情報取得のの GET リクエストでエラー */ test('Fail in 2nd GET request', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); prepareConfigs(siteUrl, listTitle, listItemIdDef, SAMPLE_COLUMN_NAMES, SAMPLE_DEF_TYPES); let reqCount = 0; const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetSiteInfoRequest(request, siteUrl); reqCount++; return httpClient.createHttpResponse(200, 'application/json', `{"id":"${siteId}"}`); } assertGetColumnsRequest(request, siteId, listTitle); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); assertError('Failed to get columns. status: 400'); }); /** * 指定した名前の列が存在せずエラーになる場合 */ test('Column not found', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); prepareConfigs(siteUrl, listTitle, listItemIdDef, SAMPLE_COLUMN_NAMES, SAMPLE_DEF_TYPES); let reqCount = 0; const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; const columns = SAMPLE_COLUMN_NAMES.map(name => ({ name })); columns.splice(4, 1); // ChoiceMultiple を削除 httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetSiteInfoRequest(request, siteUrl); reqCount++; return httpClient.createHttpResponse(200, 'application/json', `{"id":"${siteId}"}`); } assertGetColumnsRequest(request, siteId, listTitle); return httpClient.createHttpResponse(200, 'application/json', JSON.stringify({ value: columns })); }); assertError("Column 'ChoiceMultiple' not found."); }); /** * リストアイテム取得の GET リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param request.headers * @param siteId * @param listTitle * @param filter * @param columnNames */ const assertGetListItemRequest = ({ url, method, headers }, siteId, listTitle, listItemId, columnNames) => { const expand = `fields($select=${columnNames.join(',')})`; let expectedUrl = `${GRAPH_URI}sites/${encodeURIComponent(siteId)}/lists/${encodeURIComponent(listTitle)}/items/${encodeURIComponent(listItemId)}` + `?${generateQueryString('$select', 'id')}` + `&${generateQueryString('$expand', expand)}`; expect(url).toEqual(expectedUrl); expect(method).toEqual('GET'); expect(headers.Authorization).toEqual('Bearer access_token'); }; /** * リストアイテム取得の GET リクエストでエラー */ test('Fail in 3rd GET request', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); prepareConfigs(siteUrl, listTitle, listItemIdDef, SAMPLE_COLUMN_NAMES, SAMPLE_DEF_TYPES); let reqCount = 0; const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; const columns = SAMPLE_COLUMN_NAMES.map(name => ({ name })); httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetSiteInfoRequest(request, siteUrl); reqCount++; return httpClient.createHttpResponse(200, 'application/json', `{"id":"${siteId}"}`); } if (reqCount === 1) { assertGetColumnsRequest(request, siteId, listTitle); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify({ value: columns })); } assertGetListItemRequest(request, siteId, listTitle, listItemId, SAMPLE_COLUMN_NAMES); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); assertError('Failed to get list item. status: 400'); }); /** * リストアイテム取得のレスポンスを準備 * @param listItemId * @param columnNames 列の名前 * @param columnValues 列の値 * @returns {String} */ const prepareListItemResponse = (listItemId, columnNames, columnValues) => { const fields = {}; columnNames.forEach((name, i) => { if (name === '' || columnValues[i] === undefined) { return; } fields[name] = columnValues[i]; }); const listItem = { id: listItemId, fields }; return JSON.stringify(listItem); }; /** * 数値型データの値を確認する * @param dataDef * @param format * @param expectedString */ const assertDecimal = (dataDef, format, expectedString) => { const string = new java.text.DecimalFormat(format).format(engine.findData(dataDef)); expect(string).toEqual(expectedString); }; /** * 選択型データの値を確認する * @param dataDef * @param expectedIds */ const assertSelect = (dataDef, expectedIds) => { const selectedItems = engine.findData(dataDef); if (expectedIds === null) { expect(selectedItems).toEqual(null); return; } expect(selectedItems.size()).toEqual(expectedIds.length); expectedIds.forEach((expectedId, i) => { expect(selectedItems.get(i)).toEqual(expectedId); }); }; /** * 日時型データの値を確認する * @param dataDef * @param timezone * @param expectedString */ const assertDatetime = (dataDef, timezone, expectedString) => { const string = dateFormatter.format(timezone, 'yyyy-MM-dd HH:mmZ', engine.findData(dataDef)); expect(string).toEqual(expectedString); }; /** * 日付型データの値を確認する * 文字列での表現は JVM のタイムゾーンに依存するので、ミリ秒数で比較する * @param dataDef * @param originalDatetimeString */ const assertDate = (dataDef, originalDatetimeString) => { const millisec = dateFormatter.parse("yyyy-MM-dd'T'HH:mm:ssX", originalDatetimeString).getFirstTimeInDate().getTime(); expect(engine.findData(dataDef).getTime()).toEqual(millisec); }; /** * すべての API リクエストに成功する場合のリクエストハンドラを準備 * @param siteUrl * @param siteId * @param listTitle * @param listItemId * @param columnNames * @param columnValues */ const prepareRequestHandler = (siteUrl, siteId, listTitle, listItemId, columnNames, columnValues) => { const trimmedColumnNames = columnNames.filter(name => name !== ''); const columns = trimmedColumnNames.map(name => ({ name })); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetSiteInfoRequest(request, siteUrl); reqCount++; return httpClient.createHttpResponse(200, 'application/json', `{"id":"${siteId}"}`); } if (reqCount === 1) { assertGetColumnsRequest(request, siteId, listTitle); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify({ value: columns })); } assertGetListItemRequest(request, siteId, listTitle, listItemId, trimmedColumnNames); return httpClient .createHttpResponse(200, 'application/json', prepareListItemResponse(listItemId, columnNames, columnValues)); }); }; /** * 成功 - すべてのデータ項目に保存、リストアイテム ID は文字型データ項目で指定 * 1. Single-line String to STRING_TEXTFIELD * 2. Multi-line String to STRING_TEXTAREA * 3. Number to DECIMAL * 4. String to SELECT_SINGLE * 5. Array of String to SELECT_CHECKBOX * 6. Datetime to DATETIME * 7. Datetime to DATE */ test('Succeed - save to all data items', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, SAMPLE_COLUMN_NAMES, SAMPLE_DEF_TYPES); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, SAMPLE_COLUMN_NAMES, SAMPLE_COLUMN_VALUES); expect(main()).toEqual(undefined); expect(engine.findData(valueDefs[0])).toEqual(SAMPLE_COLUMN_VALUES[0]); expect(engine.findData(valueDefs[1])).toEqual(SAMPLE_COLUMN_VALUES[1]); assertDecimal(valueDefs[2], '#,###.0', `${SAMPLE_COLUMN_VALUES[2]}.0`); assertSelect(valueDefs[3], ['Choice 1']); assertSelect(valueDefs[4], ['Choice 1', 'Choice 2']); assertDatetime(valueDefs[5], 'GMT+0900', '2022-02-22 21:34+0900'); assertDate(valueDefs[6], SAMPLE_COLUMN_VALUES[6]); }); /** * 成功 - 一部のデータ項目に保存、リストアイテム ID は選択型データ項目で指定 * 1. 設定なし * 2. Boolean to STRING_TEXTFIELD * 3. Boolean to SELECT_SINGLE * 4. 設定なし * 5. Number to SELECT_SINGLE * 6. String to DECIMAL * 7. 設定なし */ test('Succeed - save to some data items, boolean and number', () => { const siteUrl = 'https://test.sharepoint.com/sites/MarketingDepartment'; const listTitle = '共有リスト'; const listItemId = '555'; const listItemIdDef = preparelistItemIdSelectDef(listItemId); const columnNames = [ '', 'TrueOrFalse', 'TrueOrFalse', // 列名は重複していてもよい '', 'ApprovalStatus', 'Calculated', '' ]; const columnDefTypes = [ '', 'STRING_TEXTFIELD', 'SELECT_SINGLE', '', 'SELECT_SINGLE', 'DECIMAL', '' ]; const columnValues = [ '', true, true, '', 3, '3.14', '' ]; // サイト URL の末尾にスラッシュが含まれていても、除いて処理される const valueDefs = prepareConfigs(`${siteUrl}/`, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test.sharepoint.com,9876abcd-5e6f-7g8h-9i0j,1a2b3c4d-9a8b7c6d5e4f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); expect(main()).toEqual(undefined); expect(engine.findData(valueDefs[1])).toEqual('true'); assertSelect(valueDefs[2], ['true']); assertSelect(valueDefs[4], ['3']); assertDecimal(valueDefs[5], '#,###.0', '3.1'); }); /** * 成功 - 実データではありえないはずの値でも、解釈できればエラーにはならない * 1. Array of Number to STRING_TEXTAREA * 2. Array of Boolean to STRING_TEXTAREA * 3. 設定なし * 4. 設定なし * 5. 設定なし * 6. Array of Number to SELECT_CHECKBOX * 7. Array of Boolean to SELECT_CHECKBOX */ test('Succeed - save to some data items, other value formats', () => { const siteUrl = 'https://test.sharepoint.com/sites/MarketingDepartment'; const listTitle = '共有リスト'; const listItemId = '9'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const columnNames = [ 'ArrayOfNumber1', 'ArrayOfBoolean1', '', '', '', 'ArrayOfNumber2', 'ArrayOfBoolean2' ]; const columnDefTypes = [ 'STRING_TEXTAREA', 'STRING_TEXTAREA', '', '', '', 'SELECT_CHECKBOX', 'SELECT_CHECKBOX' ]; const columnValues = [ [1, 2, 3], [true], '', '', '', [4, 5], [false, true] ]; const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test.sharepoint.com,9876abcd-5e6f-7g8h-9i0j,1a2b3c4d-9a8b7c6d5e4f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); expect(main()).toEqual(undefined); expect(engine.findData(valueDefs[0])).toEqual('1\n2\n3'); expect(engine.findData(valueDefs[1])).toEqual('true'); assertSelect(valueDefs[5], ['4', '5']); assertSelect(valueDefs[6], ['false', 'true']); }); /** * 成功 - 列の値が空 (undefined のはずだが、null や空配列でもテスト)、保存先が選択型以外の場合 * 1. undefined to STRING_TEXTFIELD * 2. null to STRING_TEXTFIELD * 3. [] to STRING_TEXTFIELD * 4. undefined to DECIMAL * 5. null to DECIMAL * 6. undefined to DATETIME * 7. null to DATE */ test('Succeed - column value is blank, save to STRING, DECIMAL, DATETIME, or DATE', () => { const siteUrl = 'https://test.sharepoint.com/sites/SalesDepartment'; const listTitle = '共有リスト 2'; const listItemId = '10'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const columnNames = [ 'Column1', 'Column2', 'Column3', 'Column4', 'Column5', 'Column6', 'Column7' ]; const columnDefTypes = [ 'STRING_TEXTFIELD', 'STRING_TEXTFIELD', 'STRING_TEXTFIELD', 'DECIMAL', 'DECIMAL', 'DATETIME', 'DATE' ]; const columnValues = [ undefined, null, [], undefined, null, undefined, null ]; const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test.sharepoint.com,9876abcd-5e6f-7g8h-9i0j,1a2b3c4d-9a8b7c6d5e4f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); expect(main()).toEqual(undefined); expect(engine.findData(valueDefs[0])).toEqual(null); expect(engine.findData(valueDefs[1])).toEqual(null); expect(engine.findData(valueDefs[2])).toEqual(''); expect(engine.findData(valueDefs[3])).toEqual(null); expect(engine.findData(valueDefs[4])).toEqual(null); expect(engine.findData(valueDefs[5])).toEqual(null); expect(engine.findData(valueDefs[6])).toEqual(null); }); /** * 成功 - 列の値が空 (undefined のはずだが、null や空配列でもテスト)、保存先が選択型の場合 * 1. undefined to SELECT_SINGLE * 2. null to SELECT_SINGLE * 3. [] to SELECT_SINGLE * 4. 設定なし * 5. 設定なし * 6. 設定なし * 7. 設定なし */ test('Succeed - column value is blank, save to SELECT', () => { const siteUrl = 'https://test.sharepoint.com/sites/SalesDepartment'; const listTitle = '共有リスト 2'; const listItemId = '10'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const columnNames = [ 'Column1', 'Column2', 'Column3', '', '', '', '' ]; const columnDefTypes = [ 'SELECT_SINGLE', 'SELECT_SINGLE', 'SELECT_SINGLE', '', '', '', '' ]; const columnValues = [ undefined, null, [], '', '', '', '' ]; const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test.sharepoint.com,9876abcd-5e6f-7g8h-9i0j,1a2b3c4d-9a8b7c6d5e4f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); expect(main()).toEqual(undefined); assertSelect(valueDefs[0], null); assertSelect(valueDefs[1], null); assertSelect(valueDefs[2], []); }); /** * 列を一つだけ指定する場合の設定値を準備 * @param i 列のインデックス * @param columnName * @param columnDefType * @param columnValue */ const prepareOneColumn = (i, columnName, columnDefType, columnValue) => { const columnNames = JSON.parse(JSON.stringify(BLANKS)); // ディープコピー columnNames[i] = columnName; const columnDefTypes = JSON.parse(JSON.stringify(BLANKS)); // ディープコピー columnDefTypes[i] = columnDefType; const columnValues = JSON.parse(JSON.stringify(BLANKS)); // ディープコピー columnValues[i] = columnValue; return { columnNames, columnDefTypes, columnValues }; } const SAMPLE_HYPERLINK_VALUE = { Url: 'https://www.questetra.com', Description: 'Questetra BPM Suite' }; const SAMPLE_LOOKUP_ARRAY = [ { LookupId: 100, LookupValue: '商品 100' }, { LookupId: 101, LookupValue: '商品 101' } ]; const SAMPLE_USER_ARRAY = [ { LookupId: 1, LookupValue: 'User 1', Email: 'user1@test.onmicrosoft.com' }, { LookupId: 2, LookupValue: 'User 2', Email: 'user2@test.onmicrosoft.com' }, { LookupId: 3, LookupValue: 'User 3', Email: 'user2@test.onmicrosoft.com' } ]; /** * オブジェクトを STRING に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Object to STRING', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(1, 'Hyperlink', 'STRING_TEXTFIELD', SAMPLE_HYPERLINK_VALUE); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Hyperlink' cannot be saved to Text type data item. Failed to convert an object to a string."); }); /** * オブジェクトの配列を STRING に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Array of Object to STRING', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(2, 'Unexpected', 'STRING_TEXTAREA', SAMPLE_LOOKUP_ARRAY); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Unexpected' cannot be saved to Text type data item. Failed to convert an object to a string."); }); /** * オブジェクトを SELECT に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Object to SELECT', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(1, 'Hyperlink', 'SELECT_SINGLE', SAMPLE_HYPERLINK_VALUE); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Hyperlink' cannot be saved to Select type data item. Failed to convert an object to a string."); }); /** * オブジェクトの配列を SELECT に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Array of Object to SELECT', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(2, 'Unexpected', 'SELECT_SINGLE', SAMPLE_USER_ARRAY); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Unexpected' cannot be saved to Select type data item. Failed to convert an object to a string."); }); /** * boolean を DECIMAL に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Boolean to DECIMAL', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(3, 'YesOrNo', 'DECIMAL', true); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'YesOrNo' cannot be saved to Numeric type data item. The returned value is neither a string nor a number."); }); /** * 配列を DECIMAL に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Array to DECIMAL', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(4, 'Choice', 'DECIMAL', [1, 2, 3]); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Choice' cannot be saved to Numeric type data item. The returned value is neither a string nor a number."); }); /** * オブジェクトを DECIMAL に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Object to DECIMAL', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(5, 'Hyperlink', 'DECIMAL', SAMPLE_HYPERLINK_VALUE); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Hyperlink' cannot be saved to Numeric type data item. The returned value is neither a string nor a number."); }); /** * BigDecimal にパースできない文字列を DECIMAL に保存しようとした場合、エラー */ test('Column cannot be saved to data item - unexpected String to DECIMAL', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(6, 'Text', 'DECIMAL', '数値でない文字列'); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Text' cannot be saved to Numeric type data item. Failed to convert to BigDecimal."); }); /** * boolean(string 以外)を DATETIME に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Boolean to DATETIME', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(3, 'YesOrNo', 'DATETIME', true); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'YesOrNo' cannot be saved to Datetime type data item. The returned value is not a string."); }); /** * AdabbleTimestamp にパースできない文字列を DATETIME に保存しようとした場合、エラー */ test('Column cannot be saved to data item - unexpected String to DATETIME', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(1, 'Text2', 'DATETIME', '日時でない文字列'); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Text2' cannot be saved to Datetime type data item. The returned value is not a datetime-format string."); }); /** * number(string 以外)を DATE に保存しようとした場合、エラー */ test('Column cannot be saved to data item - Number to DATE', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(4, 'Number', 'DATE', 3); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Number' cannot be saved to Date type data item. The returned value is not a string."); }); /** * AdabbleTimestamp にパースできない文字列を DATE に保存しようとした場合、エラー */ test('Column cannot be saved to data item - unexpected String to DATE', () => { const siteUrl = 'https://test-my.sharepoint.com/personal/user_test_onmicrosoft_com'; const listTitle = 'リスト 1'; const listItemId = '1'; const listItemIdDef = preparelistItemIdStringDef(listItemId); const { columnNames, columnDefTypes, columnValues } = prepareOneColumn(2, 'Text3', 'DATE', '日時でない文字列'); const valueDefs = prepareConfigs(siteUrl, listTitle, listItemIdDef, columnNames, columnDefTypes); const siteId = 'test-my.sharepoint.com,1234abcd-5e6f-7g8h-9i0j,1a2b3c4d-1a2b3c4d5e6f'; prepareRequestHandler(siteUrl, siteId, listTitle, listItemId, columnNames, columnValues); assertError("Column 'Text3' cannot be saved to Date type data item. The returned value is not a datetime-format string."); }); ]]>