Current File : /home/jvzmxxx/wiki/extensions/Wikibase/repo/tests/phpunit/includes/Store/Sql/SqlChangeStoreTest.php
<?php

namespace Wikibase\Tests\Repo;

use RecentChange;
use Diff\DiffOp\Diff\Diff;
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\EntityChange;
use Wikibase\Repo\Store\Sql\SqlChangeStore;
use Wikibase\Repo\WikibaseRepo;

/**
 * @covers Wikibase\Repo\Store\Sql\SqlChangeStore
 *
 * @group Database
 *
 * @group Wikibase
 * @group WikibaseRepo
 * @group WikibaseChange
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 * @author Marius Hoch
 */
class SqlChangeStoreTest extends \MediaWikiTestCase {

	public function saveChangeInsertProvider() {
		$wikibaseRepo = WikibaseRepo::getDefaultInstance();
		$factory = $wikibaseRepo->getEntityChangeFactory();

		$time = wfTimestamp( TS_MW );

		$simpleChange = $factory->newForEntity( EntityChange::ADD, new ItemId( 'Q21389475' ) );

		$changeWithDiff = $factory->newForEntity( EntityChange::REMOVE, new ItemId( 'Q42' ) );
		$changeWithDiff->setField( 'time', $time );
		$changeWithDiff->setDiff( new Diff() );

		$rc = new RecentChange();
		$rc->setAttribs( array(
			'rc_user' => 34,
			'rc_user_text' => 'BlackMagicIsEvil',
			'rc_timestamp' => $time,
			'rc_bot' => 0,
			'rc_cur_id' => 2354,
			'rc_this_oldid' => 343,
			'rc_last_oldid' => 897,
			'rc_comment' => 'Fake data!'
		) );

		$changeWithDataFromRC = $factory->newForEntity( EntityChange::REMOVE, new ItemId( 'Q123' ) );
		$changeWithDataFromRC->setMetadataFromRC( $rc );

		return array(
			'Simple change' => array(
				array(
					'change_type' => 'wikibase-item~add',
					'change_time' => $time,
					'change_object_id' => 'q21389475',
					'change_revision_id' => '0',
					'change_user_id' => '0',
					'change_info' => '[]',
				),
				$simpleChange
			),
			'Change with a diff' => array(
				array(
					'change_type' => 'wikibase-item~remove',
					'change_time' => $time,
					'change_object_id' => 'q42',
					'change_revision_id' => '0',
					'change_user_id' => '0',
					'change_info' => '{"diff":{"type":"diff","isassoc":null,"operations":[]}}',
				),
				$changeWithDiff
			),
			'Change with data from RC' => array(
				array(
					'change_type' => 'wikibase-item~remove',
					'change_time' => $time,
					'change_object_id' => 'q123',
					'change_revision_id' => '343',
					'change_user_id' => '34',
					'change_info' => '{"metadata":{"user_text":"BlackMagicIsEvil","bot":0,"page_id":2354,"rev_id":343,' .
						'"parent_id":897,"comment":"Fake data!"}}',
				),
				$changeWithDataFromRC
			)
		);
	}

	/**
	 * @dataProvider saveChangeInsertProvider
	 */
	public function testSaveChange_insert( array $expected, EntityChange $change ) {
		$db = wfGetDB( DB_MASTER );

		$db->delete( 'wb_changes', '*', __METHOD__ );
		$this->tablesUsed[] = 'wb_changes';

		$store = new SqlChangeStore( wfGetLB() );
		$store->saveChange( $change );

		$res = $db->select( 'wb_changes', '*', array(), __METHOD__ );

		$this->assertEquals( 1, $res->numRows(), 'row count' );

		$row = (array)$res->current();
		$this->assertTrue( is_numeric( $row['change_id'] ) );

		$this->assertEquals(
			// wfTimestamp returns string, assertEquals/$delta requires int
			(int) wfTimestamp( TS_UNIX, $expected['change_time'] ),
			(int) wfTimestamp( TS_UNIX, $row['change_time'] ),
			'Change time',
			60 * 60 // 1 hour
		);

		unset( $row['change_id'] );
		unset( $row['change_time'] );
		unset( $expected['change_time'] );

		$this->assertEquals( $expected, $row );

		$this->assertType( 'int', $change->getId() );
	}

	public function testSaveChange_update() {
		$db = wfGetDB( DB_MASTER );

		$db->delete( 'wb_changes', '*', __METHOD__ );
		$this->tablesUsed[] = 'wb_changes';

		$wikibaseRepo = WikibaseRepo::getDefaultInstance();
		$factory = $wikibaseRepo->getEntityChangeFactory();

		$change = $factory->newForEntity( EntityChange::ADD, new ItemId( 'Q21389475' ) );
		$change->setField( 'time', wfTimestampNow() );

		$store = new SqlChangeStore( wfGetLB() );
		$store->saveChange( $change );
		$expected = array(
			'change_id' => (string)$change->getId(),
			'change_type' => 'wikibase-item~add',
			'change_time' => '20121026200049',
			'change_object_id' => 'q21389475',
			'change_revision_id' => '0',
			'change_user_id' => '0',
			'change_info' => '[]',
		);

		$change->setField( 'time', '20121026200049' );
		$store->saveChange( $change );

		$res = $db->select( 'wb_changes', '*', array(), __METHOD__ );

		$this->assertEquals( 1, $res->numRows(), 'row count' );

		$row = (array)$res->current();

		$this->assertEquals( $expected, $row );
	}

}