WordPress.org

Make WordPress Core

Ticket #35160: 35160.atom.patch

File 35160.atom.patch, 7.7 KB (added by stevenkword, 6 years ago)

Fixes formatting per PHPCS

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