add missing files for forked idiorm

This commit is contained in:
Andrew Dolgov
2022-07-16 16:30:46 +03:00
parent fdd1c43612
commit b8c1d622a7
187 changed files with 11950 additions and 45862 deletions
+43
View File
@@ -0,0 +1,43 @@
<?php
class CacheIntegrationTest extends PHPUnit_Framework_TestCase {
public function setUp() {
ORM::configure('sqlite::memory:');
ORM::configure('logging', true);
ORM::configure('caching', true);
ORM::raw_execute('CREATE TABLE `league` ( `class_id` INTEGER )');
// needs to be individually inserted to support SQLite before
// version 3.7.11
ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (1)');
ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (2)');
ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (3)');
$x = ORM::for_table('league')->count();
$this->assertEquals(3, $x);
}
public function tearDown() {
ORM::raw_execute('DROP TABLE `league`');
}
public function testRegressionForPullRequest319() {
$rs = ORM::for_table('league')->where('class_id', 1);
$total = $rs->count();
$this->assertEquals(1, $total);
$row = $rs->find_one();
$this->assertEquals(array('class_id' => 1), $row->as_array());
$rs = ORM::for_table('league')->where('class_id', 1);
$total = $rs->count();
$this->assertEquals(1, $total);
try {
$row = $rs->find_one();
} catch(PDOException $e) {
$this->fail("Caching is breaking subsequent queries!\n{$e->getMessage()}");
}
$this->assertEquals(array('class_id' => 1), $row->as_array());
}
}
+42
View File
@@ -0,0 +1,42 @@
<?php
class CacheTest extends PHPUnit_Framework_TestCase {
const ALTERNATE = 'alternate'; // Used as name of alternate connection
public function setUp() {
// Set up the dummy database connections
ORM::set_db(new MockPDO('sqlite::memory:'));
ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
// Enable logging
ORM::configure('logging', true);
ORM::configure('logging', true, self::ALTERNATE);
ORM::configure('caching', true);
ORM::configure('caching', true, self::ALTERNATE);
}
public function tearDown() {
ORM::reset_config();
ORM::reset_db();
}
// Test caching. This is a bit of a hack.
public function testQueryGenerationOnlyOccursOnce() {
ORM::for_table('widget')->where('name', 'Fred')->where('age', 17)->find_one();
ORM::for_table('widget')->where('name', 'Bob')->where('age', 42)->find_one();
$expected = ORM::get_last_query();
ORM::for_table('widget')->where('name', 'Fred')->where('age', 17)->find_one(); // this shouldn't run a query!
$this->assertEquals($expected, ORM::get_last_query());
}
public function testQueryGenerationOnlyOccursOnceWithMultipleConnections() {
// Test caching with multiple connections (also a bit of a hack)
ORM::for_table('widget', self::ALTERNATE)->where('name', 'Steve')->where('age', 80)->find_one();
ORM::for_table('widget', self::ALTERNATE)->where('name', 'Tom')->where('age', 120)->find_one();
$expected = ORM::get_last_query();
ORM::for_table('widget', self::ALTERNATE)->where('name', 'Steve')->where('age', 80)->find_one(); // this shouldn't run a query!
$this->assertEquals($expected, ORM::get_last_query(self::ALTERNATE));
}
}
+82
View File
@@ -0,0 +1,82 @@
<?php
class CacheTest53 extends PHPUnit_Framework_TestCase {
const ALTERNATE = 'alternate'; // Used as name of alternate connection
public function setUp() {
// Set up the dummy database connections
ORM::set_db(new MockPDO('sqlite::memory:'));
ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
// Enable logging
ORM::configure('logging', true);
ORM::configure('logging', true, self::ALTERNATE);
ORM::configure('caching', true);
ORM::configure('caching', true, self::ALTERNATE);
}
public function tearDown() {
ORM::reset_config();
ORM::reset_db();
}
public function testCustomCacheCallback() {
$phpunit = $this;
$my_cache = array();
ORM::configure('caching_auto_clear', true);
ORM::configure('create_cache_key', function ($query, $parameters, $table_name, $connection) use ($phpunit, &$my_cache) {
$phpunit->assertEquals(true, is_string($query));
$phpunit->assertEquals(true, is_array($parameters));
$phpunit->assertEquals(true, is_string($connection));
$phpunit->assertEquals('widget', $table_name);
$parameter_string = join(',', $parameters);
$key = $query . ':' . $parameter_string;
$my_key = 'some-prefix'.crc32($key);
return $my_key;
});
ORM::configure('cache_query_result', function ($cache_key, $value, $table_name, $connection_name) use ($phpunit, &$my_cache) {
$phpunit->assertEquals(true, is_string($cache_key));
$phpunit->assertEquals('widget', $table_name);
$my_cache[$cache_key] = $value;
});
ORM::configure('check_query_cache', function ($cache_key, $table_name, $connection_name) use ($phpunit, &$my_cache) {
$phpunit->assertEquals(true, is_string($cache_key));
$phpunit->assertEquals(true, is_string($connection_name));
$phpunit->assertEquals('widget', $table_name);
if(isset($my_cache) and isset($my_cache[$cache_key])){
$phpunit->assertEquals(true, is_array($my_cache[$cache_key]));
return $my_cache[$cache_key];
} else {
return false;
}
});
ORM::configure('clear_cache', function ($table_name, $connection_name) use ($phpunit, &$my_cache) {
$phpunit->assertEquals(true, is_string($table_name));
$phpunit->assertEquals(true, is_string($connection_name));
$my_cache = array();
});
ORM::for_table('widget')->where('name', 'Fred')->where('age', 21)->find_one();
ORM::for_table('widget')->where('name', 'Fred')->where('age', 21)->find_one();
ORM::for_table('widget')->where('name', 'Bob')->where('age', 42)->find_one();
//our custom cache should be full now
$this->assertEquals(true, !empty($my_cache));
//checking custom cache key
foreach($my_cache as $k=>$v){
$this->assertEquals('some-prefix', substr($k,0,11));
}
$new = ORM::for_table('widget')->create();
$new->name = "Joe";
$new->age = 25;
$saved = $new->save();
//our custom cache should be empty now
$this->assertEquals(true, empty($my_cache));
}
}
+125
View File
@@ -0,0 +1,125 @@
<?php
class ConfigTest extends PHPUnit_Framework_TestCase {
public function setUp() {
// Enable logging
ORM::configure('logging', true);
// Set up the dummy database connection
$db = new MockPDO('sqlite::memory:');
ORM::set_db($db);
ORM::configure('id_column', 'primary_key');
}
public function tearDown() {
ORM::reset_config();
ORM::reset_db();
}
protected function setUpIdColumnOverrides() {
ORM::configure('id_column_overrides', array(
'widget' => 'widget_id',
'widget_handle' => 'widget_handle_id',
));
}
protected function tearDownIdColumnOverrides() {
ORM::configure('id_column_overrides', array());
}
public function testSettingIdColumn() {
ORM::for_table('widget')->find_one(5);
$expected = "SELECT * FROM `widget` WHERE `primary_key` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testSettingIdColumnOverridesOne() {
$this->setUpIdColumnOverrides();
ORM::for_table('widget')->find_one(5);
$expected = "SELECT * FROM `widget` WHERE `widget_id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
$this->tearDownIdColumnOverrides();
}
public function testSettingIdColumnOverridesTwo() {
$this->setUpIdColumnOverrides();
ORM::for_table('widget_handle')->find_one(5);
$expected = "SELECT * FROM `widget_handle` WHERE `widget_handle_id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
$this->tearDownIdColumnOverrides();
}
public function testSettingIdColumnOverridesThree() {
$this->setUpIdColumnOverrides();
ORM::for_table('widget_nozzle')->find_one(5);
$expected = "SELECT * FROM `widget_nozzle` WHERE `primary_key` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
$this->tearDownIdColumnOverrides();
}
public function testInstanceIdColumnOne() {
$this->setUpIdColumnOverrides();
ORM::for_table('widget')->use_id_column('new_id')->find_one(5);
$expected = "SELECT * FROM `widget` WHERE `new_id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
$this->tearDownIdColumnOverrides();
}
public function testInstanceIdColumnTwo() {
$this->setUpIdColumnOverrides();
ORM::for_table('widget_handle')->use_id_column('new_id')->find_one(5);
$expected = "SELECT * FROM `widget_handle` WHERE `new_id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
$this->tearDownIdColumnOverrides();
}
public function testInstanceIdColumnThree() {
$this->setUpIdColumnOverrides();
ORM::for_table('widget_nozzle')->use_id_column('new_id')->find_one(5);
$expected = "SELECT * FROM `widget_nozzle` WHERE `new_id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
$this->tearDownIdColumnOverrides();
}
public function testGetConfig() {
$this->assertTrue(ORM::get_config('logging'));
ORM::configure('logging', false);
$this->assertFalse(ORM::get_config('logging'));
ORM::configure('logging', true);
}
public function testGetConfigArray() {
$expected = array(
'connection_string' => 'sqlite::memory:',
'id_column' => 'primary_key',
'id_column_overrides' => array(),
'error_mode' => PDO::ERRMODE_EXCEPTION,
'username' => null,
'password' => null,
'driver_options' => null,
'identifier_quote_character' => '`',
'logging' => true,
'logger' => null,
'caching' => false,
'caching_auto_clear' => false,
'return_result_sets' => false,
'limit_clause_style' => 'limit',
);
$this->assertEquals($expected, ORM::get_config());
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
class ConfigTest53 extends PHPUnit_Framework_TestCase {
public function setUp() {
// Enable logging
ORM::configure('logging', true);
// Set up the dummy database connection
$db = new MockPDO('sqlite::memory:');
ORM::set_db($db);
ORM::configure('id_column', 'primary_key');
}
public function tearDown() {
ORM::configure('logging', false);
ORM::set_db(null);
ORM::configure('id_column', 'id');
}
public function testLoggerCallback() {
ORM::configure('logger', function($log_string) {
return $log_string;
});
$function = ORM::get_config('logger');
$this->assertTrue(is_callable($function));
$log_string = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
$this->assertEquals($log_string, $function($log_string));
ORM::configure('logger', null);
}
}
+81
View File
@@ -0,0 +1,81 @@
<?php
class IdiormResultSetTest extends PHPUnit_Framework_TestCase {
public function setUp() {
// Enable logging
ORM::configure('logging', true);
// Set up the dummy database connection
$db = new MockPDO('sqlite::memory:');
ORM::set_db($db);
}
public function tearDown() {
ORM::reset_config();
ORM::reset_db();
}
public function testGet() {
$IdiormResultSet = new IdiormResultSet();
$this->assertInternalType('array', $IdiormResultSet->get_results());
}
public function testConstructor() {
$result_set = array('item' => new stdClass);
$IdiormResultSet = new IdiormResultSet($result_set);
$this->assertSame($IdiormResultSet->get_results(), $result_set);
}
public function testSetResultsAndGetResults() {
$result_set = array('item' => new stdClass);
$IdiormResultSet = new IdiormResultSet();
$IdiormResultSet->set_results($result_set);
$this->assertSame($IdiormResultSet->get_results(), $result_set);
}
public function testAsArray() {
$result_set = array('item' => new stdClass);
$IdiormResultSet = new IdiormResultSet();
$IdiormResultSet->set_results($result_set);
$this->assertSame($IdiormResultSet->as_array(), $result_set);
}
public function testCount() {
$result_set = array('item' => new stdClass);
$IdiormResultSet = new IdiormResultSet($result_set);
$this->assertSame($IdiormResultSet->count(), 1);
$this->assertSame(count($IdiormResultSet), 1);
}
public function testGetIterator() {
$result_set = array('item' => new stdClass);
$IdiormResultSet = new IdiormResultSet($result_set);
$this->assertInstanceOf('ArrayIterator', $IdiormResultSet->getIterator());
}
public function testForeach() {
$result_set = array('item' => new stdClass);
$IdiormResultSet = new IdiormResultSet($result_set);
$return_array = array();
foreach($IdiormResultSet as $key => $record) {
$return_array[$key] = $record;
}
$this->assertSame($result_set, $return_array);
}
public function testCallingMethods() {
$result_set = array('item' => ORM::for_table('test'), 'item2' => ORM::for_table('test'));
$IdiormResultSet = new IdiormResultSet($result_set);
$IdiormResultSet->set('field', 'value')->set('field2', 'value');
foreach($IdiormResultSet as $record) {
$this->assertTrue(isset($record->field));
$this->assertSame($record->field, 'value');
$this->assertTrue(isset($record->field2));
$this->assertSame($record->field2, 'value');
}
}
}
+52
View File
@@ -0,0 +1,52 @@
<?php
class MultipleConnectionTest extends PHPUnit_Framework_TestCase {
const ALTERNATE = 'alternate'; // Used as name of alternate connection
public function setUp() {
// Set up the dummy database connections
ORM::set_db(new MockPDO('sqlite::memory:'));
ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
// Enable logging
ORM::configure('logging', true);
ORM::configure('logging', true, self::ALTERNATE);
}
public function tearDown() {
ORM::reset_config();
ORM::reset_db();
}
public function testMultiplePdoConnections() {
$this->assertInstanceOf('MockPDO', ORM::get_db());
$this->assertInstanceOf('MockPDO', ORM::get_db(ORM::DEFAULT_CONNECTION));
$this->assertInstanceOf('MockDifferentPDO', ORM::get_db(self::ALTERNATE));
}
public function testRawExecuteOverAlternateConnection() {
$expected = "SELECT * FROM `foo`";
ORM::raw_execute("SELECT * FROM `foo`", array(), self::ALTERNATE);
$this->assertEquals($expected, ORM::get_last_query(self::ALTERNATE));
}
public function testFindOneOverDifferentConnections() {
ORM::for_table('widget')->find_one();
$statementOne = ORM::get_last_statement();
$this->assertInstanceOf('MockPDOStatement', $statementOne);
ORM::for_table('person', self::ALTERNATE)->find_one();
$statementOne = ORM::get_last_statement(); // get_statement is *not* per connection
$this->assertInstanceOf('MockDifferentPDOStatement', $statementOne);
$expected = "SELECT * FROM `widget` LIMIT 1";
$this->assertNotEquals($expected, ORM::get_last_query()); // Because get_last_query() is across *all* connections
$this->assertEquals($expected, ORM::get_last_query(ORM::DEFAULT_CONNECTION));
$expectedToo = "SELECT * FROM `person` LIMIT 1";
$this->assertEquals($expectedToo, ORM::get_last_query(self::ALTERNATE));
}
}
+185
View File
@@ -0,0 +1,185 @@
<?php
class ORMTest extends PHPUnit_Framework_TestCase {
public function setUp() {
// Enable logging
ORM::configure('logging', true);
// Set up the dummy database connection
$db = new MockPDO('sqlite::memory:');
ORM::set_db($db);
}
public function tearDown() {
ORM::reset_config();
ORM::reset_db();
}
public function testStaticAtrributes() {
$this->assertEquals('0', ORM::CONDITION_FRAGMENT);
$this->assertEquals('1', ORM::CONDITION_VALUES);
}
public function testForTable() {
$result = ORM::for_table('test');
$this->assertInstanceOf('ORM', $result);
}
public function testCreate() {
$model = ORM::for_table('test')->create();
$this->assertInstanceOf('ORM', $model);
$this->assertTrue($model->is_new());
}
public function testIsNew() {
$model = ORM::for_table('test')->create();
$this->assertTrue($model->is_new());
$model = ORM::for_table('test')->create(array('test' => 'test'));
$this->assertTrue($model->is_new());
}
public function testIsDirty() {
$model = ORM::for_table('test')->create();
$this->assertFalse($model->is_dirty('test'));
$model = ORM::for_table('test')->create(array('test' => 'test'));
$this->assertTrue($model->is_dirty('test'));
$model->test = null;
$this->assertTrue($model->is_dirty('test'));
$model->test = '';
$this->assertTrue($model->is_dirty('test'));
}
public function testArrayAccess() {
$value = 'test';
$model = ORM::for_table('test')->create();
$model['test'] = $value;
$this->assertTrue(isset($model['test']));
$this->assertEquals($model['test'], $value);
unset($model['test']);
$this->assertFalse(isset($model['test']));
}
public function testFindResultSet() {
$result_set = ORM::for_table('test')->find_result_set();
$this->assertInstanceOf('IdiormResultSet', $result_set);
$this->assertSame(count($result_set), 5);
}
public function testFindResultSetByDefault() {
ORM::configure('return_result_sets', true);
$result_set = ORM::for_table('test')->find_many();
$this->assertInstanceOf('IdiormResultSet', $result_set);
$this->assertSame(count($result_set), 5);
ORM::configure('return_result_sets', false);
$result_set = ORM::for_table('test')->find_many();
$this->assertInternalType('array', $result_set);
$this->assertSame(count($result_set), 5);
}
public function testGetLastPdoStatement() {
ORM::for_table('widget')->where('name', 'Fred')->find_one();
$statement = ORM::get_last_statement();
$this->assertInstanceOf('MockPDOStatement', $statement);
}
/**
* @expectedException IdiormMethodMissingException
*/
public function testInvalidORMFunctionCallShouldCreateException() {
$orm = ORM::for_table('test');
$orm->invalidFunctionCall();
}
/**
* @expectedException IdiormMethodMissingException
*/
public function testInvalidResultsSetFunctionCallShouldCreateException() {
$resultSet = ORM::for_table('test')->find_result_set();
$resultSet->invalidFunctionCall();
}
/**
* These next two tests are needed because if you have select()ed some fields,
* but not the primary key, then the primary key is not available for the
* update/delete query - see issue #203.
* We need to change the primary key here to something other than `id`
* becuase MockPDOStatement->fetch() always returns an id.
*/
public function testUpdateNullPrimaryKey() {
try {
$widget = ORM::for_table('widget')
->use_id_column('primary')
->select('foo')
->where('primary', 1)
->find_one()
;
$widget->foo = 'bar';
$widget->save();
throw new Exception('Test did not throw expected exception');
} catch (Exception $e) {
$this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
}
}
public function testDeleteNullPrimaryKey() {
try {
$widget = ORM::for_table('widget')
->use_id_column('primary')
->select('foo')
->where('primary', 1)
->find_one()
;
$widget->delete();
throw new Exception('Test did not throw expected exception');
} catch (Exception $e) {
$this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
}
}
public function testNullPrimaryKey() {
try {
$widget = ORM::for_table('widget')
->use_id_column('primary')
->select('foo')
->where('primary', 1)
->find_one()
;
$widget->id(true);
throw new Exception('Test did not throw expected exception');
} catch (Exception $e) {
$this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
}
}
public function testNullPrimaryKeyPart() {
try {
$widget = ORM::for_table('widget')
->use_id_column(array('id', 'primary'))
->select('foo')
->where('id', 1)
->where('primary', 1)
->find_one()
;
$widget->id(true);
throw new Exception('Test did not throw expected exception');
} catch (Exception $e) {
$this->assertEquals($e->getMessage(), 'Primary key ID contains null value(s)');
}
}
}
+32
View File
@@ -0,0 +1,32 @@
<?php
class QueryBuilderMssqlTest extends PHPUnit_Framework_TestCase {
public function setUp() {
// Enable logging
ORM::configure('logging', true);
// Set up the dummy database connection
$db = new MockMsSqlPDO('sqlite::memory:');
ORM::set_db($db);
}
public function tearDown() {
ORM::reset_config();
ORM::reset_db();
}
public function testFindOne() {
ORM::for_table('widget')->find_one();
$expected = 'SELECT TOP 1 * FROM "widget"';
$this->assertEquals($expected, ORM::get_last_query());
}
public function testLimit() {
ORM::for_table('widget')->limit(5)->find_many();
$expected = 'SELECT TOP 5 * FROM "widget"';
$this->assertEquals($expected, ORM::get_last_query());
}
}
+582
View File
@@ -0,0 +1,582 @@
<?php
class QueryBuilderPsr1Test53 extends PHPUnit_Framework_TestCase {
public function setUp() {
// Enable logging
ORM::configure('logging', true);
// Set up the dummy database connection
$db = new MockPDO('sqlite::memory:');
ORM::setDb($db);
}
public function tearDown() {
ORM::configure('logging', false);
ORM::setDb(null);
}
public function testFindMany() {
ORM::forTable('widget')->findMany();
$expected = "SELECT * FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testFindOne() {
ORM::forTable('widget')->findOne();
$expected = "SELECT * FROM `widget` LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testFindOneWithPrimaryKeyFilter() {
ORM::forTable('widget')->findOne(5);
$expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereIdIs() {
ORM::forTable('widget')->whereIdIs(5)->findOne();
$expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testSingleWhereClause() {
ORM::forTable('widget')->where('name', 'Fred')->findOne();
$expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMultipleWhereClauses() {
ORM::forTable('widget')->where('name', 'Fred')->where('age', 10)->findOne();
$expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereNotEqual() {
ORM::forTable('widget')->whereNotEqual('name', 'Fred')->findMany();
$expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereLike() {
ORM::forTable('widget')->whereLike('name', '%Fred%')->findOne();
$expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereNotLike() {
ORM::forTable('widget')->whereNotLike('name', '%Fred%')->findOne();
$expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereIn() {
ORM::forTable('widget')->whereIn('name', array('Fred', 'Joe'))->findMany();
$expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereNotIn() {
ORM::forTable('widget')->whereNotIn('name', array('Fred', 'Joe'))->findMany();
$expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testLimit() {
ORM::forTable('widget')->limit(5)->findMany();
$expected = "SELECT * FROM `widget` LIMIT 5";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testLimitAndOffset() {
ORM::forTable('widget')->limit(5)->offset(5)->findMany();
$expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testOrderByDesc() {
ORM::forTable('widget')->orderByDesc('name')->findOne();
$expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testOrderByAsc() {
ORM::forTable('widget')->orderByAsc('name')->findOne();
$expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testOrderByExpression() {
ORM::forTable('widget')->orderByExpr('SOUNDEX(`name`)')->findOne();
$expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMultipleOrderBy() {
ORM::forTable('widget')->orderByAsc('name')->orderByDesc('age')->findOne();
$expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testGroupBy() {
ORM::forTable('widget')->groupBy('name')->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMultipleGroupBy() {
ORM::forTable('widget')->groupBy('name')->groupBy('age')->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name`, `age`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testGroupByExpression() {
ORM::forTable('widget')->groupByExpr("FROM_UNIXTIME(`time`, '%Y-%m')")->findMany();
$expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHaving() {
ORM::forTable('widget')->groupBy('name')->having('name', 'Fred')->findOne();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMultipleHaving() {
ORM::forTable('widget')->groupBy('name')->having('name', 'Fred')->having('age', 10)->findOne();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingNotEqual() {
ORM::forTable('widget')->groupBy('name')->havingNotEqual('name', 'Fred')->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingLike() {
ORM::forTable('widget')->groupBy('name')->havingLike('name', '%Fred%')->findOne();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingNotLike() {
ORM::forTable('widget')->groupBy('name')->havingNotLike('name', '%Fred%')->findOne();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingIn() {
ORM::forTable('widget')->groupBy('name')->havingIn('name', array('Fred', 'Joe'))->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingNotIn() {
ORM::forTable('widget')->groupBy('name')->havingNotIn('name', array('Fred', 'Joe'))->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingLessThan() {
ORM::forTable('widget')->groupBy('name')->havingLt('age', 10)->havingGt('age', 5)->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingLessThanOrEqualAndGreaterThanOrEqual() {
ORM::forTable('widget')->groupBy('name')->havingLte('age', 10)->havingGte('age', 5)->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingNull() {
ORM::forTable('widget')->groupBy('name')->havingNull('name')->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testHavingNotNull() {
ORM::forTable('widget')->groupBy('name')->havingNotNull('name')->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawHaving() {
ORM::forTable('widget')->groupBy('name')->havingRaw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->findMany();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testComplexQuery() {
ORM::forTable('widget')->where('name', 'Fred')->limit(5)->offset(5)->orderByAsc('name')->findMany();
$expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereLessThanAndGreaterThan() {
ORM::forTable('widget')->whereLt('age', 10)->whereGt('age', 5)->findMany();
$expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereLessThanAndEqualAndGreaterThanAndEqual() {
ORM::forTable('widget')->whereLte('age', 10)->whereGte('age', 5)->findMany();
$expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereNull() {
ORM::forTable('widget')->whereNull('name')->findMany();
$expected = "SELECT * FROM `widget` WHERE `name` IS NULL";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testWhereNotNull() {
ORM::forTable('widget')->whereNotNull('name')->findMany();
$expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawWhereClause() {
ORM::forTable('widget')->whereRaw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->findMany();
$expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawWhereClauseWithPercentSign() {
ORM::forTable('widget')->whereRaw('STRFTIME("%Y", "now") = ?', array(2012))->findMany();
$expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawWhereClauseWithNoParameters() {
ORM::forTable('widget')->whereRaw('`name` = "Fred"')->findMany();
$expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\"";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawWhereClauseInMethodChain() {
ORM::forTable('widget')->where('age', 18)->whereRaw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where('size', 'large')->findMany();
$expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawQuery() {
ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w')->findMany();
$expected = "SELECT `w`.* FROM `widget` w";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawQueryWithParameters() {
ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))->findMany();
$expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawQueryWithNamedPlaceholders() {
ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w WHERE `name` = :name AND `age` = :age', array(':name' => 'Fred', ':age' => 5))->findMany();
$expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testSimpleResultColumn() {
ORM::forTable('widget')->select('name')->findMany();
$expected = "SELECT `name` FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMultipleSimpleResultColumns() {
ORM::forTable('widget')->select('name')->select('age')->findMany();
$expected = "SELECT `name`, `age` FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testSpecifyTableNameAndColumnInResultColumns() {
ORM::forTable('widget')->select('widget.name')->findMany();
$expected = "SELECT `widget`.`name` FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMainTableAlias() {
ORM::forTable('widget')->tableAlias('w')->findMany();
$expected = "SELECT * FROM `widget` `w`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testAliasesInResultColumns() {
ORM::forTable('widget')->select('widget.name', 'widget_name')->findMany();
$expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testAliasesInSelectManyResults() {
ORM::forTable('widget')->selectMany(array('widget_name' => 'widget.name'), 'widget_handle')->findMany();
$expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testLiteralExpressionInResultColumn() {
ORM::forTable('widget')->selectExpr('COUNT(*)', 'count')->findMany();
$expected = "SELECT COUNT(*) AS `count` FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testLiteralExpressionInSelectManyResultColumns() {
ORM::forTable('widget')->selectManyExpr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->findMany();
$expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testSimpleJoin() {
ORM::forTable('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
$expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testSimpleJoinWithWhereIdIsMethod() {
ORM::forTable('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findOne(5);
$expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testInnerJoin() {
ORM::forTable('widget')->innerJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
$expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testLeftOuterJoin() {
ORM::forTable('widget')->leftOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
$expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRightOuterJoin() {
ORM::forTable('widget')->rightOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
$expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testFullOuterJoin() {
ORM::forTable('widget')->fullOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
$expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMultipleJoinSources() {
ORM::forTable('widget')
->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id'))
->findMany();
$expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testJoinWithAliases() {
ORM::forTable('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->findMany();
$expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testJoinWithAliasesAndWhere() {
ORM::forTable('widget')->tableAlias('w')->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')->whereEqual('id', 1)->findMany();
$expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testJoinWithStringConstraint() {
ORM::forTable('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->findMany();
$expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawJoin() {
ORM::forTable('widget')->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` )', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle')->findMany();
$expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawJoinWithParameters() {
ORM::forTable('widget')->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))->findMany();
$expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testRawJoinAndRawWhereWithParameters() {
ORM::forTable('widget')
->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))
->rawJoin('INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array('person.id', '=', 'widget.person_id'), 'person', array('%Fred%'))
->whereRaw('`id` > ? AND `id` < ?', array(5, 10))
->findMany();
$expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testSelectWithDistinct() {
ORM::forTable('widget')->distinct()->select('name')->findMany();
$expected = "SELECT DISTINCT `name` FROM `widget`";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testInsertData() {
$widget = ORM::forTable('widget')->create();
$widget->name = "Fred";
$widget->age = 10;
$widget->save();
$expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testInsertDataContainingAnExpression() {
$widget = ORM::forTable('widget')->create();
$widget->name = "Fred";
$widget->age = 10;
$widget->setExpr('added', 'NOW()');
$widget->save();
$expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testInsertDataUsingArrayAccess() {
$widget = ORM::forTable('widget')->create();
$widget['name'] = "Fred";
$widget['age'] = 10;
$widget->save();
$expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testUpdateData() {
$widget = ORM::forTable('widget')->findOne(1);
$widget->name = "Fred";
$widget->age = 10;
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testUpdateDataContainingAnExpression() {
$widget = ORM::forTable('widget')->findOne(1);
$widget->name = "Fred";
$widget->age = 10;
$widget->setExpr('added', 'NOW()');
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testUpdateMultipleFields() {
$widget = ORM::forTable('widget')->findOne(1);
$widget->set(array("name" => "Fred", "age" => 10));
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testUpdateMultipleFieldsContainingAnExpression() {
$widget = ORM::forTable('widget')->findOne(1);
$widget->set(array("name" => "Fred", "age" => 10));
$widget->setExpr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression() {
$widget = ORM::forTable('widget')->findOne(1);
$widget->set(array("name" => "Fred", "age" => 10));
$widget->setExpr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
$widget->lat_long = 'unknown';
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testDeleteData() {
$widget = ORM::forTable('widget')->findOne(1);
$widget->delete();
$expected = "DELETE FROM `widget` WHERE `id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testDeleteMany() {
ORM::forTable('widget')->whereEqual('age', 10)->delete_many();
$expected = "DELETE FROM `widget` WHERE `age` = '10'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testCount() {
ORM::forTable('widget')->count();
$expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testIgnoreSelectAndCount() {
ORM::forTable('widget')->select('test')->count();
$expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMax() {
ORM::forTable('person')->max('height');
$expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testMin() {
ORM::forTable('person')->min('height');
$expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testAvg() {
ORM::forTable('person')->avg('height');
$expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testSum() {
ORM::forTable('person')->sum('height');
$expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
/**
* Regression tests
*/
public function testIssue12IncorrectQuotingOfColumnWildcard() {
ORM::forTable('widget')->select('widget.*')->findOne();
$expected = "SELECT `widget`.* FROM `widget` LIMIT 1";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied() {
ORM::forTable('widget')->whereRaw('username LIKE "ben%"')->findMany();
$expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"';
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied() {
ORM::forTable('widget')->whereRaw('comments LIKE "has been released?%"')->findMany();
$expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"';
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testIssue74EscapingQuoteMarksIn_quote_identifier_part() {
$widget = ORM::forTable('widget')->findOne(1);
$widget->set('ad`ded', '2013-01-04');
$widget->save();
$expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration() {
$widget = ORM::forTable('widget')->findOne(1);
$widget->setExpr('added', 'NOW()');
$widget->save();
$expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
$this->assertEquals($expected, ORM::getLastQuery());
}
}
+696
View File
@@ -0,0 +1,696 @@
<?php
class QueryBuilderTest extends PHPUnit_Framework_TestCase {
public function setUp() {
// Enable logging
ORM::configure('logging', true);
// Set up the dummy database connection
$db = new MockPDO('sqlite::memory:');
ORM::set_db($db);
}
public function tearDown() {
ORM::reset_config();
ORM::reset_db();
}
public function testFindMany() {
ORM::for_table('widget')->find_many();
$expected = "SELECT * FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testFindOne() {
ORM::for_table('widget')->find_one();
$expected = "SELECT * FROM `widget` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testFindOneWithPrimaryKeyFilter() {
ORM::for_table('widget')->find_one(5);
$expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereIdIs() {
ORM::for_table('widget')->where_id_is(5)->find_one();
$expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereIdIn() {
ORM::for_table('widget')->where_id_in(array(4, 5))->find_many();
$expected = "SELECT * FROM `widget` WHERE `id` IN ('4', '5')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testSingleWhereClause() {
ORM::for_table('widget')->where('name', 'Fred')->find_one();
$expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMultipleWhereClauses() {
ORM::for_table('widget')->where('name', 'Fred')->where('age', 10)->find_one();
$expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereNotEqual() {
ORM::for_table('widget')->where_not_equal('name', 'Fred')->find_many();
$expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereLike() {
ORM::for_table('widget')->where_like('name', '%Fred%')->find_one();
$expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereNotLike() {
ORM::for_table('widget')->where_not_like('name', '%Fred%')->find_one();
$expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereIn() {
ORM::for_table('widget')->where_in('name', array('Fred', 'Joe'))->find_many();
$expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereNotIn() {
ORM::for_table('widget')->where_not_in('name', array('Fred', 'Joe'))->find_many();
$expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereAnyIs() {
ORM::for_table('widget')->where_any_is(array(
array('name' => 'Joe', 'age' => 10),
array('name' => 'Fred', 'age' => 20)))->find_many();
$expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` = '10' ) OR ( `name` = 'Fred' AND `age` = '20' ))";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereAnyIsOverrideOneColumn() {
ORM::for_table('widget')->where_any_is(array(
array('name' => 'Joe', 'age' => 10),
array('name' => 'Fred', 'age' => 20)), array('age' => '>'))->find_many();
$expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` > '10' ) OR ( `name` = 'Fred' AND `age` > '20' ))";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereAnyIsOverrideAllOperators() {
ORM::for_table('widget')->where_any_is(array(
array('score' => '5', 'age' => 10),
array('score' => '15', 'age' => 20)), '>')->find_many();
$expected = "SELECT * FROM `widget` WHERE (( `score` > '5' AND `age` > '10' ) OR ( `score` > '15' AND `age` > '20' ))";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testLimit() {
ORM::for_table('widget')->limit(5)->find_many();
$expected = "SELECT * FROM `widget` LIMIT 5";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testLimitAndOffset() {
ORM::for_table('widget')->limit(5)->offset(5)->find_many();
$expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testOrderByDesc() {
ORM::for_table('widget')->order_by_desc('name')->find_one();
$expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testOrderByAsc() {
ORM::for_table('widget')->order_by_asc('name')->find_one();
$expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testOrderByExpression() {
ORM::for_table('widget')->order_by_expr('SOUNDEX(`name`)')->find_one();
$expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMultipleOrderBy() {
ORM::for_table('widget')->order_by_asc('name')->order_by_desc('age')->find_one();
$expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testGroupBy() {
ORM::for_table('widget')->group_by('name')->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMultipleGroupBy() {
ORM::for_table('widget')->group_by('name')->group_by('age')->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name`, `age`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testGroupByExpression() {
ORM::for_table('widget')->group_by_expr("FROM_UNIXTIME(`time`, '%Y-%m')")->find_many();
$expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHaving() {
ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->find_one();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMultipleHaving() {
ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->having('age', 10)->find_one();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingNotEqual() {
ORM::for_table('widget')->group_by('name')->having_not_equal('name', 'Fred')->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingLike() {
ORM::for_table('widget')->group_by('name')->having_like('name', '%Fred%')->find_one();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingNotLike() {
ORM::for_table('widget')->group_by('name')->having_not_like('name', '%Fred%')->find_one();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingIn() {
ORM::for_table('widget')->group_by('name')->having_in('name', array('Fred', 'Joe'))->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingNotIn() {
ORM::for_table('widget')->group_by('name')->having_not_in('name', array('Fred', 'Joe'))->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingLessThan() {
ORM::for_table('widget')->group_by('name')->having_lt('age', 10)->having_gt('age', 5)->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingLessThanOrEqualAndGreaterThanOrEqual() {
ORM::for_table('widget')->group_by('name')->having_lte('age', 10)->having_gte('age', 5)->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingNull() {
ORM::for_table('widget')->group_by('name')->having_null('name')->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testHavingNotNull() {
ORM::for_table('widget')->group_by('name')->having_not_null('name')->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawHaving() {
ORM::for_table('widget')->group_by('name')->having_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many();
$expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testComplexQuery() {
ORM::for_table('widget')->where('name', 'Fred')->limit(5)->offset(5)->order_by_asc('name')->find_many();
$expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereLessThanAndGreaterThan() {
ORM::for_table('widget')->where_lt('age', 10)->where_gt('age', 5)->find_many();
$expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereLessThanAndEqualAndGreaterThanAndEqual() {
ORM::for_table('widget')->where_lte('age', 10)->where_gte('age', 5)->find_many();
$expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereNull() {
ORM::for_table('widget')->where_null('name')->find_many();
$expected = "SELECT * FROM `widget` WHERE `name` IS NULL";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereNotNull() {
ORM::for_table('widget')->where_not_null('name')->find_many();
$expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawWhereClause() {
ORM::for_table('widget')->where_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many();
$expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawWhereClauseWithPercentSign() {
ORM::for_table('widget')->where_raw('STRFTIME("%Y", "now") = ?', array(2012))->find_many();
$expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawWhereClauseWithNoParameters() {
ORM::for_table('widget')->where_raw('`name` = "Fred"')->find_many();
$expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\"";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawWhereClauseInMethodChain() {
ORM::for_table('widget')->where('age', 18)->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where('size', 'large')->find_many();
$expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawWhereClauseMultiples() {
ORM::for_table('widget')->where('age', 18)->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where_raw('(`name` = ? OR `name` = ?)', array('Sarah', 'Jane'))->where('size', 'large')->find_many();
$expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND (`name` = 'Sarah' OR `name` = 'Jane') AND `size` = 'large'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawQuery() {
ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w')->find_many();
$expected = "SELECT `w`.* FROM `widget` w";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawQueryWithParameters() {
ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))->find_many();
$expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawQueryWithNamedPlaceholders() {
ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = :name AND `age` = :age', array(':name' => 'Fred', ':age' => 5))->find_many();
$expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testSimpleResultColumn() {
ORM::for_table('widget')->select('name')->find_many();
$expected = "SELECT `name` FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMultipleSimpleResultColumns() {
ORM::for_table('widget')->select('name')->select('age')->find_many();
$expected = "SELECT `name`, `age` FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testSpecifyTableNameAndColumnInResultColumns() {
ORM::for_table('widget')->select('widget.name')->find_many();
$expected = "SELECT `widget`.`name` FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMainTableAlias() {
ORM::for_table('widget')->table_alias('w')->find_many();
$expected = "SELECT * FROM `widget` `w`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testAliasesInResultColumns() {
ORM::for_table('widget')->select('widget.name', 'widget_name')->find_many();
$expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testAliasesInSelectManyResults() {
ORM::for_table('widget')->select_many(array('widget_name' => 'widget.name'), 'widget_handle')->find_many();
$expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testLiteralExpressionInResultColumn() {
ORM::for_table('widget')->select_expr('COUNT(*)', 'count')->find_many();
$expected = "SELECT COUNT(*) AS `count` FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testLiteralExpressionInSelectManyResultColumns() {
ORM::for_table('widget')->select_many_expr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->find_many();
$expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testSimpleJoin() {
ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
$expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testSimpleJoinWithWhereIdIsMethod() {
ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_one(5);
$expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testInnerJoin() {
ORM::for_table('widget')->inner_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
$expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testLeftOuterJoin() {
ORM::for_table('widget')->left_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
$expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRightOuterJoin() {
ORM::for_table('widget')->right_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
$expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testFullOuterJoin() {
ORM::for_table('widget')->full_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
$expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMultipleJoinSources() {
ORM::for_table('widget')
->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id'))
->find_many();
$expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testJoinWithAliases() {
ORM::for_table('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->find_many();
$expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testJoinWithAliasesAndWhere() {
ORM::for_table('widget')->table_alias('w')->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')->where_equal('id', 1)->find_many();
$expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testJoinWithStringConstraint() {
ORM::for_table('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->find_many();
$expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawJoin() {
ORM::for_table('widget')->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` )', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle')->find_many();
$expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawJoinWithParameters() {
ORM::for_table('widget')->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))->find_many();
$expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testRawJoinAndRawWhereWithParameters() {
ORM::for_table('widget')
->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))
->raw_join('INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array('person.id', '=', 'widget.person_id'), 'person', array('%Fred%'))
->where_raw('`id` > ? AND `id` < ?', array(5, 10))
->find_many();
$expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testSelectWithDistinct() {
ORM::for_table('widget')->distinct()->select('name')->find_many();
$expected = "SELECT DISTINCT `name` FROM `widget`";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testInsertData() {
$widget = ORM::for_table('widget')->create();
$widget->name = "Fred";
$widget->age = 10;
$widget->save();
$expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testInsertDataContainingAnExpression() {
$widget = ORM::for_table('widget')->create();
$widget->name = "Fred";
$widget->age = 10;
$widget->set_expr('added', 'NOW()');
$widget->save();
$expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testInsertDataUsingArrayAccess() {
$widget = ORM::for_table('widget')->create();
$widget['name'] = "Fred";
$widget['age'] = 10;
$widget->save();
$expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testUpdateData() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->name = "Fred";
$widget->age = 10;
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testUpdateDataContainingAnExpression() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->name = "Fred";
$widget->age = 10;
$widget->set_expr('added', 'NOW()');
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testUpdateMultipleFields() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->set(array("name" => "Fred", "age" => 10));
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testUpdateMultipleFieldsContainingAnExpression() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->set(array("name" => "Fred", "age" => 10));
$widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->set(array("name" => "Fred", "age" => 10));
$widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
$widget->lat_long = 'unknown';
$widget->save();
$expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testDeleteData() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->delete();
$expected = "DELETE FROM `widget` WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testDeleteMany() {
ORM::for_table('widget')->where_equal('age', 10)->delete_many();
$expected = "DELETE FROM `widget` WHERE `age` = '10'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testCount() {
ORM::for_table('widget')->count();
$expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testIgnoreSelectAndCount() {
ORM::for_table('widget')->select('test')->count();
$expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMax() {
ORM::for_table('person')->max('height');
$expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testMin() {
ORM::for_table('person')->min('height');
$expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testAvg() {
ORM::for_table('person')->avg('height');
$expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testSum() {
ORM::for_table('person')->sum('height');
$expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function test_quote_identifier_part() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->set('added', '2013-01-04');
$widget->save();
$expected = "UPDATE `widget` SET `added` = '2013-01-04' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function test_quote_multiple_identifiers_part() {
$record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
$expected = "`id1`, `id2`";
$this->assertEquals($expected, $record->_quote_identifier($record->_get_id_column_name()));
}
/**
* Compound primary key tests
*/
public function testFindOneWithCompoundPrimaryKey() {
$record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'));
$record->findOne(array('id1' => 10, 'name' => 'Joe', 'id2' => 20));
$expected = "SELECT * FROM `widget` WHERE `id1` = '10' AND `id2` = '20' LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testInsertWithCompoundPrimaryKey() {
$record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
$record->set('id1', 10);
$record->set('id2', 20);
$record->set('name', 'Joe');
$record->save();
$expected = "INSERT INTO `widget` (`id1`, `id2`, `name`) VALUES ('10', '20', 'Joe')";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testUpdateWithCompoundPrimaryKey() {
$record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
$record->set('id1', 10);
$record->set('id2', 20);
$record->set('name', 'Joe');
$record->save();
$record->set('name', 'John');
$record->save();
$expected = "UPDATE `widget` SET `name` = 'John' WHERE `id1` = '10' AND `id2` = '20'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testDeleteWithCompoundPrimaryKey() {
$record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
$record->set('id1', 10);
$record->set('id2', 20);
$record->set('name', 'Joe');
$record->save();
$record->delete();
$expected = "DELETE FROM `widget` WHERE `id1` = '10' AND `id2` = '20'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testWhereIdInWithCompoundPrimaryKey() {
$record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'));
$record->where_id_in(array(
array('id1' => 10, 'name' => 'Joe', 'id2' => 20),
array('id1' => 20, 'name' => 'Joe', 'id2' => 30)))->find_many();
$expected = "SELECT * FROM `widget` WHERE (( `id1` = '10' AND `id2` = '20' ) OR ( `id1` = '20' AND `id2` = '30' ))";
$this->assertEquals($expected, ORM::get_last_query());
}
/**
* Regression tests
*/
public function testIssue12IncorrectQuotingOfColumnWildcard() {
ORM::for_table('widget')->select('widget.*')->find_one();
$expected = "SELECT `widget`.* FROM `widget` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied() {
ORM::for_table('widget')->where_raw('username LIKE "ben%"')->find_many();
$expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"';
$this->assertEquals($expected, ORM::get_last_query());
}
public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied() {
ORM::for_table('widget')->where_raw('comments LIKE "has been released?%"')->find_many();
$expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"';
$this->assertEquals($expected, ORM::get_last_query());
}
public function testIssue74EscapingQuoteMarksIn_quote_identifier_part() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->set('ad`ded', '2013-01-04');
$widget->save();
$expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration() {
$widget = ORM::for_table('widget')->find_one(1);
$widget->set_expr('added', 'NOW()');
$widget->save();
$expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
$this->assertEquals($expected, ORM::get_last_query());
}
public function testIssue176LimitDoesntWorkFirstTime() {
ORM::reset_config();
ORM::reset_db();
ORM::configure('logging', true);
ORM::configure('connection_string', 'sqlite::memory:');
ORM::for_table('sqlite_master')->limit(1)->find_array();
$expected = "SELECT * FROM `sqlite_master` LIMIT 1";
$this->assertEquals($expected, ORM::get_last_query());
}
}
+126
View File
@@ -0,0 +1,126 @@
<?php
require_once dirname(__FILE__) . '/../idiorm.php';
/**
*
* Mock version of the PDOStatement class.
*
*/
class MockPDOStatement extends PDOStatement {
private $current_row = 0;
private $statement = NULL;
private $bindParams = array();
/**
* Store the statement that gets passed to the constructor
*/
public function __construct($statement) {
$this->statement = $statement;
}
/**
* Check that the array
*/
public function execute($params = NULL) {
$count = 0;
$m = array();
if (is_null($params)) $params = $this->bindParams;
if (preg_match_all('/"[^"\\\\]*(?:\\?)[^"\\\\]*"|\'[^\'\\\\]*(?:\\?)[^\'\\\\]*\'|(\\?)/', $this->statement, $m, PREG_SET_ORDER)) {
$count = count($m);
for ($v = 0; $v < $count; $v++) {
if (count($m[$v]) == 1) unset($m[$v]);
}
$count = count($m);
for ($i = 0; $i < $count; $i++) {
if (!isset($params[$i])) {
ob_start();
var_dump($m, $params);
$output = ob_get_clean();
throw new Exception('Incorrect parameter count. Expected ' . $count . ' got ' . count($params) . ".\n" . $this->statement . "\n" . $output);
}
}
}
}
/**
* Add data to arrays
*/
public function bindParam($paramno, &$param, $type = NULL, $maxlen = NULL, $driverdata = NULL)
{
// Do check on type
if (!is_int($type) || ($type != PDO::PARAM_STR && $type != PDO::PARAM_NULL && $type != PDO::PARAM_BOOL && $type != PDO::PARAM_INT))
throw new Exception('Incorrect parameter type. Expected $type to be an integer.');
// Add param to array
$this->bindParams[is_int($paramno) ? --$paramno : $paramno] = $param;
}
/**
* Return some dummy data
*/
public function fetch($fetch_style=PDO::FETCH_BOTH, $cursor_orientation=PDO::FETCH_ORI_NEXT, $cursor_offset=0) {
if ($this->current_row == 5) {
return false;
} else {
return array('name' => 'Fred', 'age' => 10, 'id' => ++$this->current_row);
}
}
}
/**
* Another mock PDOStatement class, used for testing multiple connections
*/
class MockDifferentPDOStatement extends MockPDOStatement { }
/**
*
* Mock database class implementing a subset
* of the PDO API.
*
*/
class MockPDO extends PDO {
/**
* Return a dummy PDO statement
*/
public function prepare($statement, $driver_options=array()) {
$this->last_query = new MockPDOStatement($statement);
return $this->last_query;
}
}
/**
* A different mock database class, for testing multiple connections
* Mock database class implementing a subset of the PDO API.
*/
class MockDifferentPDO extends MockPDO {
/**
* Return a dummy PDO statement
*/
public function prepare($statement, $driver_options = array()) {
$this->last_query = new MockDifferentPDOStatement($statement);
return $this->last_query;
}
}
class MockMsSqlPDO extends MockPDO {
public $fake_driver = 'mssql';
/**
* If we are asking for the name of the driver, check if a fake one
* has been set.
*/
public function getAttribute($attribute) {
if ($attribute == self::ATTR_DRIVER_NAME) {
if (!is_null($this->fake_driver)) {
return $this->fake_driver;
}
}
return parent::getAttribute($attribute);
}
}
+182
View File
@@ -0,0 +1,182 @@
FROM ubuntu:12.04
# configuration mostly copied from https://github.com/kuborgh/docker-php-5.2
RUN mkdir /php && \
cd /php && \
apt-get update && \
apt-get install -y --no-install-recommends \
autoconf binutils build-essential bzip2 ca-certificates \
comerr-dev cpp cpp-4.6 dpkg-dev g++ g++-4.6 gcc gcc-4.6 krb5-multidev \
libapr1-dev libaprutil1-dev libaspell-dev libaspell15 libbz2-dev \
libc-client2007e libc-client2007e-dev libc-dev-bin libc6-dev libcurl3 \
libcurl4-openssl-dev libdpkg-perl libexpat1-dev libfreetype6 \
libfreetype6-dev libgcrypt11-dev libgdbm-dev libgmp10 libgnutls-dev \
libgnutls-openssl27 libgnutlsxx27 libgomp1 libgpg-error-dev \
libgssapi-krb5-2 libgssrpc4 libice-dev libice6 libidn11 libidn11-dev \
libjpeg-dev libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8 libjpeg8-dev \
libk5crypto3 libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 libkeyutils1 \
libkrb5-3 libkrb5-dev libkrb5support0 libldap2-dev libltdl-dev libltdl7 \
libmagic-dev libmagic1 libmcrypt-dev libmcrypt4 libmhash-dev libmhash2 \
libmpc2 libmpfr4 libncurses5-dev \
libp11-kit-dev libpam0g-dev libpcre3-dev libpcrecpp0 libpng12-dev libpopt0 \
libpq-dev libpq5 libpspell-dev libpthread-stubs0 libpthread-stubs0-dev \
libquadmath0 libreadline-dev libreadline6-dev librtmp-dev librtmp0 \
libsm-dev libsm6 libsqlite3-dev libssl-dev libstdc++6-4.6-dev libt1-5 \
libt1-dev libtasn1-3-dev libtimedate-perl libtinfo-dev libx11-6 libx11-data \
libx11-dev libxau-dev libxau6 libxaw7 libxaw7-dev libxcb1 libxcb1-dev \
libxdmcp-dev libxdmcp6 libxext-dev libxext6 libxml2 libxml2-dev libxmu-dev \
libxmu-headers libxmu6 libxpm-dev libxpm4 libxt-dev libxt6 linux-libc-dev \
m4 make mlock mysql-common openssl patch pkg-config uuid-dev wget \
x11-common x11proto-core-dev x11proto-input-dev x11proto-kb-dev \
x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev \
&& \
wget http://museum.php.net/php5/php-5.2.17.tar.bz2 && \
tar xfj php-5.2.17.tar.bz2 && \
ln -s /usr/lib/x86_64-linux-gnu/libjpeg.* /usr/lib/ && \
ln -s /usr/lib/x86_64-linux-gnu/libpng.* /usr/lib/ && \
ln -s /usr/lib/x86_64-linux-gnu/libkrb5.* /usr/lib/ && \
ln -s /usr/lib/x86_64-linux-gnu/libmysqlclient.* /usr/lib/ && \
cd php-5.2.17; \
wget -c -t 3 -O ./debian_patches_disable_SSLv2_for_openssl_1_0_0.patch https://bugs.php.net/patch-display.php\?bug_id\=54736\&patch\=debian_patches_disable_SSLv2_for_openssl_1_0_0.patch\&revision=1305414559\&download\=1 && \
patch -p1 -b < debian_patches_disable_SSLv2_for_openssl_1_0_0.patch && \
./configure \
--bindir=/usr/bin \
--sbindir=/usr/sbin \
--prefix=/usr \
--build=i686-pc-linux-gnu \
--host=i686-pc-linux-gnu \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--datadir=/usr/share \
--sysconfdir=/etc \
--localstatedir=/var/lib \
--prefix=/usr/lib/php5.2 \
--mandir=/usr/lib/php5.2/man \
--infodir=/usr/lib/php5.2/info \
--libdir=/usr/lib/php5.2/lib \
--with-libdir=lib \
--with-pear \
--disable-maintainer-zts \
--enable-bcmath \
--with-bz2 \
--enable-calendar \
--with-curl \
--with-curlwrappers \
--disable-dbase \
--enable-exif \
--without-fbsql \
--without-fdftk \
--enable-ftp \
--with-gettext \
--without-gmp \
--disable-ipv6 \
--with-kerberos \
--enable-mbstring \
--with-mcrypt \
--with-mhash \
--without-msql \
--without-mssql \
--with-ncurses \
--with-openssl \
--with-openssl-dir=/usr \
--disable-pcntl \
--without-pgsql \
--with-pspell \
--without-recode \
--disable-shmop \
--without-snmp \
--enable-soap \
--enable-sockets \
--without-sybase-ct \
--disable-sysvmsg \
--disable-sysvsem \
--disable-sysvshm \
--without-tidy \
--disable-wddx \
--disable-xmlreader \
--disable-xmlwriter \
--with-xmlrpc \
--without-xsl \
--enable-zip \
--with-zlib \
--disable-debug \
--enable-dba \
--without-cdb \
--disable-flatfile \
--with-gdbm \
--disable-inifile \
--without-qdbm \
--with-freetype-dir=/usr \
--with-t1lib=/usr \
--disable-gd-jis-conv \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--without-xpm-dir \
--with-gd \
--with-imap \
--with-imap-ssl \
--without-interbase \
--without-mysql \
--without-mysqli \
--without-oci8 \
--without-pdo-dblib \
--without-pdo-mysql \
--without-pdo-pgsql \
--without-pdo-odbc \
--with-readline \
--without-libedit \
--without-mm \
--with-pcre-regex \
--with-config-file-path=/etc/php/cli-php5.2 \
--with-config-file-scan-dir=/etc/php/cli-php5.2/ext-active \
--enable-cli \
--disable-cgi \
--disable-embed \
--with-pic \
&& \
make clean && \
make && \
make install && \
pecl install phar && \
wget https://github.com/treffynnon/php5.2-phpunit3.6.12-phar/releases/download/1.0.2/php52-phpunit.phar -O ~/phpunit && \
chmod +x ~/phpunit && \
cd /php && \
rm -Rf /php && \
rm -Rf /var/cache/* && \
rm -Rf /tmp/pear && \
apt-get purge -y \
apache2-prefork-dev autoconf binutils build-essential bzip2 \
comerr-dev cpp cpp-4.6 dpkg-dev g++ g++-4.6 gcc gcc-4.6 krb5-multidev \
libapr1-dev libaprutil1-dev libaspell-dev libbz2-dev \
libc-client2007e-dev libc-dev-bin libc6-dev \
libcurl4-openssl-dev libdpkg-perl libexpat1-dev \
libfreetype6-dev libgcrypt11-dev libgdbm-dev libgmp10 libgnutls-dev \
libgnutls-openssl27 libgnutlsxx27 libgomp1 libgpg-error-dev \
libgssrpc4 libice-dev libice6 libidn11-dev \
libjpeg-dev libjpeg-turbo8-dev libjpeg8-dev \
libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 \
libkrb5-dev libldap2-dev libltdl-dev libltdl7 \
libmagic-dev libmcrypt-dev libmhash-dev \
libmpc2 libmpfr4 libmysqlclient-dev libncurses5-dev \
libp11-kit-dev libpam0g-dev libpcre3-dev libpcrecpp0 libpng12-dev libpopt0 \
libpq-dev libpq5 libpspell-dev libpthread-stubs0 libpthread-stubs0-dev \
libquadmath0 libreadline-dev libreadline6-dev librtmp-dev \
libsm-dev libsm6 libsqlite3-dev libssl-dev libstdc++6-4.6-dev \
libt1-dev libtasn1-3-dev libtimedate-perl libtinfo-dev \
libx11-dev libxau-dev libxaw7 libxaw7-dev libxcb1-dev \
libxdmcp-dev libxext-dev libxext6 libxml2-dev libxmu-dev \
libxmu-headers libxmu6 libxpm-dev libxpm4 libxt-dev libxt6 linux-libc-dev \
m4 make patch pkg-config uuid-dev wget \
x11-common x11proto-core-dev x11proto-input-dev x11proto-kb-dev \
x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev \
&& \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY php.ini /etc/php/cli-php5.2/
+23
View File
@@ -0,0 +1,23 @@
# Docker for PHP 5.2 testing
Run all the following commands from this diretory.
# Building the image
docker build . -f Dockerfile -t treffynnon/php5.2cli
# Run the tests
docker run -t -v $(realpath ../..):/tmp/idiorm --rm treffynnon/php5.2cli /root/phpunit -c /tmp/idiorm/phpunit.xml
# Running the container interactively
docker run -it -v $(realpath ../..):/tmp/idiorm --rm treffynnon/php5.2cli
# Running the tests
~/phpunit -c tmp/idiorm/phpunit.xml
# Getting out of the interactive container
exit
File diff suppressed because it is too large Load Diff