From b0cc43a1888932b6617eb1848f28a5b68dcecc84 Mon Sep 17 00:00:00 2001 From: vedanshujain Date: Wed, 6 Jan 2021 15:25:17 +0530 Subject: [PATCH] More for individual fields in responses for V2 and V3 products and orders endpoints. --- ...lass-wc-rest-orders-v2-controller-test.php | 102 ++++++++++++ ...lass-wc-rest-products-controller-tests.php | 148 ++++++++++++++++++ ...lass-wc-rest-products-controller-tests.php | 2 +- 3 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 tests/php/includes/rest-api/Controllers/Version2/class-wc-rest-products-controller-tests.php diff --git a/tests/php/includes/rest-api/Controllers/Version2/class-wc-rest-orders-v2-controller-test.php b/tests/php/includes/rest-api/Controllers/Version2/class-wc-rest-orders-v2-controller-test.php index ba3cebb7cf3..69fd9efca45 100644 --- a/tests/php/includes/rest-api/Controllers/Version2/class-wc-rest-orders-v2-controller-test.php +++ b/tests/php/includes/rest-api/Controllers/Version2/class-wc-rest-orders-v2-controller-test.php @@ -6,6 +6,108 @@ */ class WC_REST_Order_V2_Controller_Test extends WC_REST_Unit_Test_case { + /** + * Setup our test server, endpoints, and user info. + */ + public function setUp() { + parent::setUp(); + $this->endpoint = new WC_REST_Orders_V2_Controller(); + $this->user = $this->factory->user->create( + array( + 'role' => 'administrator', + ) + ); + } + + /** + * Get all expected fields. + */ + public function get_expected_response_fields() { + return array( + 'id', + 'parent_id', + 'number', + 'order_key', + 'created_via', + 'version', + 'status', + 'currency', + 'date_created', + 'date_created_gmt', + 'date_modified', + 'date_modified_gmt', + 'discount_total', + 'discount_tax', + 'shipping_total', + 'shipping_tax', + 'cart_tax', + 'total', + 'total_tax', + 'prices_include_tax', + 'customer_id', + 'customer_ip_address', + 'customer_user_agent', + 'customer_note', + 'billing', + 'shipping', + 'payment_method', + 'payment_method_title', + 'transaction_id', + 'date_paid', + 'date_paid_gmt', + 'date_completed', + 'date_completed_gmt', + 'cart_hash', + 'meta_data', + 'line_items', + 'tax_lines', + 'shipping_lines', + 'fee_lines', + 'coupon_lines', + 'currency_symbol', + 'refunds', + ); + } + + /** + * Test that all expected response fields are present. + * Note: This has fields hardcoded intentionally instead of fetching from schema to test for any bugs in schema result. Add new fields manually when added to schema. + */ + public function test_orders_api_get_all_fields_v2() { + wp_set_current_user( $this->user ); + $expected_response_fields = $this->get_expected_response_fields(); + + $order = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::create_order( $this->user ); + $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v2/orders/' . $order->get_id() ) ); + + $this->assertEquals( 200, $response->get_status() ); + + $response_fields = array_keys( $response->get_data() ); + + $this->assertEmpty( array_diff( $expected_response_fields, $response_fields ), 'These fields were expected but not present in API response: ' . print_r( array_diff( $expected_response_fields, $response_fields ), true ) ); + + $this->assertEmpty( array_diff( $response_fields, $expected_response_fields ), 'These fields were not expected in the API V2 response: ' . print_r( array_diff( $response_fields, $expected_response_fields ), true ) ); + } + + /** + * Test that all fields are returned when requested one by one. + */ + public function test_orders_get_each_field_one_by_one_v2() { + wp_set_current_user( $this->user ); + $expected_response_fields = $this->get_expected_response_fields(); + $order = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::create_order( $this->user ); + + foreach ( $expected_response_fields as $field ) { + $request = new WP_REST_Request( 'GET', '/wc/v2/orders/' . $order->get_id() ); + $request->set_param( '_fields', $field ); + $response = $this->server->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $response_fields = array_keys( $response->get_data() ); + + $this->assertContains( $field, $response_fields, "Field $field was expected but not present in order API V2 response." ); + } + } + /** * Test that `prepare_object_for_response` method works. */ diff --git a/tests/php/includes/rest-api/Controllers/Version2/class-wc-rest-products-controller-tests.php b/tests/php/includes/rest-api/Controllers/Version2/class-wc-rest-products-controller-tests.php new file mode 100644 index 00000000000..31460f3cc92 --- /dev/null +++ b/tests/php/includes/rest-api/Controllers/Version2/class-wc-rest-products-controller-tests.php @@ -0,0 +1,148 @@ +endpoint = new WC_REST_Products_V2_Controller(); + $this->user = $this->factory->user->create( + array( + 'role' => 'administrator', + ) + ); + } + + /** + * Get all expected fields. + */ + public function get_expected_response_fields() { + return array( + 'id', + 'name', + 'slug', + 'permalink', + 'date_created', + 'date_created_gmt', + 'date_modified', + 'date_modified_gmt', + 'type', + 'status', + 'featured', + 'catalog_visibility', + 'description', + 'short_description', + 'sku', + 'price', + 'regular_price', + 'sale_price', + 'date_on_sale_from', + 'date_on_sale_from_gmt', + 'date_on_sale_to', + 'date_on_sale_to_gmt', + 'price_html', + 'on_sale', + 'purchasable', + 'total_sales', + 'virtual', + 'downloadable', + 'downloads', + 'download_limit', + 'download_expiry', + 'external_url', + 'button_text', + 'tax_status', + 'tax_class', + 'manage_stock', + 'stock_quantity', + 'in_stock', + 'backorders', + 'backorders_allowed', + 'backordered', + 'sold_individually', + 'weight', + 'dimensions', + 'shipping_required', + 'shipping_taxable', + 'shipping_class', + 'shipping_class_id', + 'reviews_allowed', + 'average_rating', + 'rating_count', + 'related_ids', + 'upsell_ids', + 'cross_sell_ids', + 'parent_id', + 'purchase_note', + 'categories', + 'tags', + 'images', + 'attributes', + 'default_attributes', + 'variations', + 'grouped_products', + 'menu_order', + 'meta_data', + ); + } + + /** + * Test that all expected response fields are present. + * Note: This has fields hardcoded intentionally instead of fetching from schema to test for any bugs in schema result. Add new fields manually when added to schema. + */ + public function test_product_api_get_all_fields_v2() { + wp_set_current_user( $this->user ); + $expected_response_fields = $this->get_expected_response_fields(); + + $product = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\ProductHelper::create_simple_product(); + $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v2/products/' . $product->get_id() ) ); + + $this->assertEquals( 200, $response->get_status() ); + + $response_fields = array_keys( $response->get_data() ); + + $this->assertEmpty( array_diff( $expected_response_fields, $response_fields ), 'These fields were expected but not present in API V2 response: ' . print_r( array_diff( $expected_response_fields, $response_fields ), true ) ); + + $this->assertEmpty( array_diff( $response_fields, $expected_response_fields ), 'These fields were not expected in the API V2 response: ' . print_r( array_diff( $response_fields, $expected_response_fields ), true ) ); + } + + /** + * Test that `get_product_data` function works without silent `request` parameter as it used to. + * TODO: Fix the underlying design issue when DI gets available. + */ + public function test_get_product_data_should_work_without_request_param() { + $product = WC_Helper_Product::create_simple_product(); + $product->save(); + // Workaround to call protected method. + $call_product_data_wrapper = function () use ( $product ) { + return $this->get_product_data( $product ); + }; + $response = $call_product_data_wrapper->call( new WC_REST_Products_Controller() ); + $this->assertArrayHasKey( 'id', $response ); + } + + /** + * Test that all fields are returned when requested one by one. + */ + public function test_products_get_each_field_one_by_one_v2() { + wp_set_current_user( $this->user ); + $expected_response_fields = $this->get_expected_response_fields(); + $product = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\ProductHelper::create_simple_product(); + + foreach ( $expected_response_fields as $field ) { + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $product->get_id() ); + $request->set_param( '_fields', $field ); + $response = $this->server->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $response_fields = array_keys( $response->get_data() ); + + $this->assertContains( $field, $response_fields, "Field $field was expected but not present in product API V2 response." ); + } + } +} diff --git a/tests/php/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller-tests.php b/tests/php/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller-tests.php index d96fa3477b3..ebc6d0fdfdc 100644 --- a/tests/php/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller-tests.php +++ b/tests/php/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller-tests.php @@ -98,7 +98,7 @@ class WC_REST_Products_Controller_Tests extends WC_REST_Unit_Test_Case { */ public function test_product_api_get_all_fields() { wp_set_current_user( $this->user ); - $expected_response_fields = get_expected_response_fields(); + $expected_response_fields = $this->get_expected_response_fields(); $product = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\ProductHelper::create_simple_product(); $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/products/' . $product->get_id() ) );