Make WordPress Core


Ignore:
Timestamp:
11/16/2021 06:04:49 PM (3 years ago)
Author:
spacedmonkey
Message:

REST API: Make the templates controller follow core REST patterns.

The templates controller now respects the _fields parameter and filters the response accordingly. The schema has been updated to include all the fields returned. The content.block_version field has been added. The controller now returns WP_Error objects for improved error handling.

Add new unit tests.

Props TimothyBlynJacobs, hellofromtonya, zieladam.
Fixes #54422.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/rest-api/wpRestTemplatesController.php

    r52185 r52186  
    77 */
    88
    9 class WP_REST_Template_Controller_Test extends WP_Test_REST_Controller_Testcase {
     9/**
     10 * Tests for REST API for templates.
     11 *
     12 * @covers WP_REST_Templates_Controller
     13 *
     14 * @group restapi
     15 */
     16class Tests_REST_WpRestTemplatesController extends WP_Test_REST_Controller_Testcase {
    1017    /**
    1118     * @var int
     
    5461    }
    5562
     63    /**
     64     * @covers WP_REST_Templates_Controller::get_context_param
     65     */
    5666    public function test_context_param() {
    57         // TODO: Implement test_context_param() method.
    58     }
    59 
     67        // Collection.
     68        $request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates' );
     69        $response = rest_get_server()->dispatch( $request );
     70        $data     = $response->get_data();
     71        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
     72        $this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
     73        // Single.
     74        $request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/default//my_template' );
     75        $response = rest_get_server()->dispatch( $request );
     76        $data     = $response->get_data();
     77        $this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
     78        $this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
     79    }
     80
     81    /**
     82     * @covers WP_REST_Templates_Controller::get_items
     83     */
    6084    public function test_get_items() {
    61         function find_and_normalize_template_by_id( $templates, $id ) {
    62             foreach ( $templates as $template ) {
    63                 if ( $template['id'] === $id ) {
    64                     unset( $template['content'] );
    65                     unset( $template['_links'] );
    66                     return $template;
    67                 }
    68             }
    69 
    70             return null;
    71         }
    72 
    73         wp_set_current_user( 0 );
    74         $request  = new WP_REST_Request( 'GET', '/wp/v2/templates' );
    75         $response = rest_get_server()->dispatch( $request );
    76         $this->assertErrorResponse( 'rest_cannot_manage_templates', $response, 401 );
    77 
    7885        wp_set_current_user( self::$admin_id );
    7986        $request  = new WP_REST_Request( 'GET', '/wp/v2/templates' );
     
    97104                'has_theme_file' => false,
    98105            ),
    99             find_and_normalize_template_by_id( $data, 'default//my_template' )
    100         );
    101     }
    102 
     106            $this->find_and_normalize_template_by_id( $data, 'default//my_template' )
     107        );
     108    }
     109
     110    /**
     111     * @covers WP_REST_Templates_Controller::get_items
     112     */
     113    public function test_get_items_no_permission() {
     114        wp_set_current_user( 0 );
     115        $request  = new WP_REST_Request( 'GET', '/wp/v2/templates' );
     116        $response = rest_get_server()->dispatch( $request );
     117        $this->assertErrorResponse( 'rest_cannot_manage_templates', $response, 401 );
     118    }
     119
     120    /**
     121     * @covers WP_REST_Templates_Controller::get_item
     122     */
    103123    public function test_get_item() {
    104124        wp_set_current_user( self::$admin_id );
     
    129149    }
    130150
     151    /**
     152     * @ticket 54422
     153     * @covers WP_REST_Templates_Controller::create_item
     154     */
    131155    public function test_create_item() {
    132156        wp_set_current_user( self::$admin_id );
     
    167191    }
    168192
     193    /**
     194     * @ticket 54422
     195     * @covers WP_REST_Templates_Controller::create_item
     196     */
     197    public function test_create_item_raw() {
     198        wp_set_current_user( self::$admin_id );
     199        $request = new WP_REST_Request( 'POST', '/wp/v2/templates' );
     200        $request->set_body_params(
     201            array(
     202                'slug'        => 'my_custom_template_raw',
     203                'description' => 'Just a description',
     204                'title'       => array(
     205                    'raw' => 'My Template',
     206                ),
     207                'content'     => array(
     208                    'raw' => 'Content',
     209                ),
     210            )
     211        );
     212        $response = rest_get_server()->dispatch( $request );
     213        $data     = $response->get_data();
     214        unset( $data['_links'] );
     215        unset( $data['wp_id'] );
     216
     217        $this->assertSame(
     218            array(
     219                'id'             => 'default//my_custom_template_raw',
     220                'theme'          => 'default',
     221                'content'        => array(
     222                    'raw' => 'Content',
     223                ),
     224                'slug'           => 'my_custom_template_raw',
     225                'source'         => 'custom',
     226                'type'           => 'wp_template',
     227                'description'    => 'Just a description',
     228                'title'          => array(
     229                    'raw'      => 'My Template',
     230                    'rendered' => 'My Template',
     231                ),
     232                'status'         => 'publish',
     233                'has_theme_file' => false,
     234            ),
     235            $data
     236        );
     237    }
     238
     239    /**
     240     * @covers WP_REST_Templates_Controller::update_item
     241     */
    169242    public function test_update_item() {
    170243        wp_set_current_user( self::$admin_id );
     
    181254    }
    182255
     256    /**
     257     * @covers WP_REST_Templates_Controller::update_item
     258     */
     259    public function test_update_item_raw() {
     260        wp_set_current_user( self::$admin_id );
     261        $request = new WP_REST_Request( 'PUT', '/wp/v2/templates/default//my_template' );
     262        $request->set_body_params(
     263            array(
     264                'title' => array( 'raw' => 'My new raw Index Title' ),
     265            )
     266        );
     267        $response = rest_get_server()->dispatch( $request );
     268        $data     = $response->get_data();
     269        $this->assertSame( 'My new raw Index Title', $data['title']['raw'] );
     270        $this->assertSame( 'custom', $data['source'] );
     271    }
     272
     273    /**
     274     * @covers WP_REST_Templates_Controller::delete_item
     275     */
    183276    public function test_delete_item() {
     277        // Set up template post.
     278        $args    = array(
     279            'post_type'    => 'wp_template',
     280            'post_name'    => 'my_test_template',
     281            'post_title'   => 'My Template',
     282            'post_content' => 'Content',
     283            'post_excerpt' => 'Description of my template.',
     284            'tax_input'    => array(
     285                'wp_theme' => array(
     286                    get_stylesheet(),
     287                ),
     288            ),
     289        );
     290        $post_id = self::factory()->post->create( $args );
     291        wp_set_post_terms( $post_id, get_stylesheet(), 'wp_theme' );
     292
     293        wp_set_current_user( self::$admin_id );
     294        $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/default//my_test_template' );
     295        $request->set_param( 'force', 'false' );
     296        $response = rest_get_server()->dispatch( $request );
     297        $data     = $response->get_data();
     298        $this->assertSame( 'My Template', $data['title']['raw'] );
     299        $this->assertSame( 'trash', $data['status'] );
     300    }
     301
     302    /**
     303     * @covers WP_REST_Templates_Controller::delete_item
     304     */
     305    public function test_delete_item_skip_trash() {
     306        // Set up template post.
     307        $args    = array(
     308            'post_type'    => 'wp_template',
     309            'post_name'    => 'my_test_template',
     310            'post_title'   => 'My Template',
     311            'post_content' => 'Content',
     312            'post_excerpt' => 'Description of my template.',
     313            'tax_input'    => array(
     314                'wp_theme' => array(
     315                    get_stylesheet(),
     316                ),
     317            ),
     318        );
     319        $post_id = self::factory()->post->create( $args );
     320        wp_set_post_terms( $post_id, get_stylesheet(), 'wp_theme' );
     321
     322        wp_set_current_user( self::$admin_id );
     323        $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/default//my_test_template' );
     324        $request->set_param( 'force', 'true' );
     325        $response = rest_get_server()->dispatch( $request );
     326        $this->assertSame( 200, $response->get_status() );
     327        $data = $response->get_data();
     328        $this->assertTrue( $data['deleted'] );
     329        $this->assertNotEmpty( $data['previous'] );
     330    }
     331
     332    /**
     333     * @covers WP_REST_Templates_Controller::delete_item
     334     */
     335    public function test_delete_item_fail() {
    184336        wp_set_current_user( self::$admin_id );
    185337        $request  = new WP_REST_Request( 'DELETE', '/wp/v2/templates/justrandom//template' );
     
    192344    }
    193345
     346    public function test_prepare_item_limit_fields() {
     347        wp_set_current_user( self::$admin_id );
     348
     349        $endpoint = new WP_REST_Templates_Controller( 'wp_template' );
     350        $request  = new WP_REST_Request( 'GET', '/wp/v2/templates/default//my_template' );
     351        $request->set_param( 'context', 'edit' );
     352        $request->set_param( '_fields', 'id,slug' );
     353        $obj      = get_block_template( 'default//my_template', 'wp_template' );
     354        $response = $endpoint->prepare_item_for_response( $obj, $request );
     355        $this->assertSame(
     356            array(
     357                'id',
     358                'slug',
     359            ),
     360            array_keys( $response->get_data() )
     361        );
     362    }
     363
     364    /**
     365     * @ticket 54422
     366     * @covers WP_REST_Templates_Controller::get_item_schema
     367     */
    194368    public function test_get_item_schema() {
    195         // TODO: Implement test_get_item_schema() method.
    196     }
     369        $request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates' );
     370        $response   = rest_get_server()->dispatch( $request );
     371        $data       = $response->get_data();
     372        $properties = $data['schema']['properties'];
     373        $this->assertCount( 11, $properties );
     374        $this->assertArrayHasKey( 'id', $properties );
     375        $this->assertArrayHasKey( 'description', $properties );
     376        $this->assertArrayHasKey( 'slug', $properties );
     377        $this->assertArrayHasKey( 'theme', $properties );
     378        $this->assertArrayHasKey( 'type', $properties );
     379        $this->assertArrayHasKey( 'source', $properties );
     380        $this->assertArrayHasKey( 'content', $properties );
     381        $this->assertArrayHasKey( 'title', $properties );
     382        $this->assertArrayHasKey( 'description', $properties );
     383        $this->assertArrayHasKey( 'status', $properties );
     384        $this->assertArrayHasKey( 'wp_id', $properties );
     385        $this->assertArrayHasKey( 'has_theme_file', $properties );
     386    }
     387
     388    protected function find_and_normalize_template_by_id( $templates, $id ) {
     389        foreach ( $templates as $template ) {
     390            if ( $template['id'] === $id ) {
     391                unset( $template['content'] );
     392                unset( $template['_links'] );
     393                return $template;
     394            }
     395        }
     396
     397        return null;
     398    }
     399
    197400}
Note: See TracChangeset for help on using the changeset viewer.