Make WordPress Core

Ticket #42937: 42937.4.diff

File 42937.4.diff, 7.7 KB (added by birgire, 6 years ago)
  • src/wp-admin/includes/ajax-actions.php

    diff --git src/wp-admin/includes/ajax-actions.php src/wp-admin/includes/ajax-actions.php
    index 8764af4..81b6a77 100644
    function wp_ajax_add_tag() { 
    961961        $wp_list_table->single_row( $tag );
    962962        $parents = ob_get_clean();
    963963
     964        require ABSPATH . 'wp-admin/includes/edit-tag-messages.php';
     965
     966        $message = false;
     967        if ( isset( $messages[ $tax->name ][3] ) ) {
     968                $message = $messages[ $tax->name ][3];
     969        } elseif ( isset( $messages['_item'][3] ) ) {
     970                $message = $messages['_item'][3];
     971        }
     972
    964973        $x->add(
    965974                array(
    966975                        'what'         => 'taxonomy',
     976                        'data'         => $message,
    967977                        'supplemental' => compact( 'parents', 'noparents' ),
    968978                )
    969979        );
  • src/wp-includes/js/wp-ajax-response.js

    diff --git src/wp-includes/js/wp-ajax-response.js src/wp-includes/js/wp-ajax-response.js
    index 363a08b..7c6158c 100644
    var wpAjax = jQuery.extend( { 
    1212                return r;
    1313        },
    1414        parseAjaxResponse: function( x, r, e ) { // 1 = good, 0 = strange (bad data?), -1 = you lack permission
    15                 var parsed = {}, re = jQuery('#' + r).empty(), err = '';
     15                var parsed = {}, re = jQuery('#' + r).empty(), err = '', successmsg = '';
    1616
    1717                if ( x && typeof x == 'object' && x.getElementsByTagName('wp_ajax') ) {
    1818                        parsed.responses = [];
    var wpAjax = jQuery.extend( { 
    2121                                var th = jQuery(this), child = jQuery(this.firstChild), response;
    2222                                response = { action: th.attr('action'), what: child.get(0).nodeName, id: child.attr('id'), oldId: child.attr('old_id'), position: child.attr('position') };
    2323                                response.data = jQuery( 'response_data', child ).text();
     24                                successmsg += response.data;
    2425                                response.supplemental = {};
    2526                                if ( !jQuery( 'supplemental', child ).children().each( function() {
    2627                                        response.supplemental[this.nodeName] = jQuery(this).text();
    var wpAjax = jQuery.extend( { 
    4041                                } ).length ) { response.errors = false; }
    4142                                parsed.responses.push( response );
    4243                        } );
    43                         if ( err.length ) { re.html( '<div class="error">' + err + '</div>' ); }
     44                        if ( err.length ) {
     45                                re.html( '<div class="error">' + err + '</div>' );
     46                        } else {
     47                                re.html( '<div class="updated notice is-dismissible"><p>' + successmsg + '</p></div>');
     48                                jQuery(document).trigger( 'wp-updates-notice-added' );
     49                        }
    4450                        return parsed;
    4551                }
    4652                if ( isNaN(x) ) { return !re.html('<div class="error"><p>' + x + '</p></div>'); }
  • new file tests/phpunit/tests/ajax/add-tag.php

    diff --git tests/phpunit/tests/ajax/add-tag.php tests/phpunit/tests/ajax/add-tag.php
    new file mode 100644
    index 0000000..553110a
    - +  
     1<?php
     2/**
     3 * Ajax tests for adding tags.
     4 *
     5 * @package    WordPress
     6 * @subpackage UnitTests
     7 */
     8
     9/**
     10 * Admin ajax functions to be tested.
     11 */
     12require_once ABSPATH . 'wp-admin/includes/ajax-actions.php';
     13
     14/**
     15 * Class for testing ajax add tag functionality.
     16 *
     17 * @since      5.0.0
     18 * @group      ajax
     19 */
     20class Tests_Ajax_AddTag extends WP_Ajax_UnitTestCase {
     21        /**
     22         * List of terms to insert on setup
     23         *
     24         * @var array
     25         */
     26        private static $terms = array(
     27                'jazz',
     28        );
     29
     30        /**
     31         * Set up before class.
     32         */
     33        public static function wpSetUpBeforeClass() {
     34                foreach ( self::$terms as $term ) {
     35                        wp_insert_term( $term, 'category' );
     36                }
     37        }
     38
     39        /**
     40         * Test adding a category.
     41         */
     42        public function test_add_category() {
     43
     44                $this->_setRole( 'administrator' );
     45
     46                $_POST['taxonomy']         = 'category';
     47                $_POST['post_type']        = 'post';
     48                $_POST['screen']           = 'edit-category';
     49                $_POST['action']           = 'add-tag';
     50                $_POST['tag-name']         = 'blues';
     51                $_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
     52
     53                try {
     54                        $this->_handleAjax( 'add-tag' );
     55                } catch ( WPAjaxDieContinueException $e ) {
     56                        unset( $e );
     57                }
     58
     59                $xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
     60
     61                $expected = 'Category updated.';
     62                $actual   = (string) $xml->response->taxonomy->response_data;
     63
     64                $this->assertSame( $expected, $actual );
     65        }
     66
     67        /**
     68         * Test adding a post tag.
     69         */
     70        public function test_add_post_tag() {
     71
     72                $this->_setRole( 'administrator' );
     73
     74                $_POST['taxonomy']         = 'post_tag';
     75                $_POST['post_type']        = 'post';
     76                $_POST['screen']           = 'edit-post_tag';
     77                $_POST['action']           = 'add-tag';
     78                $_POST['tag-name']         = 'Louis Armstrong';
     79                $_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
     80
     81                try {
     82                        $this->_handleAjax( 'add-tag' );
     83                } catch ( WPAjaxDieContinueException $e ) {
     84                        unset( $e );
     85                }
     86
     87                $xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
     88
     89                $expected = 'Tag updated.';
     90                $actual   = (string) $xml->response->taxonomy->response_data;
     91
     92                $this->assertSame( $expected, $actual );
     93        }
     94
     95        /**
     96         * Test that adding a category should work with message filtering.
     97         */
     98        public function test_add_category_should_work_with_message_filtering() {
     99
     100                $this->_setRole( 'administrator' );
     101
     102                $_POST['taxonomy']         = 'category';
     103                $_POST['post_type']        = 'post';
     104                $_POST['screen']           = 'edit-category';
     105                $_POST['action']           = 'add-tag';
     106                $_POST['tag-name']         = 'techno';
     107                $_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
     108
     109                try {
     110                        add_filter( 'term_updated_messages', array( $this, 'message_filter' ) );
     111                        $this->_handleAjax( 'add-tag' );
     112                        remove_filter( 'term_updated_messages', array( $this, 'message_filter' ) );
     113                } catch ( WPAjaxDieContinueException $e ) {
     114                        unset( $e );
     115                }
     116
     117                $xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
     118
     119                $expected = 'New category added.';
     120                $actual   = (string) $xml->response->taxonomy->response_data;
     121
     122                $this->assertSame( $expected, $actual );
     123        }
     124
     125        /**
     126         * Filters the messages displayed when a tag is updated.
     127         *
     128         * @param  array $messages The messages to be displayed.
     129         * @return array $messages The messages to be displayed.
     130         */
     131        public function message_filter( $messages ) {
     132                if ( isset( $messages['category'][3] ) ) {
     133                        $messages['category'][3] = 'New category added.';
     134                }
     135                return $messages;
     136        }
     137
     138        /**
     139         * Test that adding a category without capability should error.
     140         */
     141        public function test_adding_category_without_capability_should_error() {
     142
     143                $this->_setRole( 'subscriber' );
     144
     145                $_POST['taxonomy']         = 'category';
     146                $_POST['post_type']        = 'post';
     147                $_POST['screen']           = 'edit-category';
     148                $_POST['action']           = 'add-tag';
     149                $_POST['tag-name']         = 'disco';
     150                $_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
     151
     152                $this->setExpectedException( 'WPAjaxDieStopException', '-1' );
     153
     154                try {
     155                        $this->_handleAjax( 'add-tag' );
     156                } catch ( WPAjaxDieContinueException $e ) {
     157                        unset( $e );
     158                }
     159        }
     160
     161        /**
     162         * Test that adding an existing category should error.
     163         */
     164        public function test_adding_existing_category_should_error() {
     165
     166                $this->_setRole( 'administrator' );
     167
     168                $_POST['taxonomy']         = 'category';
     169                $_POST['post_type']        = 'post';
     170                $_POST['screen']           = 'edit-category';
     171                $_POST['action']           = 'add-tag';
     172                $_POST['tag-name']         = self::$terms[0];
     173                $_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
     174
     175                try {
     176                        $this->_handleAjax( 'add-tag' );
     177                } catch ( WPAjaxDieContinueException $e ) {
     178                        unset( $e );
     179                }
     180
     181                $xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
     182
     183                $expected = 'A term with the name provided already exists with this parent.';
     184                $actual   = (string) $xml->response->taxonomy->wp_error;
     185
     186                $this->assertSame( $expected, $actual );
     187        }
     188
     189}