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