WordPress.org

Make WordPress Core

Ticket #35160: 35160.3.patch

File 35160.3.patch, 18.2 KB (added by stevenkword, 6 years ago)
  • tests/phpunit/tests/feed/atom.php

     
     1<?php
     2
     3/**
     4 * Test the Atom feed by generating a feed, parsing it, and checking that the
     5 * parsed contents match the contents of the posts stored in the database.  Since
     6 * we're using a real XML parser, this confirms that the feed is valid, well formed,
     7 * and contains the right stuff.
     8 *
     9 * @group feed
     10 */
     11class Tests_Feed_Atom extends WP_UnitTestCase {
     12        static $user_id;
     13        static $posts;
     14        static $category;
     15
     16        /**
     17         * Setup a new user and attribute some posts.
     18         */
     19        public static function wpSetUpBeforeClass( $factory ) {
     20                // Create a user
     21                self::$user_id = $factory->user->create( array(
     22                        'role'         => 'author',
     23                        'user_login'   => 'test_author',
     24                        'display_name' => 'Test A. Uthor',
     25                ) );
     26
     27                // Create a taxonomy
     28                self::$category = self::factory()->category->create_and_get( array(
     29                        'name' => 'Test Category',
     30                        'slug' => 'test-cat',
     31                ) );
     32
     33                // Create a few posts
     34                self::$posts = $factory->post->create_many( 42, array(
     35                        'post_author'  => self::$user_id,
     36                        'post_content' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec velit massa, ultrices eu est suscipit, mattis posuere est. Donec vitae purus lacus. Cras vitae odio odio.',
     37                        'post_excerpt' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
     38                ) );
     39
     40                // Assign a category to those posts
     41                foreach ( self::$posts as $post ) {
     42                        wp_set_object_terms( $post, self::$category->slug, 'category' );
     43                }
     44
     45        }
     46
     47        /**
     48         * Destroy the user we created and related posts.
     49         */
     50        public static function wpTearDownAfterClass() {
     51                // Delete our user
     52                self::delete_user( self::$user_id );
     53
     54                // Delete all of our posts
     55                foreach ( self::$posts as $post ) {
     56                        wp_delete_post( $post, true );
     57                }
     58
     59                // Delete our taxonomy
     60                wp_delete_category( self::$category->term_id );
     61        }
     62
     63        /**
     64         * Setup.
     65         */
     66        public function setUp() {
     67                parent::setUp();
     68
     69                $this->post_count = (int) get_option( 'posts_per_rss' );
     70                $this->excerpt_only = get_option( 'rss_use_excerpt' );
     71        }
     72
     73        /**
     74         * This is a bit of a hack used to buffer feed content.
     75         */
     76        function do_atom() {
     77                ob_start();
     78                // Nasty hack! In the future it would better to leverage do_feed( 'atom' ).
     79                global $post;
     80                try {
     81                        @require( ABSPATH . 'wp-includes/feed-atom.php' );
     82                        $out = ob_get_clean();
     83                } catch ( Exception $e ) {
     84                        $out = ob_get_clean();
     85                        throw( $e );
     86                }
     87                return $out;
     88        }
     89
     90        /**
     91         * Test the <feed> element to make sure its present and populated
     92         * with the expected child elements and attributes.
     93         */
     94        function test_feed_element() {
     95                $this->go_to( '/?feed=atom' );
     96                $feed = $this->do_atom();
     97                $xml = xml_to_array( $feed );
     98
     99                // Get the <feed> child element of <xml>.
     100                $atom = xml_find( $xml, 'feed' );
     101
     102                // There should only be one <feed> child element.
     103                $this->assertCount( 1, $atom );
     104
     105                // Verify attributes.
     106                $this->assertEquals( 'http://www.w3.org/2005/Atom', $atom[0]['attributes']['xmlns'] );
     107                $this->assertEquals( 'http://purl.org/syndication/thread/1.0', $atom[0]['attributes']['xmlns:thr'] );
     108                $this->assertEquals( site_url( '/wp-atom.php' ) , $atom[0]['attributes']['xml:base'] );
     109
     110                // Verify the <feed> element is present and contains a <title> child element.
     111                $title = xml_find( $xml, 'feed', 'title' );
     112                $this->assertEquals( get_option( 'blogname' ), $title[0]['content'] );
     113
     114                // Verify the <feed> element is present and contains a <updated> child element.
     115                $updated = xml_find( $xml, 'feed', 'updated' );
     116                $this->assertEquals( strtotime( get_lastpostmodified() ), strtotime( $updated[0]['content'] ) );
     117
     118                // Verify the <feed> element is present and contains a <subtitle> child element.
     119                $subtitle = xml_find( $xml, 'feed', 'subtitle' );
     120                $this->assertEquals( get_option( 'blogdescription' ), $subtitle[0]['content'] );
     121
     122                // Verify the <feed> element is present and contains two <link> child elements.
     123                $link = xml_find( $xml, 'feed', 'link' );
     124                $this->assertCount( 2, $link );
     125
     126                // Verify the <feed> element is present and contains a <link rel="alternate"> child element.
     127                $this->assertEquals( 'alternate', $link[0]['attributes']['rel'] );
     128                $this->assertEquals( home_url(), $link[0]['attributes']['href'] );
     129
     130                // Verify the <feed> element is present and contains a <link rel="href"> child element.
     131                $this->assertEquals( 'self', $link[1]['attributes']['rel'] );
     132                $this->assertEquals( home_url( '/?feed=atom' ), $link[1]['attributes']['href'] );
     133        }
     134
     135        /**
     136         * Validate <entry> child elements.
     137         */
     138        function test_entry_elements() {
     139                $this->go_to( '/?feed=atom' );
     140                $feed = $this->do_atom();
     141                $xml = xml_to_array( $feed );
     142
     143                // Get all the <entry> child elements of the <feed> element.
     144                $entries = xml_find( $xml, 'feed', 'entry' );
     145
     146                // Verify we are displaying the correct number of posts.
     147                $this->assertCount( $this->post_count, $entries );
     148
     149                // We Really only need to test X number of entries unless the content is different
     150                $entries = array_slice( $entries, 1 );
     151
     152                // Check each of the desired entries against the known post data.
     153                foreach ( $entries as $key => $entry ) {
     154
     155                        // Get post for comparison
     156                        $id = xml_find( $entries[$key]['child'], 'id' );
     157                        preg_match( '/\?p=(\d+)/', $id[0]['content'], $matches );
     158                        $post = get_post( $matches[1] );
     159
     160                        // Author
     161                        $author = xml_find( $entries[$key]['child'], 'author', 'name' );
     162                        $user = new WP_User( $post->post_author );
     163                        $this->assertEquals( $user->display_name, $author[0]['content'] );
     164
     165                        // Title
     166                        $title = xml_find( $entries[$key]['child'], 'title' );
     167                        $this->assertEquals( $post->post_title, $title[0]['content'] );
     168
     169                        // Link rel="alternate"
     170                        $link_alts = xml_find( $entries[$key]['child'], 'link' );
     171                        foreach ( $link_alts as $link_alt ) {
     172                                if ( 'alternate' == $link_alt['attributes']['rel'] ) {
     173                                        $this->assertEquals( get_permalink( $post ), $link_alt['attributes']['href'] );
     174                                }
     175                        }
     176
     177                        // Id
     178                        $guid = xml_find( $entries[$key]['child'], 'id' );
     179                        $this->assertEquals( $post->guid, $id[0]['content'] );
     180
     181                        // Updated
     182                        $updated = xml_find( $entries[$key]['child'], 'updated' );
     183                        $this->assertEquals( strtotime( $post->post_modified_gmt ), strtotime( $updated[0]['content'] ) );
     184
     185                        // Published
     186                        $published = xml_find( $entries[$key]['child'], 'published' );
     187                        $this->assertEquals( strtotime( $post->post_date_gmt ), strtotime( $published[0]['content'] ) );
     188
     189                        // Category
     190                        foreach ( get_the_category( $post->ID ) as $term ) {
     191                                $terms[] = $term->name;
     192                        }
     193                        $categories = xml_find( $entries[$key]['child'], 'category' );
     194                        foreach ( $categories as $category ) {
     195                                $this->assertTrue( in_array( $category['attributes']['term'], $terms ) );
     196                        }
     197                        unset( $terms );
     198
     199                        // Content
     200                        if ( ! $this->excerpt_only ) {
     201                                $content = xml_find( $entries[$key]['child'], 'content' );
     202                                $this->assertEquals( trim( apply_filters( 'the_content', $post->post_content ) ), trim( $content[0]['content'] ) );
     203                        }
     204
     205                        // Link rel="replies"
     206                        $link_replies = xml_find( $entries[$key]['child'], 'link' );
     207                        foreach ( $link_replies as $link_reply ) {
     208                                if ( 'replies' == $link_reply['attributes']['rel'] && 'application/atom+xml' == $link_reply['attributes']['type'] ) {
     209                                        $this->assertEquals( get_post_comments_feed_link( $post->ID, 'atom' ), $link_reply['attributes']['href'] );
     210                                }
     211                        }
     212                }
     213        }
     214}
  • tests/phpunit/tests/feed/rss2.php

    Property changes on: tests/phpunit/tests/feed/atom.php
    ___________________________________________________________________
    Added: svn:executable
    ## -0,0 +1 ##
    +*
    \ No newline at end of property
     
    11<?php
    22
    33/**
    4  * test the RSS 2.0 feed by generating a feed, parsing it, and checking that the
     4 * Test the RSS 2.0 feed by generating a feed, parsing it, and checking that the
    55 * parsed contents match the contents of the posts stored in the database.  Since
    66 * we're using a real XML parser, this confirms that the feed is valid, well formed,
    77 * and contains the right stuff.
     
    88 *
    99 * @group feed
    1010 */
    11 class Tests_Feed_RSS2 extends WP_UnitTestCase {
     11class Tests_Feeds_RSS2 extends WP_UnitTestCase {
    1212        static $user_id;
    1313        static $posts;
     14        static $category;
    1415
     16        /**
     17         * Setup a new user and attribute some posts.
     18         */
    1519        public static function wpSetUpBeforeClass( $factory ) {
    16                 self::$user_id = $factory->user->create();
    17                 self::$posts = $factory->post->create_many( 5, array(
    18                         'post_author' => self::$user_id,
     20                // Create a user
     21                self::$user_id = $factory->user->create( array(
     22                        'role'         => 'author',
     23                        'user_login'   => 'test_author',
     24                        'display_name' => 'Test A. Uthor',
    1925                ) );
     26
     27                // Create a taxonomy
     28                self::$category = self::factory()->category->create_and_get( array(
     29                        'name' => 'Test Category',
     30                        'slug' => 'test-cat',
     31                ) );
     32
     33                // Create a few posts
     34                self::$posts = $factory->post->create_many( 42, array(
     35                        'post_author'  => self::$user_id,
     36                        'post_content' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec velit massa, ultrices eu est suscipit, mattis posuere est. Donec vitae purus lacus. Cras vitae odio odio.',
     37                        'post_excerpt' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
     38                ) );
     39
     40                // Assign a category to those posts
     41                foreach ( self::$posts as $post ) {
     42                        wp_set_object_terms( $post, self::$category->slug, 'category' );
     43                }
    2044        }
    2145
     46        /**
     47         * Destroy the user we created and related posts.
     48         */
    2249        public static function wpTearDownAfterClass() {
     50                // Delete our user
    2351                self::delete_user( self::$user_id );
    2452
     53                // Delete all of our posts
    2554                foreach ( self::$posts as $post ) {
    2655                        wp_delete_post( $post, true );
    2756                }
     57
     58                // Delete our taxonomy
     59                wp_delete_category( self::$category->term_id );
    2860        }
    2961
     62        /**
     63         * Setup.
     64         */
    3065        public function setUp() {
    3166                parent::setUp();
    3267
    33                 $this->post_count = get_option('posts_per_rss');
    34                 $this->excerpt_only = get_option('rss_use_excerpt');
     68                $this->post_count = (int) get_option( 'posts_per_rss' );
     69                $this->excerpt_only = get_option( 'rss_use_excerpt' );
    3570                // this seems to break something
    36                 update_option('use_smilies', false);
     71                update_option( 'use_smilies', false );
    3772        }
    3873
     74        /**
     75         * This is a bit of a hack used to buffer feed content.
     76         */
    3977        function do_rss2() {
    4078                ob_start();
    41                 // nasty hack
     79                // Nasty hack! In the future it would better to leverage do_feed( 'rss2' ).
    4280                global $post;
    4381                try {
    4482                        @require(ABSPATH . 'wp-includes/feed-rss2.php');
     
    5088                return $out;
    5189        }
    5290
    53         function test_rss() {
     91        /**
     92         * Test the <rss> element to make sure its present and populated
     93         * with the expected child elements and attributes.
     94         */
     95        function test_rss_element() {
    5496                $this->go_to( '/?feed=rss2' );
    5597                $feed = $this->do_rss2();
    56                 $xml = xml_to_array($feed);
     98                $xml = xml_to_array( $feed );
    5799
    58                 // get the rss element
    59                 $rss = xml_find($xml, 'rss');
     100                // Get the <rss> child element of <xml>.
     101                $rss = xml_find( $xml, 'rss' );
    60102
    61                 // there should only be one rss element
    62                 $this->assertEquals(1, count($rss));
     103                // There should only be one <rss> child element.
     104                $this->assertEquals( 1, count( $rss ) );
    63105
    64                 $this->assertEquals('2.0', $rss[0]['attributes']['version']);
    65                 $this->assertEquals('http://purl.org/rss/1.0/modules/content/', $rss[0]['attributes']['xmlns:content']);
    66                 $this->assertEquals('http://wellformedweb.org/CommentAPI/', $rss[0]['attributes']['xmlns:wfw']);
    67                 $this->assertEquals('http://purl.org/dc/elements/1.1/', $rss[0]['attributes']['xmlns:dc']);
     106                $this->assertEquals( '2.0', $rss[0]['attributes']['version'] );
     107                $this->assertEquals( 'http://purl.org/rss/1.0/modules/content/', $rss[0]['attributes']['xmlns:content'] );
     108                $this->assertEquals( 'http://wellformedweb.org/CommentAPI/', $rss[0]['attributes']['xmlns:wfw'] );
     109                $this->assertEquals( 'http://purl.org/dc/elements/1.1/', $rss[0]['attributes']['xmlns:dc'] );
    68110
    69111                // rss should have exactly one child element (channel)
    70                 $this->assertEquals(1, count($rss[0]['child']));
     112                $this->assertEquals( 1, count( $rss[0]['child'] ) );
    71113        }
    72114
    73         function test_channel() {
     115        /**
     116         * [test_channel_element description]
     117         * @return [type] [description]
     118         */
     119        function test_channel_element() {
    74120                $this->go_to( '/?feed=rss2' );
    75121                $feed = $this->do_rss2();
    76                 $xml = xml_to_array($feed);
     122                $xml = xml_to_array( $feed );
    77123
    78124                // get the rss -> channel element
    79                 $channel = xml_find($xml, 'rss', 'channel');
     125                $channel = xml_find( $xml, 'rss', 'channel' );
    80126
    81                 $this->assertTrue(empty($channel[0]['attributes']));
     127                // The channel should be free of attributes
     128                $this->assertTrue( empty( $channel[0]['attributes'] ) );
    82129
    83                 $title = xml_find($xml, 'rss', 'channel', 'title');
    84                 $this->assertEquals(get_option('blogname'), $title[0]['content']);
     130                // Verify the channel is present and contains a title child element
     131                $title = xml_find( $xml, 'rss', 'channel', 'title' );
     132                $this->assertEquals( get_option( 'blogname' ), $title[0]['content'] );
    85133
    86                 $desc = xml_find($xml, 'rss', 'channel', 'description');
    87                 $this->assertEquals(get_option('blogdescription'), $desc[0]['content']);
     134                $desc = xml_find( $xml, 'rss', 'channel', 'description' );
     135                $this->assertEquals( get_option( 'blogdescription' ), $desc[0]['content'] );
    88136
    89                 $link = xml_find($xml, 'rss', 'channel', 'link');
    90                 $this->assertEquals(get_option('siteurl'), $link[0]['content']);
     137                $link = xml_find( $xml, 'rss', 'channel', 'link' );
     138                $this->assertEquals( get_option( 'siteurl' ), $link[0]['content'] );
    91139
    92                 $pubdate = xml_find($xml, 'rss', 'channel', 'lastBuildDate');
    93                 $this->assertEquals(strtotime(get_lastpostmodified()), strtotime($pubdate[0]['content']));
     140                $pubdate = xml_find( $xml, 'rss', 'channel', 'lastBuildDate' );
     141                $this->assertEquals( strtotime( get_lastpostmodified() ), strtotime( $pubdate[0]['content'] ) );
    94142        }
    95143
    96144        /**
    97145         * @ticket UT32
    98146         */
    99         function test_items() {
     147        function test_item_elements() {
    100148                $this->go_to( '/?feed=rss2' );
    101149                $feed = $this->do_rss2();
    102                 $xml = xml_to_array($feed);
     150                $xml = xml_to_array( $feed );
    103151
    104                 // get all the rss -> channel -> item elements
     152                // Get all the <item> child elements of the <channel> element
    105153                $items = xml_find( $xml, 'rss', 'channel', 'item' );
    106154
    107                 // check each of the items against the known post data
     155                // Verify we are displaying the correct number of posts.
     156                $this->assertCount( $this->post_count, $items );
     157
     158                // We Really only need to test X number of items unless the content is different
     159                $items = array_slice( $items, 1 );
     160
     161                // Check each of the desired entries against the known post data
    108162                foreach ( $items as $key => $item ) {
    109163
    110164                        // Get post for comparison
     
    112166                        preg_match( '/\?p=(\d+)/', $guid[0]['content'], $matches );
    113167                        $post = get_post( $matches[1] );
    114168
    115                         // title
     169                        // Title
    116170                        $title = xml_find( $items[$key]['child'], 'title' );
    117171                        $this->assertEquals( $post->post_title, $title[0]['content'] );
    118172
    119                         // link
     173                        // Link
    120174                        $link = xml_find( $items[$key]['child'], 'link' );
    121175                        $this->assertEquals( get_permalink( $post ), $link[0]['content'] );
    122176
    123                         // comment link
     177                        // Comment link
    124178                        $comments_link = xml_find( $items[$key]['child'], 'comments' );
    125                         $this->assertEquals( get_permalink( $post) . '#respond', $comments_link[0]['content'] );
     179                        $this->assertEquals( get_permalink( $post ) . '#respond', $comments_link[0]['content'] );
    126180
    127                         // pub date
     181                        // Pub date
    128182                        $pubdate = xml_find( $items[$key]['child'], 'pubDate' );
    129183                        $this->assertEquals( strtotime( $post->post_date_gmt ), strtotime( $pubdate[0]['content'] ) );
    130184
    131                         // author
     185                        // Author
    132186                        $creator = xml_find( $items[$key]['child'], 'dc:creator' );
    133187                        $user = new WP_User( $post->post_author );
    134                         $this->assertEquals( $user->user_login, $creator[0]['content'] );
     188                        $this->assertEquals( $user->display_name, $creator[0]['content'] );
    135189
    136                         // categories (perhaps multiple)
     190                        // Categories (perhaps multiple)
    137191                        $categories = xml_find( $items[$key]['child'], 'category' );
    138192                        $cats = array();
    139193                        foreach ( get_the_category( $post->ID ) as $term ) {
     
    147201                                }
    148202                        }
    149203                        $cats = array_filter( $cats );
    150                         // should be the same number of categories
     204                        // Should be the same number of categories
    151205                        $this->assertEquals( count( $cats ), count( $categories ) );
    152206
    153207                        // ..with the same names
    154208                        foreach ( $cats as $id => $cat ) {
    155                                 $this->assertEquals( $cat, $categories[$id]['content']);
     209                                $this->assertEquals( $cat, $categories[$id]['content'] );
    156210                        }
    157211
    158212                        // GUID
    159213                        $guid = xml_find( $items[$key]['child'], 'guid' );
    160                         $this->assertEquals('false', $guid[0]['attributes']['isPermaLink'] );
     214                        $this->assertEquals( 'false', $guid[0]['attributes']['isPermaLink'] );
    161215                        $this->assertEquals( $post->guid, $guid[0]['content'] );
    162216
    163                         // description/excerpt
    164                         if ( !empty( $post->post_excerpt ) ) {
     217                        // Description / Excerpt
     218                        if ( ! empty( $post->post_excerpt ) ) {
    165219                                $description = xml_find( $items[$key]['child'], 'description' );
    166220                                $this->assertEquals( trim( $post->post_excerpt ), trim( $description[0]['content'] ) );
    167221                        }
    168222
    169                         // post content
    170                         if ( !$this->excerpt_only ) {
     223                        // Post content
     224                        if ( ! $this->excerpt_only ) {
    171225                                $content = xml_find( $items[$key]['child'], 'content:encoded' );
    172226                                $this->assertEquals( trim( apply_filters( 'the_content', $post->post_content ) ), trim( $content[0]['content'] ) );
    173227                        }
    174228
    175                         // comment rss
     229                        // Comment rss
    176230                        $comment_rss = xml_find( $items[$key]['child'], 'wfw:commentRss' );
    177                         $this->assertEquals( html_entity_decode( get_post_comments_feed_link( $post->ID) ), $comment_rss[0]['content'] );
     231                        $this->assertEquals( html_entity_decode( get_post_comments_feed_link( $post->ID ) ), $comment_rss[0]['content'] );
    178232                }
    179233        }
    180234
     
    186240
    187241                $this->go_to( '/?feed=rss2' );
    188242                $feed = $this->do_rss2();
    189                 $xml = xml_to_array($feed);
     243                $xml = xml_to_array( $feed );
    190244
    191245                // get all the rss -> channel -> item elements
    192246                $items = xml_find( $xml, 'rss', 'channel', 'item' );
     
    209263
    210264                remove_filter( 'comments_open', '__return_false' );
    211265        }
     266
    212267}