<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Tests][1130] trunk/tests: Add tests for #WP22435, the Export API crusade</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg > ul, #logmsg > ol { margin-left: 0; margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://unit-tests.trac.wordpress.org/changeset/1130">1130</a></dd>
<dt>Author</dt> <dd>nbachiyski</dd>
<dt>Date</dt> <dd>2012-11-13 18:00:21 +0000 (Tue, 13 Nov 2012)</dd>
</dl>
<h3>Log Message</h3>
<pre>Add tests for #WP22435, the Export API crusade</pre>
<h3>Added Paths</h3>
<ul>
<li>trunk/tests/export/</li>
<li><a href="#trunktestsexportclasswpwxrexportphp">trunk/tests/export/class-wp-wxr-export.php</a></li>
<li><a href="#trunktestsexportwritersphp">trunk/tests/export/writers.php</a></li>
<li><a href="#trunktestsiteratorsphp">trunk/tests/iterators.php</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunktestsexportclasswpwxrexportphp"></a>
<div class="addfile"><h4>Added: trunk/tests/export/class-wp-wxr-export.php (0 => 1130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/tests/export/class-wp-wxr-export.php         (rev 0)
+++ trunk/tests/export/class-wp-wxr-export.php        2012-11-13 18:00:21 UTC (rev 1130)
</span><span class="lines">@@ -0,0 +1,271 @@
</span><ins>+<?php
+
+/**
+ * Test WP_WXR_Export class
+ *
+ * @group export
+ * @ticket 22435
+ */
+class Test_WP_WXR_Export extends WP_UnitTestCase {
+        function test_WP_WXR_Export_should_be_initialized_with_an_array() {
+                $export = new WP_WXR_Export( array( 'author' => 'all' ) );
+                $this->assertTrue( (bool) $export );
+        }
+
+        function test_WP_WXR_Export_should_use_post_ids_if_passed() {
+                $export = new WP_WXR_Export( array( 'post_ids' => array( 1, 2, 3 ) ) );
+                $this->assertEquals( array( 1, 2, 3 ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_all_posts_if_all_arg_is_true() {
+                $post_id = $this->factory->post->create();
+                $export = new WP_WXR_Export();
+                $this->assertEquals( array( $post_id ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_all_posts_if_no_args_passed() {
+                $post_id = $this->factory->post->create();
+                $export = new WP_WXR_Export();
+                $this->assertEquals( array( $post_id ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_not_export_anything_if_post_type_arg_is_set_to_non_existing_post_type() {
+                $post_id = $this->factory->post->create();
+                $export = new WP_WXR_Export( array( 'post_type' => 'baba' ) );
+                $this->assertEquals( array(), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_with_a_certain_post_type_if_the_post_type_arg_is_set() {
+                register_post_type( 'baba' );
+                $post_id = $this->factory->post->create( array( 'post_type' => 'baba' ) );
+                $_ = $this->factory->post->create( array( 'post_type' => 'dyado' ) );
+                $export = new WP_WXR_Export( array( 'post_type' => 'baba' ) );
+                $this->assertEquals( array( $post_id ), $export->post_ids() );
+                _unregister_post_type( 'baba' );
+        }
+
+        function test_WP_WXR_Export_should_not_export_post_types_with_can_export_set_to_false() {
+                register_post_type( 'non-exportable', array( 'can_export' => false ) );
+                register_post_type( 'exportable', array( 'can_export' => true ) );
+                $non_exportable_post_id = $this->factory->post->create( array( 'post_type' => 'non-exportable' ) );
+                $exportable_post_id = $this->factory->post->create( array( 'post_type' => 'exportable' ) );
+                $export = new WP_WXR_Export();
+                $this->assertEquals( array( $exportable_post_id ), $export->post_ids() );
+                _unregister_post_type( 'non-exportable' );
+                _unregister_post_type( 'exportable' );
+        }
+
+        function test_WP_WXR_Export_should_not_export_auto_drafts_by_default() {
+                $post_id = $this->factory->post->create( array( 'post_status' => 'auto-draft' ) );
+                $export = new WP_WXR_Export();
+                $this->assertEquals( array(), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_with_certain_status_if_status_arg_is_set() {
+                $post_id_baba = $this->factory->post->create( array( 'post_status' => 'baba' ) );
+                $post_id_dudu = $this->factory->post->create( array( 'post_status' => 'dudu' ) );
+                $export = new WP_WXR_Export( array( 'status' => 'baba' ) );
+                $this->assertEquals( array( $post_id_baba ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_with_certain_author_id_if_status_arg_is_a_number() {
+                $user_id = $this->factory->user->create();
+                $post_by_user = $this->factory->post->create( array( 'post_author' => $user_id ) );
+                $other_post = $this->factory->post->create( array( 'post_author' => $user_id + 1 ) );
+                $export = new WP_WXR_Export( array( 'author' => $user_id ) );
+                $this->assertEquals( array( $post_by_user ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_with_certain_author_name_if_status_arg_is_a_username() {
+                $user = $this->factory->user->create_and_get( array( 'user_login' => 'baba' ) );
+                $post_by_user = $this->factory->post->create( array( 'post_author' => $user->ID ) );
+                $other_post = $this->factory->post->create( array( 'post_author' => $user->ID + 1 ) );
+                $export = new WP_WXR_Export( array( 'author' => 'baba' ) );
+                $this->assertEquals( array( $post_by_user ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_with_certain_author_object_if_author_is_an_object_with_ID_member_variable() {
+                $user = $this->factory->user->create_and_get();
+                $post_by_user = $this->factory->post->create( array( 'post_author' => $user->ID ) );
+                $other_post = $this->factory->post->create( array( 'post_author' => $user->ID + 1 ) );
+                $export = new WP_WXR_Export( array( 'author' => $user ) );
+                $this->assertEquals( array( $post_by_user ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_after_certain_start_date_if_start_date_arg_is_passed() {
+                $post_before = $this->factory->post->create( array( 'post_date' => '2012-11-10 23:59:59' ) );
+                $post_after = $this->factory->post->create( array( 'post_date' => '2012-11-11 00:00:00' ) );
+                $export = new WP_WXR_Export( array( 'start_date' => '2012-11-11' ) );
+                $this->assertEquals( array( $post_after ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_after_certain_end_date_if_end_date_arg_is_passed() {
+                $post_before = $this->factory->post->create( array( 'post_date' => '2012-11-10 23:59:59' ) );
+                $post_after = $this->factory->post->create( array( 'post_date' => '2012-11-11 00:00:00' ) );
+                $export = new WP_WXR_Export( array( 'end_date' => '2012-11-10' ) );
+                $this->assertEquals( array( $post_before ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_with_certain_category_if_category_arg_is_passed() {
+                $category_id = $this->factory->category->create( array( 'name' => 'baba' ) );
+                $post_with_category = $this->factory->post->create( array( 'post_category' => array( $category_id ) ) );
+                $post_without = $this->factory->post->create();
+                $export = new WP_WXR_Export( array( 'post_type' => 'post', 'category' => 'baba' ) );
+                $this->assertEquals( array( $post_with_category ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_only_posts_with_certain_category_id_if_category_arg_is_passed() {
+                $category_id = $this->factory->category->create( array( 'name' => 'baba' ) );
+                $post_with_category = $this->factory->post->create( array( 'post_category' => array( $category_id ) ) );
+                $post_without = $this->factory->post->create();
+                $export = new WP_WXR_Export( array( 'post_type' => 'post', 'category' => $category_id ) );
+                $this->assertEquals( array( $post_with_category ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_filter_posts_by_category_only_for_post_post_type() {
+                $category_id = $this->factory->category->create( array( 'name' => 'baba' ) );
+                $post_with_category = $this->factory->post->create( array( 'post_category' => array( $category_id ) ) );
+                $post_without = $this->factory->post->create();
+                $different_post_type = $this->factory->post->create( array( 'post_type' => 'page' ) );
+                $export = new WP_WXR_Export( array( 'category' => $category_id ) );
+                $this->assertEqualSets( array( $post_with_category, $post_without, $different_post_type ), $export->post_ids() );
+        }
+
+        function test_WP_WXR_Export_should_include_attachments_of_posts_if_we_are_filtering_only_some_post_types() {
+                register_post_type( 'baba' );
+                $post_id = $this->factory->post->create( array( 'post_type' => 'baba' ) );
+                $attachment_post_id = $this->factory->post->create( array( 'post_type' => 'attachment', 'post_parent' => $post_id ) );
+                $export = new WP_WXR_Export( array( 'post_type' => 'baba' ) );
+                $this->assertEquals( array( $post_id, $attachment_post_id ), $export->post_ids() );
+                _unregister_post_type( 'baba' );
+        }
+
+        function test_export_using_writer_class_returns_wp_error_if_the_writer_throws_wxr_exception() {
+                $export = new WP_WXR_Export();
+                $this->assertTrue( is_wp_error( $export->export_using_writer_class( 'Test_WP_WXR_Stub_Writer_Throws_WXR_Exception' ) ) );
+        }
+
+        function test_export_using_writer_class_passes_the_exception_if_the_writer_throws_other_exception() {
+                $this->setExpectedException( 'Exception' );
+                $export = new WP_WXR_Export();
+                $export->export_using_writer_class( 'Test_WP_WXR_Stub_Writer_Throws_Other_Exception' );
+        }
+
+        function test_authors_should_return_list_of_users_for_each_post_author() {
+                $user_id = $this->factory->user->create();
+                $this->factory->post->create( array( 'post_author' => $user_id ) );
+                $export = new WP_WXR_Export();
+                $authors = $export->authors();
+                $this->assertEquals( 1, count( $authors ) );
+                $this->assertEquals( $user_id, $authors[0]->ID );
+        }
+
+        function test_authors_should_skip_non_existing_authors() {
+                $this->factory->post->create( array( 'post_author' => 11 ) );
+                $export = new WP_WXR_Export();
+                $this->assertEquals( array(), $export->authors() );
+        }
+
+        function test_authors_should_skip_auto_draft_authors() {
+                $user_id = $this->factory->user->create();
+                $this->factory->post->create( array( 'post_author' => $user_id, 'post_status' => 'auto-draft' ) );
+                $export = new WP_WXR_Export();
+                $this->assertEquals( array(), $export->authors() );
+        }
+
+        function test_categories_should_return_only_the_category_we_are_filtering_on() {
+                $category_id = $this->factory->category->create( array( 'name' => 'baba' ) );
+                $other_category_id = $this->factory->category->create( array( 'name' => 'dyado' ) );
+                $export = new WP_WXR_Export( array( 'post_type' => 'post', 'category' => $category_id ) );
+                $this->assertEquals( 1, count( $export->categories() ) );
+        }
+
+        function test_categories_should_return_no_categories_if_we_are_requesting_only_one_post_type() {
+                $category_id = $this->factory->category->create();
+                $export = new WP_WXR_Export( array( 'post_type' => 'post' ) );
+                $this->assertEquals( array(), $export->categories() );
+        }
+
+        function test_categories_should_return_all_categories_if_we_are_requesting_all_post_types() {
+                $category_id = $this->factory->category->create();
+                $another_category_id = $this->factory->category->create();
+                $export = new WP_WXR_Export();
+                $this->assertEqualSets( array( 1, $category_id, $another_category_id ), self::get_term_ids( $export->categories() ) );
+        }
+
+        function test_categories_should_not_return_a_child_before_its_parent_category() {
+                $child_category_id = $this->factory->category->create();
+                $top_category_id = $this->factory->category->create();
+                wp_update_term( $child_category_id, 'category', array( 'parent' => $top_category_id ) );
+                $export = new WP_WXR_Export();
+                $this->assertNoChildBeforeParent( $export->categories() );
+        }
+
+        function test_tags_should_return_all_tags() {
+                $tag_id = $this->factory->tag->create();
+                $export = new WP_WXR_Export();
+                $this->assertEquals( array( $tag_id ), self::get_term_ids( $export->tags() ) );
+        }
+
+        function test_tags_should_return_no_tags_if_we_are_requesting_only_one_post_type() {
+                $category_id = $this->factory->tag->create();
+                $export = new WP_WXR_Export( array( 'post_type' => 'post' ) );
+                $this->assertEquals( array(), $export->tags() );
+        }
+
+        function test_custom_taxonomies_terms_should_return_all_terms() {
+                register_taxonomy( 'taxonomy_all', 'post' );
+                $term_id = $this->factory->term->create( array( 'taxonomy' => 'taxonomy_all' ) );
+                $export = new WP_WXR_Export();
+                $this->assertEquals( array( $term_id ), self::get_term_ids( $export->custom_taxonomies_terms() ) );
+                _unregister_taxonomy( 'taxonomy_all' );
+        }
+
+        function test_custom_taxonomes_terms_should_return_no_terms_if_we_are_requesting_only_one_post_type() {
+                register_taxonomy( 'taxonomy_one_post_type', 'post' );
+                $term_id = $this->factory->term->create( array( 'taxonomy' => 'taxonomy_one_post_type' ) );
+                $export = new WP_WXR_Export( array( 'post_type' => 'post' ) );
+                $this->assertEquals( array(), $export->custom_taxonomies_terms() );
+                _unregister_taxonomy( 'taxonomy_one_post_type' );
+        }
+
+        function test_custom_taxonomies_terms_should_not_return_a_child_before_its_parent_term() {
+                register_taxonomy( 'heir', 'post', array( 'hierarchical' => true ) );
+                $child_term_id = $this->factory->term->create( array( 'taxonomy' => 'heir' ) );
+                $top_term_id = $this->factory->term->create( array( 'taxonomy' => 'heir' ) );
+                wp_update_term( $child_term_id, 'heir', array( 'parent' => $top_term_id ) );
+                $export = new WP_WXR_Export();
+                $this->assertNoChildBeforeParent( $export->custom_taxonomies_terms() );
+                _unregister_taxonomy( 'heir' );
+        }
+
+        private function assertNoChildBeforeParent( $terms ) {
+                $visited = array();
+                foreach( $terms as $term ) {
+                        $this->assertTrue( isset( $visited[$term->parent] ) || !$term->parent );
+                        $visited[$term->term_id] = true;
+                }
+        }
+
+        private static function get_term_ids( $terms ) {
+                return array_values( array_map( function( $c ) {
+                        return intval( $c->term_id );
+                }, $terms ) );
+        }
+}
+
+class Test_WP_WXR_Stub_Writer_Throws_WXR_Exception {
+        function __construct( $xml_generator ) {
+        }
+        function export() {
+                throw new WP_WXR_Exception( 'baba' );
+        }
+}
+
+class Test_WP_WXR_Stub_Writer_Throws_Other_Exception {
+        function __construct( $xml_generator ) {
+        }
+        function export() {
+                throw new Exception( 'baba' );
+        }
+}
</ins></span></pre></div>
<a id="trunktestsexportwritersphp"></a>
<div class="addfile"><h4>Added: trunk/tests/export/writers.php (0 => 1130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/tests/export/writers.php         (rev 0)
+++ trunk/tests/export/writers.php        2012-11-13 18:00:21 UTC (rev 1130)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+<?php
+
+/**
+ * Test WP_WXR_*_Writer classes
+ *
+ * @group export
+ * @ticket 22435
+ */
+class Test_WP_WXR_Writers extends WP_UnitTestCase {
+        function test_xml_returner_returns_all_the_return_values() {
+                $returner = new WP_WXR_Returner( $this->get_x_generator() );
+                $this->assertEquals( 'xxx' , $returner->export() );
+        }
+
+        private function get_x_generator() {
+                $methods = array( 'before_posts', 'posts', 'after_posts' );
+                $xml_generator = $this->getMock( 'WP_WXR_XML_Generator', $methods, array( null ) );
+                foreach( $methods as $method ) {
+                        $return = 'posts' == $method? array( 'x' ) : 'x';
+                        $xml_generator->expects( $this->once() )->method( $method )->with()->will( $this->returnValue( $return ) );
+                }
+                return $xml_generator;
+        }
+}
+
</ins></span></pre></div>
<a id="trunktestsiteratorsphp"></a>
<div class="addfile"><h4>Added: trunk/tests/iterators.php (0 => 1130)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/tests/iterators.php         (rev 0)
+++ trunk/tests/iterators.php        2012-11-13 18:00:21 UTC (rev 1130)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+<?php
+
+/**
+ * @ticket 22435
+ */
+class Test_WP_Post_IDs_Iterator extends WP_UnitTestCase {
+        function test_create() {
+                new WP_Post_IDs_Iterator( array( 1, 2, 3 ) );
+        }
+
+        function test_no_posts() {
+                $this->assertIteratorReturnsSamePostIDs( array() );
+        }
+
+        function test_less_ids_than_limit() {
+                $post_id_0 = $this->factory->post->create();
+                $post_id_1 = $this->factory->post->create();
+                $this->assertIteratorReturnsSamePostIDs( array( $post_id_0, $post_id_1 ), 10 );
+        }
+
+        function test_ids_exactly_as_limit() {
+                $post_id_0 = $this->factory->post->create();
+                $post_id_1 = $this->factory->post->create();
+                $this->assertIteratorReturnsSamePostIDs( array( $post_id_0, $post_id_1 ), 2 );
+        }
+
+        function test_more_ids_than_limit() {
+                $post_id_0 = $this->factory->post->create();
+                $post_id_1 = $this->factory->post->create();
+                $post_id_2 = $this->factory->post->create();
+                $this->assertIteratorReturnsSamePostIDs( array( $post_id_0, $post_id_1, $post_id_2 ), 2 );
+        }
+
+        function test_ids_exactly_twice_more_than_limit() {
+                $post_id_0 = $this->factory->post->create();
+                $post_id_1 = $this->factory->post->create();
+                $post_id_2 = $this->factory->post->create();
+                $post_id_3 = $this->factory->post->create();
+                $this->assertIteratorReturnsSamePostIDs( array( $post_id_0, $post_id_1, $post_id_2, $post_id_3 ), 2 );
+        }
+
+        private function assertIteratorReturnsSamePostIDs( $post_ids, $limit = 2 ) {
+                $this->assertEquals( $post_ids, wp_list_pluck( iterator_to_array( new WP_Post_IDs_Iterator( $post_ids, $limit ) ), 'ID' ) );
+        }
+}
</ins></span></pre>
</div>
</div>
</body>
</html>