123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?php
- class Elgg_DatabaseTest extends PHPUnit_Framework_TestCase {
-
- private $dbClass, $configClass;
- /**
- * Inspect instances in DI container to get correct classnames for
- * Database API.
- */
- public function setUp() {
- // Database class
- // Cannot user _elgg_services() because ElggEntityTest replace
- // the database instance with a mock.
- $db = _elgg_create_service_provider()->db;
- $this->dbClass = get_class($db);
-
- // Config class
- $reflectionClass = new ReflectionClass($db);
- $reflectionProperty = $reflectionClass->getProperty('config');
- if (method_exists($reflectionProperty, 'setAccessible')) {
- $reflectionProperty->setAccessible(true);
- $config = $reflectionProperty->getValue($db);
- $this->configClass = get_class($config);
- } else {
- $this->configClass = 'Elgg_Database_Config';
- }
- }
-
- /**
- * @dataProvider scriptsWithOneStatement
- */
- public function test_runSqlScript_withOneStatement($script) {
- $db = $this->getDbMock();
- $db->expects($this->exactly(1))
- ->method('updateData')
- ->with($this->matchesRegularExpression("/^INSERT INTO test_sometable \(`key`\)\sVALUES \('Value(?: -- not a comment)?'\)$/"));
- $db->runSqlScript($this->getFixture($script));
- }
- public function scriptsWithOneStatement() {
- return array(
- array('one_statement.sql'),
- array('one_statement_multiline.sql'),
- array('one_statement_with_comments.sql'),
- );
- }
-
- /**
- * @dataProvider scriptsWithMultipleStatements
- * @todo Use @see withConsecutive() to test consecutive method calls after upgrading to PHPUnit 4.
- */
- public function test_runSqlScript_withMultipleStatements($script) {
- // Verify that exactly three statements are executed
- $db1 = $this->getDbMock();
- $db1->expects($this->exactly(3))->method('updateData');
- $db1->runSqlScript($this->getFixture($script));
- // Verify that executed statements matches fixtures
- $db2 = $this->getDbMock();
- $this->expectExecutedStatement($db2, 0, $this->matches("INSERT INTO test_sometable (`key`) VALUES ('Value 1')"));
- $this->expectExecutedStatement($db2, 1, $this->matchesRegularExpression("/^UPDATE test_sometable\s+SET `key` = 'Value 2'\s+WHERE `key` = 'Value 1'$/"));
- $this->expectExecutedStatement($db2, 2, $this->matches("INSERT INTO test_sometable (`key`) VALUES ('Value 3')"));
- $db2->runSqlScript($this->getFixture($script));
- }
-
- public function scriptsWithMultipleStatements() {
- return array(
- array('multiple_statements.sql'),
- array('multiple_statements_with_comments.sql'),
- );
- }
- public function testFingerprintingOfCallbacks() {
- $db = $this->getDbMock();
- $prints = array();
- $uniques = 0;
- $prints[$db->fingerprintCallback('foo')] = true;
- $uniques++;
- $prints[$db->fingerprintCallback('foo::bar')] = true;
- $prints[$db->fingerprintCallback(array('foo', 'bar'))] = true;
- $uniques++;
- $obj1 = new Elgg_DatabaseTestObj();
- $prints[$db->fingerprintCallback(array($obj1, '__invoke'))] = true;
- $prints[$db->fingerprintCallback($obj1)] = true;
- $uniques++;
- $obj2 = new Elgg_DatabaseTestObj();
- $prints[$db->fingerprintCallback(array($obj2, '__invoke'))] = true;
- $uniques++;
- $this->assertEquals($uniques, count($prints));
- }
- private function getFixture($filename) {
- return dirname(__FILE__) .
- DIRECTORY_SEPARATOR . '..' .
- DIRECTORY_SEPARATOR . 'test_files' .
- DIRECTORY_SEPARATOR . 'sql' .
- DIRECTORY_SEPARATOR . $filename;
- }
-
- /**
- * @return PHPUnit_Framework_MockObject_MockObject
- */
- private function getDbMock()
- {
- return $this->getMock(
- $this->dbClass,
- array('updateData'),
- array(
- new $this->configClass((object) array('dbprefix' => 'test_')),
- _elgg_services()->logger
- )
- );
- }
-
- /**
- * @param PHPUnit_Framework_MockObject_MockObject $db
- * @param int $index
- * @param PHPUnit_Framework_MockObject_Matcher $matcher
- */
- private function expectExecutedStatement($db, $index, $matcher)
- {
- $db->expects($this->at($index))->method('updateData')->with($matcher);
- }
- }
- class Elgg_DatabaseTestObj {
- public function __invoke() {}
- }
|