From 1f76570c46465729724bef44f8cfd49414691652 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 10 Jul 2019 12:53:06 -0700 Subject: [PATCH] Add ResultWrapper/FakeResultWrapper tests Bug: T227665 Change-Id: I0709d0fb55640756b19614552b42b6b8341959f4 --- .../resultwrapper/FakeResultWrapperTest.php | 69 +++++++++++ .../rdbms/resultwrapper/ResultWrapperTest.php | 112 ++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 tests/phpunit/includes/libs/rdbms/resultwrapper/FakeResultWrapperTest.php create mode 100644 tests/phpunit/includes/libs/rdbms/resultwrapper/ResultWrapperTest.php diff --git a/tests/phpunit/includes/libs/rdbms/resultwrapper/FakeResultWrapperTest.php b/tests/phpunit/includes/libs/rdbms/resultwrapper/FakeResultWrapperTest.php new file mode 100644 index 0000000000..cecdc715ac --- /dev/null +++ b/tests/phpunit/includes/libs/rdbms/resultwrapper/FakeResultWrapperTest.php @@ -0,0 +1,69 @@ + 1, 'colB' => 'a' ], + [ 'colA' => 2, 'colB' => 'b' ], + (object)[ 'colA' => 3, 'colB' => 'c' ], + [ 'colA' => 4, 'colB' => 'd' ], + [ 'colA' => 5, 'colB' => 'e' ], + (object)[ 'colA' => 6, 'colB' => 'f' ], + (object)[ 'colA' => 7, 'colB' => 'g' ], + [ 'colA' => 8, 'colB' => 'h' ] + ] ); + + $expectedRows = [ + 0 => (object)[ 'colA' => 1, 'colB' => 'a' ], + 1 => (object)[ 'colA' => 2, 'colB' => 'b' ], + 2 => (object)[ 'colA' => 3, 'colB' => 'c' ], + 3 => (object)[ 'colA' => 4, 'colB' => 'd' ], + 4 => (object)[ 'colA' => 5, 'colB' => 'e' ], + 5 => (object)[ 'colA' => 6, 'colB' => 'f' ], + 6 => (object)[ 'colA' => 7, 'colB' => 'g' ], + 7 => (object)[ 'colA' => 8, 'colB' => 'h' ] + ]; + + $this->assertEquals( 8, $res->numRows() ); + + $res->seek( 7 ); + $this->assertEquals( [ 'colA' => 8, 'colB' => 'h' ], $res->fetchRow() ); + $res->seek( 7 ); + $this->assertEquals( (object)[ 'colA' => 8, 'colB' => 'h' ], $res->fetchObject() ); + + $this->assertEquals( $expectedRows, iterator_to_array( $res, true ) ); + + $rows = []; + foreach ( $res as $i => $row ) { + $rows[$i] = $row; + } + $this->assertEquals( $expectedRows, $rows ); + } +} diff --git a/tests/phpunit/includes/libs/rdbms/resultwrapper/ResultWrapperTest.php b/tests/phpunit/includes/libs/rdbms/resultwrapper/ResultWrapperTest.php new file mode 100644 index 0000000000..ae619668ba --- /dev/null +++ b/tests/phpunit/includes/libs/rdbms/resultwrapper/ResultWrapperTest.php @@ -0,0 +1,112 @@ +getMockBuilder( IDatabase::class ) + ->disableOriginalConstructor() + ->getMock(); + $db->method( 'select' )->willReturnCallback( + function () use ( $db, $rows ) { + return new ResultWrapper( $db, $rows ); + } + ); + $db->method( 'dataSeek' )->willReturnCallback( + function ( ResultWrapper $res, $pos ) use ( $db ) { + // Position already set in ResultWrapper + } + ); + $db->method( 'fetchRow' )->willReturnCallback( + function ( ResultWrapper $res ) use ( $db ) { + $row = $res::unwrap( $res )[$res->key()] ?? false; + + return $row; + } + ); + $db->method( 'fetchObject' )->willReturnCallback( + function ( ResultWrapper $res ) use ( $db ) { + $row = $res::unwrap( $res )[$res->key()] ?? false; + + return $row ? (object)$row : false; + } + ); + $db->method( 'numRows' )->willReturnCallback( + function ( ResultWrapper $res ) use ( $db ) { + return count( $res::unwrap( $res ) ); + } + ); + + return $db; + } + + public function testIteration() { + $db = $this->getDatabaseMock( [ + [ 'colA' => 1, 'colB' => 'a' ], + [ 'colA' => 2, 'colB' => 'b' ], + [ 'colA' => 3, 'colB' => 'c' ], + [ 'colA' => 4, 'colB' => 'd' ], + [ 'colA' => 5, 'colB' => 'e' ], + [ 'colA' => 6, 'colB' => 'f' ], + [ 'colA' => 7, 'colB' => 'g' ], + [ 'colA' => 8, 'colB' => 'h' ] + ] ); + + $expectedRows = [ + 0 => (object)[ 'colA' => 1, 'colB' => 'a' ], + 1 => (object)[ 'colA' => 2, 'colB' => 'b' ], + 2 => (object)[ 'colA' => 3, 'colB' => 'c' ], + 3 => (object)[ 'colA' => 4, 'colB' => 'd' ], + 4 => (object)[ 'colA' => 5, 'colB' => 'e' ], + 5 => (object)[ 'colA' => 6, 'colB' => 'f' ], + 6 => (object)[ 'colA' => 7, 'colB' => 'g' ], + 7 => (object)[ 'colA' => 8, 'colB' => 'h' ] + ]; + + $res = $db->select( 'faketable', [ 'colA', 'colB' ], '1 = 1', __METHOD__ ); + $this->assertEquals( 8, $res->numRows() ); + + $res->seek( 7 ); + $this->assertEquals( [ 'colA' => 8, 'colB' => 'h' ], $res->fetchRow() ); + $res->seek( 7 ); + $this->assertEquals( (object)[ 'colA' => 8, 'colB' => 'h' ], $res->fetchObject() ); + + $this->assertEquals( $expectedRows, iterator_to_array( $res, true ) ); + + $rows = []; + foreach ( $res as $i => $row ) { + $rows[$i] = $row; + } + $this->assertEquals( $expectedRows, $rows ); + } +} -- 2.20.1