From c94faa619d2267fda2360af46f1ad927b77fb000 Mon Sep 17 00:00:00 2001 From: weryques Date: Wed, 21 Feb 2018 12:06:11 -0300 Subject: [PATCH] Test meta query and date query --- src/api/class-tainacan-rest-controller.php | 110 ++++++++++++--------- tests/test-api-collections.php | 4 +- tests/test-api-queries.php | 51 +++++++++- 3 files changed, 112 insertions(+), 53 deletions(-) diff --git a/src/api/class-tainacan-rest-controller.php b/src/api/class-tainacan-rest-controller.php index f9e17678e..50b541892 100644 --- a/src/api/class-tainacan-rest-controller.php +++ b/src/api/class-tainacan-rest-controller.php @@ -74,23 +74,26 @@ class TAINACAN_REST_Controller extends WP_REST_Controller { */ protected function prepare_filters($request){ $map = [ - 'name' => 'title', - 'title' => 'title', - 'id' => 'p', - 'pageid' => 'page_id', - 'authorid' => 'author_id', - 'authorname' => 'author_name', - 'search' => 's', - 'status' => 'post_status', - 'offset' => 'offset', - 'metaquery' => 'meta_query', - 'datequery' => 'date_query', - 'order' => 'order', - 'orderby' => 'orderby', - 'metakey' => 'meta_key', - 'hideempty' => 'hide_empty', - 'perpage' => 'posts_per_page', - 'paged' => 'paged' + 'name' => 'title', + 'title' => 'title', + 'id' => 'p', + 'pageid' => 'page_id', + 'authorid' => 'author_id', + 'authorname' => 'author_name', + 'search' => 's', + 'status' => 'post_status', + 'offset' => 'offset', + 'metaquery' => 'meta_query', + 'datequery' => 'date_query', + 'order' => 'order', + 'orderby' => 'orderby', + 'metakey' => 'meta_key', + 'metavalue' => 'meta_value', + 'metavaluenum' => 'meta_value_num', + 'metacompare' => 'meta_compare', + 'hideempty' => 'hide_empty', + 'perpage' => 'posts_per_page', + 'paged' => 'paged', ]; $meta_query = [ @@ -98,16 +101,22 @@ class TAINACAN_REST_Controller extends WP_REST_Controller { 'value' => 'value', 'compare' => 'compare', 'relation' => 'relation', + 'type' => 'type', ]; $date_query = [ - 'year' => 'year', - 'month' => 'month', - 'day' => 'day', - 'week' => 'week', - 'hour' => 'hour', - 'minute' => 'minute', - 'second' => 'second' + 'year' => 'year', + 'month' => 'month', + 'day' => 'day', + 'week' => 'week', + 'hour' => 'hour', + 'minute' => 'minute', + 'second' => 'second', + 'compare' => 'compare', + 'dayofweek' => 'dayofweek', + 'inclusive' => 'inclusive', + 'before' => 'before', + 'after' => 'after', ]; $args = []; @@ -115,31 +124,11 @@ class TAINACAN_REST_Controller extends WP_REST_Controller { foreach ($map as $mapped => $mapped_v){ if(isset($request[$mapped])){ if($mapped === 'metaquery'){ - $request_meta_query = $request[$mapped]; - - // If is a multidimensional array (array of array) - if($this->contains_array($request_meta_query)) { - - foreach ( $request_meta_query as $index1 => $a ) { - foreach ( $meta_query as $mapped_meta => $meta_v ) { - if ( isset( $a[ $meta_v ] ) ) { - $args[ $mapped_v ][ $index1 ][ $meta_v ] = $request[ $mapped ][ $index1 ][ $meta_v ]; - } - } - } - } else { - foreach ( $meta_query as $mapped_meta => $meta_v ) { - if(isset($request[$mapped][$meta_v])) { - $args[ $mapped_v ][ $meta_v ] = $request[ $mapped ][ $meta_v ]; - } - } - } - - } elseif ($mapped === 'datequery') { - foreach ($date_query as $date_meta => $date_v){ - $args[$mapped_v][$date_v] = $request[$mapped][$date_meta]; - } - } else { + $args = $this->prepare_meta($mapped, $request, $meta_query, $mapped_v, $args); + } elseif($mapped === 'datequery'){ + $args = $this->prepare_meta($mapped, $request, $date_query, $mapped_v, $args); + } + else { $args[ $mapped_v ] = $request[ $mapped ]; } } @@ -150,6 +139,29 @@ class TAINACAN_REST_Controller extends WP_REST_Controller { return $args; } + private function prepare_meta($mapped, $request, $query, $mapped_v, $args){ + $request_meta_query = $request[$mapped]; + + // If is a multidimensional array (array of array) + if($this->contains_array($request_meta_query)) { + foreach ( $request_meta_query as $index1 => $a ) { + foreach ( $query as $mapped_meta => $meta_v ) { + if ( isset( $a[ $meta_v ] ) ) { + $args[ $mapped_v ][ $index1 ][ $meta_v ] = $request[ $mapped ][ $index1 ][ $meta_v ]; + } + } + } + } else { + foreach ( $query as $mapped_meta => $meta_v ) { + if(isset($request[$mapped][$meta_v])) { + $args[ $mapped_v ][ $meta_v ] = $request[ $mapped ][ $meta_v ]; + } + } + } + + return $args; + } + protected function contains_array($array){ foreach ($array as $value){ if(is_array($value)){ diff --git a/tests/test-api-collections.php b/tests/test-api-collections.php index 4d02b8a41..92e1a55eb 100644 --- a/tests/test-api-collections.php +++ b/tests/test-api-collections.php @@ -90,8 +90,8 @@ class TAINACAN_REST_Collections_Controller extends TAINACAN_UnitApiTestCase { $other_collection = $data[0]; $one_collection = $data[1]; - $this->assertEquals('testeApi', $one_collection['name']); - $this->assertEquals('Other', $other_collection['name']); + $this->assertEquals('Other', $one_collection['name']); + $this->assertEquals('testeApi', $other_collection['name']); } public function test_delete_or_trash_a_collection(){ diff --git a/tests/test-api-queries.php b/tests/test-api-queries.php index b1f288e28..e3bcfb393 100644 --- a/tests/test-api-queries.php +++ b/tests/test-api-queries.php @@ -164,8 +164,10 @@ class TAINACAN_REST_Queries extends TAINACAN_UnitApiTestCase { /* Meta Query: - Fetch items from a collection desc ordered by fieldA1 and its only in range A to Y. - */ + * + * Fetch items from a collection desc ordered by fieldA1 and its only in range A to F. + * + * */ $meta_query = [ 'metakey' => $fieldA1->get_id(), @@ -188,6 +190,51 @@ class TAINACAN_REST_Queries extends TAINACAN_UnitApiTestCase { $data3 = $meta_query_response->get_data(); $this->assertCount(2, $data3); + + $values = [$data3[0]['metadata']['Field A-1']['value'], $data3[1]['metadata']['Field A-1']['value']]; + + $this->assertNotContains('G', $values); + + // E have to come first, because DESC + $this->assertEquals('E', $data3[0]['metadata']['Field A-1']['value']); + $this->assertEquals('D', $data3[1]['metadata']['Field A-1']['value']); + + + /* Date Query: + * + * Fetch posts for today + * + * */ + + $today = getdate(); + + $date_query = [ + 'datequery' => [ + [ + 'year' => $today['year'], + 'month' => $today['mon'], + 'day' => $today['mday'] + ] + ] + ]; + + $date_query_request_collections = new \WP_REST_Request('GET', $this->namespace . '/collections'); + $date_query_request_collections->set_query_params($date_query); + + $date_query_response_collections = $this->server->dispatch($date_query_request_collections); + $data4 = $date_query_response_collections->get_data(); + + $this->assertCount(3, $data4); + + // If we change the date query for a date different of today, it should return nothing + $date_query['datequery'][0]['year'] = 1995; + + $date_query_request_collections->set_query_params($date_query); + + $date_query_response_collections = $this->server->dispatch($date_query_request_collections); + $data5 = $date_query_response_collections->get_data(); + + $this->assertCount(0, $data5); } }