2024-08-29
(C) Questetra, Inc. (MIT License)
3
2
This item moves cards to a specified list on Trello.
この工程は、Trello のカードを指定したリストに移動します。
https://support.questetra.com/bpmn-icons/service-task-trello-card-move/
https://support.questetra.com/ja/bpmn-icons/service-task-trello-card-move/
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAzBJREFUWEfF
l11IFFEUx/93xnH9iPzow0jBaIOsSNJWI+glX6KHJLcvkiKwF7WXolJ76iWiSLBeUortoSSLcDfp
pZfwJXrQVV8MIsNEjFbwI5T1e/bGndnZnRlnZ8ZZau/b3HvuOb97zrnnniFI8SC27Z8KZoGPeMHz
x0FpGSh2gSBP2k8xC4IxEDIEUeyFyPnxwbNgR7c1wLm+HRBJM0DqAWTYUQpgCaAd4OlDvKsMme0x
B6gJ1oOgFUC2TcN6sTAobiHg6Ui0PzGAN/gUQINDw/pt7fB7Go10GQPU9L8GIRfZhgyBQ3qadaSM
lM8tivFpSrsQqKjVy63XHD15aXEmAs1u7C5wOXbCyhqF79MUGp+NKzrWeUILIMe8nUl/uV+Co3ud
hl7L7G4cxujksjxJ0aDOiTiAlO3cDyXhlt6UwyU4c73eZQ8CIdzp/KVMh8FH9ii3I27B298GkOuK
1PLbck3s5xdF/AnLMXUJHLbnpMXsrIoUodlV6ZvjCHbmCSAq9taeSdx+OaHioo/hr7jBJmQxVmQE
TKvvuRogQgH+7IDmYCFfKQpyBWmutu0nuj7PxNZ914pRV7U19r0eAEtYxRZWrGSA032XwHGv1BbU
ACyZXBcGNQBjHQdRvC1dmjt5bwQfh+biBq8U4WZ1gRkAEIlcxvvKThngzIAPlNb9VwBCXqD78FUZ
wBtkxyv7rwDAEPyechmgJjgTe1iiFP88BOwBC3jyFQ9QTYABbASAZThLNGX0tLhRXZFrngNs1e+J
XhZvMCkApovdFDbYidRXkM0Z3AJZOAaQZAj03tN/GwLoQpBUEjoC0CShxTVcEymE89o6MPG8FIX5
ciGyGoYe0FxDi0LEDIxPrWB6fk2ylZnOoaTQbnOUIAc0hciiFFud0GrduhRLxcj8MbIyYrb+qGcS
TaaPEdute46/PjmA/UX23WwGcKTlG/pGwopIgueYLasakhOHNqO7yY1sF5fM4dE7PI+qu9/jOhI2
JIqIrhk9tm8TcrJ4RxCDowv4He0TogosWjLFjKopdWTZaJPtpjSBJ5IE2WBbHvNEKn9MFIiU/pqp
/Z6yn9Mkg2+1/S+COKkwjkUALAAAAABJRU5ErkJggg==
{
const authKey = httpClient.createAuthSettingToken(
'Trello',
'TrelloApiKey',
);
configs.putObject('conf_ApiKey', authKey);
const authToken = httpClient.createAuthSettingToken(
'Trello',
'TrelloApiToken',
);
configs.putObject('conf_ApiToken', authToken);
const cardIdsDef = engine.createDataDefinition('カード IDs', 3, 'q_CardIds', 'STRING_TEXTAREA');
configs.putObject('conf_CardIds', cardIdsDef);
engine.setData(cardIdsDef, cardIds);
const listIdDef = engine.createDataDefinition('リスト ID', 4, 'q_ListId', 'STRING_TEXTFIELD');
configs.putObject('conf_ListId', listIdDef);
engine.setData(listIdDef, listId);
};
/**
* 設定の準備 C3: カード ID は単一行を指定
* リスト ID は選択型データ項目で指定
* @param cardId
*/
const prepareSingleLineAndSelectConfigs = (cardId, listId) => {
const authKey = httpClient.createAuthSettingToken(
'Trello',
'TrelloApiKey',
);
configs.putObject('conf_ApiKey', authKey);
const authToken = httpClient.createAuthSettingToken(
'Trello',
'TrelloApiToken',
);
configs.putObject('conf_ApiToken', authToken);
const cardIdsDef = engine.createDataDefinition('カード ID', 3, 'q_CardId', 'STRING_TEXTFIELD');
configs.putObject('conf_CardIds', cardIdsDef);
engine.setData(cardIdsDef, cardId);
const listIdDef = engine.createDataDefinition('リスト ID', 4, 'q_ListId', 'SELECT_SINGLE');
const select = new java.util.ArrayList();
const item = engine.createItem(listId, `${listId} を選択`);
select.add(item);
configs.putObject('conf_ListId', listIdDef);
engine.setData(listIdDef, select);
};
/**
* 異常系のテスト
* @param func
* @param errorMsg
*/
const assertError = (func, errorMsg) => {
let failed = false;
try {
func();
} catch (e) {
failed = true;
expect(e.message).toEqual(errorMsg);
}
if (!failed) {
fail('No error was thrown.');
}
};
/**
* カード ID が改行のみ
* カード ID 複数行を指定
* リスト ID 文字型を指定
*/
test("Failed - Card ID is Empty lines only", () => {
prepareConfigs('\n\n\n', 'L123ABC');
assertError(main, "Card IDs aren't set.");
});
/**
* カード ID が空
* カード ID 単一行を指定
* リスト ID 選択型を指定
*/
test("Failed - Card ID is Empty line", () => {
prepareSingleLineAndSelectConfigs('', 'L456ABC');
assertError(main, "Card IDs aren't set.");
});
/**
* リスト ID が空
* カード ID 複数行を指定
* リスト ID 文字型を指定
*/
test("Failed - List ID is not set", () => {
prepareConfigs('C123ABC', null);
assertError(main, "List ID is blank.");
});
/**
* リスト ID が未選択
* カード ID 単一行を指定
* リスト ID 選択型を指定
*/
test("Failed - List ID is not selected", () => {
prepareConfigs('C456ABC', 'Ltemp');
// 選択型データ項目を準備し、未選択のまま設定
const idDef = engine.createDataDefinition('リスト ID', 4, 'q_ListId', 'SELECT_SINGLE');
configs.putObject('conf_ListId', idDef);
assertError(main, "List ID is not selected.");
});
/**
* GET リクエスト のテスト
* @param url
* @param method
* @param cardId
* @param listId
*/
const assertGetRequest = ({ url, method }, cardId) => {
expect(url).toEqual(`https://api.trello.com/1/cards/${cardId}?key=TrelloApiKey&token=TrelloApiToken`);
expect(method).toEqual('GET');
};
/**
* PUT リクエスト のテスト
* @param url
* @param method
* @param cardId
* @param listId
*/
const assertPutRequest = ({ url, method }, cardId, listId) => {
expect(url).toEqual(`https://api.trello.com/1/cards/${cardId}?key=TrelloApiKey&token=TrelloApiToken&idList=${listId}`);
expect(method).toEqual('PUT');
};
/**
* Get リクエスト のレスポンスを準備
* @param cardID
* @param boolean
*/
const prepareGetResponse = (id, boolean) => {
const responseGetObj = {
"id": `${id}`,
"closed": boolean,
"idLabels": [
{
"id": `id${id}`,
"idBoard": `idBoard${id}`,
"name": "Overdue",
"color": "yellow"
}
],
"idList": `idList${id}`,
"idMembers": [
`idMembers${id}`
],
};
return responseGetObj;
};
/**
* GET リクエストで失敗 存在しないカード ID 、権限のないカード ID など
*/
test("GET Failed", () => {
prepareConfigs('Cqqqqq', 'LQQQQQ');
httpClient.setRequestHandler((request) => {
assertGetRequest(request, 'Cqqqqq');
return httpClient.createHttpResponse(404, "application/json", "{}");
});
assertError(main, 'Failed to get card information. Card ID: Cqqqqq, status: 404');
});
/**
* アーカイブ済のカード ID
*/
test("Failed - Archived - CardID", () => {
prepareConfigs('Caaaaa', 'LQQQQQ');
httpClient.setRequestHandler((request) => {
assertGetRequest(request, 'Caaaaa');
return httpClient.createHttpResponse(200, "application/json", JSON.stringify(prepareGetResponse('Caaaaa', true)));
});
assertError(main, 'Card ID: Caaaaa is archived.');
});
/**
* PUT リクエストで失敗
*/
test("PUT Failed", () => {
prepareConfigs('Cqqqqq', 'LQQQQQ');
let reqCount = 0;
httpClient.setRequestHandler((request) => {
if (reqCount === 0) {
assertGetRequest(request, 'Cqqqqq');
reqCount++;
return httpClient.createHttpResponse(200, "application/json", JSON.stringify(prepareGetResponse('Cqqqqq', false)));
}
assertPutRequest(request, 'Cqqqqq', 'LQQQQQ');
return httpClient.createHttpResponse(404, 'application/json', '{}');
});
assertError(main, 'Failed to move. Card ID: Cqqqqq, status: 404');
});
/**
* 成功 - 1 つのカード ID
* カード ID 単一行を指定
* リスト ID 選択型を指定
*/
test("Success - 1 cardID - singleline", () => {
prepareSingleLineAndSelectConfigs('C123ABC', 'L123ABC');
let reqCount = 0;
httpClient.setRequestHandler((request) => {
if (reqCount === 0) {
assertGetRequest(request, 'C123ABC');
reqCount++;
return httpClient.createHttpResponse(200, "application/json", JSON.stringify(prepareGetResponse('C123ABC', false)));
}
assertPutRequest(request, 'C123ABC', 'L123ABC');
return httpClient.createHttpResponse(200, 'application/json', '{}');
});
main();
});
/**
* 成功 - 1 つのカード ID
* カード ID 複数行を指定
* リスト ID 文字型を指定
*/
test("Success - 1 cardID", () => {
prepareConfigs('C456ABC', 'L456ABC');
let reqCount = 0;
httpClient.setRequestHandler((request) => {
if (reqCount === 0) {
assertGetRequest(request, 'C456ABC');
reqCount++;
return httpClient.createHttpResponse(200, "application/json", JSON.stringify(prepareGetResponse('C456ABC', false)));
}
assertPutRequest(request, 'C456ABC', 'L456ABC');
return httpClient.createHttpResponse(200, 'application/json', '{}');
});
main();
});
/**
* 成功 - リスト ID に固定値を指定
* カード ID 複数行を指定
*/
test('Success - ListId specified with fixed value ' , () => {
prepareConfigs('C123DEF', 'Ltemp');
//conf_ListId の設定値を固定値で上書き
configs.put('conf_ListId', 'L12345');
let reqCount = 0;
httpClient.setRequestHandler((request) => {
if (reqCount === 0) {
assertGetRequest(request, 'C123DEF');
reqCount++;
return httpClient.createHttpResponse(200, "application/json", JSON.stringify(prepareGetResponse('C123DEF', false)));
}
assertPutRequest(request, 'C123DEF', 'L12345');
return httpClient.createHttpResponse(200, 'application/json', '{}');
});
main();
});
/**
* 成功 - カード ID 先頭や、途中に空行がある 末尾に2行以上の改行がある
* カード ID 複数行を指定
* リスト ID 文字型を指定
*/
test("Success - Empty lines are set", () => {
prepareConfigs('\n123450\n\n123451\n\n\n\n', 'L456ABC');
let reqCount = 0;
let cardIndex = 0;
httpClient.setRequestHandler((request) => {
if (reqCount%2 === 0) {
assertGetRequest(request, `12345${cardIndex}`);
reqCount++;
return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(prepareGetResponse(`12345${cardIndex}`, false)));
}
assertPutRequest(request, `12345${cardIndex}`, 'L456ABC');
reqCount++;
cardIndex++;
return httpClient.createHttpResponse(200, 'application/json', '{}');
});
main();
expect(reqCount).toEqual(4);
});
/**
* 成功 - 複数のカード ID HTTP リクエスト数の上限
* カード ID 複数行を指定
* リスト ID 文字型を指定
*/
test('Succeed to multiple IDs', () => {
let ids = '';
for (let i = 0; i < httpClient.getRequestingLimit()/2; i++) {
ids += `ID${i}\n`;
}
prepareConfigs(ids, 'L456DEF');
let reqCount = 0;
let cardIndex = 0;
httpClient.setRequestHandler((request) => {
if (reqCount%2 === 0) {
assertGetRequest(request, `ID${cardIndex}`);
reqCount++;
return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(prepareGetResponse(`ID${cardIndex}`, false)));
}
assertPutRequest(request, `ID${cardIndex}`, 'L456DEF');
reqCount++;
cardIndex++;
return httpClient.createHttpResponse(200, 'application/json', '{}');
});
main();
expect(reqCount).toEqual(httpClient.getRequestingLimit());
});
/**
* 複数のカード ID HTTP リクエスト数の上限を超える
* カード ID 複数行を指定
* リスト ID 文字型を指定
*/
test('Failed - Number of Card IDs is over the limit', () => {
let ids = '';
for (let i = 0; i <= httpClient.getRequestingLimit()/2; i++) {
ids += `ID${i}\n`;
}
prepareConfigs(ids, 'L123ABC');
assertError(main, 'Number of Card IDs is over the limit.');
});
]]>