3
2
2023-11-14
(C) Questetra, Inc. (MIT License)
This item publishes a post in draft status on WordPress.com. When the publish datetime is not specified, the post will be immediately published.
この工程は、WordPress.com で作成済みの下書き状態の記事(投稿)を公開します。公開日時を指定しない場合、即座に公開されます。
https://support.questetra.com/bpmn-icons/service-task-wordpress-post-publish/
https://support.questetra.com/ja/bpmn-icons/service-task-wordpress-post-publish/
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
{
const oauth2 = httpClient.createAuthSettingOAuth2(
'WordPress.com',
'https://public-api.wordpress.com/oauth2/authorize',
'https://public-api.wordpress.com/oauth2/token',
'posts',
'client_id',
'client_secret',
'access_token'
);
configs.putObject('conf_Auth', oauth2);
configs.put('conf_Domain', domain);
const postIdDef = engine.createDataDefinition('投稿 ID', 1, 'q_postId', 'STRING_TEXTFIELD');
engine.setData(postIdDef, postId);
configs.putObject('conf_PostId', postIdDef);
};
/**
* 異常系のテスト
* @param func
* @param errorMsg
*/
const assertError = (func, errorMsg) => {
try {
func();
fail();
} catch (e) {
expect(e.toString()).toEqual(errorMsg);
}
};
/**
* 投稿 ID の値が空でエラー
*/
test('Post ID is blank', () => {
prepareConfigs('test1.example.com', null);
assertError(main, 'Post ID is blank.');
});
/**
* 投稿 ID の値に数字以外の文字が含まれていてエラー
*/
test('Post ID must be a non-negative integer', () => {
prepareConfigs('test1.example.com', '1-1');
assertError(main, 'Post ID must be a non-negative integer.');
});
/**
* 公開日時を設定する
* @param timestamp
*/
const setDate = (timestamp) => {
const dateDef = engine.createDataDefinition('公開日時', 2, 'q_date', 'DATETIME');
engine.setData(dateDef, timestamp);
configs.putObject('conf_Date', dateDef);
};
/**
* 公開日時が選択されているのに、値が空
*/
test('Publish Datetime is selected but its data is null', () => {
prepareConfigs('test1.example.com', '1');
setDate(null);
assertError(main, 'Publish Datetime is selected but its data is null.');
});
/**
* 記事取得の GET リクエストのテスト
* @param {Object} request
* @param request.url
* @param request.method
* @param request.headers
* @param domain
* @param postId
*/
const assertGetRequest = ({ url, method, headers }, domain, postId) => {
const expectedUrl = `https://public-api.wordpress.com/rest/${API_VERSION}/sites/${encodeURIComponent(domain)}/posts/${postId}`
+ `?fields=${encodeURIComponent('status')}`;
expect(url).toEqual(expectedUrl);
expect(method).toEqual('GET');
expect(headers['Authorization']).toEqual('Bearer access_token');
};
/**
* 記事取得の GET リクエストでエラー
*/
test('Fail in GET request', () => {
const domain = 'test1.example.com';
const postId = '1';
prepareConfigs(domain, postId);
httpClient.setRequestHandler((request) => {
assertGetRequest(request, domain, postId);
return httpClient.createHttpResponse(400, 'application/json', '{}');
});
assertError(main, 'Failed to get post. status: 400');
});
/**
* 記事が下書き状態でない場合はエラー
*/
test('The status of the post is not draft', () => {
const domain = 'test1.example.com';
const postId = '1';
prepareConfigs(domain, postId);
httpClient.setRequestHandler((request) => {
assertGetRequest(request, domain, postId);
return httpClient.createHttpResponse(200, 'application/json', '{"status": "publish"}');
});
assertError(main, 'The status of the post is not draft but publish.');
});
/**
* 記事公開の POST リクエストのテスト
* @param {Object} request
* @param request.url
* @param request.method
* @param request.headers
* @param request.contentType
* @param request.body
* @param domain
* @param postId
* @param date
*/
const assertPostRequest = ({ url, method, headers, contentType, body }, domain, postId, date) => {
const expectedUrl = `https://public-api.wordpress.com/rest/${API_VERSION}/sites/${encodeURIComponent(domain)}/posts/${postId}`
+ `?fields=${encodeURIComponent('URL,status,date')}`;
expect(url).toEqual(expectedUrl);
expect(method).toEqual('POST');
expect(headers['Authorization']).toEqual('Bearer access_token');
expect(contentType).startsWith('application/x-www-form-urlencoded');
expect(body).toEqual(`status=publish&date=${encodeURIComponent(date)}`);
};
/**
* 記事公開の POST リクエストでエラー
*/
test('Fail in POST request', () => {
const domain = 'test1.example.com';
const postId = '1';
prepareConfigs(domain, postId);
let reqCount = 0;
httpClient.setRequestHandler((request) => {
if (reqCount === 0) {
assertGetRequest(request, domain, postId);
reqCount++;
return httpClient.createHttpResponse(200, 'application/json', '{"status": "draft"}');
}
assertPostRequest(request, domain, postId, '');
return httpClient.createHttpResponse(400, 'application/json', '{}');
});
assertError(main, 'Failed to publish post. status: 400');
});
/**
* 成功 - 公開日時を指定せず、即時公開する場合
*/
test('Succeed - publish immediately', () => {
const domain = 'test1.example.com';
const postId = '1';
prepareConfigs(domain, postId);
let reqCount = 0;
httpClient.setRequestHandler((request) => {
if (reqCount === 0) {
assertGetRequest(request, domain, postId);
reqCount++;
return httpClient.createHttpResponse(200, 'application/json', '{"status": "draft"}');
}
assertPostRequest(request, domain, postId, '');
return httpClient.createHttpResponse(200, 'application/json', '{}'); // 実際には URL, status, date が返る
});
expect(main()).toEqual(undefined);
});
/**
* 成功 - 公開日時を指定する場合
*/
test('Succeed - publish at a specific datetime', () => {
const domain = 'test2.example.com';
const postId = '12';
prepareConfigs(domain, postId);
const timestamp = new com.questetra.bpms.util.AddableTimestamp().addDays(1);
setDate(timestamp);
let reqCount = 0;
httpClient.setRequestHandler((request) => {
if (reqCount === 0) {
assertGetRequest(request, domain, postId);
reqCount++;
return httpClient.createHttpResponse(200, 'application/json', '{"status": "draft"}');
}
assertPostRequest(request, domain, postId, dateFormatter.format(DATETIME_FORMAT, timestamp));
return httpClient.createHttpResponse(200, 'application/json', '{}'); // 実際には URL, status, date が返る
});
expect(main()).toEqual(undefined);
});
]]>