Files

238 lines
7.2 KiB
PHP
Raw Permalink Normal View History

2018-06-25 00:00:37 +02:00
<?php
class CommentConnectionQueriesTest extends \Codeception\TestCase\WPTestCase {
public $post_id;
public $current_time;
public $current_date;
public $current_date_gmt;
public $admin;
public $created_comment_ids;
public function setUp() {
// before
parent::setUp();
$this->post_id = $this->factory->post->create();
$this->current_time = strtotime( '- 1 day' );
$this->current_date = date( 'Y-m-d H:i:s', $this->current_time );
$this->current_date_gmt = gmdate( 'Y-m-d H:i:s', $this->current_time );
$this->admin = $this->factory()->user->create( [
'role' => 'administrator',
] );
$this->created_comment_ids = $this->create_comments();
}
public function tearDown() {
// then
parent::tearDown();
}
public function createCommentObject( $args = [] ) {
/**
* Set up the $defaults
*/
$defaults = [
'comment_author' => $this->admin,
'comment_content' => 'Test comment content',
'comment_approved' => 1,
];
/**
* Combine the defaults with the $args that were
* passed through
*/
$args = array_merge( $defaults, $args );
/**
* Create the page
*/
$comment_id = $this->factory->comment->create( $args );
/**
* Return the $id of the comment_object that was created
*/
return $comment_id;
}
/**
* Creates several comments (with different timestamps) for use in cursor query tests
*
* @return array
*/
public function create_comments() {
// Create 20 comments
$created_comments = [];
for ( $i = 1; $i <= 20; $i ++ ) {
$date = date( 'Y-m-d H:i:s', strtotime( "-1 day +{$i} minutes" ) );
$created_comments[ $i ] = $this->createCommentObject( [
'comment_content' => $i,
'comment_date' => $date,
] );
}
return $created_comments;
}
public function commentsQuery( $variables ) {
$query = 'query commentsQuery($first:Int $last:Int $after:String $before:String $where:RootCommentsCommentArgs){
comments( first:$first last:$last after:$after before:$before where:$where ) {
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
edges {
cursor
node {
id
commentId
content
date
}
}
nodes {
commentId
}
}
}';
return do_graphql_request( $query, 'commentsQuery', $variables );
}
public function testFirstComment() {
$variables = [
'first' => 1,
];
$results = $this->commentsQuery( $variables );
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( [
'comment_status' => 'approved',
'number' => 1,
'order' => 'DESC',
'orderby' => 'comment_date',
'comment_parent' => 0,
] );
$first_comment = $comments[0];
$expected_cursor = \GraphQLRelay\Connection\ArrayConnection::offsetToCursor( $first_comment->comment_ID );
$this->assertNotEmpty( $results );
$this->assertEquals( 1, count( $results['data']['comments']['edges'] ) );
$this->assertEquals( $first_comment->comment_ID, $results['data']['comments']['edges'][0]['node']['commentId'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['edges'][0]['cursor'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['pageInfo']['startCursor'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['pageInfo']['endCursor'] );
$this->assertEquals( $first_comment->comment_ID, $results['data']['comments']['nodes'][0]['commentId'] );
}
public function testForwardPagination() {
/**
* Create the cursor for the comment with the oldest comment_date
*/
$first_comment_cursor = \GraphQLRelay\Connection\ArrayConnection::offsetToCursor( $this->created_comment_ids[20] );
/**
* Set the variables to use in the GraphQL Query
*/
$variables = [
'first' => 1,
'after' => $first_comment_cursor,
];
/**
* Run the GraphQL Query
*/
$results = $this->commentsQuery( $variables );
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( [
'comment_status' => 'approved',
'number' => 1,
'offset' => 1,
'order' => 'DESC',
'orderby' => 'comment_date',
'comment_parent' => 0,
] );
$second_comment = $comments[0];
$expected_cursor = \GraphQLRelay\Connection\ArrayConnection::offsetToCursor( $second_comment->comment_ID );
$this->assertNotEmpty( $results );
$this->assertEquals( 1, count( $results['data']['comments']['edges'] ) );
$this->assertEquals( $second_comment->comment_ID, $results['data']['comments']['edges'][0]['node']['commentId'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['edges'][0]['cursor'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['pageInfo']['startCursor'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['pageInfo']['endCursor'] );
}
public function testLastComment() {
$variables = [
'last' => 1,
];
$results = $this->commentsQuery( $variables );
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( [
'comment_status' => 'approved',
'number' => 1,
'order' => 'ASC',
'orderby' => 'comment_date',
'comment_parent' => 0,
] );
$last_comment = $comments[0];
$expected_cursor = \GraphQLRelay\Connection\ArrayConnection::offsetToCursor( $last_comment->comment_ID );
$this->assertNotEmpty( $results );
$this->assertEquals( 1, count( $results['data']['comments']['edges'] ) );
$this->assertEquals( $last_comment->comment_ID, $results['data']['comments']['edges'][0]['node']['commentId'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['edges'][0]['cursor'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['pageInfo']['startCursor'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['pageInfo']['endCursor'] );
}
public function testBackwardPagination() {
/**
* Create the cursor for the comment with the newest comment_date
*/
$last_comment_cursor = \GraphQLRelay\Connection\ArrayConnection::offsetToCursor( $this->created_comment_ids[1] );
$variables = [
'last' => 1,
'before' => $last_comment_cursor,
];
$results = $this->commentsQuery( $variables );
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( [
'comment_status' => 'approved',
'number' => 1,
'offset' => 1,
'order' => 'ASC',
'orderby' => 'comment_date',
'comment_parent' => 0,
] );
$second_to_last_comment = $comments[0];
$expected_cursor = \GraphQLRelay\Connection\ArrayConnection::offsetToCursor( $second_to_last_comment->comment_ID );
$this->assertNotEmpty( $results );
$this->assertEquals( 1, count( $results['data']['comments']['edges'] ) );
$this->assertEquals( $second_to_last_comment->comment_ID, $results['data']['comments']['edges'][0]['node']['commentId'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['edges'][0]['cursor'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['pageInfo']['startCursor'] );
$this->assertEquals( $expected_cursor, $results['data']['comments']['pageInfo']['endCursor'] );
}
}