Current File : /home/jvzmxxx/wiki1/extensions/Flow/tests/phpunit/Import/TalkpageImportOperationTest.php
<?php

namespace Flow\Tests\Import;

use Flow\Container;
use Flow\Import\SourceStore\Null as NullImportSourceStore;
use Flow\Import\PageImportState;
use Flow\Import\Postprocessor\ProcessorGroup;
use Flow\Import\TalkpageImportOperation;
use Flow\Model\Header;
use Flow\Model\PostRevision;
use Flow\Model\PostSummary;
use Flow\Model\TopicListEntry;
use Flow\Model\Workflow;
use Flow\Tests\Mock\MockImportHeader;
use Flow\Tests\Mock\MockImportPost;
use Flow\Tests\Mock\MockImportRevision;
use Flow\Tests\Mock\MockImportSource;
use Flow\Tests\Mock\MockImportSummary;
use Flow\Tests\Mock\MockImportTopic;
use Psr\Log\NullLogger;
use SplQueue;
use Title;
use User;

/**
 * @group Flow
 * @group Database
 */
class TalkpageImportOperationTest extends \MediaWikiTestCase {
	protected $tablesUsed = array(
		// importer will ensureFlowRevision(), which will insert into these core tables
		'page',
		'revision',
		'text',
	);

	protected function setUp() {
		parent::setUp();

		// reset flow state, so everything ($container['permissions'])
		// uses this particular $user
		\FlowHooks::resetFlowExtension();
		Container::reset();
		$container = Container::getContainer();
		$container['user'] = User::newFromName( '127.0.0.1', false );
	}

	/**
	 * This is a horrible test, it basically runs the whole thing
	 * and sees if it falls over.
	 */
	public function testImportDoesntCompletelyFail() {
		$workflow = Workflow::create(
			'discussion',
			Title::newFromText( 'TalkpageImportOperationTest' )
		);
		$storage = $this->getMockBuilder( 'Flow\Data\ManagerGroup' )
			->disableOriginalConstructor()
			->getMock();
		$stored = array();
		$storage->expects( $this->any() )
			->method( 'put' )
			->will( $this->returnCallback( function( $obj ) use( &$stored ) {
				$stored[] = $obj;
			} ) );
		$storage->expects( $this->any() )
			->method( 'multiPut' )
			->will( $this->returnCallback( function( $objs ) use( &$stored ) {
				$stored = array_merge( $stored, $objs );
			} ) );

		$now = time();
		$source = new MockImportSource(
			new MockImportHeader( array(
				// header revisions
				new MockImportRevision( array( 'createdTimestamp' => $now ) ),
			) ),
			array(
				new MockImportTopic(
					new MockImportSummary( array(
						new MockImportRevision( array( 'createdTimestamp' => $now - 250 ) ),
					) ),
					array(
						// topic title revisions
						new MockImportRevision( array( 'createdTimestamp' => $now - 1000 ) ),
					),
					array(
						//replies
						new MockImportPost(
							array(
								// revisions
								new MockImportRevision( array( 'createdTimestmap' => $now - 1000 ) ),
							),
							array(
								// replies
								new MockImportPost(
									array(
										// revisions
										new MockImportRevision( array(
											'createdTimestmap' => $now - 500,
											'user' => User::newFromNAme( '10.0.0.2', false ),
										) ),
									),
									array(
										// replies
									)
								),
							)
						),
					)
				)
			)
		);

		$op = new TalkpageImportOperation( $source, Container::get( 'occupation_controller' ) );
		$store = new NullImportSourceStore;
		$op->import( new PageImportState(
			$workflow,
			$storage,
			$store,
			new NullLogger(),
			$this->getMockBuilder( 'Flow\Data\BufferedCache' )
				->disableOriginalConstructor()
				->getMock(),
			Container::get( 'db.factory' ),
			new ProcessorGroup,
			new SplQueue
		) );

		// Count what actually came through
		$storedHeader = $storedDiscussion = $storedTopics = $storedTopicListEntry = $storedSummary = $storedPosts = 0;
		foreach ( $stored as $obj ) {
			if ( $obj instanceof Workflow ) {
				if ( $obj->getType() === 'discussion' ) {
					$this->assertSame( $workflow, $obj );
					$storedDiscussion++;
				} else {
					$alpha = $obj->getId()->getAlphadecimal();
					if ( !isset( $seenWorkflow[$alpha] ) ) {
						$seenWorkflow[$alpha] = true;
						$this->assertEquals( 'topic', $obj->getType() );
						$storedTopics++;
						$topicWorkflow = $obj;
					}
				}
			} elseif ( $obj instanceof PostSummary ) {
				$storedSummary++;
			} elseif ( $obj instanceof PostRevision ) {
				$storedPosts++;
				if ( $obj->isTopicTitle() ) {
					$topicTitle = $obj;
				}
			} elseif ( $obj instanceof TopicListEntry ) {
				$storedTopicListEntry++;
			} elseif ( $obj instanceof Header ) {
				$storedHeader++;
			} else {
				$this->fail( 'Unexpected object stored:' . get_class( $obj ) );
			}
		}

		// Verify we wrote the expected objects to storage

		$this->assertEquals( 1, $storedHeader );

		$this->assertEquals( 1, $storedDiscussion );
		$this->assertEquals( 1, $storedTopics );
		$this->assertEquals( 1, $storedTopicListEntry );
		$this->assertEquals( 1, $storedSummary );
		$this->assertEquals( 3, $storedPosts );

		// This total expected number of insertions should match the sum of the left assertEquals parameters above.
		$this->assertCount( 8, array_unique( array_map( 'spl_object_hash', $stored ) ) );

		// Other special cases we need to check
		$this->assertTrue(
			$topicTitle->getPostId()->equals( $topicWorkflow->getId() ),
			'Root post id must match its workflow'
		);
	}
}