add missing files for forked idiorm
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
Vendored
+185
@@ -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)');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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/
|
||||
@@ -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
|
||||
+1342
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user