diff --git a/plugins/woocommerce-admin/tests/api/reports-import.php b/plugins/woocommerce-admin/tests/api/reports-import.php new file mode 100644 index 00000000000..58d23843726 --- /dev/null +++ b/plugins/woocommerce-admin/tests/api/reports-import.php @@ -0,0 +1,153 @@ +user = $this->factory->user->create( + array( + 'role' => 'administrator', + ) + ); + } + + /** + * Test route registration. + */ + public function test_register_routes() { + $routes = $this->server->get_routes(); + + $this->assertArrayHasKey( $this->endpoint, $routes ); + } + + /** + * Asserts the report item schema is correct. + * + * @param array $schema Item to check schema. + */ + public function assert_report_item_schema( $schema ) { + $this->assertArrayHasKey( 'status', $schema ); + $this->assertArrayHasKey( 'message', $schema ); + } + + /** + * Test reports schema. + */ + public function test_reports_schema() { + wp_set_current_user( $this->user ); + + $request = new WP_REST_Request( 'OPTIONS', $this->endpoint ); + $response = $this->server->dispatch( $request ); + $data = $response->get_data(); + $properties = $data['schema']['properties']; + + $this->assertCount( 2, $properties ); + $this->assert_report_item_schema( $properties ); + } + + /** + * Test getting reports without valid permissions. + */ + public function test_get_reports_without_permission() { + wp_set_current_user( 0 ); + $response = $this->server->dispatch( new WP_REST_Request( 'POST', $this->endpoint ) ); + $this->assertEquals( 401, $response->get_status() ); + } + + /** + * Test the import paramaters. + */ + public function test_import_params() { + global $wpdb; + wp_set_current_user( $this->user ); + + // Populate all of the data. + $product = new WC_Product_Simple(); + $product->set_name( 'Test Product' ); + $product->set_regular_price( 25 ); + $product->save(); + + $order_1 = WC_Helper_Order::create_order( 1, $product ); + $order_1->set_status( 'completed' ); + $order_1->set_date_created( time() - ( 3 * DAY_IN_SECONDS ) ); + $order_1->save(); + $order_2 = WC_Helper_Order::create_order( 1, $product ); + $order_2->set_total( 100 ); + $order_2->set_status( 'completed' ); + $order_2->save(); + + // Delete order stats so we can test import API. + $wpdb->query( "DELETE FROM {$wpdb->posts} WHERE post_type = 'scheduled-action'" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}wc_order_stats" ); + + // Use the days param to only process orders in the last day. + $request = new WP_REST_Request( 'POST', $this->endpoint ); + $request->set_query_params( array( 'days' => '1' ) ); + $response = $this->server->dispatch( $request ); + $report = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( 'success', $report['status'] ); + + // Run pending twice to process batch and order. + WC_Helper_Queue::run_all_pending(); + WC_Helper_Queue::run_all_pending(); + + $request = new WP_REST_Request( 'GET', '/wc/v4/reports/orders' ); + $response = $this->server->dispatch( $request ); + $reports = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertCount( 1, $reports ); + $this->assertEquals( $order_2->get_id(), $reports[0]['order_id'] ); + + // Use the skip existing params to skip processing orders. + // Compare against order status to make sure previously imported order was skipped. + $order_2->set_status( 'processing' ); + $order_2->save(); + + // Delete scheduled actions to avoid default order processing. + $wpdb->query( "DELETE FROM {$wpdb->posts} WHERE post_type = 'scheduled-action'" ); + + $request = new WP_REST_Request( 'POST', $this->endpoint ); + $request->set_query_params( array( 'skip_existing' => '1' ) ); + $response = $this->server->dispatch( $request ); + $report = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( 'success', $report['status'] ); + + // Run pending twice to process batch and order. + WC_Helper_Queue::run_all_pending(); + WC_Helper_Queue::run_all_pending(); + + $request = new WP_REST_Request( 'GET', '/wc/v4/reports/orders' ); + $response = $this->server->dispatch( $request ); + $reports = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertCount( 2, $reports ); + $this->assertEquals( 'completed', $reports[0]['status'] ); + } + +}