*/ abstract class ORMRowTest extends \MediaWikiTestCase { /** * @since 1.20 * @return string */ abstract protected function getRowClass(); /** * @since 1.20 * @return IORMTable */ abstract protected function getTableInstance(); /** * @since 1.20 * @return array */ abstract public function constructorTestProvider(); /** * @since 1.20 * @param IORMRow $row * @param array $data */ protected function verifyFields( IORMRow $row, array $data ) { foreach ( array_keys( $data ) as $fieldName ) { $this->assertEquals( $data[$fieldName], $row->getField( $fieldName ) ); } } /** * @since 1.20 * @param array $data * @param bool $loadDefaults * @return IORMRow */ protected function getRowInstance( array $data, $loadDefaults ) { $class = $this->getRowClass(); return new $class( $this->getTableInstance(), $data, $loadDefaults ); } /** * @since 1.20 * @return array */ protected function getMockValues() { return array( 'id' => 1, 'str' => 'foobar4645645', 'int' => 42, 'float' => 4.2, 'bool' => true, 'array' => array( 42, 'foobar' ), 'blob' => new stdClass() ); } /** * @since 1.20 * @return array */ protected function getMockFields() { $mockValues = $this->getMockValues(); $mockFields = array(); foreach ( $this->getTableInstance()->getFields() as $name => $type ) { if ( $name !== 'id' ) { $mockFields[$name] = $mockValues[$type]; } } return $mockFields; } /** * @since 1.20 * @return array Array of IORMRow */ public function instanceProvider() { $instances = array(); foreach ( $this->constructorTestProvider() as $arguments ) { $instances[] = array( call_user_func_array( array( $this, 'getRowInstance' ), $arguments ) ); } return $instances; } /** * @dataProvider constructorTestProvider */ public function testConstructor( array $data, $loadDefaults ) { $this->verifyFields( $this->getRowInstance( $data, $loadDefaults ), $data ); } /** * @dataProvider constructorTestProvider */ public function testSaveAndRemove( array $data, $loadDefaults ) { $item = $this->getRowInstance( $data, $loadDefaults ); $this->assertTrue( $item->save() ); $this->assertTrue( $item->hasIdField() ); $this->assertTrue( is_integer( $item->getId() ) ); $id = $item->getId(); $this->assertTrue( $item->save() ); $this->assertEquals( $id, $item->getId() ); $this->verifyFields( $item, $data ); $this->assertTrue( $item->remove() ); $this->assertFalse( $item->hasIdField() ); $this->assertTrue( $item->save() ); $this->verifyFields( $item, $data ); $this->assertTrue( $item->remove() ); $this->assertFalse( $item->hasIdField() ); $this->verifyFields( $item, $data ); } /** * @dataProvider instanceProvider */ public function testSetField( IORMRow $item ) { foreach ( $this->getMockFields() as $name => $value ) { $item->setField( $name, $value ); $this->assertEquals( $value, $item->getField( $name ) ); } } /** * @since 1.20 * @param array $expected * @param IORMRow $item */ protected function assertFieldValues( array $expected, IORMRow $item ) { foreach ( $expected as $name => $type ) { if ( $name !== 'id' ) { $this->assertEquals( $expected[$name], $item->getField( $name ) ); } } } /** * @dataProvider instanceProvider */ public function testSetFields( IORMRow $item ) { $originalValues = $item->getFields(); $item->setFields( array(), false ); foreach ( $item->getTable()->getFields() as $name => $type ) { $originalHas = array_key_exists( $name, $originalValues ); $newHas = $item->hasField( $name ); $this->assertEquals( $originalHas, $newHas ); if ( $originalHas && $newHas ) { $this->assertEquals( $originalValues[$name], $item->getField( $name ) ); } } $mockFields = $this->getMockFields(); $item->setFields( $mockFields, false ); $this->assertFieldValues( $originalValues, $item ); $item->setFields( $mockFields, true ); $this->assertFieldValues( $mockFields, $item ); } // TODO: test all of the methods! }