Current File : /home/jvzmxxx/wiki/extensions/Wikibase/lib/tests/phpunit/Changes/ChangeRowTest.php
<?php

namespace Wikibase\Lib\Tests\Changes;

use MediaWikiTestCase;
use MWException;
use Wikibase\ChangeRow;

/**
 * @covers Wikibase\ChangeRow
 *
 * @since 0.2
 *
 * @group Database
 * @group Wikibase
 * @group WikibaseLib
 * @group WikibaseChange
 *
 * @license GPL-2.0+
 * @author Thiemo Mättig
 */
class ChangeRowTest extends MediaWikiTestCase {

	public function testAgeCalculation() {
		$change = new ChangeRow( array( 'time' => date( 'YmdHis' ) ) );
		$age = $change->getAge();
		$this->assertInternalType( 'int', $age );
		$this->assertGreaterThanOrEqual( 0, $age );
	}

	public function testCanNotCalculateAgeWithoutTime() {
		$change = new ChangeRow();
		$this->setExpectedException( MWException::class );
		$change->getAge();
	}

	public function testReturnsTime() {
		$change = new ChangeRow( array( 'time' => '20130101000000' ) );
		$this->assertSame( '20130101000000', $change->getTime() );
	}

	public function testCanNotReturnTimeWithoutTime() {
		$change = new ChangeRow();
		$this->setExpectedException( MWException::class );
		$change->getTime();
	}

	public function testIsNotEmpty() {
		$change = new ChangeRow();
		$this->assertFalse( $change->isEmpty() );
	}

	public function testGetTypeReturnsChange() {
		$change = new ChangeRow();
		$this->assertSame( 'change', $change->getType() );
	}

	public function testReturnsObjectId() {
		$change = new ChangeRow( array( 'object_id' => 'Q1' ) );
		$this->assertSame( 'Q1', $change->getObjectId() );
	}

	public function testCanNotReturnDefaultObjectId() {
		$change = new ChangeRow();
		$this->setExpectedException( MWException::class );
		$change->getObjectId();
	}

	public function testReturnsExistingField() {
		$change = new ChangeRow( array( 'field' => 'value' ) );
		$this->assertSame( 'value', $change->getField( 'field' ) );
	}

	public function testReturnsDefaultForUnknownField() {
		$change = new ChangeRow();
		$this->assertSame( 'default', $change->getField( 'field', 'default' ) );
	}

	public function testCanNotReturnFieldWithoutDefault() {
		$change = new ChangeRow();
		$this->setExpectedException( MWException::class );
		$change->getField( 'field' );
	}

	public function testGetFieldUnserializesInfo() {
		$json = '{"field":"value"}';
		$expected = array( 'field' => 'value' );
		$change = new ChangeRow( array( 'info' => $json ) );
		$this->assertSame( $expected, $change->getField( 'info' ) );
	}

	public function testReturnsFields() {
		$change = new ChangeRow( array( 'field' => 'value' ) );
		$this->assertSame( array( 'id' => null, 'field' => 'value' ), $change->getFields() );
	}

	public function testGetFieldsUnserializesInfo() {
		$json = '{"field":"value"}';
		$expected = array( 'field' => 'value' );
		$change = new ChangeRow( array( 'info' => $json ) );
		$this->assertSame( array( 'id' => null, 'info' => $expected ), $change->getFields() );
	}

	public function testSerializes() {
		$info = array( 'field' => 'value' );
		$expected = '{"field":"value"}';
		$change = new ChangeRow();
		$this->assertSame( $expected, $change->serializeInfo( $info ) );
	}

	public function testDoesNotSerializeObjects() {
		$info = array( 'array' => array( 'object' => new ChangeRow() ) );
		$change = new ChangeRow();
		$this->setExpectedException( MWException::class );
		$change->serializeInfo( $info );
	}

	public function testUnserializesJson() {
		$json = '{"field":"value"}';
		$expected = array( 'field' => 'value' );
		$change = new ChangeRow();
		$this->assertSame( $expected, $change->unserializeInfo( $json ) );
	}

	public function testUnserializesPhpSerializations() {
		$serialization = 'a:1:{s:5:"field";s:5:"value";}';
		$expected = array( 'field' => 'value' );
		$change = new ChangeRow();
		$this->assertSame( $expected, $change->unserializeInfo( $serialization ) );
	}

	public function testCanNotUnserializeWithoutObjectId() {
		$change = new ChangeRow();
		$this->setExpectedException( MWException::class );
		$change->unserializeInfo( 's:5:"value";' );
	}

	public function testCanNotUnserializeNonArrays() {
		$change = new ChangeRow( array( 'object_id' => 'Q1' ) );

		\MediaWiki\suppressWarnings();
		$info = $change->unserializeInfo( 's:5:"value";' );
		\MediaWiki\restoreWarnings();

		$this->assertSame( array(), $info );
	}

	public function testSetsField() {
		$change = new ChangeRow();
		$change->setField( 'field', 'value' );
		$this->assertSame( 'value', $change->getField( 'field' ) );
	}

	public function testSetsFields() {
		$change = new ChangeRow();
		$change->setFields( array( 'field' => 'value' ) );
		$this->assertSame( 'value', $change->getField( 'field' ) );
	}

	public function testOverridesFieldsByDefault() {
		$change = new ChangeRow( array( 'field' => 'old' ) );
		$change->setFields( array( 'field' => 'new' ) );
		$this->assertSame( 'new', $change->getField( 'field' ) );
	}

	public function testDoesNotOverrideFields() {
		$change = new ChangeRow( array( 'field' => 'old' ) );
		$change->setFields( array( 'field' => 'new' ), false );
		$this->assertSame( 'old', $change->getField( 'field' ) );
	}

	public function testReturnsId() {
		$change = new ChangeRow( array( 'id' => 1 ) );
		$this->assertSame( 1, $change->getId() );
	}

	public function testDefaultIdIsNull() {
		$change = new ChangeRow();
		$this->assertNull( $change->getId() );
	}

	public function testHasKnownField() {
		$change = new ChangeRow( array( 'key' => 'value' ) );
		$this->assertTrue( $change->hasField( 'key' ) );
	}

	public function testDoesNotHaveUnknownField() {
		$change = new ChangeRow();
		$this->assertFalse( $change->hasField( 'unknown' ) );
	}

	public function testAlwaysHasIdField() {
		$change = new ChangeRow();
		$this->assertTrue( $change->hasField( 'id' ) );
	}

}