Current File : /home/jvzmxxx/wiki1/extensions/Flow/tests/phpunit/api/ApiFlowViewTopicListTest.php
<?php

namespace Flow\Tests\Api;

use Flow\Model\UUID;
use Title;

/**
 * @group Flow
 * @group medium
 */
class ApiFlowViewTopicListTest extends ApiTestCase {
	const TITLE_PREFIX = 'VTL Test ';

	public function testTocOnly() {
		$topicData = array();
		for ( $i = 0; $i < 3; $i++ ) {
			$title = self::TITLE_PREFIX . $i;
			$topic = $this->createTopic( $title );
			$data = $this->doApiRequest( array(
				'page' => $topic['topic-page'],
				'action' => 'flow',
				'submodule' => 'view-topic',
			) );

			$topicData[$i]['response'] = $data[0]['flow']['view-topic']['result']['topic'];
			$topicData[$i]['page'] = $topic['topic-page'];
			$topicData[$i]['id'] = $topic['topic-id'];
			$topicData[$i]['revisionId'] = $topic['topic-revision-id'];
			$actualRevision = $topicData[$i]['response']['revisions'][$topicData[$i]['revisionId']];
			$topicData[$i]['expectedRevision'] = array(
				'content' => array(
					'content' => $title,
					'format' => 'topic-title-wikitext',
					'plaintext' => $title,
				),
				// This last_updated is used for the 'newest' test, then later changed for 'updated' test.
				'last_updated' => $actualRevision['last_updated'],
				'isModerated' => false,
			);
		}

		$flowQaTitle = Title::newFromText( 'Talk:Flow_QA' );

		$expectedCommonResponse = array(
			'flow' => array(
				'view-topiclist' => array(
					'result' => array(
						'topiclist' => array(
							'submitted' => array(
								'savesortby' => false,
								'offset-dir' => 'fwd',
								'offset-id' => null,
								'offset' => null,
								'limit' => 2,
								'toconly' => true,
								'include-offset' => false,
								'format' => 'fixed-html',
							),
							'errors' => array(),
							'type' => 'topiclist',
						),
					),
					'status' => 'ok',
				),
			),
		);

		$expectedEmptyPageResponse = array_merge_recursive( array(
			'flow' => array(
				'view-topiclist' => array(
					'result' => array(
						'topiclist' => array(
							'submitted' => array(
								'sortby' => 'newest',
							),
							'sortby' => 'newest',
							'roots' => array(),
							'posts' => array(),
							'revisions' => array(),
							'links' => array(
								'pagination' => array(),
							),
						),
					),
				),
			),
		), $expectedCommonResponse );

		$actualEmptyPageResponse = $this->doApiRequest(
			array(
				'action' => 'flow',
				'page' => 'Talk:Intentionally blank',
				'submodule' => 'view-topiclist',
				'vtllimit' => 2,
				'vtlsortby' => 'newest',
				'vtltoconly' => true,
				'vtlformat' => 'fixed-html',
			)
		);
		$actualEmptyPageResponse = $actualEmptyPageResponse[0];

		$this->assertEquals(
			$expectedEmptyPageResponse,
			$actualEmptyPageResponse,
			'TOC-only output for an empty, but occupied, Flow board'
		);

		$expectedNewestResponse = array_merge_recursive( array(
			'flow' => array(
				'view-topiclist' => array(
					'result' => array(
						'topiclist' => array(
							'submitted' => array(
								'sortby' => 'newest',
							),
							'sortby' => 'newest',
							'roots' => array(
								$topicData[2]['id'],
								$topicData[1]['id'],
							),
							'posts' => array(
								$topicData[2]['id'] => $topicData[2]['response']['posts'][$topicData[2]['id']],
								$topicData[1]['id'] => $topicData[1]['response']['posts'][$topicData[1]['id']],
							),
							'revisions' => array(
								$topicData[2]['revisionId'] => $topicData[2]['expectedRevision'],
								$topicData[1]['revisionId'] => $topicData[1]['expectedRevision'],
							),
							'links' => array(
								'pagination' => array(
									'fwd' => array(
										'url' => $flowQaTitle->getLinkURL( array(
											'topiclist_offset-dir' => 'fwd',
											'topiclist_limit' => '2',
											'topiclist_offset-id' => $topicData[1]['id'],
											'topiclist_sortby' => 'newest',
										) ),
										'title' => 'fwd',
										'text' => 'fwd',
									),
								),
							),
						),
					)
				)
			)
		), $expectedCommonResponse );

		$actualNewestResponse = $this->doApiRequest(
			array(
				'action' => 'flow',
				'page' => 'Talk:Flow QA',
				'submodule' => 'view-topiclist',
				'vtllimit' => 2,
				'vtlsortby' => 'newest',
				'vtltoconly' => true,
				'vtlformat' => 'fixed-html',
			)
		);
		$actualNewestResponse = $actualNewestResponse[0];

		$this->assertEquals(
			$expectedNewestResponse,
			$actualNewestResponse,
			'TOC-only output for "newest" order'
		);

		// Make it so update order is chronologically (1, 0, 2)
		// We then expect it to be returned reverse chronologically (2, 0)

		$updateList = array( 1, 0, 2 );

		foreach ( $updateList as $updateListInd => $topicDataInd ) {
			$replyResponse = $this->doApiRequest(
				array(
					'action' => 'flow',
					'page' => $topicData[$topicDataInd]['page'],
					'submodule' => 'reply',
					'token' => $this->getEditToken(),
					'repreplyTo' => $topicData[$topicDataInd]['id'],
					'repcontent' => "Reply to topic $topicDataInd",
				)
			);

			// This is because we use timestamps with second granularity.
			// Without this, the timestamp can be exactly the same
			// for two topics, which means the ordering is undefined (and thus
			// untestable).  This was causing failures on Jenkins.
			//
			// Possible improvement: Make a simple class for getting the current
			// time that normally calls wfTimestampNow.  Have an alternative
			// implementation for tests that can be controlled by an API like
			// http://sinonjs.org/ (which we use on the client side).
			// Pimple can be in charge of which is used.
			if ( $updateListInd !== ( count( $updateList ) - 1 ) ) {
				sleep( 1 );
			}

			$newPostId = $replyResponse[0]['flow']['reply']['committed']['topic']['post-id'];
			$topicData[$topicDataInd]['updateTimestamp'] = UUID::create( $newPostId )->getTimestamp();
			$topicData[$topicDataInd]['expectedRevision']['last_updated'] = wfTimestamp( TS_UNIX, $topicData[$topicDataInd]['updateTimestamp'] ) * 1000;
		}

		$expectedUpdatedResponse = array_merge_recursive( array(
			'flow' => array(
				'view-topiclist' => array(
					'result' => array(
						'topiclist' => array(
							'submitted' => array(
								'sortby' => 'updated',
							),
							'sortby' => 'updated',
							'roots' => array(
								$topicData[2]['id'],
								$topicData[0]['id'],
							),
							'posts' => array(
								$topicData[2]['id'] => $topicData[2]['response']['posts'][$topicData[2]['id']],
								$topicData[0]['id'] => $topicData[0]['response']['posts'][$topicData[0]['id']],
							),
							'revisions' => array(
								$topicData[2]['revisionId'] => $topicData[2]['expectedRevision'],
								$topicData[0]['revisionId'] => $topicData[0]['expectedRevision'],
							),
							'links' => array(
								'pagination' => array(
									'fwd' => array(
										'url' => $flowQaTitle->getLinkURL( array(
											'topiclist_offset-dir' => 'fwd',
											'topiclist_limit' => '2',
											'topiclist_offset' => $topicData[0]['updateTimestamp'],
											'topiclist_sortby' => 'updated',
										) ),
										'title' => 'fwd',
										'text' => 'fwd',
									),
								),
							),
						),
					)
				)
			)
		), $expectedCommonResponse );

		$actualUpdatedResponse = $this->doApiRequest(
			array(
				'action' => 'flow',
				'page' => 'Talk:Flow QA',
				'submodule' => 'view-topiclist',
				'vtllimit' => 2,
				'vtlsortby' => 'updated',
				'vtltoconly' => true,
				'vtlformat' => 'fixed-html',
			)
		);
		$actualUpdatedResponse = $actualUpdatedResponse[0];

		$this->assertEquals(
			$expectedUpdatedResponse,
			$actualUpdatedResponse,
			'TOC-only output for "updated" order'
		);
	}
}