2023-09-01 (C) Questetra, Inc. (MIT License) 3 2 This item gets Slack username and/or email address by Slack ID. この工程は、Slack ID から Slack ユーザ名やメールアドレスを取得します。 https://support.questetra.com/bpmn-icons/service-task-slack-username-get/ https://support.questetra.com/ja/bpmn-icons/service-task-slack-username-get/ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABFBJREFUWEfN l39ME2cYx79vofwSEljXirCwLWOSYJRotjgnJDPZWNKjg4BYpDgnCCuYKCxmxLUu7pcJZupitmqY XTfFLRnaqeXqYibbXExIdNQ/tj+WLMvCEjPoGGABxULf5b3Sy7W9a0+zhd0f/aP3Ps/zeZ/fR7DE D1Fr31RgygrNh2pBsYmCrAXoYwDyFuUnAPI7AfWB4FtNqsbtueWZVaM7KYBRb8wnIN0UsALIUKMU wF0CnKCgPV6/989EMgkBjIYqKyh9H8AylYZjj82AkL3esYETSvKKANzDnIMStD+g4SgxQnGc/4vv kNMlC2A0cJ+DYuu/YVzUQfCFd4xvjNUZB6Dm5kUlRRj5ZUTUlZOXA41Gg6nxqYTMcp6IAliM+XEl LcyQa9iFzGUZmJ6cxrbVL6PhNTO2dG4BIQS8i4ejW1E8rJaQdmlOiAAs2wHya6KEaznQjNqOWpHv 1MFTgvGMrHBxzAfnUV1YkyxyMwAtjlSHCMDpuaMU6EwkXVZRhoPn3hOPeD+7hBctlUhJTRH/4wxV yQBAgA94P98lOIT9sCazEAyNq6lzBtHR0460jDSc+9CNtndb7xuA9YkUrUbHmpUAwBm4JkpxOha9 4PEVaHmrBfmP5ke9unc3CM9JDwb7B3Hx1oU4gFXrS9HU3YShr4dwofeirEcIwTZ+jO8LA+g5JwWa Y0/2/XQaeYZIt43Xs+eFThy5dDgKwLyyAWd+7kOqNlUQ6GnrwdXzP8QJE+AT3s+3CABGfdUwQNfG nhoY9QjZrfSwJDR3mZGemS4cCd4Lwv2RW/gv8jAvHd51REYF8Xn9A+sWAbi/JYNFPGz71IZnjRtk 7c/dmYOl1ILttu0w7TQJZxyvO6B/RI/63fViVbRteBWjI6NyOia8fv6hCABVumVxWTHWbFyNhfkF TI3fDt90LohrA9dEEZYrLFSjf4xBl6/DqmdKMTt9B5fPXEZoIaToQa+fD/vXqOdkAXbsfwV1u+pA NERwr/nJBnw81AvdCp1wq53rW4XbN7+5Q4y51NqkfxLW8nYEJgKyEFIA2RBIM1wuvr32XjTubUR2 brbiLRN0R2kI5JPw7G/9yMzOFJT7vvdh5vYsyk0bRWOsEZWVr0HhE4WKAM4DTrgdXyVOQqUyfPr5 p9D6TisCkwHYN9vReawrDsD1tgs21xsoWVcSZYTlzPB3PhyyHgINxUc4qgyVGlEs9j7nvjiAXH0u snKy8OOVGwo3lXdOVCNS24rlAKSz4ObVm7BttiuGQ/IiuhWzF2qG0Z6ju1FpqRT19B/rR421Bto0 rfAfc/tLBdVJAeKGUbgUk4/j5UXL4bx+UuiOLK6NpRZhMFVUV4iJaq/fnwxAfhwLEOElNOFGwUpu U91zuPLlIGYD4c2bTci0dC2uf3MjmXHlhSQiqWYlS25FIfFkltP/31L6X3jivtfyCMSSfpiIEEv5 aSZNpSX7OH3QjFcr9w829dcwn81r2gAAAABJRU5ErkJggg== { // 認証設定を準備 const auth = httpClient.createAuthSettingToken('Slack Bot Token', 'slack-bot-token-12345'); configs.putObject('conf_Token', auth); // 文字型データ項目を準備して、config に指定 const slackUserIdDef = engine.createDataDefinition('ユーザ ID', 1, 'q_userId', 'STRING_TEXTFIELD'); engine.setData(slackUserIdDef, slackUserId); configs.putObject('conf_SlackUserId', slackUserIdDef); const userNameDef = engine.createDataDefinition('ユーザ名', 2, 'q_userName', 'STRING_TEXTFIELD'); engine.setData(userNameDef, '事前文字列'); configs.putObject('conf_UserName', userNameDef); const emailDef = engine.createDataDefinition('メールアドレス', 3, 'q_mailAddress', 'STRING_TEXTFIELD'); engine.setData(emailDef, '事前文字列'); configs.putObject('conf_Quser', emailDef); return { userNameDef, emailDef }; }; /** * 異常系のテスト * @param func * @param errorMsg */ const assertError = (func, errorMsg) => { try { func(); fail(); } catch (e) { expect(e.toString()).toEqual(errorMsg); } }; /** * ユーザ ID が空 */ test('Slack User ID is blank', () => { prepareConfigs(null); assertError(main, 'Slack User ID is blank.'); }); /** * 保存先データ項目がいずれも未設定 */ test('No data item to save the result is set', () => { prepareConfigs('U12345678'); configs.put('conf_UserName', ''); configs.put('conf_Quser', ''); assertError(main, 'No data item to save the result is set.'); }); /** * ユーザ情報取得の API リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param slackUserId */ const assertRequest = ({ url, method }, slackUserId) => { expect(url).toEqual(`https://slack.com/api/users.info?user=${slackUserId}`); expect(method).toEqual('GET'); }; /** * API リクエストに失敗 - レスポンスが JSON でない */ test('Failed to parse response as json', () => { prepareConfigs('U12345678'); httpClient.setRequestHandler((request) => { assertRequest(request, 'U12345678'); return httpClient.createHttpResponse(403, 'text/plain', 'Forbidden.'); }); assertError(main, 'Failed to get user info. status: 403'); }); /** * API リクエストに失敗 - レスポンスが ok でない */ test('Response is not ok', () => { prepareConfigs('U12345678'); httpClient.setRequestHandler((request) => { assertRequest(request, 'U12345678'); const errorResponse = { ok: false, error: 'missing_scope' }; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(errorResponse)); }); assertError(main, 'Response is not ok. error: missing_scope'); }); /** * 成功 * メールアドレスを文字型データ項目に保存 */ test('Success - Email Address is saved to String type data item', () => { const { userNameDef, emailDef } = prepareConfigs('U12345678'); httpClient.setRequestHandler((request) => { assertRequest(request, 'U12345678'); const response = { ok: true, user: { profile: { email: 'user1@example.com', real_name: 'User 1' } } }; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(response)); }); expect(main()).toEqual(undefined); expect(engine.findData(userNameDef)).toEqual('User 1'); expect(engine.findData(emailDef)).toEqual('user1@example.com'); }); /** * スコープの不足により、メールアドレスの取得に失敗 */ test('Failed to get Email Address', () => { prepareConfigs('U12345678'); httpClient.setRequestHandler((request) => { assertRequest(request, 'U12345678'); const response = { // リクエスト自体には成功するが、メールアドレスのフィールドがレスポンスに含まれない ok: true, user: { profile: { real_name: 'User 1' } } }; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(response)); }); assertError(main, 'Failed to get Email Address. Scope users:read.email is required.'); }); /** * 成功 * メールアドレスを保存しない場合 */ test('Success - Email Address is not saved', () => { const { userNameDef, emailDef } = prepareConfigs('U24680'); configs.put('conf_Quser', ''); // メールアドレスを保存するデータ項目の選択を解除 httpClient.setRequestHandler((request) => { assertRequest(request, 'U24680'); // メールアドレスを保存しない場合は、メールアドレスがレスポンスに含まれなくてもエラーにならない const response = { ok: true, user: { profile: { real_name: 'User 2' } } }; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(response)); }); expect(main()).toEqual(undefined); expect(engine.findData(userNameDef)).toEqual('User 2'); expect(engine.findData(emailDef)).toEqual('事前文字列'); }); /** * 成功 * ユーザ名を保存しない * メールアドレスをユーザ型データ項目に保存 */ test('Success - Email Address is saved to Quser type data item', () => { const { userNameDef, emailDef } = prepareConfigs('U12345678'); configs.put('conf_UserName', ''); // ユーザ名を保存するデータ項目の選択を解除 const quserDef = engine.createDataDefinition('Questetra ユーザ', 4, 'q_user', 'QUSER'); configs.putObject('conf_Quser', quserDef); engine.createQuser(1, 'ユーザ 1', 'user1@example.com'); // 対象のユーザを作成しておく httpClient.setRequestHandler((request) => { assertRequest(request, 'U12345678'); const response = { ok: true, user: { profile: { email: 'user1@example.com', real_name: 'User 1' } } }; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(response)); }); expect(main()).toEqual(undefined); expect(engine.findData(userNameDef)).toEqual('事前文字列'); expect(engine.findData(emailDef)).toEqual('事前文字列'); const quser = engine.findData(quserDef); expect(quser.getEmail()).toEqual('user1@example.com'); expect(quser.getName()).toEqual('ユーザ 1'); }); /** * メールアドレスが一致するQuestetra ユーザが存在しない場合 */ test('Questetra User not found', () => { const { userNameDef, emailDef } = prepareConfigs('U12345678'); const quserDef = engine.createDataDefinition('Questetra ユーザ', 4, 'q_user', 'QUSER'); configs.putObject('conf_Quser', quserDef); httpClient.setRequestHandler((request) => { assertRequest(request, 'U12345678'); const response = { ok: true, user: { profile: { email: 'user1@example.com', real_name: 'User 1' } } }; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(response)); }); assertError(main, 'Questetra User not found. email: user1@example.com'); }); ]]>