REST API: Fix multiple issues with setting dates of posts and comments.

This commit modifies the `rest_get_date_with_gmt` function to correctly parse local and UTC timestamps with or without timezone information.

It also ensures that the REST API can edit the dates of draft posts by setting the `edit_date` flag to `wp_update_post`.

Overall this commit ensures that post and comment dates can be set and updated as expected.

Fixes #39256.


git-svn-id: https://develop.svn.wordpress.org/trunk@40101 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
James Nylen
2017-02-21 18:17:32 +00:00
parent c31acbfe7e
commit 83d27ba447
5 changed files with 335 additions and 7 deletions

View File

@@ -960,6 +960,84 @@ class WP_Test_REST_Comments_Controller extends WP_Test_REST_Controller_Testcase
$this->assertEquals( self::$post_id, $data['post'] );
}
public function comment_dates_provider() {
return array(
'set date without timezone' => array(
'params' => array(
'timezone_string' => 'America/New_York',
'date' => '2016-12-12T14:00:00',
),
'results' => array(
'date' => '2016-12-12T14:00:00',
'date_gmt' => '2016-12-12T19:00:00',
),
),
'set date_gmt without timezone' => array(
'params' => array(
'timezone_string' => 'America/New_York',
'date_gmt' => '2016-12-12T19:00:00',
),
'results' => array(
'date' => '2016-12-12T14:00:00',
'date_gmt' => '2016-12-12T19:00:00',
),
),
'set date with timezone' => array(
'params' => array(
'timezone_string' => 'America/New_York',
'date' => '2016-12-12T18:00:00-01:00',
),
'results' => array(
'date' => '2016-12-12T14:00:00',
'date_gmt' => '2016-12-12T19:00:00',
),
),
'set date_gmt with timezone' => array(
'params' => array(
'timezone_string' => 'America/New_York',
'date_gmt' => '2016-12-12T18:00:00-01:00',
),
'results' => array(
'date' => '2016-12-12T14:00:00',
'date_gmt' => '2016-12-12T19:00:00',
),
),
);
}
/**
* @dataProvider comment_dates_provider
*/
public function test_create_comment_date( $params, $results ) {
wp_set_current_user( self::$admin_id );
update_option( 'timezone_string', $params['timezone_string'] );
$request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
$request->set_param( 'content', 'not empty' );
$request->set_param( 'post', self::$post_id );
if ( isset( $params['date'] ) ) {
$request->set_param( 'date', $params['date'] );
}
if ( isset( $params['date_gmt'] ) ) {
$request->set_param( 'date_gmt', $params['date_gmt'] );
}
$response = $this->server->dispatch( $request );
update_option( 'timezone_string', '' );
$this->assertEquals( 201, $response->get_status() );
$data = $response->get_data();
$comment = get_comment( $data['id'] );
$this->assertEquals( $results['date'], $data['date'] );
$comment_date = str_replace( 'T', ' ', $results['date'] );
$this->assertEquals( $comment_date, $comment->comment_date );
$this->assertEquals( $results['date_gmt'], $data['date_gmt'] );
$comment_date_gmt = str_replace( 'T', ' ', $results['date_gmt'] );
$this->assertEquals( $comment_date_gmt, $comment->comment_date_gmt );
}
public function test_create_item_using_accepted_content_raw_value() {
wp_set_current_user( self::$admin_id );
@@ -1970,6 +2048,39 @@ class WP_Test_REST_Comments_Controller extends WP_Test_REST_Controller_Testcase
$this->assertEquals( '2014-11-07T10:14:25', $comment['date'] );
}
/**
* @dataProvider comment_dates_provider
*/
public function test_update_comment_date( $params, $results ) {
wp_set_current_user( self::$editor_id );
update_option( 'timezone_string', $params['timezone_string'] );
$comment_id = $this->factory->comment->create();
$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', $comment_id ) );
if ( isset( $params['date'] ) ) {
$request->set_param( 'date', $params['date'] );
}
if ( isset( $params['date_gmt'] ) ) {
$request->set_param( 'date_gmt', $params['date_gmt'] );
}
$response = $this->server->dispatch( $request );
update_option( 'timezone_string', '' );
$this->assertEquals( 200, $response->get_status() );
$data = $response->get_data();
$comment = get_comment( $data['id'] );
$this->assertEquals( $results['date'], $data['date'] );
$comment_date = str_replace( 'T', ' ', $results['date'] );
$this->assertEquals( $comment_date, $comment->comment_date );
$this->assertEquals( $results['date_gmt'], $data['date_gmt'] );
$comment_date_gmt = str_replace( 'T', ' ', $results['date_gmt'] );
$this->assertEquals( $comment_date_gmt, $comment->comment_date_gmt );
}
public function test_update_item_no_content() {
$post_id = $this->factory->post->create();