diff options
Diffstat (limited to 'tests/unit/Data')
165 files changed, 15150 insertions, 83 deletions
diff --git a/tests/unit/Data/ActiveRecord/ActiveRecordDynamicCallTest.php b/tests/unit/Data/ActiveRecord/ActiveRecordDynamicCallTest.php new file mode 100644 index 00000000..1bf98415 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/ActiveRecordDynamicCallTest.php @@ -0,0 +1,70 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/DepartmentRecord.php'); +require_once(dirname(__FILE__).'/records/DepSections.php'); + +/** + * @package System.Data.ActiveRecord + */ +class ActiveRecordDynamicCallTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_multiple_field_and_or() + { + $finder = DepartmentRecord::finder(); + $r2 = $finder->findAllByName_And_Description_Or_Active_Or_Order('Facilities', null, false, 1); + $this->assertNotNull($r2); + } + + function test_dynamic_call() + { + $finder = DepartmentRecord::finder(); + $r2 = $finder->findByName('Facilities'); + $this->assertNotNull($r2); + } + + function test_dynamic_multiple_field_call() + { + $finder = DepartmentRecord::finder(); + $rs = $finder->findByNameAndActive('Marketing',true); + $this->assertNotNull($rs); + } + + function test_dynamic_call_missing_parameters_throws_exception() + { + $finder = DepartmentRecord::finder(); + try + { + $rs = $finder->findByNameAndActive('Marketing'); + $this->fail(); + } + catch(TDbException $e) + { + $this->pass(); + } + } + + function test_dynamic_call_extras_parameters_ok() + { + $finder = DepartmentRecord::finder(); + $rs = $finder->findByNameAndActive('Marketing',true,true); + $this->assertNotNull($rs); + } + + function test_dynamic_delete_by() + { + $finder = DepartmentRecord::finder(); + //$finder->RecordManager->OnDelete[] = array($this, 'assertDeleteSql'); + $this->assertEqual($finder->deleteByName('tasds'), 0); + } + + function assertDeleteSql($sender, $param) + { + var_dump($param); + } +} diff --git a/tests/unit/Data/ActiveRecord/ActiveRecordFinderTest.php b/tests/unit/Data/ActiveRecord/ActiveRecordFinderTest.php new file mode 100644 index 00000000..2209fc6a --- /dev/null +++ b/tests/unit/Data/ActiveRecord/ActiveRecordFinderTest.php @@ -0,0 +1,46 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/DepartmentRecord.php'); + +/** + * @package System.Data.ActiveRecord + */ +class ActiveRecordFinderTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function testFindBySQL_returns_one_record() + { + $department = DepartmentRecord::finder()->find('department_id < ?', 5); + $this->assertNotNull($department); + } + + function testFindBySQL_returns_zero_records() + { + $department = DepartmentRecord::finder()->find('department_id > ?', 15); + $this->assertNull($department); + } + + function test_find_by_sql_returns_iterator() + { + $deps = DepartmentRecord::finder()->findAll('department_id < :id', array('id'=>5)); + $this->assertEqual(count($deps),4); + } + + function test_find_by_multiple_parameters() + { + $department = DepartmentRecord::finder()->find('department_id < ? AND "order" > ?', 5,2); + $this->assertNotNull($department); + } + + function test_find_by_array_parameter() + { + $department = DepartmentRecord::finder()->find('department_id < ? AND "order" > ?', array(5,2)); + $this->assertNotNull($department); + } + +} diff --git a/tests/unit/Data/ActiveRecord/ActiveRecordMySql5Test.php b/tests/unit/Data/ActiveRecord/ActiveRecordMySql5Test.php new file mode 100644 index 00000000..31cbed5c --- /dev/null +++ b/tests/unit/Data/ActiveRecord/ActiveRecordMySql5Test.php @@ -0,0 +1,48 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/Blogs.php'); + +/** + * @package System.Data.ActiveRecord + */ +class ActiveRecordMySql5Test extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('mysql:host=localhost;dbname=ar_test;port=3307', 'test5','test5'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_find_first_blog() + { + $blog = Blogs::finder()->findByPk(1); + $this->assertNotNull($blog); + } + + function test_insert_new_blog() + { + $blog = new Blogs(); + $blog->blog_name = 'test1'; + $blog->blog_author = 'wei'; + + $this->assertTrue($blog->save()); + + $blog->blog_name = 'test2'; + + $this->assertTrue($blog->save()); + + $check = Blogs::finder()->findByPk($blog->blog_id); + + $this->assertSameBlog($check,$blog); + + $this->assertTrue($blog->delete()); + } + + function assertSameBlog($check, $blog) + { + $props = array('blog_id', 'blog_name', 'blog_author'); + foreach($props as $prop) + $this->assertEqual($check->{$prop}, $blog->{$prop}); + } + +}
\ No newline at end of file diff --git a/tests/unit/Data/ActiveRecord/BaseActiveRecordTest.php b/tests/unit/Data/ActiveRecord/BaseActiveRecordTest.php new file mode 100644 index 00000000..258fe70c --- /dev/null +++ b/tests/unit/Data/ActiveRecord/BaseActiveRecordTest.php @@ -0,0 +1,34 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); + +/** + * @package System.Data.ActiveRecord + */ +class BaseRecordTest extends TActiveRecord +{ + +} + +class BaseActiveRecordTest extends PHPUnit_Framework_TestCase +{ + function test_finder_returns_same_instance() + { + $obj1 = TActiveRecord::finder('BaseRecordTest'); + $obj2 = TActiveRecord::finder('BaseRecordTest'); + $this->assertIdentical($obj1,$obj2); + } + + function test_finder_throw_exception_when_save() + { + $obj = TActiveRecord::finder('BaseRecordTest'); + try + { + $obj->save(); + $this->fail(); + } + catch(TActiveRecordException $e) + { + $this->pass(); + } + } +} diff --git a/tests/unit/Data/ActiveRecord/CountRecordsTest.php b/tests/unit/Data/ActiveRecord/CountRecordsTest.php new file mode 100644 index 00000000..b97f83ed --- /dev/null +++ b/tests/unit/Data/ActiveRecord/CountRecordsTest.php @@ -0,0 +1,36 @@ +<?php + +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/DepartmentRecord.php'); + +/** + * @package System.Data.ActiveRecord + */ +class CountRecordsTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_count() + { + $finder = DepartmentRecord::finder(); + $count = $finder->count('"order" > ?', 2); + $this->assertTrue($count > 0); + } + + function test_count_zero() + { + $finder = DepartmentRecord::finder(); + $count = $finder->count('"order" > ?', 11); + $this->assertEqual($count,0); + } + + function test_count_without_parameter() + { + $finder = DepartmentRecord::finder(); + $this->assertEqual($finder->count(), 8); + } +} diff --git a/tests/unit/Data/ActiveRecord/CriteriaTest.php b/tests/unit/Data/ActiveRecord/CriteriaTest.php new file mode 100644 index 00000000..3c4c15d7 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/CriteriaTest.php @@ -0,0 +1,51 @@ +<?php + +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/DepartmentRecord.php'); +require_once(dirname(__FILE__).'/records/DepSections.php'); + +/** + * @package System.Data.ActiveRecord + */ +class CriteriaTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_orderby_only() + { + $criteria = new TActiveRecordCriteria; + $criteria->OrdersBy['name'] = 'asc'; + $records = DepartmentRecord::finder()->findAll($criteria); + $this->assertEqual(count($records), 8); + $this->assertEqual($records[0]->name, '+GX Service'); + $this->assertEqual($records[7]->name, 'Marketing'); + } + + function test_orderby_only_desc() + { + $criteria = new TActiveRecordCriteria; + $criteria->OrdersBy['name'] = 'desc'; + $records = DepartmentRecord::finder()->findAll($criteria); + $this->assertEqual(count($records), 8); + $this->assertEqual($records[7]->name, '+GX Service'); + $this->assertEqual($records[0]->name, 'Marketing'); + } + + function test_criteria_parameters() + { + $criteria = new TActiveRecordCriteria('sql', "One", "two", 3); + $expect = array("One", "two", 3); + $this->assertEqual($criteria->getParameters()->toArray(), $expect); + } + + function test_criteria_parameters_array() + { + $expect = array("One", "two", 3); + $criteria = new TActiveRecordCriteria('sql', $expect); + $this->assertEqual($criteria->getParameters()->toArray(), $expect); + } +} diff --git a/tests/unit/Data/ActiveRecord/DeleteByPkTest.php b/tests/unit/Data/ActiveRecord/DeleteByPkTest.php new file mode 100644 index 00000000..2f2c09c9 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/DeleteByPkTest.php @@ -0,0 +1,33 @@ +<?php + +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/DepartmentRecord.php'); +require_once(dirname(__FILE__).'/records/DepSections.php'); + +/** + * @package System.Data.ActiveRecord + */ +class DeleteByPkTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_delete_by_pks() + { + $finder = DepartmentRecord::finder(); + $this->assertEqual($finder->deleteByPk(100),0); + $this->assertEqual($finder->deleteByPk(100, 101),0); + $this->assertEqual($finder->deleteByPk(array(100, 101)),0); + } + + function test_delete_by_composite_pks() + { + $finder = DepSections::finder(); + $this->assertEqual($finder->deleteByPk(array(100,101)),0); + $this->assertEqual($finder->deleteByPk(array(100, 101), array(102, 103)),0); + $this->assertEqual($finder->deleteByPk(array(array(100, 101), array(102, 103))),0); + } +}
\ No newline at end of file diff --git a/tests/unit/Data/ActiveRecord/FindByPksTest.php b/tests/unit/Data/ActiveRecord/FindByPksTest.php new file mode 100644 index 00000000..8235352c --- /dev/null +++ b/tests/unit/Data/ActiveRecord/FindByPksTest.php @@ -0,0 +1,65 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/DepartmentRecord.php'); +require_once(dirname(__FILE__).'/records/DepSections.php'); + +/** + * @package System.Data.ActiveRecord + */ +class FindByPksTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_find_by_1pk() + { + $dep = DepartmentRecord::finder()->findByPk(1); + $this->assertNotNull($dep); + $this->assertEqual($dep->department_id, 1); + } + + function test_find_by_1pk_array() + { + $dep = DepartmentRecord::finder()->findByPk(array(1)); + $this->assertNotNull($dep); + $this->assertEqual($dep->department_id, 1); + } + + function test_find_by_pks() + { + $deps = DepartmentRecord::finder()->findAllByPks(1,2,4); + $this->assertEqual(count($deps), 3); + + $this->assertEqual($deps[0]->department_id, 1); + $this->assertEqual($deps[1]->department_id, 2); + $this->assertEqual($deps[2]->department_id, 4); + } + + function test_find_by_pks_with_invalid() + { + $deps = DepartmentRecord::finder()->findAllByPks(4,2,14); + $this->assertEqual(count($deps), 2); + + $this->assertEqual($deps[0]->department_id, 2); + $this->assertEqual($deps[1]->department_id, 4); + } + + function test_find_by_composite_pks() + { + $ds = DepSections::finder()->findAllByPks(array(1,1), array(2,5)); + $this->assertEqual(count($ds), 2); + + $this->assertIsDepSection($ds[0], 1, 1); + $this->assertIsDepSection($ds[1], 2, 5); + } + + function assertIsDepSection($dep, $dep_id, $sec_id) + { + $this->assertTrue($dep instanceof DepSections); + $this->assertEqual($dep->department_id, $dep_id); + $this->assertEqual($dep->section_id, $sec_id); + } +} diff --git a/tests/unit/Data/ActiveRecord/FindBySqlTest.php b/tests/unit/Data/ActiveRecord/FindBySqlTest.php new file mode 100644 index 00000000..98113b06 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/FindBySqlTest.php @@ -0,0 +1,47 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/DepartmentRecord.php'); +require_once(dirname(__FILE__).'/records/UserRecord.php'); + +/** + * @package System.Data.ActiveRecord + */ +class UserRecord2 extends UserRecord +{ + public $another_value; +} + +class SqlTest extends TActiveRecord +{ + public $category; + public $item; + + const TABLE='items'; +} + +class FindBySqlTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_find_by_sql() + { + $deps = DepartmentRecord::finder()->findBySql('SELECT * FROM departments'); + $this->assertTrue(count($deps) > 0); + } + + function test_find_by_sql_arb() + { + $sql = 'SELECT c.name as category, i.name as item + FROM items i, categories c + WHERE i.category_id = c.category_id LIMIT 2'; + $items = TActiveRecord::finder('SqlTest')->findBySql($sql); + + $sql = "SELECT users.*, 'hello' as another_value FROM users LIMIT 2"; + $users = TActiveRecord::finder('UserRecord2')->findBySql($sql); + var_dump($users); + } +} diff --git a/tests/unit/Data/ActiveRecord/ForeignKeyTest.php b/tests/unit/Data/ActiveRecord/ForeignKeyTest.php new file mode 100644 index 00000000..99c8b527 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/ForeignKeyTest.php @@ -0,0 +1,176 @@ +<?php + +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/ItemRecord.php'); + +/** + * @package System.Data.ActiveRecord + */ +abstract class SqliteRecord extends TActiveRecord +{ + protected static $conn; + + public function getDbConnection() + { + if(self::$conn===null) + self::$conn = new TDbConnection('sqlite:'.dirname(__FILE__).'/fk_tests.db'); + return self::$conn; + } +} + +class Album extends SqliteRecord +{ + public $title; + + public $Tracks = array(); + public $Artists = array(); + + public $cover; + + public static $RELATIONS = array( + 'Tracks' => array(self::HAS_MANY, 'Track'), + 'Artists' => array(self::MANY_TO_MANY, 'Artist', 'album_artists'), + 'cover' => array(self::HAS_ONE, 'Cover') + ); + + public static function finder($class=__CLASS__) + { + return parent::finder($class); + } +} + +class Artist extends SqliteRecord +{ + public $name; + + public $Albums = array(); + + public static $RELATIONS=array + ( + 'Albums' => array(self::MANY_TO_MANY, 'Album', 'album_artists') + ); + + public static function finder($class=__CLASS__) + { + return parent::finder($class); + } +} + +class Track extends SqliteRecord +{ + public $id; + public $song_name; + public $album_id; //FK -> Album.id + + public $Album; + + public static $RELATIONS = array( + 'Album' => array(self::BELONGS_TO, 'Album'), + ); + + public static function finder($class=__CLASS__) + { + return parent::finder($class); + } +} + +class Cover extends SqliteRecord +{ + public $album; + public $content; +} + +class ForeignKeyTest extends PHPUnit_Framework_TestCase +{ + function test_has_many() + { + $albums = Album::finder()->withTracks()->findAll(); + $this->assertEqual(count($albums), 2); + + $this->assertEqual($albums[0]->title, 'Album 1'); + $this->assertEqual($albums[1]->title, 'Album 2'); + + $this->assertEqual(count($albums[0]->Artists), 0); + $this->assertEqual(count($albums[1]->Artists), 0); + + $this->assertEqual(count($albums[0]->Tracks), 3); + $this->assertEqual(count($albums[1]->Tracks), 2); + + $this->assertEqual($albums[0]->Tracks[0]->song_name, 'Track 1'); + $this->assertEqual($albums[0]->Tracks[1]->song_name, 'Song 2'); + $this->assertEqual($albums[0]->Tracks[2]->song_name, 'Song 3'); + + $this->assertEqual($albums[1]->Tracks[0]->song_name, 'Track A'); + $this->assertEqual($albums[1]->Tracks[1]->song_name, 'Track B'); + } + + function test_has_one() + { + $albums = Album::finder()->with_cover()->findAll(); + $this->assertEqual(count($albums), 2); + + $this->assertEqual($albums[0]->title, 'Album 1'); + $this->assertEqual($albums[1]->title, 'Album 2'); + + $this->assertEqual($albums[0]->cover->content, 'lalala'); + $this->assertEqual($albums[1]->cover->content, 'conver content'); + + $this->assertEqual(count($albums[0]->Artists), 0); + $this->assertEqual(count($albums[1]->Artists), 0); + + $this->assertEqual(count($albums[0]->Tracks), 0); + $this->assertEqual(count($albums[1]->Tracks), 0); + } + + function test_belongs_to() + { + $track = Track::finder()->withAlbum()->find('id = ?', 1); + + $this->assertEqual($track->id, "1"); + $this->assertEqual($track->song_name, "Track 1"); + $this->assertEqual($track->Album->title, "Album 1"); + } + + function test_has_many_associate() + { + $album = Album::finder()->withArtists()->find('title = ?', 'Album 2'); + $this->assertEqual($album->title, 'Album 2'); + $this->assertEqual(count($album->Artists), 3); + + $this->assertEqual($album->Artists[0]->name, 'Dan'); + $this->assertEqual($album->Artists[1]->name, 'Karl'); + $this->assertEqual($album->Artists[2]->name, 'Tom'); + } + + function test_multiple_fk() + { + $album = Album::finder()->withArtists()->withTracks()->with_cover()->find('title = ?', 'Album 1'); + + $this->assertEqual($album->title, 'Album 1'); + $this->assertEqual(count($album->Artists), 2); + + $this->assertEqual($album->Artists[0]->name, 'Dan'); + $this->assertEqual($album->Artists[1]->name, 'Jenny'); + + $this->assertEqual($album->Tracks[0]->song_name, 'Track 1'); + $this->assertEqual($album->Tracks[1]->song_name, 'Song 2'); + $this->assertEqual($album->Tracks[2]->song_name, 'Song 3'); + + $this->assertEqual($album->cover->content, 'lalala'); + } + + function test_self_reference_fk() + { + $item = ItemRecord::finder()->withRelated_Items()->findByPk(1); + $this->assertNotNull($item); + $this->assertEqual($item->name, "Professional Work Attire"); + + $this->assertEqual(count($item->related_items),2); + $this->assertEqual($item->related_items[0]->name, "Nametags"); + $this->assertEqual($item->related_items[0]->item_id, 2); + + $this->assertEqual($item->related_items[1]->name, "Grooming and Hygiene"); + $this->assertEqual($item->related_items[1]->item_id, 3); + } + +} diff --git a/tests/unit/Data/ActiveRecord/ForeignObjectUpdateTest.php b/tests/unit/Data/ActiveRecord/ForeignObjectUpdateTest.php new file mode 100644 index 00000000..8b9d0673 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/ForeignObjectUpdateTest.php @@ -0,0 +1,243 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); + +/** + * @package System.Data.ActiveRecord + */ +class BaseFkRecord extends TActiveRecord +{ + public function getDbConnection() + { + static $conn; + if($conn===null) + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + //$this->OnExecuteCommand[] = array($this,'logger'); + } + return $conn; + } + + function logger($sender,$param) + { + } +} + +class TeamRecord extends BaseFkRecord +{ + const TABLE='teams'; + public $name; + public $location; + + public $players=array(); + + //define the $player member having has many relationship with PlayerRecord + public static $RELATIONS=array + ( + 'players' => array(self::HAS_MANY, 'PlayerRecord'), + ); + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} + +class PlayerRecord extends BaseFkRecord +{ + const TABLE='players'; + public $player_id; + public $age; + public $team_name; + + public $team; + private $_skills; + public $profile; + + public static $RELATIONS=array + ( + 'skills' => array(self::MANY_TO_MANY, 'SkillRecord', 'player_skills'), + 'team' => array(self::BELONGS_TO, 'TeamRecord'), + 'profile' => array(self::HAS_ONE, 'ProfileRecord'), + ); + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } + + public function getSkills() + { + if($this->_skills===null && $this->player_id !==null) + { + //lazy load the skill records + $this->setSkills($this->withSkills()->findByPk($this->player_id)->skills); + } + else if($this->_skills===null) + { + //create new TList; + $this->setSkills(new TList()); + } + return $this->_skills; + } + + public function setSkills($value) + { + $this->_skills = $value instanceof TList ? $value : new TList($value); + } +} + +class ProfileRecord extends BaseFkRecord +{ + const TABLE='profiles'; + public $fk_player_id; + public $salary; + + public $player; + + public static $RELATIONS=array + ( + 'player' => array(self::BELONGS_TO, 'PlayerRecord'), + ); + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} + +class SkillRecord extends BaseFkRecord +{ + const TABLE='skills'; + public $skill_id; + public $name; + + public $players=array(); + + public static $RELATIONS=array + ( + 'players' => array(self::MANY_TO_MANY, 'PlayerRecord', 'player_skills'), + ); + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } + + +} + +class ForeignObjectUpdateTest extends PHPUnit_Framework_TestCase +{ + function test_add_has_one() + { + ProfileRecord::finder()->deleteByPk(3); + + $player = PlayerRecord::finder()->findByPk(3); + $player->profile = new ProfileRecord(array('salary'=>50000)); + $player->save(); + + //test insert + $player2 = PlayerRecord::finder()->withProfile()->findByPk(3); + $this->assertEqual($player2->profile->salary,50000); + + $player2->profile->salary = 45000; + $player2->save(); + $this->assertEqual($player2->profile->salary,45000); + + //test update + $player3 = PlayerRecord::finder()->withProfile()->findByPk(3); + $this->assertEqual($player3->profile->salary,45000); + } + + function test_add_many() + { + PlayerRecord::finder()->deleteAll("player_id > ?", 3); + + $team = TeamRecord::finder()->findByPk('Team b'); + $team->players[] = new PlayerRecord(array('age'=>20)); + $team->players[] = new PlayerRecord(array('age'=>25)); + $team->save(); + + //test insert + $team1 = TeamRecord::finder()->withPlayers()->findByPk('Team b'); + $this->assertEqual(count($team1->players),3); + $this->assertEqual($team1->players[0]->age, 18); + $this->assertEqual($team1->players[1]->age, 20); + $this->assertEqual($team1->players[2]->age, 25); + + //test update + $team1->players[1]->age = 55; + $team1->save(); + + $this->assertEqual($team1->players[0]->age, 18); + $this->assertEqual($team1->players[1]->age, 55); + $this->assertEqual($team1->players[2]->age, 25); + + $criteria = new TActiveRecordCriteria(); + $criteria->OrdersBy['age'] = 'desc'; + $team2 = TeamRecord::finder()->withPlayers($criteria)->findByPk('Team b'); + $this->assertEqual(count($team2->players),3); + //ordered by age + $this->assertEqual($team2->players[0]->age, 55); + $this->assertEqual($team2->players[1]->age, 25); + $this->assertEqual($team2->players[2]->age, 18); + } + + function test_add_belongs_to() + { + TeamRecord::finder()->deleteByPk('Team c'); + PlayerRecord::finder()->deleteAll("player_id > ?", 3); + + $player = new PlayerRecord(array('age'=>27)); + $player->team = new TeamRecord(array('name'=>'Team c', 'location'=>'Sydney')); + $player->save(); + + //test insert + $player1 = PlayerRecord::finder()->withTeam()->findByAge(27); + $this->assertNotNull($player1); + $this->assertNotNull($player1->team); + $this->assertEqual($player1->team->name, 'Team c'); + $this->assertEqual($player1->team->location, 'Sydney'); + } + + function test_add_many_via_association() + { + PlayerRecord::finder()->deleteAll("player_id > ?", 3); + SkillRecord::finder()->deleteAll("skill_id > ?", 3); + + $player = new PlayerRecord(array('age'=>37)); + $player->skills[] = new SkillRecord(array('name'=>'Bash')); + $player->skills[] = new SkillRecord(array('name'=>'Jump')); + $player->save(); + + //test insert + $player2 = PlayerRecord::finder()->withSkills()->findByAge(37); + $this->assertNotNull($player2); + $this->assertEqual(count($player2->skills), 2); + $this->assertEqual($player2->skills[0]->name, 'Bash'); + $this->assertEqual($player2->skills[1]->name, 'Jump'); + + //test update + $player2->skills[1]->name = "Skip"; + $player2->skills[] = new SkillRecord(array('name'=>'Push')); + $player2->save(); + + $criteria = new TActiveRecordCriteria(); + $criteria->OrdersBy['name'] = 'asc'; + $player3 = PlayerRecord::finder()->withSkills($criteria)->findByAge(37); + $this->assertNotNull($player3); + $this->assertEqual(count($player3->skills), 3); + $this->assertEqual($player3->skills[0]->name, 'Bash'); + $this->assertEqual($player3->skills[1]->name, 'Push'); + $this->assertEqual($player3->skills[2]->name, 'Skip'); + + //test lazy load + $player4 = PlayerRecord::finder()->findByAge(37); + $this->assertEqual(count($player4->skills), 3); + + $this->assertEqual($player4->skills[0]->name, 'Bash'); + $this->assertEqual($player4->skills[1]->name, 'Skip'); + $this->assertEqual($player4->skills[2]->name, 'Push'); + } +//*/ +} diff --git a/tests/unit/Data/ActiveRecord/MultipleForeignKeyTest.php b/tests/unit/Data/ActiveRecord/MultipleForeignKeyTest.php new file mode 100644 index 00000000..d8c54b03 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/MultipleForeignKeyTest.php @@ -0,0 +1,193 @@ +<?php + +Prado::using('System.Data.ActiveRecord.TActiveRecord'); + +/** + * @package System.Data.ActiveRecord + */ +abstract class MultipleFKSqliteRecord extends TActiveRecord +{ + protected static $conn; + + public function getDbConnection() + { + if(self::$conn===null) + self::$conn = new TDbConnection('sqlite:'.dirname(__FILE__).'/test1.sqlite'); + return self::$conn; + } +} + +/** + * +CREATE TABLE table1 ( +id integer PRIMARY KEY AUTOINCREMENT, +field1 varchar, +fk1 integer CONSTRAINT fk_id1 REFERENCES table2(id) ON DELETE CASCADE, +fk2 integer CONSTRAINT fk_id2 REFERENCES table2(id) ON DELETE CASCADE, +fk3 integer CONSTRAINT fk_id3 REFERENCES table2(id) ON DELETE CASCADE) + */ +class Table1 extends MultipleFKSqliteRecord +{ + public $id; + public $field1; + public $fk1; + public $fk2; + public $fk3; + + public $object1; + //public $object2; //commented out for testing __get/__set + public $object3; + + public static $RELATIONS = array + ( + 'object1' => array(self::BELONGS_TO, 'Table2', 'fk1'), + 'object2' => array(self::BELONGS_TO, 'Table2', 'fk2'), + 'object3' => array(self::BELONGS_TO, 'Table2', 'fk3'), + ); + + public static function finder($class=__CLASS__) + { + return parent::finder($class); + } +} + +/** + * CREATE TABLE table2 (id integer PRIMARY KEY AUTOINCREMENT,field1 varchar) + */ +class Table2 extends MultipleFKSqliteRecord +{ + public $id; + public $field1; + + private $_state1; + //public $state2; //commented out for testing __get/__set + public $state3; + + public static $RELATIONS = array + ( + 'state1' => array(self::HAS_MANY, 'Table1', 'fk1'), + 'state2' => array(self::HAS_MANY, 'Table1', 'fk2'), + 'state3' => array(self::HAS_ONE, 'Table1', 'fk3'), + ); + + public function setState1($obj) + { + $this->_state1 = $obj; + } + + public function getState1() + { + if(is_null($this->_state1)) + $this->fetchResultsFor('state1'); + return $this->_state1; + } + + public static function finder($class=__CLASS__) + { + return parent::finder($class); + } +} + + +class CategoryX extends MultipleFKSqliteRecord +{ + public $cat_id; + public $category_name; + public $parent_cat; + + public $parent_category; + public $child_categories=array(); + + public static $RELATIONS=array + ( + 'parent_category' => array(self::BELONGS_TO, 'CategoryX'), + 'child_categories' => array(self::HAS_MANY, 'CategoryX'), + ); + + public static function finder($class=__CLASS__) + { + return parent::finder($class); + } +} + +class MultipleForeignKeyTest extends PHPUnit_Framework_TestCase +{ + function testBelongsTo() + { + $obj = Table1::finder()->withObject1()->findAll(); + $this->assertEqual(count($obj), 3); + $this->assertEqual($obj[0]->id, '1'); + $this->assertEqual($obj[1]->id, '2'); + $this->assertEqual($obj[2]->id, '3'); + + $this->assertEqual($obj[0]->object1->id, '1'); + $this->assertEqual($obj[1]->object1->id, '2'); + $this->assertEqual($obj[2]->object1->id, '2'); + } + + function testHasMany() + { + $obj = Table2::finder()->withState1()->findAll(); + $this->assertEqual(count($obj), 5); + + $this->assertEqual(count($obj[0]->state1), 1); + $this->assertEqual($obj[0]->state1[0]->id, '1'); + + $this->assertEqual(count($obj[1]->state1), 2); + $this->assertEqual($obj[1]->state1[0]->id, '2'); + $this->assertEqual($obj[1]->state1[1]->id, '3'); + + $this->assertEqual(count($obj[2]->state1), 0); + $this->assertEqual($obj[2]->id, '3'); + + $this->assertEqual(count($obj[3]->state1), 0); + $this->assertEqual($obj[3]->id, '4'); + } + + function testHasOne() + { + $obj = Table2::finder()->withState3('id = 3')->findAll(); + + $this->assertEqual(count($obj), 5); + + $this->assertEqual($obj[0]->id, '1'); + $this->assertNull($obj[0]->state3); + + $this->assertEqual($obj[1]->id, '2'); + $this->assertNull($obj[1]->state3); + + $this->assertEqual($obj[2]->id, '3'); + $this->assertNotNull($obj[2]->state3); + $this->assertEqual($obj[2]->state3->id, '3'); + + $this->assertEqual($obj[3]->id, '4'); + $this->assertNull($obj[3]->state3); + } + + function testParentChild() + { + $obj = CategoryX::finder()->withChild_Categories()->withParent_Category()->findByPk(2); + + $this->assertEqual($obj->cat_id, '2'); + $this->assertEqual(count($obj->child_categories), 2); + $this->assertNotNull($obj->parent_category); + + $this->assertEqual($obj->child_categories[0]->cat_id, 3); + $this->assertEqual($obj->child_categories[1]->cat_id, 4); + + $this->assertEqual($obj->parent_category->cat_id, 1); + } + + function testLazyLoadingGetterSetter_hasMany() + { + $arr = Table2::finder()->findByPk(2); + + $this->assertNotNull($arr->state2); //lazy load + $this->assertEqual(count($arr->state2), 1); + $this->assertEqual($arr->state2[0]->id, "1"); + $this->assertNotNull($arr->state2[0]->object2); + $this->assertEqual($arr->state2[0]->object2->id, "2"); + + $this->assertNotIdentical($arr, $arr->state2[0]->object2); + } +} diff --git a/tests/unit/Data/ActiveRecord/RecordEventTest.php b/tests/unit/Data/ActiveRecord/RecordEventTest.php new file mode 100644 index 00000000..0114e0a4 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/RecordEventTest.php @@ -0,0 +1,38 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/UserRecord.php'); + +/** + * @package System.Data.ActiveRecord + */ +class RecordEventTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function testFindByPk() + { + $user1 = UserRecord::finder()->findByPk('admin'); + $this->assertNotNull($user1); + } + + function test_same_data_returns_same_object() + { + $criteria = new TActiveRecordCriteria('username = ?', 'admin'); + $finder = new UserRecord(); + $finder->OnCreateCommand[] = array($this, 'logger'); + $finder->OnExecuteCommand[] = array($this, 'logger'); + $user1 = $finder->find($criteria); + //var_dump($user1); + + //var_dump(UserRecord::finder()->find($criteria)); + } + + function logger($sender, $param) + { + //var_dump($param); + } +} diff --git a/tests/unit/Data/ActiveRecord/SqliteTest.php b/tests/unit/Data/ActiveRecord/SqliteTest.php new file mode 100644 index 00000000..c7f8f515 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/SqliteTest.php @@ -0,0 +1,22 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/SqliteUsers.php'); + +/** + * @package System.Data.ActiveRecord + */ +class SqliteTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('sqlite2:'.dirname(__FILE__).'/ar_test.db'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_finder() + { + $finder = SqliteUsers::finder(); + $user = $finder->findByPk('test'); + $this->assertNotNull($user); + } +} diff --git a/tests/unit/Data/ActiveRecord/UserRecordTest.php b/tests/unit/Data/ActiveRecord/UserRecordTest.php new file mode 100644 index 00000000..c582e95b --- /dev/null +++ b/tests/unit/Data/ActiveRecord/UserRecordTest.php @@ -0,0 +1,67 @@ +<?php +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/UserRecord.php'); + +/** + * @package System.Data.ActiveRecord + */ +class UserRecordTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function testFindByPk() + { + $user1 = UserRecord::finder()->findByPk('admin'); + $this->assertNotNull($user1); + } + + function test_same_data_returns_different_instance() + { + $user1 = UserRecord::finder()->findByPk('admin'); + $this->assertNotNull($user1); + + $user2 = UserRecord::finder()->findByPk('admin'); + $this->assertFalse($user1===$user2); + } + + function testFindByPk_returns_null() + { + $user = UserRecord::finder()->findByPk('me'); + $this->assertNull($user); + } + + function test_Create_new_user_returns_true() + { + $user = new UserRecord; + $user->username = 'hello'; + $user->password = md5('asd'); + $user->email = 'asdasd'; + $user->first_name = 'wei'; + $user->last_name = 'zhuo'; + + $this->assertTrue($user->save()); + + $user->password = md5('more'); + + $this->assertTrue($user->save()); + + $check = UserRecord::finder()->findByPk('hello'); + + $this->assertSameUser($user, $check); + + $this->assertTrue($user->delete()); + } + + function assertSameUser($user,$check) + { + $props = array('username', 'password', 'email', 'first_name', 'last_name', 'job_title', + 'work_phone', 'work_fax', 'active', 'department_id', 'salutation', + 'hint_question', 'hint_answer'); + foreach($props as $prop) + $this->assertEqual($user->$prop,$check->$prop); + } +} diff --git a/tests/unit/Data/ActiveRecord/ViewRecordTest.php b/tests/unit/Data/ActiveRecord/ViewRecordTest.php new file mode 100644 index 00000000..f319e45f --- /dev/null +++ b/tests/unit/Data/ActiveRecord/ViewRecordTest.php @@ -0,0 +1,78 @@ +<?php + + +Prado::using('System.Data.ActiveRecord.TActiveRecord'); +require_once(dirname(__FILE__).'/records/SimpleUser.php'); + +/** + * @package System.Data.ActiveRecord + */ +class ViewRecordTest extends PHPUnit_Framework_TestCase +{ + function setup() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + TActiveRecordManager::getInstance()->setDbConnection($conn); + } + + function test_view_record() + { + $users = SimpleUser::finder()->findAll(); + $this->assertTrue(count($users) > 0); + } + + function test_save_view_record_throws_exception() + { + $user = new SimpleUser(); + try + { + $user->save(); + $this->fail(); + } + catch(TActiveRecordException $e) + { + $this->pass(); + } + } + + function test_update_view_record_throws_exception() + { + $user = SimpleUser::finder()->findByUsername('admin'); + $user->username = 'ads'; + try + { + $user->save(); + $this->fail(); + } + catch(TActiveRecordException $e) + { + $this->pass(); + } + } + + function test_find_by_pk_throws_exception() + { + try + { + $user = SimpleUser::finder()->findByPk('admin'); + $this->fail(); + } + catch(TDbException $e) + { + $this->pass(); + } + } + + function test_delete_by_pk_throws_exception() + { + try + { + SimpleUser::finder()->deleteByPk('admin'); + $this->fail(); + } + catch(TDbException $e) + { + $this->pass(); + } + } +}
\ No newline at end of file diff --git a/tests/unit/Data/ActiveRecord/ar_test.db b/tests/unit/Data/ActiveRecord/ar_test.db Binary files differnew file mode 100644 index 00000000..7549bb66 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/ar_test.db diff --git a/tests/unit/Data/ActiveRecord/blog.db b/tests/unit/Data/ActiveRecord/blog.db Binary files differnew file mode 100644 index 00000000..30a9cb7a --- /dev/null +++ b/tests/unit/Data/ActiveRecord/blog.db diff --git a/tests/unit/Data/ActiveRecord/fk_tests.db b/tests/unit/Data/ActiveRecord/fk_tests.db Binary files differnew file mode 100644 index 00000000..87835c84 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/fk_tests.db diff --git a/tests/unit/Data/ActiveRecord/mysql4text.sql b/tests/unit/Data/ActiveRecord/mysql4text.sql new file mode 100644 index 00000000..03d2c010 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/mysql4text.sql @@ -0,0 +1,52 @@ +CREATE TABLE album ( + title varchar(100) NOT NULL default '', + PRIMARY KEY (title) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE artist ( + name varchar(25) NOT NULL default '', + PRIMARY KEY (name) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE album_artists ( + album_title varchar(100) NOT NULL default '', + artist_name varchar(25) NOT NULL default '', + PRIMARY KEY (album_title,artist_name), + KEY FK_album_artists_2 (artist_name) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE track ( + id int(11) NOT NULL auto_increment, + song_name varchar(200) NOT NULL default '', + album_id varchar(100) NOT NULL default '', + PRIMARY KEY (id), + KEY album_id (album_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE album_artists + ADD CONSTRAINT FK_album_artists_2 FOREIGN KEY (artist_name) REFERENCES artist (name), + ADD CONSTRAINT FK_album_artists_1 FOREIGN KEY (album_title) REFERENCES album (title); + +ALTER TABLE track + ADD CONSTRAINT track_ibfk_1 FOREIGN KEY (album_id) REFERENCES album (title); + + +INSERT INTO album (title) VALUES ('Album 1'); +INSERT INTO album (title) VALUES ('Album 2'); + +INSERT INTO artist (name) VALUES ('Dan'); +INSERT INTO artist (name) VALUES ('Jenny'); +INSERT INTO artist (name) VALUES ('Karl'); +INSERT INTO artist (name) VALUES ('Tom'); + +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 1', 'Dan'); +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 2', 'Dan'); +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 1', 'Jenny'); +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 2', 'Karl'); +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 2', 'Tom'); + +INSERT INTO track (id, song_name, album_id) VALUES (1, 'Track 1', 'Album 1'); +INSERT INTO track (id, song_name, album_id) VALUES (2, 'Song 2', 'Album 1'); +INSERT INTO track (id, song_name, album_id) VALUES (3, 'Track A', 'Album 2'); +INSERT INTO track (id, song_name, album_id) VALUES (4, 'Track B', 'Album 2'); +INSERT INTO track (id, song_name, album_id) VALUES (5, 'Song 3', 'Album 1');
\ No newline at end of file diff --git a/tests/unit/Data/ActiveRecord/records/Blogs.php b/tests/unit/Data/ActiveRecord/records/Blogs.php new file mode 100644 index 00000000..6523f029 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/records/Blogs.php @@ -0,0 +1,12 @@ +<?php +class Blogs extends TActiveRecord +{ + public $blog_id; + public $blog_name; + public $blog_author; + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} diff --git a/tests/unit/Data/ActiveRecord/records/DepSections.php b/tests/unit/Data/ActiveRecord/records/DepSections.php new file mode 100644 index 00000000..bf01ed12 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/records/DepSections.php @@ -0,0 +1,14 @@ +<?php +class DepSections extends TActiveRecord +{ + public $department_id; + public $section_id; + public $order; + + const TABLE='department_sections'; + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} diff --git a/tests/unit/Data/ActiveRecord/records/DepartmentRecord.php b/tests/unit/Data/ActiveRecord/records/DepartmentRecord.php new file mode 100644 index 00000000..b60c7930 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/records/DepartmentRecord.php @@ -0,0 +1,16 @@ +<?php +class DepartmentRecord extends TActiveRecord +{ + public $department_id; + public $name; + public $description; + public $active; + public $order; + + const TABLE = 'departments'; + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} diff --git a/tests/unit/Data/ActiveRecord/records/ItemRecord.php b/tests/unit/Data/ActiveRecord/records/ItemRecord.php new file mode 100644 index 00000000..e6707cde --- /dev/null +++ b/tests/unit/Data/ActiveRecord/records/ItemRecord.php @@ -0,0 +1,47 @@ +<?php + +class ItemRecord extends TActiveRecord +{ + const TABLE='items'; + public $item_id; + public $name; + public $brand_specific; + public $description; + public $meta; + public $active; + public $need_review; + public $category_id; + public $type_id; + public $content; + public $standard_id; + public $timestamp; + + public $related_items = array(); + public $related_item_id; + + public static $RELATIONS=array + ( + 'related_items' => array(self::MANY_TO_MANY, 'ItemRecord', 'related_items.related_item_id'), + ); + + public function getDbConnection() + { + static $conn; + if($conn===null) + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + $this->OnExecuteCommand[] = array($this,'logger'); + } + return $conn; + } + + public function logger($sender,$param) + { + //var_dump($param->Command->Text); + } + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} diff --git a/tests/unit/Data/ActiveRecord/records/SimpleUser.php b/tests/unit/Data/ActiveRecord/records/SimpleUser.php new file mode 100644 index 00000000..b6748857 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/records/SimpleUser.php @@ -0,0 +1,12 @@ +<?php +class SimpleUser extends TActiveRecord +{ + public $username; + + const TABLE='simple_users'; + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} diff --git a/tests/unit/Data/ActiveRecord/records/SqliteUsers.php b/tests/unit/Data/ActiveRecord/records/SqliteUsers.php new file mode 100644 index 00000000..f8fa12c5 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/records/SqliteUsers.php @@ -0,0 +1,14 @@ +<?php +class SqliteUsers extends TActiveRecord +{ + public $username; + public $password; + public $email; + + const TABLE='users'; + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} diff --git a/tests/unit/Data/ActiveRecord/records/UserRecord.php b/tests/unit/Data/ActiveRecord/records/UserRecord.php new file mode 100644 index 00000000..4ef98baf --- /dev/null +++ b/tests/unit/Data/ActiveRecord/records/UserRecord.php @@ -0,0 +1,36 @@ +<?php +class UserRecord extends TActiveRecord +{ + public $username; + public $password; + public $email; + public $first_name; + public $last_name; + public $job_title; + public $work_phone; + public $work_fax; + public $active=true; + public $department_id; + public $salutation; + public $hint_question; + public $hint_answer; + + private $_level=-1; + + const TABLE='users'; + + public function getLevel() + { + return $this->_level; + } + + public function setLevel($level) + { + $this->_level=TPropertyValue::ensureInteger($level); + } + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} diff --git a/tests/unit/Data/ActiveRecord/sqlite.sql b/tests/unit/Data/ActiveRecord/sqlite.sql new file mode 100644 index 00000000..7854fc43 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/sqlite.sql @@ -0,0 +1,46 @@ +CREATE TABLE album ( + title varchar(100) NOT NULL PRIMARY KEY +); + +CREATE TABLE artist ( + name varchar(25) NOT NULL PRIMARY KEY +); + +CREATE TABLE album_artists ( + album_title varchar(100) NOT NULL CONSTRAINT fk_album REFERENCES album(title) ON DELETE CASCADE, + artist_name varchar(25) NOT NULL CONSTRAINT fk_artist REFERENCES artist(name) ON DELETE CASCADE +); + +CREATE TABLE track ( + id INTEGER NOT NULL PRIMARY KEY, + song_name varchar(200) NOT NULL default '', + album_id varchar(100) NOT NULL CONSTRAINT fk_album_1 REFERENCES album(title) ON DELETE CASCADE +); + +CREATE TABLE cover( + album varchar(200) NOT NULL CONSTRAINT fk_album_2 REFERENCES album(title) ON DELETE CASCADE, + content text +); + +INSERT INTO album (title) VALUES ('Album 1'); +INSERT INTO album (title) VALUES ('Album 2'); + +INSERT INTO cover(album,content) VALUES ('Album 1', 'lalala'); +INSERT INTO cover(album,content) VALUES ('Album 2', 'conver content'); + +INSERT INTO artist (name) VALUES ('Dan'); +INSERT INTO artist (name) VALUES ('Jenny'); +INSERT INTO artist (name) VALUES ('Karl'); +INSERT INTO artist (name) VALUES ('Tom'); + +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 1', 'Dan'); +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 2', 'Dan'); +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 1', 'Jenny'); +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 2', 'Karl'); +INSERT INTO album_artists (album_title, artist_name) VALUES ('Album 2', 'Tom'); + +INSERT INTO track (id, song_name, album_id) VALUES (1, 'Track 1', 'Album 1'); +INSERT INTO track (id, song_name, album_id) VALUES (2, 'Song 2', 'Album 1'); +INSERT INTO track (id, song_name, album_id) VALUES (3, 'Track A', 'Album 2'); +INSERT INTO track (id, song_name, album_id) VALUES (4, 'Track B', 'Album 2'); +INSERT INTO track (id, song_name, album_id) VALUES (5, 'Song 3', 'Album 1');
\ No newline at end of file diff --git a/tests/unit/Data/ActiveRecord/test1.sqlite b/tests/unit/Data/ActiveRecord/test1.sqlite Binary files differnew file mode 100644 index 00000000..1e056b52 --- /dev/null +++ b/tests/unit/Data/ActiveRecord/test1.sqlite diff --git a/tests/unit/Data/DataGateway/AllTests.php b/tests/unit/Data/DataGateway/AllTests.php deleted file mode 100644 index 6007ae70..00000000 --- a/tests/unit/Data/DataGateway/AllTests.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - - -if(!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Data_DataGateway_AllTests::main'); -} - -require_once 'TSqlCriteriaTest.php'; - -class Data_DataGateway_AllTests { - - public static function main() { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() { - $suite = new PHPUnit_Framework_TestSuite('System.Data.DataGateway'); - - $suite->addTestSuite('TSqlCriteriaTest'); - - return $suite; - } -} - -if(PHPUnit_MAIN_METHOD == 'Data_DataGateway_AllTests::main') { - Data_DataGateway_AllTests::main(); -} diff --git a/tests/unit/Data/DbCommon/CommandBuilderMssqlTest.php b/tests/unit/Data/DbCommon/CommandBuilderMssqlTest.php new file mode 100644 index 00000000..893a8ca6 --- /dev/null +++ b/tests/unit/Data/DbCommon/CommandBuilderMssqlTest.php @@ -0,0 +1,47 @@ +<?php + +Prado::using('System.Data.*'); +Prado::using('System.Data.Common.Mssql.TMssqlCommandBuilder'); + +/** + * @package System.Data.DbCommon + */ +class CommandBuilderMssqlTest extends PHPUnit_Framework_TestCase +{ + protected static $sql = array( + 'simple' => 'SELECT username, age FROM accounts', + 'multiple' => 'select a.username, b.name from accounts a, table1 b where a.age = b.id1', + 'ordering' => 'select a.username, b.name, a.age from accounts a, table1 b where a.age = b.id1 order by age DESC, name', + 'index' => 'select a.username, b.name, a.age from accounts a, table1 b where a.age = b.id1 ORDER BY 1 DESC, 2 ASC', + //'compute' => 'SELECT username, age FROM accounts order by age compute avg(age)', + ); + + function test_limit() + { + $builder = new TMssqlCommandBuilder(); + + $sql = $builder->applyLimitOffset(self::$sql['simple'], 3); + $expect = 'SELECT TOP 3 username, age FROM accounts'; + $this->assertEqual($expect, $sql); + + + $sql = $builder->applyLimitOffset(self::$sql['simple'], 3, 2); + $expect = 'SELECT * FROM (SELECT TOP 3 * FROM (SELECT TOP 5 username, age FROM accounts) as [__inner top table__] ) as [__outer top table__] '; + $this->assertEqual($expect, $sql); + + $sql = $builder->applyLimitOffset(self::$sql['multiple'], 3, 2); + $expect = 'SELECT * FROM (SELECT TOP 3 * FROM (SELECT TOP 5 a.username, b.name from accounts a, table1 b where a.age = b.id1) as [__inner top table__] ) as [__outer top table__] '; + $this->assertEqual($sql, $expect); + + $sql = $builder->applyLimitOffset(self::$sql['ordering'], 3, 2); + $expect = 'SELECT * FROM (SELECT TOP 3 * FROM (SELECT TOP 5 a.username, b.name, a.age from accounts a, table1 b where a.age = b.id1 order by age DESC, name) as [__inner top table__] ORDER BY age ASC, name DESC) as [__outer top table__] ORDER BY age DESC, name ASC'; + $this->assertEqual($sql, $expect); + + $sql = $builder->applyLimitOffset(self::$sql['index'], 3, 2); + $expect = 'SELECT * FROM (SELECT TOP 3 * FROM (SELECT TOP 5 a.username, b.name, a.age from accounts a, table1 b where a.age = b.id1 ORDER BY 1 DESC, 2 ASC) as [__inner top table__] ORDER BY 1 ASC, 2 DESC) as [__outer top table__] ORDER BY 1 DESC, 2 ASC'; + $this->assertEqual($expect, $sql); + + // $sql = $builder->applyLimitOffset(self::$sql['compute'], 3, 2); + // var_dump($sql); + } +} diff --git a/tests/unit/Data/DbCommon/CommandBuilderMysqlTest.php b/tests/unit/Data/DbCommon/CommandBuilderMysqlTest.php new file mode 100644 index 00000000..77e58019 --- /dev/null +++ b/tests/unit/Data/DbCommon/CommandBuilderMysqlTest.php @@ -0,0 +1,20 @@ +<?php +Prado::using('System.Data.*'); +Prado::using('System.Data.Common.Mysql.TMysqlMetaData'); + +/** + * @package System.Data.DbCommon + */ +class CommandBuilderMysqlTest extends PHPUnit_Framework_TestCase +{ + function mysql_meta_data() + { + $conn = new TDbConnection('mysql:host=localhost;dbname=tests;port=3307', 'test5','test5'); + return new TMysqlMetaData($conn); + } + + function test() + { + $this->mysql_meta_data()->getTableInfo("tests.table1"); + } +} diff --git a/tests/unit/Data/DbCommon/CommandBuilderPgsqlTest.php b/tests/unit/Data/DbCommon/CommandBuilderPgsqlTest.php new file mode 100644 index 00000000..389ad0e1 --- /dev/null +++ b/tests/unit/Data/DbCommon/CommandBuilderPgsqlTest.php @@ -0,0 +1,77 @@ +<?php +Prado::using('System.Data.*'); +Prado::using('System.Data.Common.Pgsql.TPgsqlMetaData'); + +/** + * @package System.Data.DbCommon + */ +class CommandBuilderPgsqlTest extends PHPUnit_Framework_TestCase +{ + function pgsql_meta_data() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + return new TPgsqlMetaData($conn); + } + + function test_insert_command_using_named_array() + { + $builder = $this->pgsql_meta_data()->createCommandBuilder('address'); + $address=array( + 'username' => 'Username', + 'phone' => 121987, + 'field1_boolean' => true, + 'field2_date' => '1213', + 'field3_double' => 121.1, + 'field4_integer' => 345, + 'field6_time' => time(), + 'field7_timestamp' => time(), + 'field8_money' => '121.12', + 'field9_numeric' => 984.22, + 'int_fk1'=>1, + 'int_fk2'=>1, + ); + $insert = $builder->createInsertCommand($address); + $sql = 'INSERT INTO public.address("username", "phone", "field1_boolean", "field2_date", "field3_double", "field4_integer", "field6_time", "field7_timestamp", "field8_money", "field9_numeric", "int_fk1", "int_fk2") VALUES (:username, :phone, :field1_boolean, :field2_date, :field3_double, :field4_integer, :field6_time, :field7_timestamp, :field8_money, :field9_numeric, :int_fk1, :int_fk2)'; + $this->assertEqual($sql, $insert->Text); + } + + function test_update_command() + { + $builder = $this->pgsql_meta_data()->createCommandBuilder('address'); + $data = array( + 'phone' => 9809, + 'int_fk1' => 1212, + ); + $update = $builder->createUpdateCommand($data, '1'); + $sql = 'UPDATE public.address SET "phone" = :phone, "int_fk1" = :int_fk1 WHERE 1'; + $this->assertEqual($sql, $update->Text); + } + + function test_delete_command() + { + $builder = $this->pgsql_meta_data()->createCommandBuilder('address'); + $where = 'phone is NULL'; + $delete = $builder->createDeleteCommand($where); + $sql = 'DELETE FROM public.address WHERE phone is NULL'; + $this->assertEqual($sql, $delete->Text); + } + + function test_select_limit() + { + $meta = $this->pgsql_meta_data(); + $builder = $meta->createCommandBuilder('address'); + $query = 'SELECT * FROM '.$meta->getTableInfo('address')->getTableFullName(); + + $limit = $builder->applyLimitOffset($query, 1); + $expect = $query.' LIMIT 1'; + $this->assertEqual($expect, $limit); + + $limit = $builder->applyLimitOffset($query, -1, 10); + $expect = $query.' OFFSET 10'; + $this->assertEqual($expect, $limit); + + $limit = $builder->applyLimitOffset($query, 2, 3); + $expect = $query.' LIMIT 2 OFFSET 3'; + $this->assertEqual($expect, $limit); + } +} diff --git a/tests/unit/Data/DbCommon/MssqlColumnTest.php b/tests/unit/Data/DbCommon/MssqlColumnTest.php new file mode 100644 index 00000000..e4196fcf --- /dev/null +++ b/tests/unit/Data/DbCommon/MssqlColumnTest.php @@ -0,0 +1,49 @@ +<?php + +Prado::using('System.Data.*'); +Prado::using('System.Data.Common.Mssql.TMssqlMetaData'); +Prado::using('System.Data.DataGateway.TTableGateway'); + +/** + * @package System.Data.DbCommon + */ +class MssqlColumnTest extends PHPUnit_Framework_TestCase +{ + function get_conn() + { + return new TDbConnection('mssql:host=localhost\\sqlexpress', 'test', 'test01'); + } + + /** + * @return TMssqlMetaData + */ + function meta_data() + { + return new TMssqlMetaData($this->get_conn()); + } + + function test_insert() + { + $table = new TTableGateway('table1', $this->get_conn()); + $this->assertTrue(is_int($table->insert(array('name'=>'cool')))); + } + +/* function test_meta() + { + $result = $this->meta_data()->getTableInfo("bar"); + var_dump($result); + } +*/ + /*function test_insert() + { + $table = new TTableGateway('table1', $this->get_conn()); + //var_dump($table->insert(array('name'=>'cool'))); + //var_dump($table->getLastInsertId()); + $criteria = new TSqlCriteria(); + $criteria->Limit = 5; + $criteria->Offset = 2; + + $result = $table->findAll($criteria)->readAll(); + var_dump($result); + }*/ +} diff --git a/tests/unit/Data/DbCommon/Mysql4ColumnTest.php b/tests/unit/Data/DbCommon/Mysql4ColumnTest.php new file mode 100644 index 00000000..74606452 --- /dev/null +++ b/tests/unit/Data/DbCommon/Mysql4ColumnTest.php @@ -0,0 +1,255 @@ +<?php +Prado::using('System.Data.*'); +Prado::using('System.Data.Common.Mysql.TMysqlMetaData'); + +/** + * @package System.Data.DbCommon + */ +class Mysql4ColumnTest extends PHPUnit_Framework_TestCase +{ + function create_meta_data() + { + $conn = new TDbConnection('mysql:host=localhost;dbname=tests;port=3306', 'test4','test4'); + return new TMysqlMetaData($conn); + } + + function test_columns() + { + $table = $this->create_meta_data()->getTableInfo('table1'); + $this->assertEqual(count($table->getColumns()), 18); + + $columns['id'] = array( + 'ColumnName' => '`id`', + 'ColumnSize' => 10, + 'ColumnIndex' => 0, + 'DbType' => 'int unsigned', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => true, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => true, + ); + + $columns['name'] = array( + 'ColumnName' => '`name`', + 'ColumnSize' => 45, + 'ColumnIndex' => 1, + 'DbType' => 'varchar', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => true, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field1'] = array( + 'ColumnName' => '`field1`', + 'ColumnSize' => 4, + 'ColumnIndex' => 2, + 'DbType' => 'tinyint', + 'AllowNull' => false, + 'DefaultValue' => '0', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field2_text'] = array( + 'ColumnName' => '`field2_text`', + 'ColumnSize' => null, + 'ColumnIndex' => 3, + 'DbType' => 'text', + 'AllowNull' => true, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field3_date'] = array( + 'ColumnName' => '`field3_date`', + 'ColumnSize' => null, + 'ColumnIndex' => 4, + 'DbType' => 'date', + 'AllowNull' => true, + 'DefaultValue' => '2007-02-25', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field4_float'] = array( + 'ColumnName' => '`field4_float`', + 'ColumnSize' => null, + 'ColumnIndex' => 5, + 'DbType' => 'float', + 'AllowNull' => false, + 'DefaultValue' => 10, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field5_float'] = array( + 'ColumnName' => '`field5_float`', + 'ColumnSize' => null, + 'ColumnIndex' => 6, + 'DbType' => 'float', + 'AllowNull' => false, + 'DefaultValue' => '0.0000', + 'NumericPrecision' => 5, + 'NumericScale' => 4, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field6_double'] = array( + 'ColumnName' => '`field6_double`', + 'ColumnSize' => null, + 'ColumnIndex' => 7, + 'DbType' => 'double', + 'AllowNull' => false, + 'DefaultValue' => '0', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field7_datetime'] = array( + 'ColumnName' => '`field7_datetime`', + 'ColumnSize' => null, + 'ColumnIndex' => 8, + 'DbType' => 'datetime', + 'AllowNull' => false, + 'DefaultValue' => '0000-00-00 00:00:00', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field8_timestamp'] = array( + 'ColumnName' => '`field8_timestamp`', + 'ColumnSize' => null, + 'ColumnIndex' => 9, + 'DbType' => 'timestamp', + 'AllowNull' => true, + 'DefaultValue' => 'CURRENT_TIMESTAMP', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field9_time'] = array( + 'ColumnName' => '`field9_time`', + 'ColumnSize' => null, + 'ColumnIndex' => 10, + 'DbType' => 'time', + 'AllowNull' => false, + 'DefaultValue' => '00:00:00', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field10_year'] = array( + 'ColumnName' => '`field10_year`', + 'ColumnSize' => 4, + 'ColumnIndex' => 11, + 'DbType' => 'year', + 'AllowNull' => false, + 'DefaultValue' => '0000', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field11_enum'] = array( + 'ColumnName' => '`field11_enum`', + 'ColumnSize' => null, + 'ColumnIndex' => 12, + 'DbType' => 'enum', + 'AllowNull' => false, + 'DefaultValue' => 'one', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + 'DbTypeValues' => array('one', 'two', 'three'), + ); + + $columns['field12_SET'] = array( + 'ColumnName' => '`field12_SET`', + 'ColumnSize' => null, + 'ColumnIndex' => 13, + 'DbType' => 'set', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + 'DbTypeValues' => array('blue', 'red', 'green'), + ); + + $this->assertColumn($columns, $table); + + $this->assertNull($table->getSchemaName()); + $this->assertEqual('table1', $table->getTableName()); + $this->assertEqual(array('id', 'name'), $table->getPrimaryKeys()); + } + + function assertColumn($columns, $table) + { + foreach($columns as $id=>$asserts) + { + $column = $table->Columns[$id]; + foreach($asserts as $property=>$assert) + { + $ofAssert= var_export($assert,true); + $value = $column->{$property}; + $ofValue = var_export($value, true); + $this->assertEqual($value, $assert, + "Column [{$id}] {$property} value {$ofValue} did not match {$ofAssert}"); + } + } + } +} diff --git a/tests/unit/Data/DbCommon/MysqlColumnTest.php b/tests/unit/Data/DbCommon/MysqlColumnTest.php new file mode 100644 index 00000000..3bdfe54f --- /dev/null +++ b/tests/unit/Data/DbCommon/MysqlColumnTest.php @@ -0,0 +1,255 @@ +<?php +Prado::using('System.Data.*'); +Prado::using('System.Data.Common.Mysql.TMysqlMetaData'); + +/** + * @package System.Data.DbCommon + */ +class MysqlColumnTest extends PHPUnit_Framework_TestCase +{ + function create_meta_data() + { + $conn = new TDbConnection('mysql:host=localhost;dbname=tests;port=3307', 'test5','test5'); + return new TMysqlMetaData($conn); + } + + function test_columns() + { + $table = $this->create_meta_data()->getTableInfo('table1'); + $this->assertEqual(count($table->getColumns()), 18); + + $columns['id'] = array( + 'ColumnName' => '`id`', + 'ColumnSize' => 10, + 'ColumnIndex' => 0, + 'DbType' => 'int unsigned', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => true, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => true, + ); + + $columns['name'] = array( + 'ColumnName' => '`name`', + 'ColumnSize' => 45, + 'ColumnIndex' => 1, + 'DbType' => 'varchar', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => true, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field1'] = array( + 'ColumnName' => '`field1`', + 'ColumnSize' => 4, + 'ColumnIndex' => 2, + 'DbType' => 'tinyint', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field2_text'] = array( + 'ColumnName' => '`field2_text`', + 'ColumnSize' => null, + 'ColumnIndex' => 3, + 'DbType' => 'text', + 'AllowNull' => true, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field3_date'] = array( + 'ColumnName' => '`field3_date`', + 'ColumnSize' => null, + 'ColumnIndex' => 4, + 'DbType' => 'date', + 'AllowNull' => true, + 'DefaultValue' => '2007-02-25', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field4_float'] = array( + 'ColumnName' => '`field4_float`', + 'ColumnSize' => null, + 'ColumnIndex' => 5, + 'DbType' => 'float', + 'AllowNull' => false, + 'DefaultValue' => 10, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field5_float'] = array( + 'ColumnName' => '`field5_float`', + 'ColumnSize' => null, + 'ColumnIndex' => 6, + 'DbType' => 'float', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => 5, + 'NumericScale' => 4, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field6_double'] = array( + 'ColumnName' => '`field6_double`', + 'ColumnSize' => null, + 'ColumnIndex' => 7, + 'DbType' => 'double', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field7_datetime'] = array( + 'ColumnName' => '`field7_datetime`', + 'ColumnSize' => null, + 'ColumnIndex' => 8, + 'DbType' => 'datetime', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field8_timestamp'] = array( + 'ColumnName' => '`field8_timestamp`', + 'ColumnSize' => null, + 'ColumnIndex' => 9, + 'DbType' => 'timestamp', + 'AllowNull' => true, + 'DefaultValue' => 'CURRENT_TIMESTAMP', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field9_time'] = array( + 'ColumnName' => '`field9_time`', + 'ColumnSize' => null, + 'ColumnIndex' => 10, + 'DbType' => 'time', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field10_year'] = array( + 'ColumnName' => '`field10_year`', + 'ColumnSize' => 4, + 'ColumnIndex' => 11, + 'DbType' => 'year', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + ); + + $columns['field11_enum'] = array( + 'ColumnName' => '`field11_enum`', + 'ColumnSize' => null, + 'ColumnIndex' => 12, + 'DbType' => 'enum', + 'AllowNull' => false, + 'DefaultValue' => 'one', + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + 'DbTypeValues' => array('one', 'two', 'three'), + ); + + $columns['field12_SET'] = array( + 'ColumnName' => '`field12_SET`', + 'ColumnSize' => null, + 'ColumnIndex' => 13, + 'DbType' => 'set', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + 'AutoIncrement' => false, + 'DbTypeValues' => array('blue', 'red', 'green'), + ); + + $this->assertColumn($columns, $table); + + $this->assertNull($table->getSchemaName()); + $this->assertEqual('table1', $table->getTableName()); + $this->assertEqual(array('id', 'name'), $table->getPrimaryKeys()); + } + + function assertColumn($columns, $table) + { + foreach($columns as $id=>$asserts) + { + $column = $table->Columns[$id]; + foreach($asserts as $property=>$assert) + { + $ofAssert= var_export($assert,true); + $value = $column->{$property}; + $ofValue = var_export($value, true); + $this->assertEqual($value, $assert, + "Column [{$id}] {$property} value {$ofValue} did not match {$ofAssert}"); + } + } + } +} diff --git a/tests/unit/Data/DbCommon/PgsqlColumnTest.php b/tests/unit/Data/DbCommon/PgsqlColumnTest.php new file mode 100644 index 00000000..7d7f1177 --- /dev/null +++ b/tests/unit/Data/DbCommon/PgsqlColumnTest.php @@ -0,0 +1,141 @@ +<?php + +Prado::using('System.Data.*'); +Prado::using('System.Data.Common.Pgsql.TPgsqlMetaData'); + +/** + * @package System.Data.DbCommon + */ +class PgsqlColumnTest extends PHPUnit_Framework_TestCase +{ + function create_meta_data() + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + return new TPgsqlMetaData($conn); + } + + function test_text_column_def() + { + $table = $this->create_meta_data()->getTableInfo('public.address'); + $this->assertEqual(count($table->getColumns()), 14); + + $columns['id'] = array( + 'ColumnName' => '"id"', + 'ColumnSize' => null, + 'ColumnIndex' => 0, + 'DbType' => 'integer', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => true, + 'IsForeignKey' => false, + 'SequenceName' => 'public.address_id_seq', + ); + + $columns['username'] = array( + 'ColumnName' => '"username"', + 'ColumnSize' => 128, + 'ColumnIndex' => 1, + 'DbType' => 'character varying', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + ); + + $columns['phone'] = array( + 'ColumnName' => '"phone"', + 'ColumnSize' => 40, + 'ColumnIndex' => 2, + 'DbType' => 'character', + 'AllowNull' => false, + 'DefaultValue' => "'hello'::bpchar", + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + ); + + $columns['field1_boolean'] = array( + 'ColumnName' => '"field1_boolean"', + 'ColumnSize' => null, + 'ColumnIndex' => 3, + 'DbType' => 'boolean', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + ); + + $columns['field4_integer'] = array( + 'ColumnName' => '"field4_integer"', + 'ColumnSize' => null, + 'ColumnIndex' => 6, + 'DbType' => 'integer', + 'AllowNull' => false, + 'DefaultValue' => "1", + 'NumericPrecision' => null, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => true, + 'SequenceName' => null, + ); + + $columns['field7_timestamp'] = array( + 'ColumnName' => '"field7_timestamp"', + 'ColumnSize' => 2, + 'ColumnIndex' => 9, + 'DbType' => 'timestamp without time zone', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => 6, + 'NumericScale' => null, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + ); + + $columns['field9_numeric'] = array( + 'ColumnName' => '"field9_numeric"', + 'ColumnSize' => 393220, + 'ColumnIndex' => 11, + 'DbType' => 'numeric', + 'AllowNull' => false, + 'DefaultValue' => TDbTableColumn::UNDEFINED_VALUE, + 'NumericPrecision' => 6, + 'NumericScale' => 4, + 'IsPrimaryKey' => false, + 'IsForeignKey' => false, + 'SequenceName' => null, + ); + $this->assertColumn($columns, $table); + + $this->assertEqual('public', $table->getSchemaName()); + $this->assertEqual('address', $table->getTableName()); + $this->assertEqual(array('id'), $table->getPrimaryKeys()); + } + + function assertColumn($columns, $table) + { + foreach($columns as $id=>$asserts) + { + $column = $table->Columns[$id]; + foreach($asserts as $property=>$assert) + { + $ofAssert= var_export($assert,true); + $value = $column->{$property}; + $ofValue = var_export($value, true); + $this->assertEqual($value, $assert, + "Column [{$id}] {$property} value {$ofValue} did not match {$ofAssert}"); + } + } + } +} diff --git a/tests/unit/Data/DbCommon/SqliteColumnTest.php b/tests/unit/Data/DbCommon/SqliteColumnTest.php new file mode 100644 index 00000000..88117e9e --- /dev/null +++ b/tests/unit/Data/DbCommon/SqliteColumnTest.php @@ -0,0 +1,32 @@ +<?php +Prado::using('System.Data.*'); +Prado::using('System.Data.Common.Sqlite.TSqliteMetaData'); +Prado::using('System.Data.DataGateway.TTableGateway'); + +/** + * @package System.Data.DbCommon + */ +class SqliteColumnTest extends PHPUnit_Framework_TestCase +{ + /** + * @return TSqliteMetaData + */ + function meta_data() + { + $conn = new TDbConnection('sqlite:c:/test.db'); + return new TSqliteMetaData($conn); + } + + function test_it() + { + //$table = $this->meta_data()->getTableInfo('foo'); + //var_dump($table); + } + + function test_table() + { + $conn = new TDbConnection('sqlite:c:/test.db'); + //$table = new TTableGateway('Accounts', $conn); +// var_dump($table->findAll()->readAll()); + } +}
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/ActiveRecordSqlMapTest.php b/tests/unit/Data/SqlMap/ActiveRecordSqlMapTest.php new file mode 100644 index 00000000..c2eef7a1 --- /dev/null +++ b/tests/unit/Data/SqlMap/ActiveRecordSqlMapTest.php @@ -0,0 +1,88 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +Prado::using('System.Data.ActiveRecord.TActiveRecord'); + +/** + * @package System.Data.SqlMap + */ +class ActiveAccount extends TActiveRecord +{ + public $Account_Id; + public $Account_FirstName; + public $Account_LastName; + public $Account_Email; + + public $Account_Banner_Option; + public $Account_Cart_Option; + + const TABLE='Accounts'; + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} + +class ActiveRecordSqlMapTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + TActiveRecordManager::getInstance()->setDbConnection($this->getConnection()); + + //$this->initScript('account-init.sql'); + } + + function testLoadWithSqlMap() + { + $records = $this->sqlmap->queryForList('GetActiveRecordAccounts'); + $registry=TActiveRecordManager::getInstance()->getObjectStateRegistry(); + foreach($records as $record) + { + $this->assertEqual(get_class($record), 'ActiveAccount'); + $this->assertTrue($registry->isCleanObject($record)); + } + } + + function testLoadWithActiveRecord() + { + $records = ActiveAccount::finder()->findAll(); + $registry=TActiveRecordManager::getInstance()->getObjectStateRegistry(); + foreach($records as $record) + { + $this->assertEqual(get_class($record), 'ActiveAccount'); + //$this->assertTrue($registry->isCleanObject($record)); //? not clean anymore? + } + } + + function testLoadWithSqlMap_SaveWithActiveRecord() + { + $record = $this->sqlmap->queryForObject('GetActiveRecordAccounts'); + $registry=TActiveRecordManager::getInstance()->getObjectStateRegistry(); + $record->Account_FirstName = "Testing 123"; + $this->assertTrue($registry->isDirtyObject($record)); + + $this->assertTrue($record->save()); + + $check1 = $this->sqlmap->queryForObject('GetActiveRecordAccounts'); + $finder = ActiveAccount::finder(); + $check2 = $finder->findByAccount_FirstName($record->Account_FirstName); + + + $this->assertSameAccount($record,$check1); + $this->assertSameAccount($record,$check2); + + $this->initScript('account-init.sql'); + } + + function assertSameAccount($account1,$account2) + { + $props = array('Account_Id', 'Account_FirstName', 'Account_LastName', + 'Account_Email', 'Account_Banner_Option', 'Account_Cart_Option'); + foreach($props as $prop) + $this->assertEqual($account1->{$prop}, $account2->{$prop}); + } +} diff --git a/tests/unit/Data/SqlMap/AllTests.php b/tests/unit/Data/SqlMap/AllTests.php deleted file mode 100644 index 08870eb3..00000000 --- a/tests/unit/Data/SqlMap/AllTests.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - - -if(!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Data_SqlMap_AllTests::main'); -} - -require_once 'DynamicParameterTest.php'; -require_once 'DataMapper/AllTests.php'; - -class Data_SqlMap_AllTests { - - public static function main() { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() { - $suite = new PHPUnit_Framework_TestSuite('System.Data.SqlMap'); - - $suite->addTestSuite('DynamicParameterTest'); - $suite -> addTest( Data_SqlMap_DataMapper_AllTests::suite() ); - - return $suite; - } -} - -if(PHPUnit_MAIN_METHOD == 'Data_SqlMap_AllTests::main') { - Data_SqlMap_AllTests::main(); -} diff --git a/tests/unit/Data/SqlMap/BaseCase.php b/tests/unit/Data/SqlMap/BaseCase.php new file mode 100644 index 00000000..15bb3367 --- /dev/null +++ b/tests/unit/Data/SqlMap/BaseCase.php @@ -0,0 +1,260 @@ +<?php + +require_once(dirname(__FILE__).'/common.php'); +Prado::using('System.Data.SqlMap.TSqlMapManager'); + +/** + * @package System.Data.SqlMap + */ +class BaseCase extends PHPUnit_Framework_TestCase +{ + protected $sqlmap; + protected $connection; + private $mapper; + private $config; + protected $ScriptDirectory; + + public function testCase1() + { + $this->assertTrue(true); + } + + public function testCase2() + { + $this->assertTrue(true); + } + + public function __construct() + { + parent::__construct(); + $this->config = BaseTestConfig::createConfigInstance(); + $this->ScriptDirectory = $this->config->getScriptDir(); + } + + public function hasSupportFor($feature) + { + return $this->config->hasFeature($feature); + } + + public function __destruct() + { + if(!is_null($this->mapper)) + $this->mapper->cacheConfiguration(); + } + + function getConnection() + { + if(is_null($this->connection)) + $this->connection = $this->config->getConnection(); + $this->connection->setActive(true); + return $this->connection; + } + + /** + * Initialize an sqlMap + */ + protected function initSqlMap() + { + $manager = new TSqlMapManager($this->config->getConnection()); + $manager->configureXml($this->config->getSqlMapConfigFile()); + $this->sqlmap = $manager->getSqlMapGateway(); + $manager->TypeHandlers->registerTypeHandler(new TDateTimeHandler); + } + + /** + * Run a sql batch for the datasource. + */ + protected function initScript($script) + { + $runner = $this->config->getScriptRunner(); + $runner->runScript($this->getConnection(), $this->ScriptDirectory.$script); + } + + /** + * Create a new account with id = 6 + */ + protected function NewAccount6() + { + $account = new Account(); + $account->setID(6); + $account->setFirstName('Calamity'); + $account->setLastName('Jane'); + $account->setEmailAddress('no_email@provided.com'); + return $account; + } + + /** + * Verify that the input account is equal to the account(id=1). + */ + protected function assertAccount1(Account $account) + { + $this->assertIdentical($account->getID(), 1); + $this->assertIdentical($account->getFirstName(), 'Joe'); + $this->assertIdentical($account->getEmailAddress(), 'Joe.Dalton@somewhere.com'); + } + + /** + * Verify that the input account is equal to the account(id=6). + */ + protected function assertAccount6(Account $account) + { + $this->assertIdentical($account->getID(), 6); + $this->assertIdentical($account->getFirstName(), 'Calamity'); + $this->assertIdentical($account->getLastName(), 'Jane'); + $this->assertNull($account->getEmailAddress()); + } + + /** + * Verify that the input order is equal to the order(id=1). + */ + protected function assertOrder1(Order $order) + { + $date = @mktime(8,15,0,2,15,2003); + + $this->assertIdentical((int)$order->getID(), 1); + if($order->getDate() instanceof TDateTime) + $this->assertIdentical($order->getDate()->getTimestamp(), $date); + else + $this->fail(); + $this->assertIdentical($order->getCardType(), 'VISA'); + $this->assertIdentical($order->getCardNumber(), '999999999999'); + $this->assertIdentical($order->getCardExpiry(), '05/03'); + $this->assertIdentical($order->getStreet(), '11 This Street'); + $this->assertIdentical($order->getProvince(), 'BC'); + $this->assertIdentical($order->getPostalCode(), 'C4B 4F4'); + } + + function assertAccount1AsHashArray($account) + { + $this->assertIdentical(1, (int)$account["Id"]); + $this->assertIdentical("Joe", $account["FirstName"]); + $this->assertIdentical("Dalton", $account["LastName"]); + $this->assertIdentical("Joe.Dalton@somewhere.com", $account["EmailAddress"]); + } + + function AssertOrder1AsHashArray($order) + { + $date = @mktime(8,15,0,2,15,2003); + + $this->assertIdentical(1, $order["Id"]); + if($order['Date'] instanceof TDateTime) + $this->assertIdentical($date, $order["Date"]->getTimestamp()); + else + $this->fail(); + $this->assertIdentical("VISA", $order["CardType"]); + $this->assertIdentical("999999999999", $order["CardNumber"]); + $this->assertIdentical("05/03", $order["CardExpiry"]); + $this->assertIdentical("11 This Street", $order["Street"]); + $this->assertIdentical("Victoria", $order["City"]); + $this->assertIdentical("BC", $order["Province"]); + $this->assertIdentical("C4B 4F4", $order["PostalCode"]); + } + +} + +class HundredsBool extends TSqlMapTypeHandler +{ + public function getResult($string) + { + $value = intval($string); + if($value == 100) + return true; + if($value == 200) + return false; + //throw new Exception('unexpected value '.$value); + } + + public function getParameter($parameter) + { + if($parameter) + return 100; + else + return 200; + } + + public function createNewInstance($data=null) + { + throw new TDataMapperException('can not create'); + } +} + +class OuiNonBool extends TSqlMapTypeHandler +{ + const YES = "Oui"; + const NO = "Non"; + + public function getResult($string) + { + if($string === self::YES) + return true; + if($string === self::NO) + return false; + //throw new Exception('unexpected value '.$string); + } + + public function getParameter($parameter) + { + if($parameter) + return self::YES; + else + return self::NO; + } + + public function createNewInstance($data=null) + { + throw new TDataMapperException('can not create'); + } +} + +class TDateTimeHandler extends TSqlMapTypeHandler +{ + public function getType() + { + return 'date'; + } + + public function getResult($string) + { + $time = new TDateTime($string); + return $time; + } + + public function getParameter($parameter) + { + if($parameter instanceof TDateTime) + return $parameter->getTimestamp(); + else + return $parameter; + } + + public function createNewInstance($data=null) + { + return new TDateTime; + } +} + +class TDateTime +{ + private $_datetime; + + public function __construct($datetime=null) + { + if(!is_null($datetime)) + $this->setDatetime($datetime); + } + + public function getTimestamp() + { + return strtotime($this->getDatetime()); + } + + public function getDateTime() + { + return $this->_datetime; + } + + public function setDateTime($value) + { + $this->_datetime = $value; + } +} diff --git a/tests/unit/Data/SqlMap/CacheTest.php b/tests/unit/Data/SqlMap/CacheTest.php new file mode 100644 index 00000000..3d2ccd41 --- /dev/null +++ b/tests/unit/Data/SqlMap/CacheTest.php @@ -0,0 +1,162 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class CacheTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + + $this->initSqlMap(); + + //force autoload + new Account; + } + + function resetDatabase() + { + $this->initScript('account-init.sql'); + } + + /** + * Test for JIRA 29 + */ + function testJIRA28() + { + $account = $this->sqlmap->queryForObject("GetNoAccountWithCache",-99); + $this->assertNull($account); + } + + /** + * Test Cache query + */ + function testQueryWithCache() + { + $this->resetDatabase(); + + $list1 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + + $list2 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + + $this->assertTrue($list1 === $list2); + + $account = $list1[1]; + $account->setEmailAddress("somebody@cache.com"); + + //this will cause the cache to flush + $this->sqlmap->update("UpdateAccountViaInlineParameters", $account); + + $list3 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + + $this->assertTrue($list1 !== $list3); + + $this->resetDatabase(); + } + + + /** + * Test flush Cache + */ + function testFlushDataCache() + { + $list1 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + $list2 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + + $this->assertTrue($list1 === $list2); + $this->sqlmap->flushCaches(); + + $list3 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + + $this->assertTrue($list1 !== $list3); + } + + /** + * + */ + function testFlushDataCacheOnExecute() + { + $list1 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + + $list2 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + + $this->assertTrue($list1 === $list2); + $this->sqlmap->update("UpdateAccountViaInlineParameters", $list1[0]); + + $list3 = $this->sqlmap->queryForList("GetCachedAccountsViaResultMap"); + + $this->assertTrue($list1 !== $list3); + } + + /** + */ + protected function getCacheModel() + { + $cache = new TSqlMapCacheModel(); + // $cache->setFlushInterval(5*60); + $cache->setImplementation('LRU'); + $cache->initialize(); + return $cache; + } + + /** + * Test CacheHit + */ + function testCacheHit() + { + $cache = $this->getCacheModel(); + $key = new TSqlMapCacheKey('testkey'); + $cache->set($key, 'a'); + + $returnedObject = $cache->get($key); + + $this->assertIdentical('a', $returnedObject); + + $this->assertIdentical(1, $cache->getHitRatio()); + } + + + + /** + * Test CacheMiss + */ + function testCacheMiss() + { + $cache = $this->getCacheModel(); + $key = new TSqlMapCacheKey('testKey'); + $value = 'testValue'; + $cache->set($key, $value); + + $wrongKey = new TSqlMapCacheKey('wrongKey'); + + $returnedObject = $cache->get($wrongKey); + $this->assertNotEqual($value, $returnedObject); + $this->assertNull($returnedObject) ; + $this->assertIdentical(0, $cache->getHitRatio()); + } + + /** + * Test CacheHitMiss + */ + function testCacheHitMiss() + { + $cache = $this->getCacheModel(); + $key = new TSqlMapCacheKey('testKey'); + + $value = "testValue"; + $cache->set($key, $value); + + $returnedObject = $cache->get($key); + $this->assertIdentical($value, $returnedObject); + + $wrongKey = new TSqlMapCacheKey('wrongKey'); + + $returnedObject = $cache->get($wrongKey); + $this->assertNotEqual($value, $returnedObject); + $this->assertNull($returnedObject) ; + $this->assertIdentical(0.5, $cache->getHitRatio()); + } +} diff --git a/tests/unit/Data/SqlMap/DataMapper/AllTests.php b/tests/unit/Data/SqlMap/DataMapper/AllTests.php deleted file mode 100644 index d685d474..00000000 --- a/tests/unit/Data/SqlMap/DataMapper/AllTests.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - - -if(!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Data_SqlMap_DataMapper_AllTests::main'); -} - -require_once 'TPropertyAccessTest.php'; - -class Data_SqlMap_DataMapper_AllTests { - - public static function main() { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - public static function suite() { - $suite = new PHPUnit_Framework_TestSuite('System.Data.SqlMap.DataMapper'); - - $suite->addTestSuite('TPropertyAccessTest'); - - return $suite; - } -} - -if(PHPUnit_MAIN_METHOD == 'Data_SqlMap_DataMapper_AllTests::main') { - Data_SqlMap_DataMapper_AllTests::main(); -}
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/DelegateTest.php b/tests/unit/Data/SqlMap/DelegateTest.php new file mode 100644 index 00000000..5bfbe5ce --- /dev/null +++ b/tests/unit/Data/SqlMap/DelegateTest.php @@ -0,0 +1,62 @@ +<?php +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class DelegateTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + } + + function testListDelegate() + { + $list = $this->sqlmap->queryWithRowDelegate( + "GetAllAccountsViaResultMap", array($this, 'listHandler')); + + $this->assertIdentical(5, count($list)); + $this->assertAccount1($list[0]); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + $this->assertIdentical(3, $list[2]->getID()); + $this->assertIdentical(4, $list[3]->getID()); + $this->assertIdentical(5, $list[4]->getID()); + } + + /** + * Test ExecuteQueryForMap : Hashtable. + */ + function testExecuteQueryForMap() + { + $map = $this->sqlmap->QueryForMapWithRowDelegate( + "GetAllAccountsViaResultClass", array($this, 'mapHandler'), null, "FirstName"); + + $this->assertIdentical(5, count($map)); + $this->assertAccount1($map["Joe"]); + + $this->assertIdentical(1, $map["Joe"]->getID()); + $this->assertIdentical(2, $map["Averel"]->getID()); + $this->assertIdentical(3, $map["William"]->getID()); + $this->assertIdentical(4, $map["Jack"]->getID()); + $this->assertIdentical(5, $map["Gilles"]->getID()); + } + + public function listHandler($sender, $param) + { + $list = &$param->getList(); + $list[] = $param->result; + $this->assertTrue($param->result instanceof Account); + } + + public function mapHandler($sender, $param) + { + $map = &$param->getMap(); + $map[$param->getKey()] = $param->getValue(); + $this->assertTrue($param->getValue() instanceof Account); + } +} + + diff --git a/tests/unit/Data/SqlMap/GroupByTest.php b/tests/unit/Data/SqlMap/GroupByTest.php new file mode 100644 index 00000000..3d414922 --- /dev/null +++ b/tests/unit/Data/SqlMap/GroupByTest.php @@ -0,0 +1,41 @@ +<?php +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class AccountWithOrders extends Account +{ + private $_orders = array(); + + public function setOrders($orders) + { + $this->_orders = $orders; + } + + public function getOrders() + { + return $this->_orders; + } +} + + +class GroupByTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + } + + function testAccountWithOrders() + { + $this->initScript('account-init.sql'); + $accounts = $this->sqlmap->queryForList("getAccountWithOrders"); + $this->assertIdentical(5, count($accounts)); + foreach($accounts as $account) + $this->assertIdentical(2, count($account->getOrders())); + } + +/**/ +} diff --git a/tests/unit/Data/SqlMap/InheritanceTest.php b/tests/unit/Data/SqlMap/InheritanceTest.php new file mode 100644 index 00000000..9c8a805e --- /dev/null +++ b/tests/unit/Data/SqlMap/InheritanceTest.php @@ -0,0 +1,144 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class InheritanceTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + + $this->initSqlMap(); + $this->initScript('documents-init.sql'); + } + + /// Test All document with no formula + function testGetAllDocument() + { + $list = $this->sqlmap->queryForList("GetAllDocument"); + + $this->assertEqual(6, count($list)); + $book = $list[0]; + $this->assertBook($book, 1, "The World of Null-A", 55); + + $book = $list[1]; + $this->assertBook($book, 3, "Lord of the Rings", 3587); + + $document = $list[2]; + $this->assertDocument($document, 5, "Le Monde"); + + $document = $list[3]; + $this->assertDocument($document, 6, "Foundation"); + + $news = $list[4]; + $this->assertNewspaper($news, 2, "Le Progres de Lyon", "Lyon"); + + $document = $list[5]; + $this->assertDocument($document, 4, "Le Canard enchaine"); + } + + /// Test All document in a typed collection + function testGetTypedCollection() + { + $list = $this->sqlmap->queryForList("GetTypedCollection"); + + $this->assertEqual(6, $list->getCount()); + + $book = $list[0]; + $this->assertBook($book, 1, "The World of Null-A", 55); + + $book = $list[1]; + $this->assertBook($book, 3, "Lord of the Rings", 3587); + + $document = $list[2]; + $this->assertDocument($document, 5, "Le Monde"); + + $document = $list[3]; + $this->assertDocument($document, 6, "Foundation"); + + $news = $list[4]; + $this->assertNewspaper($news, 2, "Le Progres de Lyon", "Lyon"); + + $document = $list[5]; + $this->assertDocument($document, 4, "Le Canard enchaine"); + } + + /// Test All document with Custom Type Handler + function testGetAllDocumentWithCustomTypeHandler() + { + + //register the custom inheritance type handler + $this->sqlmap->registerTypeHandler(new CustomInheritance); + + $list = $this->sqlmap->queryForList("GetAllDocumentWithCustomTypeHandler"); + + $this->assertEqual(6, count($list)); + $book = $list[0]; + $this->assertBook($book, 1, "The World of Null-A", 55); + + $book = $list[1]; + $this->assertBook($book, 3, "Lord of the Rings", 3587); + + $news = $list[2]; + $this->assertNewspaper($news, 5, "Le Monde", "Paris"); + + $book = $list[3]; + $this->assertBook($book, 6, "Foundation", 557); + + $news = $list[4]; + $this->assertNewspaper($news, 2, "Le Progres de Lyon", "Lyon"); + + $news = $list[5]; + $this->assertNewspaper($news, 4, "Le Canard enchaine", "Paris"); + } + + function AssertDocument(Document $document, $id, $title) + { + $this->assertEqual($id, $document->getID()); + $this->assertEqual($title, $document->getTitle()); + } + + function AssertBook(Book $book, $id, $title, $pageNumber) + { + $this->assertEqual($id, $book->getId()); + $this->assertEqual($title, $book->getTitle()); + $this->assertEqual($pageNumber, (int)$book->getPageNumber()); + } + + function AssertNewspaper(Newspaper $news, $id, $title, $city) + { + $this->assertEqual($id, $news->getId()); + $this->assertEqual($title, $news->getTitle()); + $this->assertEqual($city, $news->getCity()); + } +} + + +class CustomInheritance extends TSqlMapTypeHandler +{ + public function getResult($type) + { + switch ($type) + { + case 'Monograph': case 'Book': + return 'Book'; + case 'Tabloid': case 'Broadsheet': case 'Newspaper': + return 'Newspaper'; + default: + return 'Document'; + } + } + + public function getParameter($parameter) + { + throw new TDataMapperException('not implemented'); + } + + public function createNewInstance($data=null) + { + throw new TDataMapperException('can not create'); + } +}
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/ParameterMapTest.php b/tests/unit/Data/SqlMap/ParameterMapTest.php new file mode 100644 index 00000000..de5c235c --- /dev/null +++ b/tests/unit/Data/SqlMap/ParameterMapTest.php @@ -0,0 +1,247 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class ParameterMapTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + } + + function setup() + { + $this->initScript('account-init.sql'); +// $this->initScript('account-procedure.sql'); + $this->initScript('order-init.sql'); +// $this->initScript('line-item-init.sql'); + $this->initScript('category-init.sql'); + } + + /// Test null replacement in ParameterMap property + function testNullValueReplacement() + { + $account = $this->newAccount6(); + + $this->sqlmap->insert("InsertAccountViaParameterMap", $account); + $account = $this->sqlmap->queryForObject("GetAccountNullableEmail", 6); + + $this->assertNull($account->getEmailAddress(), 'no_email@provided.com'); + + $this->assertAccount6($account); + } + + /// Test Test Null Value Replacement Inline + function testNullValueReplacementInline() + { + $account = $this->newAccount6(); + + $this->sqlmap->insert("InsertAccountViaInlineParameters", $account); + $account = $this->sqlmap->queryForObject("GetAccountNullableEmail", 6); + $this->assertNull($account->getEmailAddress()); + + $this->assertAccount6($account); + } + + /// Test Test Null Value Replacement Inline + function testSpecifiedType() + { + $account = $this->newAccount6(); + $account->setEmailAddress(null); + $this->sqlmap->insert("InsertAccountNullableEmail", $account); + $account = $this->sqlmap->queryForObject("GetAccountNullableEmail", 6); + $this->assertAccount6($account); + } + + + /// Test Test Null Value Replacement Inline + function testUnknownParameterClass() + { + $account = $this->newAccount6(); + $account->setEmailAddress(null); + $this->sqlmap->insert("InsertAccountUknownParameterClass", $account); + $account = $this->sqlmap->queryForObject("GetAccountNullableEmail", 6); + $this->assertAccount6($account); + } + + + /// Test null replacement in ParameterMap property + /// for System.DateTime.MinValue + function testNullValueReplacementForDateTimeMinValue() + { + $account = $this->newAccount6(); + $this->sqlmap->insert("InsertAccountViaParameterMap", $account); + $order = new Order(); + $order->setId(99); + $order->setCardExpiry("09/11"); + $order->setAccount($account); + $order->setCardNumber("154564656"); + $order->setCardType("Visa"); + $order->setCity("Lyon"); + $order->setDate(null); + $order->setPostalCode("69004"); + $order->setProvince("Rhone"); + $order->setStreet("rue Durand"); + + $this->sqlmap->insert("InsertOrderViaParameterMap", $order); + + $orderTest = $this->sqlmap->queryForObject("GetOrderLiteByColumnName", 99); + + $this->assertIdentical($order->getCity(), $orderTest->getCity()); + } + + /// Test null replacement in ParameterMap/Hahstable property + /// for System.DateTime.MinValue + function testNullValueReplacementForDateTimeWithHashtable() + { + $account = $this->newAccount6(); + + $this->sqlmap->insert("InsertAccountViaParameterMap", $account); + + $order = new Order(); + $order->setId(99); + $order->setCardExpiry("09/11"); + $order->setAccount($account); + $order->setCardNumber("154564656"); + $order->setCardType("Visa"); + $order->setCity("Lyon"); + $order->setDate('0001-01-01 00:00:00'); //<-- null replacement + $order->setPostalCode("69004"); + $order->setProvince("Rhone"); + $order->setStreet("rue Durand"); + + $this->sqlmap->insert("InsertOrderViaParameterMap", $order); + + $orderTest = $this->sqlmap->queryForObject("GetOrderByHashTable", 99); + + $this->assertIdentical($orderTest["Date"], '0001-01-01 00:00:00'); + } + + /// Test null replacement in ParameterMap property + /// for Guid + function testNullValueReplacementForGuidValue() + { + if($this->hasSupportFor('last_insert_id')) + { + $category = new Category(); + $category->setName("Totoasdasd"); + $category->setGuidString('00000000-0000-0000-0000-000000000000'); + + $key = $this->sqlmap->insert("InsertCategoryNull", $category); + + $categoryRead = $this->sqlmap->queryForObject("GetCategory", $key); + + $this->assertIdentical($category->getName(), $categoryRead->getName()); + $this->assertIdentical('', $categoryRead->getGuidString()); + } + } + + + +/// Test complex mapping Via hasTable + /// <example> + /// + /// map.Add("Item", Item); + /// map.Add("Order", Order); + /// + /// <statement> + /// ... #Item.prop1#...#Order.prop2# + /// </statement> + /// + /// </example> + function testComplexMappingViaHasTable() + { + $a = new Account(); + $a->setFirstName("Joe"); + + $param["Account"] = $a; + + $o = new Order(); + $o->setCity("Dalton"); + $param["Order"] = $o; + + $accountTest = $this->sqlmap->queryForObject("GetAccountComplexMapping", $param); + + $this->assertAccount1($accountTest); + } + +/* + /// Test ByteArrayTypeHandler via Picture Property + function testByteArrayTypeHandler() + { + $account = $this->newAccount6(); + + $this->sqlmap->insert("InsertAccountViaParameterMap", $account); + + $order = new Order(); + $order->setId(99); + $order->setCardExpiry("09/11"); + $order->setAccount($account); + $order->setCardNumber("154564656"); + $order->setCardType("Visa"); + $order->setCity("Lyon"); + $order->setDate(0); + $order->setPostalCode("69004"); + $order->setProvince("Rhone"); + $order->setStreet("rue Durand"); + + $this->sqlmap->insert("InsertOrderViaParameterMap", $order); + + $item = new LineItem(); + $item->setId(99); + $item->setCode("test"); + $item->setPrice(-99.99); + $item->setQuantity(99); + $item->setOrder($order); + $item->setPicture(null); + + // Check insert + $this->sqlmap->insert("InsertLineItemWithPicture", $item); + + // select + $item = null; + + $param["LineItem_ID"] = 99; + $param["Order_ID"] = 99; + + $item = $this->sqlmap->queryForObject("GetSpecificLineItemWithPicture", $param); + + $this->assertNotNull($item->getId()); +// $this->assertNotNull($item->getPicture()); +// $this->assertIdentical( GetSize(item.Picture), this.GetSize( this.GetPicture() )); + } +*/ + + /// Test extend parameter map capacity + /// (Support Requests 1043181) + function testInsertOrderViaExtendParameterMap() + { + $this->sqlmap->getSqlMapManager()->getTypeHandlers()->registerTypeHandler(new HundredsBool()); + + $account = $this->newAccount6(); + $this->sqlmap->insert("InsertAccountViaParameterMap", $account); + + $order = new Order(); + $order->setId(99); + $order->setCardExpiry("09/11"); + $order->setAccount($account); + $order->setCardNumber("154564656"); + $order->setCardType("Visa"); + $order->setCity("Lyon"); + $order->setDate(null); //<-- null replacement + $order->setPostalCode("69004"); + $order->setProvince("Rhone"); + $order->setStreet("rue Durand"); + + $this->sqlmap->insert("InsertOrderViaExtendParameterMap", $order); + + $orderTest = $this->sqlmap->queryForObject("GetOrderLiteByColumnName", 99); + + $this->assertIdentical($order->getCity(), $orderTest->getCity()); + } +/**/ +} diff --git a/tests/unit/Data/SqlMap/PropertyAccessTest.php b/tests/unit/Data/SqlMap/PropertyAccessTest.php new file mode 100644 index 00000000..eb8306d5 --- /dev/null +++ b/tests/unit/Data/SqlMap/PropertyAccessTest.php @@ -0,0 +1,75 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class PropertyAccessTest extends BaseCase +{ + function testGetPublicProperty() + { + $account = new AccountBis(); + + $account->Id = 10; + $account->FirstName = "Luky"; + $account->LastName = "Luke"; + $account->EmailAddress = "luly.luke@somewhere.com"; + + $two = new AccountBis(); + $two->Id = 12; + $two->FirstName = "Mini Me!"; + $account->More = $two; + + $account6 = $this->NewAccount6(); + $two->More = $account6; + + $this->assertIdentical(10, TPropertyAccess::get($account, 'Id')); + $this->assertIdentical(12, TPropertyAccess::get($account, 'More.Id')); + $this->assertIdentical(6, TPropertyAccess::get($account, 'More.More.Id')); + } + + function testSetPublicProperty() + { + $account = new AccountBis(); + + $account->Id = 10; + $account->FirstName = "Luky"; + $account->LastName = "Luke"; + $account->EmailAddress = "luly.luke@somewhere.com"; + + $two = new AccountBis(); + $two->Id = 12; + $two->FirstName = "Mini Me!"; + TPropertyAccess::set($account, 'More', $two); + + $account6 = $this->NewAccount6(); + TPropertyAccess::set($account, 'More.More', $account6); + + TPropertyAccess::set($account, 'More.More.EmailAddress', 'hahaha'); + + $this->assertIdentical(10, TPropertyAccess::get($account, 'Id')); + $this->assertIdentical(12, TPropertyAccess::get($account, 'More.Id')); + $this->assertIdentical(6, TPropertyAccess::get($account, 'More.More.Id')); + + $this->assertIdentical('hahaha', + TPropertyAccess::get($account, 'More.More.EmailAddress')); + } + + function testArrayAccessProperty() + { + $account = new AccountBis(); + $things['more'] = 1; + $things['accounts'] = $this->NewAccount6(); + $account->More = $things; + + $this->assertIdentical(6, TPropertyAccess::get($account, 'More.accounts.ID')); + + TPropertyAccess::set($account, 'More.accounts.EmailAddress', 'adssd'); + $this->assertIdentical('adssd', TPropertyAccess::get($account, 'More.accounts.EmailAddress')); + + $this->assertIdentical(1, TPropertyAccess::get($things, 'more')); + } + +} + diff --git a/tests/unit/Data/SqlMap/ResultClassTest.php b/tests/unit/Data/SqlMap/ResultClassTest.php new file mode 100644 index 00000000..9b02ca70 --- /dev/null +++ b/tests/unit/Data/SqlMap/ResultClassTest.php @@ -0,0 +1,247 @@ +<?php +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class ResultClassTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + } + + /** + * Test a boolean resultClass + */ + function testBoolean() + { + $bit = $this->sqlmap->queryForObject("GetBoolean", 1); + $this->assertIdentical(true, $bit); + } + + /** + * Test a boolean implicit resultClass + */ + function testBooleanWithoutResultClass() + { + $bit = (boolean)$this->sqlmap->queryForObject("GetBooleanWithoutResultClass", 1); + $this->assertIdentical(true, $bit); + } + + /** + * Test a byte resultClass + */ + function testByte() + { + $letter = $this->sqlmap->queryForObject("GetByte", 1); + $this->assertIdentical(155, (int)$letter); + } + + /** + * Test a byte implicit resultClass + */ + function testByteWithoutResultClass() + { + $letter = $this->sqlmap->queryForObject("GetByteWithoutResultClass", 1); + $this->assertIdentical(155, (int)$letter); + } + + /** + * Test a char resultClass + */ + function testChar() + { + $letter = $this->sqlmap->queryForObject("GetChar", 1); + $this->assertIdentical('a', trim($letter)); + } + + /** + * Test a char implicit resultClass + */ + function testCharWithoutResultClass() + { + $letter = $this->sqlmap->queryForObject("GetCharWithoutResultClass", 1); + $this->assertIdentical('a', trim($letter)); + } + + /** + * Test a DateTime resultClass + */ + function testDateTime() + { + $orderDate = $this->sqlmap->queryForObject("GetDate", 1); + $date = @mktime(8, 15, 00, 2, 15, 2003); + $this->assertIdentical($date, $orderDate->getTimeStamp()); + } + + /** + * Test a DateTime implicit resultClass + */ + function testDateTimeWithoutResultClass() + { + $date = $this->sqlmap->queryForObject("GetDateWithoutResultClass", 1); + $orderDate = new TDateTime; + $orderDate->setDateTime($date); + $date = @mktime(8, 15, 00, 2, 15, 2003); + + $this->assertIdentical($date, $orderDate->getTimeStamp()); + } + + /** + * Test a decimal resultClass + */ + function testDecimal() + { + $price = $this->sqlmap->queryForObject("GetDecimal", 1); + $this->assertIdentical(1.56, $price); + } + + /** + * Test a decimal implicit resultClass + */ + function testDecimalWithoutResultClass() + { + $price = $this->sqlmap->queryForObject("GetDecimalWithoutResultClass", 1); + $this->assertIdentical(1.56, (float)$price); + } + + /** + * Test a double resultClass + */ + function testDouble() + { + $price = $this->sqlmap->queryForObject("GetDouble", 1); + $this->assertIdentical(99.5, $price); + } + + /** + * Test a double implicit resultClass + */ + function testDoubleWithoutResultClass() + { + $price = $this->sqlmap->queryForObject("GetDoubleWithoutResultClass", 1); + $this->assertIdentical(99.5, (float)$price); + } + + /** + * IBATISNET-25 Error applying ResultMap when using 'Guid' in resultClass + */ +/* function testGuid() + { + Guid newGuid = new Guid("CD5ABF17-4BBC-4C86-92F1-257735414CF4"); + + Guid guid = (Guid) $this->sqlmap->queryForObject("GetGuid", 1); + + $this->assertIdentical(newGuid, guid); + } +*/ + + /** + * Test a Guid implicit resultClass + */ +/* function testGuidWithoutResultClass() + { + Guid newGuid = new Guid("CD5ABF17-4BBC-4C86-92F1-257735414CF4"); + + string guidString = Convert.ToString($this->sqlmap->queryForObject("GetGuidWithoutResultClass", 1)); + + Guid guid = new Guid(guidString); + + $this->assertIdentical(newGuid, guid); + } +*/ + /** + * Test a int16 resultClass (integer in PHP) + */ + function testInt16() + { + $integer = $this->sqlmap->queryForObject("GetInt16", 1); + + $this->assertIdentical(32111, $integer); + } + + /** + * Test a int16 implicit resultClass (integer in PHP) + */ + function testInt16WithoutResultClass() + { + $integer = $this->sqlmap->queryForObject("GetInt16WithoutResultClass", 1); + $this->assertIdentical(32111, (int)$integer); + } + + /** + * Test a int 32 resultClass (integer in PHP) + */ + function testInt32() + { + $integer = $this->sqlmap->queryForObject("GetInt32", 1); + $this->assertIdentical(999999, $integer); + } + + /** + * Test a int 32 implicit resultClass (integer in PHP) + */ + function testInt32WithoutResultClass() + { + $integer = $this->sqlmap->queryForObject("GetInt32WithoutResultClass", 1); + $this->assertIdentical(999999, (int)$integer); + } + + /** + * Test a int64 resultClass (float in PHP) + */ + function testInt64() + { + $bigInt = $this->sqlmap->queryForObject("GetInt64", 1); + $this->assertIdentical(9223372036854775800, $bigInt); + } + + /** + * Test a int64 implicit resultClass (float in PHP) + */ + function testInt64WithoutResultClass() + { + $bigInt = $this->sqlmap->queryForObject("GetInt64WithoutResultClass", 1); + $this->assertIdentical(9223372036854775800, (double)$bigInt); + } + + /** + * Test a single/float resultClass + */ + function testSingle() + { + $price = (float)$this->sqlmap->queryForObject("GetSingle", 1); + $this->assertIdentical(92233.5, $price); + } + + /** + * Test a single/float implicit resultClass + */ + function testSingleWithoutResultClass() + { + $price = $this->sqlmap->queryForObject("GetSingleWithoutResultClass", 1); + $this->assertIdentical(92233.5, (float)$price); + } + + /** + * Test a string resultClass + */ + function testString() + { + $cardType = $this->sqlmap->queryForObject("GetString", 1); + $this->assertIdentical("VISA", $cardType); + } + + /** + * Test a string implicit resultClass + */ + function testStringWithoutResultClass() + { + $cardType = $this->sqlmap->queryForObject("GetStringWithoutResultClass", 1); + $this->assertIdentical("VISA", $cardType); + } +/**/ + +} diff --git a/tests/unit/Data/SqlMap/ResultMapTest.php b/tests/unit/Data/SqlMap/ResultMapTest.php new file mode 100644 index 00000000..c757f874 --- /dev/null +++ b/tests/unit/Data/SqlMap/ResultMapTest.php @@ -0,0 +1,271 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class ResultMapTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + new Order; + new LineItemCollection; + new Account; + } + + function resetDatabase() + { + $this->initScript('account-init.sql'); + $this->initScript('order-init.sql'); + $this->initScript('line-item-init.sql'); +// $this->initScript('enumeration-init.sql'); + } + + function testColumnsByName() + { + $order = $this->sqlmap->QueryForObject('GetOrderLiteByColumnName', 1); + $this->assertOrder1($order); + } + + function testColumnsByIndex() + { + $order = $this->sqlmap->QueryForObject("GetOrderLiteByColumnIndex", 1); + $this->assertOrder1($order); + } + + function testExtendedResultMap() + { + $order = $this->sqlmap->queryForObject("GetOrderWithLineItemsNoLazyLoad", 1); + $this->assertOrder1($order); + $this->assertTrue($order->getLineItemsList() instanceof TList); + $this->assertIdentical(2, $order->getLineItemsList()->getCount()); + } + + + function testLazyLoad() + { + $order = $this->sqlmap->QueryForObject("GetOrderWithLineItems", 1); + $this->assertOrder1($order); + $this->assertNotNull($order->getLineItemsList()); + $this->assertFalse($order->getLineItemsList() instanceof TList); + $this->assertIdentical(2, $order->getLineItemsList()->getCount()); + + // After a call to a method from a proxy object, + // the proxy object is replaced by the real object. + $this->assertTrue($order->getLineItemsList() instanceof TList); + $this->assertIdentical(2, $order->getLineItemsList()->getCount()); + } + + function testLazyWithTypedCollectionMapping() + { + $order = $this->sqlmap->queryForObject("GetOrderWithLineItemCollection", 1); + $this->assertOrder1($order); + $this->assertNotNull($order->getLineItems()); + $this->assertFalse($order->getLineItemsList() instanceof LineItemCollection); + + $this->assertIdentical(2, $order->getLineItems()->getCount()); + + // After a call to a method from a proxy object, + // the proxy object is replaced by the real object. + $this->assertTrue($order->getLineItems() instanceof LineItemCollection); + foreach($order->getLineItems() as $item) + { + $this->assertNotNull($item); + $this->assertTrue($item instanceof LineItem); + } + } + + function testNullValueReplacementOnString() + { + $account = $this->sqlmap->queryForObject("GetAccountViaColumnName", 5); + $this->assertIdentical("no_email@provided.com", $account->getEmailAddress()); + } + + function testTypeSpecified() + { + $order = $this->sqlmap->queryForObject("GetOrderWithTypes", 1); + $this->assertOrder1($order); + } + + function testComplexObjectMapping() + { + $order = $this->sqlmap->queryForObject("GetOrderWithAccount", 1); + $this->assertOrder1($order); + $this->assertAccount1($order->getAccount()); + } + + function testCollectionMappingAndExtends() + { + $order = $this->sqlmap->queryForObject("GetOrderWithLineItemsCollection", 1); + $this->assertOrder1($order); + + // Check strongly typed collection + $this->assertNotNull($order->getLineItems()); + $this->assertIdentical(2, $order->getLineItems()->getCount()); + } + + function testListMapping() + { + $order = $this->sqlmap->queryForObject("GetOrderWithLineItems", 1); + $this->assertOrder1($order); + + // Check TList collection + $this->assertNotNull($order->getLineItemsList()); + $this->assertIdentical(2, $order->getLineItemsList()->getCount()); + } + + function testArrayMapping() + { + $order = $this->sqlmap->queryForObject("GetOrderWithLineItemArray", 1); + $this->assertOrder1($order); + $this->assertNotNull($order->getLineItemsArray()); + $this->assertTrue(is_array($order->getLineItemsArray())); + $this->assertIdentical(2, count($order->getLineItemsArray())); + } + + function testTypedCollectionMapping() + { + $order = $this->sqlmap->queryForObject("GetOrderWithLineItemCollectionNoLazy", 1); + $this->assertOrder1($order); + $this->assertNotNull($order->getLineItems()); + $this->assertTrue($order->getLineItems() instanceof LineItemCollection); + $this->assertIdentical(2, $order->getLineItems()->getCount()); + foreach($order->getLineItems() as $item) + { + $this->assertNotNull($item); + $this->assertTrue($item instanceof LineItem); + } + } + + function testHashArrayMapping() + { + $order = $this->sqlmap->queryForObject("GetOrderAsHastable", 1); + $this->assertOrder1AsHashArray($order); + } + + function testNestedObjects() + { + $order = $this->sqlmap->queryForObject("GetOrderJoinedFavourite", 1); + + $this->assertOrder1($order); + $this->assertNotNull($order->getFavouriteLineItem()); + $this->assertIdentical(2, (int)$order->getFavouriteLineItem()->getID()); + $this->assertIdentical("ESM-23", $order->getFavouriteLineItem()->getCode()); + + } + + + function testNestedObjects2() + { + $order = $this->sqlmap->queryForObject("GetOrderJoinedFavourite2", 1); + $this->assertOrder1($order); + + $this->assertNotNull($order->getFavouriteLineItem()); + $this->assertIdentical(2, (int)$order->getFavouriteLineItem()->getID()); + $this->assertIdentical("ESM-23", $order->getFavouriteLineItem()->getCode()); + } + + function testImplicitResultMaps() + { + $order = $this->sqlmap->queryForObject("GetOrderJoinedFavourite3", 1); + + // *** force date to timestamp since data type can't be + // *** explicity known without mapping + $order->setDate(new TDateTime($order->getDate())); + + $this->assertOrder1($order); + + $this->assertNotNull($order->getFavouriteLineItem()); + $this->assertIdentical(2, $order->getFavouriteLineItem()->getID()); + $this->assertIdentical("ESM-23", $order->getFavouriteLineItem()->getCode()); + } + + function testCompositeKeyMapping() + { + $this->resetDatabase(); + + $order1 = $this->sqlmap->queryForObject("GetOrderWithFavouriteLineItem", 1); + $order2 = $this->sqlmap->queryForObject("GetOrderWithFavouriteLineItem", 2); + + $this->assertNotNull($order1); + $this->assertNotNull($order1->getFavouriteLineItem()); + $this->assertIdentical(2, $order1->getFavouriteLineItem()->getID()); + + $this->assertNotNull($order2); + $this->assertNotNull($order2->getFavouriteLineItem()); + $this->assertIdentical(1, $order2->getFavouriteLineItem()->getID()); + } + + + function testSimpleTypeMapping() + { + $this->resetDatabase(); + + $list = $this->sqlmap->QueryForList("GetAllCreditCardNumbersFromOrders", null); + + $this->assertIdentical(5, count($list)); + $this->assertIdentical("555555555555", $list[0]); + } + + function testDecimalTypeMapping() + { + $this->resetDatabase(); + + $param["LineItem_ID"] = 1; + $param["Order_ID"] = 10; + $price = $this->sqlmap->queryForObject("GetLineItemPrice", $param); + $this->assertIdentical(gettype($price), 'double'); + $this->assertIdentical(45.43, $price); + } + +//todo +/* + function testNullValueReplacementOnEnum() + { + $enum['Id'] = 99; + $enum['Day'] = 'Days.Thu'; + $enum['Color'] = 'Colors.Blue'; + $enum['Month'] = 'Months.All'; + + $this->sqlmap->insert("InsertEnumViaParameterMap", $enum); + + $enumClass = $this->sqlmap->queryForObject("GetEnumerationNullValue", 99); + + $this->assertIdentical($enumClass['Day'], 'Days.Thu'); + $this->asserEquals($enumClass['Color'], 'Colors.Blue'); + $this->assertIdentical($enumClass['Month'], 'Months.All'); + } + + + function testByteArrayMapping() + { + } + + function testNullValueReplacementOnDecimal() + { + } + + function testNullValueReplacementOnDateTime() + { + } +*/ + +//future work + +/* + //requires dynamic SQL + function testDynamiqueCompositeKeyMapping() + { + $order1 = $this->sqlmap->queryForObject("GetOrderWithDynFavouriteLineItem", 1); + + $this->assertNotNull($order1); + $this->assertNotNull($order1->getFavouriteLineItem()); + var_dump($order1); + $this->assertIdentical(2, $order1->getFavouriteLineItem()->getID()); + } +*/ + +} diff --git a/tests/unit/Data/SqlMap/SelectKeyTest.php b/tests/unit/Data/SqlMap/SelectKeyTest.php new file mode 100644 index 00000000..a0554aef --- /dev/null +++ b/tests/unit/Data/SqlMap/SelectKeyTest.php @@ -0,0 +1,118 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class SelectKeyTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + + //force autoload + new Account; + new Order; + new LineItem; + new LineItemCollection; + new A; new B; new C; new D; new E; new F; + } + + /** + * Test Insert with post GeneratedKey + */ + function testInsertPostKey() + { + $this->initScript('line-item-init.sql'); + + $item = new LineItem(); + + $item->setId(10); + $item->setCode("blah"); + $item->setOrder(new Order()); + $item->getOrder()->setId(9); + $item->setPrice(44.00); + $item->setQuantity(1); + + $key = $this->sqlmap->Insert("InsertLineItemPostKey", $item); + + $this->assertIdentical(99, $key); + $this->assertIdentical(99, $item->getId()); + + $param["Order_ID"] = 9; + $param["LineItem_ID"] =10; + $testItem = $this->sqlmap->QueryForObject("GetSpecificLineItem", $param); + + $this->assertNotNull($testItem); + $this->assertIdentical(10, $testItem->getId()); + + $this->initScript('line-item-init.sql'); + } + + /** + * Test Insert pre GeneratedKey + */ + function testInsertPreKey() + { + $this->initScript('line-item-init.sql'); + + $item = new LineItem(); + + $item->setId(10); + $item->setCode("blah"); + $item->setOrder(new Order()); + $item->getOrder()->setId(9); + $item->setPrice(44.00); + $item->setQuantity(1); + + $key = $this->sqlmap->Insert("InsertLineItemPreKey", $item); + + $this->assertIdentical(99, $key); + $this->assertIdentical(99, $item->getId()); + + $param["Order_ID"] = 9; + $param["LineItem_ID"] = 99; + + $testItem = $this->sqlmap->QueryForObject("GetSpecificLineItem", $param); + + $this->assertNotNull($testItem); + $this->assertIdentical(99, $testItem->getId()); + + $this->initScript('line-item-init.sql'); + } + + /** + * Test Test Insert No Key + */ + function testInsertNoKey() + { + $this->initScript('line-item-init.sql'); + + $item = new LineItem(); + + $item->setId(100); + $item->setCode("blah"); + $item->setOrder(new Order()); + $item->getOrder()->setId(9); + $item->setPrice(44.00); + $item->setQuantity(1); + + + $key = $this->sqlmap->Insert("InsertLineItemNoKey", $item); + + $this->assertNull($key); + $this->assertIdentical(100, $item->getId()); + + $param["Order_ID"] = 9; + $param["LineItem_ID"] = 100; + + $testItem = $this->sqlmap->QueryForObject("GetSpecificLineItem", $param); + + $this->assertNotNull($testItem); + $this->assertIdentical(100, $testItem->getId()); + + $this->initScript('line-item-init.sql'); + } +} diff --git a/tests/unit/Data/SqlMap/SqlMapCacheTest.php b/tests/unit/Data/SqlMap/SqlMapCacheTest.php new file mode 100644 index 00000000..57851217 --- /dev/null +++ b/tests/unit/Data/SqlMap/SqlMapCacheTest.php @@ -0,0 +1,75 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class SqlMapCacheTest extends PHPUnit_Framework_TestCase +{ + function testFIFOCache() + { + $fifo = new TSqlMapFifoCache(2); + $object1 = new TSqlMapManager; + $object2 = new TComponent; + $object3 = new TSqlMapGateway(null); + + $key1 = 'key1'; + $key2 = 'key2'; + $key3 = 'key3'; + + $fifo->set($key1, $object1); + $fifo->set($key2, $object2); + + $this->assertTrue($object1 === $fifo->get($key1)); + $this->assertTrue($object2 === $fifo->get($key2)); + + //object 1 should be removed + $fifo->set($key3, $object3); + + $this->assertNull($fifo->get($key1)); + $this->assertTrue($object2 === $fifo->get($key2)); + $this->assertTrue($object3 === $fifo->get($key3)); + + //object 2 should be removed + $fifo->set($key1, $object1); + + $this->assertNull($fifo->get($key2)); + $this->assertTrue($object3 === $fifo->get($key3)); + $this->assertTrue($object1 === $fifo->get($key1)); + } + + function testLruCache() + { + $lru = new TSqlMapLruCache(2); + + $object1 = new TSqlMapManager; + $object2 = new TComponent; + $object3 = new TSqlMapGateway(null); + + $key1 = 'key1'; + $key2 = 'key2'; + $key3 = 'key3'; + + $lru->set($key1, $object1); + $lru->set($key2, $object2); + + $this->assertTrue($object2 === $lru->get($key2)); + $this->assertTrue($object1 === $lru->get($key1)); + + //object 2 should be removed, i.e. least recently used + $lru->set($key3, $object3); + + $this->assertNull($lru->get($key2)); + $this->assertTrue($object1 === $lru->get($key1)); + $this->assertTrue($object3 === $lru->get($key3)); + + //object 1 will be removed + $lru->set($key2, $object2); + + $this->assertNull($lru->get($key1)); + $this->assertTrue($object2 === $lru->get($key2)); + $this->assertTrue($object3 === $lru->get($key3)); + } +} + diff --git a/tests/unit/Data/SqlMap/StatementExtendsTest.php b/tests/unit/Data/SqlMap/StatementExtendsTest.php new file mode 100644 index 00000000..15d00e39 --- /dev/null +++ b/tests/unit/Data/SqlMap/StatementExtendsTest.php @@ -0,0 +1,31 @@ +<?php + +Prado::using('System.Data.SqlMap.TSqlMapConfig'); + +/** + * @package System.Data.SqlMap + */ +class StatementExtendsTest extends PHPUnit_Framework_TestCase +{ + protected $sqlmap; + + function setup() + { + $config = new TSqlMapConfig(); + $config->ConfigFile = dirname(__FILE__).'/maps/tests.xml'; + $this->sqlmap = $config->getClient(); + } + + function test_extends1() + { + $manager = $this->sqlmap->SqlMapManager; + $sql = $manager->getMappedStatement('test')->getSqlString(); + + $this->assertPattern('/img_request/', $sql); + $this->assertNoPattern('/img_progress/', $sql); + + $sql2 = $manager->getMappedStatement('GetAllProgress')->getSqlString(); + $this->assertPattern('/img_request/', $sql2); + $this->assertPattern('/img_progress/', $sql2); + } +} diff --git a/tests/unit/Data/SqlMap/StatementTest.php b/tests/unit/Data/SqlMap/StatementTest.php new file mode 100644 index 00000000..bdcc3ae7 --- /dev/null +++ b/tests/unit/Data/SqlMap/StatementTest.php @@ -0,0 +1,1133 @@ +<?php +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class StatementTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + + //force autoload + new Account; + new Order; + new LineItem; + new LineItemCollection; + new A; new B; new C; new D; new E; new F; + } + + public function setup() + { + + } + + function resetDatabase() + { + $this->initScript('account-init.sql'); + $this->initScript('order-init.sql'); + $this->initScript('line-item-init.sql'); +// $this->initScript('enumeration-init.sql'); + $this->initScript('other-init.sql'); + } + + + #region Object Query tests + + /** + * Test Open connection with a connection string + */ + function testOpenConnection() + { + $conn = $this->sqlmap->getDbConnection(); + $conn->setActive(true); + $account= $this->sqlmap->QueryForObject("SelectWithProperty"); + $conn->setActive(false); + $this->assertAccount1($account); + } + + /** + * Test use a statement with property subtitution + * (JIRA 22) + */ + function testSelectWithProperty() + { + $account= $this->sqlmap->QueryForObject("SelectWithProperty"); + $this->assertAccount1($account); + } + + /** + * Test ExecuteQueryForObject Via ColumnName + */ + function testExecuteQueryForObjectViaColumnName() + { + $account= $this->sqlmap->QueryForObject("GetAccountViaColumnName", 1); + $this->assertAccount1($account); + } + + /** + * Test ExecuteQueryForObject Via ColumnIndex + */ + function testExecuteQueryForObjectViaColumnIndex() + { + $account= $this->sqlmap->QueryForObject("GetAccountViaColumnIndex", 1); + $this->assertAccount1($account); + } + + /** + * Test ExecuteQueryForObject Via ResultClass + */ + function testExecuteQueryForObjectViaResultClass() + { + $account= $this->sqlmap->QueryForObject("GetAccountViaResultClass", 1); + $this->assertAccount1($account); + } + + /** + * Test ExecuteQueryForObject With simple ResultClass : string + */ + function testExecuteQueryForObjectWithSimpleResultClass() + { + $email = $this->sqlmap->QueryForObject("GetEmailAddressViaResultClass", 1); + $this->assertIdentical("Joe.Dalton@somewhere.com", $email); + } + + /** + * Test ExecuteQueryForObject With simple ResultMap : string + */ + function testExecuteQueryForObjectWithSimpleResultMap() + { + $email = $this->sqlmap->QueryForObject("GetEmailAddressViaResultMap", 1); + $this->assertIdentical("Joe.Dalton@somewhere.com", $email); + } + + /** + * Test Primitive ReturnValue : TDateTime + */ + function testPrimitiveReturnValue() + { + $CardExpiry = $this->sqlmap->QueryForObject("GetOrderCardExpiryViaResultClass", 1); + $date = @mktime(8, 15, 00, 2, 15, 2003); + $this->assertIdentical($date, $CardExpiry->getTimeStamp()); + } + + /** + * Test ExecuteQueryForObject with result object : Account + */ + function testExecuteQueryForObjectWithResultObject() + { + $account= new Account(); + $testAccount = $this->sqlmap->QueryForObject("GetAccountViaColumnName", 1, $account); + $this->assertAccount1($account); + $this->assertTrue($account == $testAccount); + } + + /** + * Test ExecuteQueryForObject as array + */ + function testExecuteQueryForObjectAsHashArray() + { + $account = $this->sqlmap->QueryForObject("GetAccountAsHashtable", 1); + $this->assertAccount1AsHashArray($account); + } + + /** + * Test ExecuteQueryForObject as Hashtable ResultClass + */ + function testExecuteQueryForObjectAsHashtableResultClass() + { + $account = $this->sqlmap->QueryForObject("GetAccountAsHashtableResultClass", 1); + $this->assertAccount1AsHashArray($account); + } + + /** + * Test ExecuteQueryForObject via Hashtable + */ + function testExecuteQueryForObjectViaHashtable() + { + $param["LineItem_ID"] = 2; + $param["Order_ID"] = 9; + + $testItem = $this->sqlmap->QueryForObject("GetSpecificLineItem", $param); + + $this->assertNotNull($testItem); + $this->assertIdentical("TSM-12", $testItem->getCode()); + } + /**/ + + //TODO: Test Query Dynamic Sql Element + function testQueryDynamicSqlElement() + { + //$list = $this->sqlmap->QueryForList("GetDynamicOrderedEmailAddressesViaResultMap", "Account_ID"); + + //$this->assertIdentical("Joe.Dalton@somewhere.com", $list[0]); + + //list = $this->sqlmap->QueryForList("GetDynamicOrderedEmailAddressesViaResultMap", "Account_FirstName"); + + //$this->assertIdentical("Averel.Dalton@somewhere.com", $list[0]); + + } + + // TODO: Test Execute QueryForList With ResultMap With Dynamic Element + function testExecuteQueryForListWithResultMapWithDynamicElement() + { + //$list = $this->sqlmap->QueryForList("GetAllAccountsViaResultMapWithDynamicElement", "LIKE"); + + //$this->assertAccount1$list[0]); + //$this->assertIdentical(3, $list->getCount()); + //$this->assertIdentical(1, $list[0]->getID()); + //$this->assertIdentical(2, $list[1]->getID()); + //$this->assertIdentical(4, $list[2]->getID()); + + //list = $this->sqlmap->QueryForList("GetAllAccountsViaResultMapWithDynamicElement", "="); + + //$this->assertIdentical(0, $list->getCount()); + } + + + + /** + * Test Get Account Via Inline Parameters + */ + function testExecuteQueryForObjectViaInlineParameters() + { + $account= new Account(); + $account->setID(1); + + $testAccount = $this->sqlmap->QueryForObject("GetAccountViaInlineParameters", $account); + + $this->assertAccount1($testAccount); + } + /**/ + + // TODO: Test ExecuteQuery For Object With Enum property + + function testExecuteQueryForObjectWithEnum() + { + //$enumClass = $this->sqlmap->QueryForObject("GetEnumeration", 1); + + //$this->assertIdentical(enumClass.Day, Days.Sat); + //$this->assertIdentical(enumClass.Color, Colors.Red); + //$this->assertIdentical(enumClass.Month, Months.August); + + //enumClass = $this->sqlmap->QueryForObject("GetEnumeration", 3) as Enumeration; + + //$this->assertIdentical(enumClass.Day, Days.Mon); + //$this->assertIdentical(enumClass.Color, Colors.Blue); + //$this->assertIdentical(enumClass.Month, Months.September);*/ + } + + #endregion + + #region List Query tests + + /** + * Test QueryForList with Hashtable ResultMap + */ + function testQueryForListWithHashtableResultMap() + { + $this->initScript('account-init.sql'); + $list = $this->sqlmap->QueryForList("GetAllAccountsAsHashMapViaResultMap"); + + $this->assertAccount1AsHashArray($list[0]); + $this->assertIdentical(5, count($list)); + + $this->assertIdentical(1, (int)$list[0]["Id"]); + $this->assertIdentical(2, (int)$list[1]["Id"]); + $this->assertIdentical(3, (int)$list[2]["Id"]); + $this->assertIdentical(4, (int)$list[3]["Id"]); + $this->assertIdentical(5, (int)$list[4]["Id"]); + } + + /** + * Test QueryForList with Hashtable ResultClass + */ + function testQueryForListWithHashtableResultClass() + { + $list = $this->sqlmap->QueryForList("GetAllAccountsAsHashtableViaResultClass"); + + $this->assertAccount1AsHashArray($list[0]); + $this->assertIdentical(5, count($list)); + + $this->assertIdentical(1, (int)$list[0]["Id"]); + $this->assertIdentical(2, (int)$list[1]["Id"]); + $this->assertIdentical(3, (int)$list[2]["Id"]); + $this->assertIdentical(4, (int)$list[3]["Id"]); + $this->assertIdentical(5, (int)$list[4]["Id"]); + } + + /** + * Test QueryForList with IList ResultClass + */ + function testQueryForListWithIListResultClass() + { + $list = $this->sqlmap->QueryForList("GetAllAccountsAsArrayListViaResultClass"); + + $listAccount = $list[0]; + + $this->assertIdentical(1,(int)$listAccount[0]); + $this->assertIdentical("Joe",$listAccount[1]); + $this->assertIdentical("Dalton",$listAccount[2]); + $this->assertIdentical("Joe.Dalton@somewhere.com",$listAccount[3]); + + $this->assertIdentical(5, count($list)); + + $listAccount = $list[0]; + $this->assertIdentical(1, (int)$listAccount[0]); + $listAccount = $list[1]; + $this->assertIdentical(2, (int)$listAccount[0]); + $listAccount = $list[2]; + $this->assertIdentical(3, (int)$listAccount[0]); + $listAccount = $list[3]; + $this->assertIdentical(4, (int)$listAccount[0]); + $listAccount = $list[4]; + $this->assertIdentical(5, (int)$listAccount[0]); + } + + /** + * Test QueryForList With ResultMap, result collection as ArrayList + */ + function testQueryForListWithResultMap() + { + $list = $this->sqlmap->QueryForList("GetAllAccountsViaResultMap"); + + $this->assertAccount1($list[0]); + $this->assertIdentical(5, count($list)); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + $this->assertIdentical(3, $list[2]->getID()); + $this->assertIdentical(4, $list[3]->getID()); + $this->assertIdentical(5, $list[4]->getID()); + } + + /** + * Test ExecuteQueryForPaginatedList + */ + function testExecuteQueryForPaginatedList() + { + // Get List of all 5 + $list = $this->sqlmap->QueryForPagedList("GetAllAccountsViaResultMap", null, 2); + + // Test initial state (page 0) + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertTrue($list->getIsNextPageAvailable()); + $this->assertAccount1($list[0]); + $this->assertIdentical(2, $list->getCount()); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + + // Test illegal previous page (no effect, state should be same) + $list->PreviousPage(); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertTrue($list->getIsNextPageAvailable()); + $this->assertAccount1($list[0]); + $this->assertIdentical(2, $list->getCount()); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + + // Test next (page 1) + $list->NextPage(); + $this->assertTrue($list->getIsPreviousPageAvailable()); + $this->assertTrue($list->getIsNextPageAvailable()); + $this->assertIdentical(2, $list->getCount()); + $this->assertIdentical(3, $list[0]->getID()); + $this->assertIdentical(4, $list[1]->getID()); + + // Test next (page 2 -last) + $list->NextPage(); + $this->assertTrue($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(1, $list->getCount()); + $this->assertIdentical(5, $list[0]->getID()); + + // Test previous (page 1) + $list->PreviousPage(); + $this->assertTrue($list->getIsPreviousPageAvailable()); + $this->assertTrue($list->getIsNextPageAvailable()); + $this->assertIdentical(2, $list->getCount()); + $this->assertIdentical(3, $list[0]->getID()); + $this->assertIdentical(4, $list[1]->getID()); + + // Test previous (page 0 -first) + $list->PreviousPage(); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertTrue($list->getIsNextPageAvailable()); + $this->assertAccount1($list[0]); + $this->assertIdentical(2, $list->getCount()); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + + // Test goto (page 0) + $list->GotoPage(0); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertTrue($list->getIsNextPageAvailable()); + $this->assertIdentical(2, $list->getCount()); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + + // Test goto (page 1) + $list->GotoPage(1); + $this->assertTrue($list->getIsPreviousPageAvailable()); + $this->assertTrue($list->getIsNextPageAvailable()); + $this->assertIdentical(2, $list->getCount()); + $this->assertIdentical(3, $list[0]->getID()); + $this->assertIdentical(4, $list[1]->getID()); + + // Test goto (page 2) + $list->GotoPage(2); + $this->assertTrue($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(1, $list->getCount()); + $this->assertIdentical(5, $list[0]->getID()); + + // Test illegal goto (page 0) + $list->GotoPage(3); + $this->assertTrue($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(0, $list->getCount()); + + $list = $this->sqlmap->QueryForPagedList("GetNoAccountsViaResultMap", null, 2); + + // Test empty list + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(0, $list->getCount()); + + // Test next + $list->NextPage(); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(0, $list->getCount()); + + // Test previous + $list->PreviousPage(); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(0, $list->getCount()); + + // Test previous + $list->GotoPage(0); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(0, $list->getCount()); + $list = $this->sqlmap->QueryForPagedList("GetFewAccountsViaResultMap", null, 2); + + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(1, $list->getCount()); + + // Test next + $list->NextPage(); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(1, $list->getCount()); + // Test previous + $list->PreviousPage(); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(1, $list->getCount()); + + // Test previous + $list->GotoPage(0); + $this->assertFalse($list->getIsPreviousPageAvailable()); + $this->assertFalse($list->getIsNextPageAvailable()); + $this->assertIdentical(1, $list->getCount()); + + + $list = $this->sqlmap->QueryForPagedList("GetAllAccountsViaResultMap", null, 5); + + $this->assertIdentical(5, $list->getCount()); + + $list->NextPage(); + $this->assertIdentical(5, $list->getCount()); + + $b = $list->getIsPreviousPageAvailable(); + $list->PreviousPage(); + $this->assertIdentical(5, $list->getCount()); + } + + /** + * Test QueryForList with ResultObject : + * AccountCollection strongly typed collection + */ + function testQueryForListWithResultObject() + { + $accounts = new AccountCollection(); + + $this->sqlmap->QueryForList("GetAllAccountsViaResultMap", null, $accounts); + $this->assertAccount1($accounts[0]); + $this->assertIdentical(5, $accounts->getCount()); + $this->assertIdentical(1, $accounts[0]->getID()); + $this->assertIdentical(2, $accounts[1]->getID()); + $this->assertIdentical(3, $accounts[2]->getID()); + $this->assertIdentical(4, $accounts[3]->getID()); + $this->assertIdentical(5, $accounts[4]->GetId()); + } + + /** + * Test QueryForList with ListClass : LineItemCollection + */ + function testQueryForListWithListClass() + { + $linesItem = $this->sqlmap->QueryForList("GetLineItemsForOrderWithListClass", 10); + + $this->assertNotNull($linesItem); + $this->assertIdentical(2, $linesItem->getCount()); + $this->assertIdentical("ESM-34", $linesItem[0]->getCode()); + $this->assertIdentical("QSM-98", $linesItem[1]->getCode()); + } + + /** + * Test QueryForList with no result. + */ + function testQueryForListWithNoResult() + { + $list = $this->sqlmap->QueryForList("GetNoAccountsViaResultMap"); + + $this->assertIdentical(0, count($list)); + } + + /** + * Test QueryForList with ResultClass : Account. + */ + function testQueryForListResultClass() + { + $list = $this->sqlmap->QueryForList("GetAllAccountsViaResultClass"); + + $this->assertAccount1($list[0]); + $this->assertIdentical(5, count($list)); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + $this->assertIdentical(3, $list[2]->getID()); + $this->assertIdentical(4, $list[3]->getID()); + $this->assertIdentical(5, $list[4]->getID()); + } + + /** + * Test QueryForList with simple resultClass : string + */ + function testQueryForListWithSimpleResultClass() + { + $list = $this->sqlmap->QueryForList("GetAllEmailAddressesViaResultClass"); + + $this->assertIdentical("Joe.Dalton@somewhere.com", $list[0]); + $this->assertIdentical("Averel.Dalton@somewhere.com", $list[1]); + $this->assertIdentical('', $list[2]); + $this->assertIdentical("Jack.Dalton@somewhere.com", $list[3]); + $this->assertIdentical('', $list[4]); + } + + /** + * Test QueryForList with simple ResultMap : string + */ + function testQueryForListWithSimpleResultMap() + { + $list = $this->sqlmap->QueryForList("GetAllEmailAddressesViaResultMap"); + + $this->assertIdentical("Joe.Dalton@somewhere.com", $list[0]); + $this->assertIdentical("Averel.Dalton@somewhere.com", $list[1]); + $this->assertIdentical('', $list[2]); + $this->assertIdentical("Jack.Dalton@somewhere.com", $list[3]); + $this->assertIdentical('', $list[4]); + } + + /** + * Test QueryForListWithSkipAndMax + */ + function testQueryForListWithSkipAndMax() + { + $list = $this->sqlmap->QueryForList("GetAllAccountsViaResultMap", null, null, 2, 2); + + $this->assertIdentical(2, count($list)); + $this->assertIdentical(3, $list[0]->getID()); + $this->assertIdentical(4, $list[1]->getID()); + } + + + /** + * Test row delegate + */ + function testQueryWithRowDelegate() + { + //$handler = new SqlMapper.RowDelegate(this.RowHandler); + + //$list = $this->sqlmap->QueryWithRowDelegate("GetAllAccountsViaResultMap", null, handler); + + //$this->assertIdentical(5, _index); + //$this->assertIdentical(5, $list->getCount()); + //$this->assertAccount1$list[0]); + //$this->assertIdentical(1, $list[0]->getID()); + //$this->assertIdentical(2, $list[1]->getID()); + //$this->assertIdentical(3, $list[2]->getID()); + //$this->assertIdentical(4, $list[3]->getID()); + //$this->assertIdentical(5, $list[4]->getID()); + } + + #endregion + + #region Map Tests + + /** + * Test ExecuteQueryForMap : Hashtable. + */ + function testExecuteQueryForMap() + { + $map = $this->sqlmap->QueryForMap("GetAllAccountsViaResultClass", null, "FirstName"); + + $this->assertIdentical(5, count($map)); + $this->assertAccount1($map["Joe"]); + + $this->assertIdentical(1, $map["Joe"]->getID()); + $this->assertIdentical(2, $map["Averel"]->getID()); + $this->assertIdentical(3, $map["William"]->getID()); + $this->assertIdentical(4, $map["Jack"]->getID()); + $this->assertIdentical(5, $map["Gilles"]->getID()); + } + + /** + * Test ExecuteQueryForMap : Hashtable. + * + * If the keyProperty is an integer, you must acces the map + * by map[integer] and not by map["integer"] + */ + function testExecuteQueryForMap2() + { + $map = $this->sqlmap->QueryForMap("GetAllOrderWithLineItems", null, "PostalCode"); + + $this->assertIdentical(11, count($map)); + $order = $map["T4H 9G4"]; + + $this->assertIdentical(2, $order->getLineItemsList()->getCount()); + } + + /** + * Test ExecuteQueryForMap with value property : + * "FirstName" as key, "EmailAddress" as value + */ + function testExecuteQueryForMapWithValueProperty() + { + $map = $this->sqlmap->QueryForMap("GetAllAccountsViaResultClass", null, + "FirstName", "EmailAddress"); + + $this->assertIdentical(5, count($map)); + + $this->assertIdentical("Joe.Dalton@somewhere.com", $map["Joe"]); + $this->assertIdentical("Averel.Dalton@somewhere.com", $map["Averel"]); + $this->assertNull($map["William"]); + $this->assertIdentical("Jack.Dalton@somewhere.com", $map["Jack"]); + $this->assertNull($map["Gilles"]); + } + + /** + * Test ExecuteQueryForWithJoined + */ + function testExecuteQueryForWithJoined() + { + $order = $this->sqlmap->QueryForObject("GetOrderJoinWithAccount",10); + + $this->assertNotNull($order->getAccount()); + + $order = $this->sqlmap->QueryForObject("GetOrderJoinWithAccount",11); + + $this->assertNull($order->getAccount()); + } + + /** + * Test ExecuteQueryFor With Complex Joined + * + * A->B->C + * ->E + * ->F + */ + function testExecuteQueryForWithComplexJoined() + { + $a = $this->sqlmap->QueryForObject("SelectComplexJoined"); + $this->assertNotNull($a); + $this->assertNotNull($a->getB()); + $this->assertNotNull($a->getB()->getC()); + $this->assertNull($a->getB()->getD()); + $this->assertNotNull($a->getE()); + $this->assertNull($a->getF()); + } + #endregion + + #region Extends statement + + /** + * Test base Extends statement + */ + function testExtendsGetAllAccounts() + { + $list = $this->sqlmap->QueryForList("GetAllAccounts"); + + $this->assertAccount1($list[0]); + $this->assertIdentical(5, count($list)); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + $this->assertIdentical(3, $list[2]->getID()); + $this->assertIdentical(4, $list[3]->getID()); + $this->assertIdentical(5, $list[4]->getID()); + } + + /** + * Test Extends statement GetAllAccountsOrderByName extends GetAllAccounts + */ + function testExtendsGetAllAccountsOrderByName() + { + $list = $this->sqlmap->QueryForList("GetAllAccountsOrderByName"); + + $this->assertAccount1($list[3]); + $this->assertIdentical(5, count($list)); + + $this->assertIdentical(2, $list[0]->getID()); + $this->assertIdentical(5, $list[1]->getID()); + $this->assertIdentical(4, $list[2]->getID()); + $this->assertIdentical(1, $list[3]->getID()); + $this->assertIdentical(3, $list[4]->getID()); + } + + /** + * Test Extends statement GetOneAccount extends GetAllAccounts + */ + function testExtendsGetOneAccount() + { + $account= $this->sqlmap->QueryForObject("GetOneAccount", 1); + $this->assertAccount1($account); + } + + /** + * Test Extends statement GetSomeAccount extends GetAllAccounts + */ + function testExtendsGetSomeAccount() + { + $param["lowID"] = 2; + $param["hightID"] = 4; + + $list = $this->sqlmap->QueryForList("GetSomeAccount", $param); + + $this->assertIdentical(3, count($list)); + + $this->assertIdentical(2, $list[0]->getID()); + $this->assertIdentical(3, $list[1]->getID()); + $this->assertIdentical(4, $list[2]->getID()); + } + + #endregion + + #region Update tests + + + /** + * Test Insert account via public fields + */ + function testInsertAccountViaPublicFields() + { + $this->initScript('account-init.sql'); + + $account = new AccountBis(); + + $account->Id = 10; + $account->FirstName = "Luky"; + $account->LastName = "Luke"; + $account->EmailAddress = "luly.luke@somewhere.com"; + + $this->sqlmap->Insert("InsertAccountViaPublicFields", $account); + + $testAccount = $this->sqlmap->QueryForObject("GetAccountViaColumnName", 10); + + $this->assertNotNull($testAccount); + + $this->assertIdentical(10, $testAccount->getID()); + + $this->initScript('account-init.sql'); + } + + /** + * + */ + function testInsertOrderViaProperties() + { + $this->initScript('account-init.sql'); + $this->initScript('order-init.sql'); + $account= $this->NewAccount6(); + + $this->sqlmap->Insert("InsertAccountViaParameterMap", $account); + + $order = new Order(); + $order->setId(99); + $order->setCardExpiry("09/11"); + $order->setAccount($account); + $order->setCardNumber("154564656"); + $order->setCardType("Visa"); + $order->setCity("Lyon"); + $order->setDate('2005-05-20'); + $order->setPostalCode("69004"); + $order->setProvince("Rhone"); + $order->setStreet("rue Durand"); + + $this->sqlmap->Insert("InsertOrderViaPublicFields", $order); + + $this->initScript('account-init.sql'); + $this->initScript('order-init.sql'); + } + + + /** + * Test Insert account via inline parameters + */ + function testInsertAccountViaInlineParameters() + { + $this->initScript('account-init.sql'); + $account= new Account(); + + $account->setId(10); + $account->setFirstName("Luky"); + $account->setLastName("Luke"); + $account->setEmailAddress("luly.luke@somewhere.com"); + + $this->sqlmap->Insert("InsertAccountViaInlineParameters", $account); + + $testAccount = $this->sqlmap->QueryForObject("GetAccountViaColumnIndex", 10); + + $this->assertNotNull($testAccount); + $this->assertIdentical(10, $testAccount->getId()); + $this->initScript('account-init.sql'); + } + + /** + * Test Insert account via parameterMap + */ + function testInsertAccountViaParameterMap() + { + $this->initScript('account-init.sql'); + $account= $this->NewAccount6(); + $this->sqlmap->Insert("InsertAccountViaParameterMap", $account); + + $account = $this->sqlmap->QueryForObject("GetAccountNullableEmail", 6); + $this->AssertAccount6($account); + + $this->initScript('account-init.sql'); + } + + /** + * Test Update via parameterMap + */ + function testUpdateViaParameterMap() + { + $this->initScript('account-init.sql'); + $account= $this->sqlmap->QueryForObject("GetAccountViaColumnName", 1); + + $account->setEmailAddress("new@somewhere.com"); + $this->sqlmap->Update("UpdateAccountViaParameterMap", $account); + + $account = $this->sqlmap->QueryForObject("GetAccountViaColumnName", 1); + + $this->assertIdentical("new@somewhere.com", $account->getEmailAddress()); + $this->initScript('account-init.sql'); + } + + /** + * Test Update via parameterMap V2 + */ + function testUpdateViaParameterMap2() + { + $this->initScript('account-init.sql'); + $account= $this->sqlmap->QueryForObject("GetAccountViaColumnName", 1); + + $account->setEmailAddress("new@somewhere.com"); + $this->sqlmap->Update("UpdateAccountViaParameterMap2", $account); + + $account = $this->sqlmap->QueryForObject("GetAccountViaColumnName", 1); + + $this->assertIdentical("new@somewhere.com", $account->getEmailAddress()); + $this->initScript('account-init.sql'); + } + + /** + * Test Update with inline parameters + */ + function testUpdateWithInlineParameters() + { + $this->initScript('account-init.sql'); + $account= $this->sqlmap->QueryForObject("GetAccountViaColumnName", 1); + + $account->setEmailAddress("new@somewhere.com"); + $this->sqlmap->Update("UpdateAccountViaInlineParameters", $account); + + $account = $this->sqlmap->QueryForObject("GetAccountViaColumnName", 1); + + $this->assertIdentical("new@somewhere.com", $account->getEmailAddress()); + $this->initScript('account-init.sql'); + } + + /** + * Test Execute Update With Parameter Class + */ + function testExecuteUpdateWithParameterClass() + { + $this->initScript('account-init.sql'); + $account= $this->NewAccount6(); + + $this->sqlmap->Insert("InsertAccountViaParameterMap", $account); + + $noRowsDeleted = $this->sqlmap->Update("DeleteAccount", null); + + $this->sqlmap->Update("DeleteAccount", $account); + + $account = $this->sqlmap->QueryForObject("GetAccountViaColumnName", 6); + + $this->assertNull($account); + $this->assertIdentical(0, $noRowsDeleted); + $this->initScript('account-init.sql'); + } + + /** + * Test Execute Delete + */ + function testExecuteDelete() + { + $this->initScript('account-init.sql'); + $account= $this->NewAccount6(); + + $this->sqlmap->Insert("InsertAccountViaParameterMap", $account); + + $account = null; + $account = $this->sqlmap->QueryForObject("GetAccountViaColumnName", 6); + + $this->assertTrue($account->getId() == 6); + + $rowNumber = $this->sqlmap->Delete("DeleteAccount", $account); + $this->assertTrue($rowNumber == 1); + + $account = $this->sqlmap->QueryForObject("GetAccountViaColumnName", 6); + + $this->assertNull($account); + $this->initScript('account-init.sql'); + } + + /** + * Test Execute Delete + */ + function testDeleteWithComments() + { + $this->initScript('line-item-init.sql'); + $rowNumber = $this->sqlmap->Delete("DeleteWithComments"); + + $this->assertIdentical($rowNumber, 2); + $this->initScript('line-item-init.sql'); + } + + + + #endregion + + #region Row delegate + + private $_index = 0; + + function RowHandler($sender, $paramterObject, $list) + { + //_index++; + //$this->assertIdentical(_index, (($account) obj).Id); + //$list->Add(obj); + } + + #endregion + + #region JIRA Tests + + /** + * Test JIRA 30 (repeating property) + */ + function testJIRA30() + { + $account= new Account(); + $account->setId(1); + $account->setFirstName("Joe"); + $account->setLastName("Dalton"); + $account->setEmailAddress("Joe.Dalton@somewhere.com"); + + $result = $this->sqlmap->QueryForObject("GetAccountWithRepeatingProperty", $account); + + $this->assertAccount1($result); + } + + /** + * Test Bit column + */ + function testJIRA42() + { + $other = new Other(); + + $other->setInt(100); + $other->setBool(true); + $other->setLong(789456321); + + $this->sqlmap->Insert("InsertBool", $other); + } + + /** + * Test for access a result map in a different namespace + */ + function testJIRA45() + { + $account= $this->sqlmap->QueryForObject("GetAccountJIRA45", 1); + $this->assertAccount1($account); + } + + /** + * Test : Whitespace is not maintained properly when CDATA tags are used + */ + function testJIRA110() + { + $account= $this->sqlmap->QueryForObject("Get1Account"); + $this->assertAccount1($account); + } + + /** + * Test : Whitespace is not maintained properly when CDATA tags are used + */ + function testJIRA110Bis() + { + $list = $this->sqlmap->QueryForList("GetAccounts"); + + $this->assertAccount1($list[0]); + $this->assertIdentical(5, count($list)); + } + + /** + * Test for cache stats only being calculated on CachingStatments + */ + function testJIRA113() + { + // $this->sqlmap->FlushCaches(); + + // taken from TestFlushDataCache() + // first query is not cached, second query is: 50% cache hit + /*$list = $this->sqlmap->QueryForList("GetCachedAccountsViaResultMap"); + $firstId = HashCodeProvider.GetIdentityHashCode(list); + list = $this->sqlmap->QueryForList("GetCachedAccountsViaResultMap"); + int secondId = HashCodeProvider.GetIdentityHashCode(list); + $this->assertIdentical(firstId, secondId); + + string cacheStats = $this->sqlmap->GetDataCacheStats(); + + $this->assertNotNull(cacheStats);*/ + } + + #endregion + + #region CustomTypeHandler tests + + /** + * Test CustomTypeHandler + */ + function testExecuteQueryWithCustomTypeHandler() + { + $this->sqlmap->registerTypeHandler(new HundredsBool()); + $this->sqlmap->registerTypeHandler(new OuiNonBool()); + + $list = $this->sqlmap->QueryForList("GetAllAccountsViaCustomTypeHandler"); + + $this->assertAccount1($list[0]); + $this->assertIdentical(5, count($list)); + $this->assertIdentical(1, $list[0]->getID()); + $this->assertIdentical(2, $list[1]->getID()); + $this->assertIdentical(3, $list[2]->getID()); + $this->assertIdentical(4, $list[3]->getID()); + $this->assertIdentical(5, $list[4]->getID()); + + $this->assertFalse($list[0]->getCartOptions()); + $this->assertFalse($list[1]->getCartOptions()); + $this->assertTrue($list[2]->getCartOptions()); + $this->assertTrue($list[3]->getCartOptions()); + $this->assertTrue($list[4]->getCartOptions()); + + $this->assertTrue($list[0]->getBannerOptions()); + $this->assertTrue($list[1]->getBannerOptions()); + $this->assertFalse($list[2]->getBannerOptions()); + $this->assertFalse($list[3]->getBannerOptions()); + $this->assertTrue($list[4]->getBannerOptions()); + } + + /** + * Test CustomTypeHandler Oui/Non + */ + function testCustomTypeHandler() + { + $this->initScript('other-init.sql'); + $this->initScript('account-init.sql'); + + $this->sqlmap->registerTypeHandler(new OuiNonBool()); + + $other = new Other(); + $other->setInt(99); + $other->setLong(1966); + $other->setBool(true); + $other->setBool2(false); + $this->sqlmap->Insert("InsertCustomTypeHandler", $other); + + $anOther = $this->sqlmap->QueryForObject("SelectByInt", 99); + $this->assertNotNull( $anOther ); + $this->assertIdentical(99, (int)$anOther->getInt()); + $this->assertIdentical(1966, (int)$anOther->getLong()); + $this->assertIdentical(true, (boolean)$anOther->getBool()); + $this->assertIdentical(false, (boolean)$anOther->getBool2()); + + } + + /** + * Test CustomTypeHandler Oui/Non + */ + function testInsertInlineCustomTypeHandlerV1() + { + $this->initScript('other-init.sql'); + $this->initScript('account-init.sql'); + + $other = new Other(); + $other->setInt(99); + $other->setLong(1966); + $other->setBool(true); + $other->setBool2(false); + + $this->sqlmap->Insert("InsertInlineCustomTypeHandlerV1", $other); + + $anOther = $this->sqlmap->QueryForObject("SelectByIntV1", 99); + + $this->assertNotNull( $anOther ); + $this->assertIdentical(99, (int)$anOther->getInt()); + $this->assertIdentical(1966, (int)$anOther->getLong()); + $this->assertIdentical(true, (boolean)$anOther->getBool()); + $this->assertIdentical(false, (boolean)$anOther->getBool2()); + + } + + /** + * Test CustomTypeHandler Oui/Non + */ + function testInsertInlineCustomTypeHandlerV2() + { + $this->initScript('other-init.sql'); + $this->initScript('account-init.sql'); + + $other = new Other(); + $other->setInt(99); + $other->setLong(1966); + $other->setBool(true); + $other->setBool2(false); + + $this->sqlmap->Insert("InsertInlineCustomTypeHandlerV2", $other); + + $anOther = $this->sqlmap->QueryForObject("SelectByInt", 99); + + $this->assertNotNull( $anOther ); + $this->assertIdentical(99, (int)$anOther->getInt()); + $this->assertIdentical(1966, (int)$anOther->getLong()); + $this->assertIdentical(true, (boolean)$anOther->getBool()); + $this->assertIdentical(false, (boolean)$anOther->getBool2()); + } + #endregion + /**/ +} diff --git a/tests/unit/Data/SqlMap/TestQueryForMap.php b/tests/unit/Data/SqlMap/TestQueryForMap.php new file mode 100644 index 00000000..09810489 --- /dev/null +++ b/tests/unit/Data/SqlMap/TestQueryForMap.php @@ -0,0 +1,44 @@ +<?php +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class TestQueryForMap extends BaseCase +{ + function __construct() + { + parent::__construct(); + $this->initSqlMap(); + } + + /** + * Test ExecuteQueryForMap : Hashtable. + */ + function testExecuteQueryForMap() + { + $map = $this->sqlmap->QueryForMap("GetAllAccountsViaResultClass", null, "FirstName",null,0,2); + $this->assertIdentical(2, count($map)); + $this->assertAccount1($map["Joe"]); + + $this->assertIdentical(1, $map["Joe"]->getID()); + $this->assertIdentical(2, $map["Averel"]->getID()); + } + + /** + * Test ExecuteQueryForMap with value property : + * "FirstName" as key, "EmailAddress" as value + */ + function testExecuteQueryForMapWithValueProperty() + { + $map = $this->sqlmap->QueryForMap("GetAllAccountsViaResultClass", null, + "FirstName", "EmailAddress",1,3); + + $this->assertIdentical(3, count($map)); + + $this->assertIdentical("Averel.Dalton@somewhere.com", $map["Averel"]); + $this->assertNull($map["William"]); + $this->assertIdentical("Jack.Dalton@somewhere.com", $map["Jack"]); + } + +} diff --git a/tests/unit/Data/SqlMap/Ticket589Test.php b/tests/unit/Data/SqlMap/Ticket589Test.php new file mode 100644 index 00000000..a648e74f --- /dev/null +++ b/tests/unit/Data/SqlMap/Ticket589Test.php @@ -0,0 +1,23 @@ +<?php + +Prado::using('System.Data.SqlMap.TSqlMapManager'); + +/** + * @package System.Data.SqlMap + */ +class Ticket589Test extends PHPUnit_Framework_TestCase +{ + function test() + { + $manager = new TSqlMapManager(); + try + { + $manager->configureXml(dirname(__FILE__).'/sqlmap.xml'); + $this->fail(); + }catch(TSqlMapConfigurationException $e) + { + $expect = 'Invalid property \'parametrClass\' for class \'TSqlMapStatement\' for tag \'<statement id="findNotVisitedWatchedTopicList"'; + $this->assertEqual(strpos($e->getMessage(),$expect),0); + } + } +} diff --git a/tests/unit/Data/SqlMap/common.php b/tests/unit/Data/SqlMap/common.php new file mode 100644 index 00000000..020a296b --- /dev/null +++ b/tests/unit/Data/SqlMap/common.php @@ -0,0 +1,153 @@ +<?php + +Prado::using('System.Data.TDbConnection'); + +if(!defined('SQLMAP_TESTS')) + define('SQLMAP_TESTS', realpath(dirname(__FILE__))); + +if(!class_exists('Account', false)) +{ + include(SQLMAP_TESTS.'/domain/A.php'); + include(SQLMAP_TESTS.'/domain/Account.php'); + include(SQLMAP_TESTS.'/domain/AccountBis.php'); + include(SQLMAP_TESTS.'/domain/AccountCollection.php'); + include(SQLMAP_TESTS.'/domain/B.php'); + include(SQLMAP_TESTS.'/domain/Document.php'); + include(SQLMAP_TESTS.'/domain/Book.php'); + include(SQLMAP_TESTS.'/domain/C.php'); + include(SQLMAP_TESTS.'/domain/Category.php'); + include(SQLMAP_TESTS.'/domain/Complex.php'); + include(SQLMAP_TESTS.'/domain/D.php'); + include(SQLMAP_TESTS.'/domain/DocumentCollection.php'); + include(SQLMAP_TESTS.'/domain/E.php'); + include(SQLMAP_TESTS.'/domain/F.php'); + include(SQLMAP_TESTS.'/domain/LineItem.php'); + include(SQLMAP_TESTS.'/domain/LineItemCollection.php'); + include(SQLMAP_TESTS.'/domain/Newspaper.php'); + include(SQLMAP_TESTS.'/domain/Order.php'); + include(SQLMAP_TESTS.'/domain/Other.php'); + include(SQLMAP_TESTS.'/domain/Sample.php'); + include(SQLMAP_TESTS.'/domain/Search.php'); + include(SQLMAP_TESTS.'/domain/User.php'); +} + +class DefaultScriptRunner +{ + function runScript($connection, $script) + { + $sql = file_get_contents($script); + $lines = explode(';', $sql); + foreach($lines as $line) + { + $line = trim($line); + if(strlen($line) > 0) + $connection->createCommand($line)->execute(); + } + } +} + +class CopyFileScriptRunner +{ + protected $baseFile; + protected $targetFile; + + public function __construct($base, $target) + { + $this->baseFile = $base; + $this->targetFile = $target; + } + + function runScript($connection, $script) + { + copy($this->baseFile, $this->targetFile); + } +} + +class SQLiteBaseTestConfig extends BaseTestConfig +{ + protected $baseFile; + protected $targetFile; + + public function __construct() + { + $this->_sqlmapConfigFile = SQLMAP_TESTS.'/sqlite.xml'; + $this->_scriptDir = SQLMAP_TESTS.'/scripts/sqlite/'; + + $this->targetFile = realpath(SQLMAP_TESTS.'/sqlite/tests.db'); + $this->baseFile = realpath(SQLMAP_TESTS.'/sqlite/backup.db'); + $file = realpath($this->targetFile); + $this->_connection = new TDbConnection("sqlite:{$file}"); + } + + public function getScriptRunner() + { + return new CopyFileScriptRunner($this->baseFile, $this->targetFile); + } +} + +class MySQLBaseTestConfig extends BaseTestConfig +{ + public function __construct() + { + $this->_sqlmapConfigFile = SQLMAP_TESTS.'/mysql.xml'; + $this->_scriptDir = SQLMAP_TESTS.'/scripts/mysql/'; + $this->_features = array('insert_id'); + $dsn = 'mysql:host=localhost;dbname=sqlmap_test;port=3307'; + $this->_connection = new TDbConnection($dsn, 'test5', 'test5'); + } +} + +class MSSQLBaseTestConfig extends BaseTestConfig +{ + public function __construct() + { + $this->_sqlmap = SQLMAP_TESTS.'/mssql.xml'; + $this->_connectionString = 'odbc_mssql://sqlmap_tests'; + $this->_scriptDir = SQLMAP_TESTS.'/scripts/mssql/'; + $this->_features = array('insert_id'); + } +} + +class BaseTestConfig +{ + protected $_scriptDir; + protected $_connection; + protected $_sqlmapConfigFile; + + public function hasFeature($type) + { + return false; + } + + public function getScriptDir() + { + return $this->_scriptDir; + } + + public function getConnection() + { + return $this->_connection; + } + + public function getSqlMapConfigFile() + { + return $this->_sqlmapConfigFile; + } + + public function getScriptRunner() + { + return new DefaultScriptRunner(); + } + + public static function createConfigInstance() + { + //change this to connection to a different database + + //return new MySQLBaseTestConfig(); + + return new SQLiteBaseTestConfig(); + + //return new MSSQLBaseTestConfig(); + } +} + diff --git a/tests/unit/Data/SqlMap/domain/A.php b/tests/unit/Data/SqlMap/domain/A.php new file mode 100644 index 00000000..a4f204e4 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/A.php @@ -0,0 +1,25 @@ +<?php + +class A +{ + private $_ID=''; + private $_Libelle=''; + private $_B=''; + private $_E=''; + private $_F=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getLibelle(){ return $this->_Libelle; } + public function setLibelle($value){ $this->_Libelle = $value; } + + public function getB(){ return $this->_B; } + public function setB($value){ $this->_B = $value; } + + public function getE(){ return $this->_E; } + public function setE($value){ $this->_E = $value; } + + public function getF(){ return $this->_F; } + public function setF($value){ $this->_F = $value; } +} diff --git a/tests/unit/Data/SqlMap/domain/Account.php b/tests/unit/Data/SqlMap/domain/Account.php new file mode 100644 index 00000000..b4bcbcc8 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Account.php @@ -0,0 +1,34 @@ +<?php + +class Account +{ + private $_ID=0; + private $_FirstName=''; + private $_LastName=''; + private $_EmailAddress=null; + private $_IDS=''; + private $_BannerOptions=0; + private $_CartOptions=0; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = intval($value); } + + public function getFirstName(){ return $this->_FirstName; } + public function setFirstName($value){ $this->_FirstName = $value; } + + public function getLastName(){ return $this->_LastName; } + public function setLastName($value){ $this->_LastName = $value; } + + public function getEmailAddress(){ return $this->_EmailAddress; } + public function setEmailAddress($value){ $this->_EmailAddress = $value; } + + public function getIDS(){ return $this->_IDS; } + public function setIDS($value){ $this->_IDS = $value; } + + public function getBannerOptions(){ return $this->_BannerOptions; } + public function setBannerOptions($value){ $this->_BannerOptions = $value; } + + public function getCartOptions(){ return $this->_CartOptions; } + public function setCartOptions($value){ $this->_CartOptions = $value; } + +} diff --git a/tests/unit/Data/SqlMap/domain/AccountBis.php b/tests/unit/Data/SqlMap/domain/AccountBis.php new file mode 100644 index 00000000..e48184b6 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/AccountBis.php @@ -0,0 +1,11 @@ +<?php + +class AccountBis +{ + public $Id; + public $FirstName; + public $LastName; + public $EmailAddress; + public $More; +} + diff --git a/tests/unit/Data/SqlMap/domain/AccountCollection.php b/tests/unit/Data/SqlMap/domain/AccountCollection.php new file mode 100644 index 00000000..06e30dc8 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/AccountCollection.php @@ -0,0 +1,15 @@ +<?php + +class AccountCollection extends TList +{ + public function addRange($accounts) + { + foreach($accounts as $account) + $this->add($account); + } + + public function copyTo(TList $array) + { + $array->copyFrom($this); + } +} diff --git a/tests/unit/Data/SqlMap/domain/B.php b/tests/unit/Data/SqlMap/domain/B.php new file mode 100644 index 00000000..ab42e6b6 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/B.php @@ -0,0 +1,21 @@ +<?php + +class B +{ + private $_C=''; + private $_D=''; + private $_ID=''; + private $_Libelle=''; + + public function getC(){ return $this->_C; } + public function setC($value){ $this->_C = $value; } + + public function getD(){ return $this->_D; } + public function setD($value){ $this->_D = $value; } + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getLibelle(){ return $this->_Libelle; } + public function setLibelle($value){ $this->_Libelle = $value; } +} diff --git a/tests/unit/Data/SqlMap/domain/Book.php b/tests/unit/Data/SqlMap/domain/Book.php new file mode 100644 index 00000000..4c0670e8 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Book.php @@ -0,0 +1,9 @@ +<?php + +class Book extends Document +{ + private $_PageNumber=''; + + public function getPageNumber(){ return $this->_PageNumber; } + public function setPageNumber($value){ $this->_PageNumber = $value; } +} diff --git a/tests/unit/Data/SqlMap/domain/C.php b/tests/unit/Data/SqlMap/domain/C.php new file mode 100644 index 00000000..642f97e9 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/C.php @@ -0,0 +1,13 @@ +<?php + +class C +{ + private $_ID=''; + private $_Libelle=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getLibelle(){ return $this->_Libelle; } + public function setLibelle($value){ $this->_Libelle = $value; } +} diff --git a/tests/unit/Data/SqlMap/domain/Category.php b/tests/unit/Data/SqlMap/domain/Category.php new file mode 100644 index 00000000..895819e9 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Category.php @@ -0,0 +1,17 @@ +<?php + +class Category +{ + private $_ID=-1; + private $_Name=''; + private $_Guid=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getName(){ return $this->_Name; } + public function setName($value){ $this->_Name = $value; } + + public function getGuidString(){ return $this->_Guid; } + public function setGuidString($value){ $this->_Guid = $value; } +} diff --git a/tests/unit/Data/SqlMap/domain/Complex.php b/tests/unit/Data/SqlMap/domain/Complex.php new file mode 100644 index 00000000..01082343 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Complex.php @@ -0,0 +1,9 @@ +<?php + +class Complex +{ + private $_map; + + public function getMap(){ return $this->_map; } + public function setMap(TMap $map){ $this->_map = $map; } +} diff --git a/tests/unit/Data/SqlMap/domain/D.php b/tests/unit/Data/SqlMap/domain/D.php new file mode 100644 index 00000000..f120e2d1 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/D.php @@ -0,0 +1,14 @@ +<?php + +class D +{ + private $_ID=''; + private $_Libelle=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getLibelle(){ return $this->_Libelle; } + public function setLibelle($value){ $this->_Libelle = $value; } + +} diff --git a/tests/unit/Data/SqlMap/domain/Document.php b/tests/unit/Data/SqlMap/domain/Document.php new file mode 100644 index 00000000..518851e6 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Document.php @@ -0,0 +1,14 @@ +<?php + +class Document +{ + private $_ID=''; + private $_Title=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getTitle(){ return $this->_Title; } + public function setTitle($value){ $this->_Title = $value; } + +} diff --git a/tests/unit/Data/SqlMap/domain/DocumentCollection.php b/tests/unit/Data/SqlMap/domain/DocumentCollection.php new file mode 100644 index 00000000..a2d5d89d --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/DocumentCollection.php @@ -0,0 +1,6 @@ +<?php + +class DocumentCollection extends TList +{ + +} diff --git a/tests/unit/Data/SqlMap/domain/E.php b/tests/unit/Data/SqlMap/domain/E.php new file mode 100644 index 00000000..c69c8027 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/E.php @@ -0,0 +1,14 @@ +<?php + +class E +{ + private $_ID=''; + private $_Libelle=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getLibelle(){ return $this->_Libelle; } + public function setLibelle($value){ $this->_Libelle = $value; } + +} diff --git a/tests/unit/Data/SqlMap/domain/F.php b/tests/unit/Data/SqlMap/domain/F.php new file mode 100644 index 00000000..159d8d63 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/F.php @@ -0,0 +1,14 @@ +<?php + +class F +{ + private $_ID=''; + private $_Libelle=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getLibelle(){ return $this->_Libelle; } + public function setLibelle($value){ $this->_Libelle = $value; } + +} diff --git a/tests/unit/Data/SqlMap/domain/LineItem.php b/tests/unit/Data/SqlMap/domain/LineItem.php new file mode 100644 index 00000000..a989ab8b --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/LineItem.php @@ -0,0 +1,30 @@ +<?php + +class LineItem +{ + private $_ID=-1; + private $_Order=''; + private $_Code=''; + private $_Quantity=-1; + private $_Price=0.0; + private $_PictureData=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getOrder(){ return $this->_Order; } + public function setOrder($value){ $this->_Order = $value; } + + public function getCode(){ return $this->_Code; } + public function setCode($value){ $this->_Code = $value; } + + public function getQuantity(){ return $this->_Quantity; } + public function setQuantity($value){ $this->_Quantity = $value; } + + public function getPrice(){ return $this->_Price; } + public function setPrice($value){ $this->_Price = $value; } + + public function getPictureData(){ return $this->_PictureData; } + public function setPictureData($value){ $this->_PictureData = $value; } + +} diff --git a/tests/unit/Data/SqlMap/domain/LineItemCollection.php b/tests/unit/Data/SqlMap/domain/LineItemCollection.php new file mode 100644 index 00000000..1c31dca3 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/LineItemCollection.php @@ -0,0 +1,6 @@ +<?php + +class LineItemCollection extends TList +{ + +} diff --git a/tests/unit/Data/SqlMap/domain/Newspaper.php b/tests/unit/Data/SqlMap/domain/Newspaper.php new file mode 100644 index 00000000..12ebce5b --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Newspaper.php @@ -0,0 +1,10 @@ +<?php + +class Newspaper extends Document +{ + private $_City=''; + + public function getCity(){ return $this->_City; } + public function setCity($value){ $this->_City = $value; } + +} diff --git a/tests/unit/Data/SqlMap/domain/Order.php b/tests/unit/Data/SqlMap/domain/Order.php new file mode 100644 index 00000000..2b907ac6 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Order.php @@ -0,0 +1,69 @@ +<?php + +class Order +{ + private $_ID=-1; + private $_Account=''; + private $_Date=''; + private $_CardType=''; + private $_CardExpiry=''; + private $_CardNumber=''; + private $_Street=''; + private $_City=''; + private $_Province=''; + private $_PostalCode=''; + private $_LineItemsList=''; + private $_LineItems=null; + private $_LineItemsArray=array(); + private $_FavouriteLineItem=null; + + public function __construct() + { + $this->_LineItemsList = new TList; + $this->_LineItems = new TList; + $this->_FavouriteLineItem = new LineItem; + } + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getAccount(){ return $this->_Account; } + public function setAccount($value){ $this->_Account = $value; } + + public function getDate(){ return $this->_Date; } + public function setDate($value){ $this->_Date = $value; } + + public function getCardType(){ return $this->_CardType; } + public function setCardType($value){ $this->_CardType = $value; } + + public function getCardExpiry(){ return $this->_CardExpiry; } + public function setCardExpiry($value){ $this->_CardExpiry = $value; } + + public function getCardNumber(){ return $this->_CardNumber; } + public function setCardNumber($value){ $this->_CardNumber = $value; } + + public function getStreet(){ return $this->_Street; } + public function setStreet($value){ $this->_Street = $value; } + + public function getCity(){ return $this->_City; } + public function setCity($value){ $this->_City = $value; } + + public function getProvince(){ return $this->_Province; } + public function setProvince($value){ $this->_Province = $value; } + + public function getPostalCode(){ return $this->_PostalCode; } + public function setPostalCode($value){ $this->_PostalCode = $value; } + + public function getLineItemsList(){ return $this->_LineItemsList; } + public function setLineItemsList($value){ $this->_LineItemsList = $value; } + + public function getLineItems(){ return $this->_LineItems; } + public function setLineItems($value){ $this->_LineItems = $value; } + + public function getLineItemsArray(){ return $this->_LineItemsArray; } + public function setLineItemsArray($value){ $this->_LineItemsArray = $value; } + + public function getFavouriteLineItem(){ return $this->_FavouriteLineItem; } + public function setFavouriteLineItem($value){ $this->_FavouriteLineItem = $value; } + +} diff --git a/tests/unit/Data/SqlMap/domain/Other.php b/tests/unit/Data/SqlMap/domain/Other.php new file mode 100644 index 00000000..89f9d490 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Other.php @@ -0,0 +1,21 @@ +<?php + +class Other +{ + private $_Int=-1; + private $_Long=-1; + private $_Bool=false; + private $_Bool2=false; + + public function getBool2(){ return $this->_Bool2; } + public function setBool2($value){ $this->_Bool2 = $value; } + + public function getBool(){ return $this->_Bool; } + public function setBool($value){ $this->_Bool = $value; } + + public function getInt(){ return $this->_Int; } + public function setInt($value){ $this->_Int = $value; } + + public function getLong(){ return $this->_Long; } + public function setLong($value){ $this->_Long = $value; } +} diff --git a/tests/unit/Data/SqlMap/domain/Sample.php b/tests/unit/Data/SqlMap/domain/Sample.php new file mode 100644 index 00000000..f2a8951f --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Sample.php @@ -0,0 +1,53 @@ +<?php + +class Sample +{ + private $_FirstID=''; + private $_SecondID=''; + private $_ThirdID=''; + private $_FourthID=''; + private $_FifthID=''; + private $_SequenceID=''; + private $_DistributedID=''; + private $_SampleChar=''; + private $_SampleDecimal=''; + private $_SampleMoney=''; + private $_SampleDate=''; + private $_SequenceDate=''; + + public function getFirstID(){ return $this->_FirstID; } + public function setFirstID($value){ $this->_FirstID = $value; } + + public function getSecondID(){ return $this->_SecondID; } + public function setSecondID($value){ $this->_SecondID = $value; } + + public function getThirdID(){ return $this->_ThirdID; } + public function setThirdID($value){ $this->_ThirdID = $value; } + + public function getFourthID(){ return $this->_FourthID; } + public function setFourthID($value){ $this->_FourthID = $value; } + + public function getFifthID(){ return $this->_FifthID; } + public function setFifthID($value){ $this->_FifthID = $value; } + + public function getSequenceID(){ return $this->_SequenceID; } + public function setSequenceID($value){ $this->_SequenceID = $value; } + + public function getDistributedID(){ return $this->_DistributedID; } + public function setDistributedID($value){ $this->_DistributedID = $value; } + + public function getSampleChar(){ return $this->_SampleChar; } + public function setSampleChar($value){ $this->_SampleChar = $value; } + + public function getSampleDecimal(){ return $this->_SampleDecimal; } + public function setSampleDecimal($value){ $this->_SampleDecimal = $value; } + + public function getSampleMoney(){ return $this->_SampleMoney; } + public function setSampleMoney($value){ $this->_SampleMoney = $value; } + + public function getSampleDate(){ return $this->_SampleDate; } + public function setSampleDate($value){ $this->_SampleDate = $value; } + + public function getSequenceDate(){ return $this->_SequenceDate; } + public function setSequenceDate($value){ $this->_SequenceDate = $value; } +} diff --git a/tests/unit/Data/SqlMap/domain/Search.php b/tests/unit/Data/SqlMap/domain/Search.php new file mode 100644 index 00000000..d2170044 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/Search.php @@ -0,0 +1,21 @@ +<?php + +class Search +{ + private $_NumberSearch=''; + private $_StartDate=''; + private $_Operande=''; + private $_StartDateAnd=''; + + public function getNumberSearch(){ return $this->_NumberSearch; } + public function setNumberSearch($value){ $this->_NumberSearch = $value; } + + public function getStartDate(){ return $this->_StartDate; } + public function setStartDate($value){ $this->_StartDate = $value; } + + public function getOperande(){ return $this->_Operande; } + public function setOperande($value){ $this->_Operande = $value; } + + public function getStartDateAnd(){ return $this->_StartDateAnd; } + public function setStartDateAnd($value){ $this->_StartDateAnd = $value; } +} diff --git a/tests/unit/Data/SqlMap/domain/User.php b/tests/unit/Data/SqlMap/domain/User.php new file mode 100644 index 00000000..1106d1e9 --- /dev/null +++ b/tests/unit/Data/SqlMap/domain/User.php @@ -0,0 +1,25 @@ +<?php + +class User +{ + private $_ID=''; + private $_UserName=''; + private $_Password=''; + private $_EmailAddress=''; + private $_LastLogon=''; + + public function getID(){ return $this->_ID; } + public function setID($value){ $this->_ID = $value; } + + public function getUserName(){ return $this->_UserName; } + public function setUserName($value){ $this->_UserName = $value; } + + public function getPassword(){ return $this->_Password; } + public function setPassword($value){ $this->_Password = $value; } + + public function getEmailAddress(){ return $this->_EmailAddress; } + public function setEmailAddress($value){ $this->_EmailAddress = $value; } + + public function getLastLogon(){ return $this->_LastLogon; } + public function setLastLogon($value){ $this->_LastLogon = $value; } +} diff --git a/tests/unit/Data/SqlMap/gen.php b/tests/unit/Data/SqlMap/gen.php new file mode 100644 index 00000000..40ddc297 --- /dev/null +++ b/tests/unit/Data/SqlMap/gen.php @@ -0,0 +1,31 @@ +<?php + +$props = <<<EOD +_prepend +_property +_compareProperty +_compareValue +EOD; + +print_vars($props); +echo "\n"; +print_funcs($props); + +function print_vars($props) +{ + foreach(explode("\n", $props) as $prop) + { + echo "\tprivate \${$prop};\n"; + } +} + +function print_funcs($props) +{ + foreach(explode("\n", $props) as $prop) + { + $name = ucfirst(str_replace('_', '', $prop)); + $getter = "\tpublic function get{$name}(){ return \$this->{$prop}; }\n"; + $setter = "\tpublic function set{$name}(\$value){ \$this->{$prop} = \$value; }\n"; + echo $getter.$setter."\n"; + } +} diff --git a/tests/unit/Data/SqlMap/maps/MySql/Account.xml b/tests/unit/Data/SqlMap/maps/MySql/Account.xml new file mode 100644 index 00000000..d6dd1c1d --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/Account.xml @@ -0,0 +1,624 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<sqlMap namespace="Account" > + + <!-- ============================================= + <resultMap + name="name" + class="name" + extend="resultMapId" + > + <result + property="name" + column="name" + columnIndex="name" + nullValue="value" + select="name" + resultMap="name" + lazyLoad="true/false" + dbType="" + /> + <procedure + name="name" + parameterMap="name" + > + <statement + name="name" + parameterClass="name" + parameterMap="name" + resultClass="name" + resultMap="name" + listClass="name" + > + <parameterMap + name="name" + class="" + > + <parameter + property="name" + dbType="" + output="true/false" + type="" + nullValue="" + extend="parameterMapId" + /> + + ============================================= --> + + <cacheModel id="account-cache" implementation="LRU" > + <flushInterval hours="24"/> + <flushOnExecute statement="UpdateAccountViaInlineParameters"/> + <flushOnExecute statement="UpdateAccountViaParameterMap"/> + <property name="size" value="10"/> + </cacheModel> + + <!-- + <cacheModel name="account-cache" implementation="LRU" > + <flushInterval hours="24"/> + <flushOnExecute statement="UpdateAccountViaInlineParameters"/> + <flushOnExecute statement="UpdateAccountViaParameterMap"/> + <property name="CacheSize" value="50"/> + </cacheModel> + --> + + + <alias> + <typeAlias alias="HundredsBool" type="IBatisNet.DataMapper.Test.Domain.HundredsTypeHandlerCallback, IBatisNet.DataMapper.Test"/> + </alias> + + <resultMap id="account-result" class="Account" > + <result property="Id" column="Account_Id"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email" nullValue="no_email@provided.com"/> + <result property="BannerOptions" column="Account_Banner_Option" typeHandler="OuiNonBool"/> + <result property="CartOptions" column="Account_Cart_Option" typeHandler="HundredsBool"/> + </resultMap> + <resultMap id="indexed-account-result" class="Account"> + <result property="Id" column="Account_Id" columnIndex="0"/> + <result property="FirstName" column="Account_FirstName" columnIndex="1"/> + <result property="LastName" column="Account_LastName" columnIndex="2"/> + <result property="EmailAddress" column="Account_Email" columnIndex="3" nullValue="no_email@provided.com"/> + </resultMap> + <resultMap id="account-result-nullable-email" class="Account"> + <result property="Id" column="Account_Id"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email"/> + </resultMap> + + <resultMap id="email-result" class="string"> + <result property="value" column="Account_Email"/> + </resultMap> + + <resultMap id="account-hashtable-result" class="array"> + <result property="Id" column="Account_Id"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email"/> + </resultMap> + + + <!-- ============================================= + MAPPED STATEMENTS - w/Inline Parameters + ============================================= + --> + + <select id="GetAllAccountsAsArrayListViaResultClass" + resultClass="TList"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_Id + </select> + + <select id="GetAccountsDynamic" resultMap="account-result" parameterClass="Hashtable" > + select * from Accounts + <dynamic prepend="where"> + <isParameterPresent> + <isNotEmpty prepend="and" property="FirstName" > + Account_FirstName LIKE '%$FirstName$%' + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName LIKE '%$LastName$%' + </isNotEmpty> + <isNotEmpty prepend="and" property="EmailAddress" > + Account_Email LIKE '%$EmailAddress$%' + </isNotEmpty> + </isParameterPresent> + </dynamic> + order by Account_LastName + limit 0, $MaximumAllowed$ + </select> + + <select id="SelectWithProperty" + resultMap="account-result"> + select * + from Accounts + where Account_FirstName = ${accountName} + </select> + + <select id="GetCachedAccountsViaResultMap" + resultMap="account-result" + cacheModel="account-cache" > + select * + from Accounts + order by Account_Id + </select> + + <select id="GetNoAccountWithCache" + parameterClass="Integer" + resultMap="account-hashtable-result" + cacheModel="account-cache"> + select * + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAccountAsHashtable" + parameterClass="Integer" + resultMap="account-hashtable-result"> + select * + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllAccountsAsHashMapViaResultMap" + resultMap="account-hashtable-result"> + select * + from Accounts + order by Account_Id + </select> + + <select id="GetAccountAsHashtableResultClass" + parameterClass="int" + resultClass="array"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllAccountsAsHashtableViaResultClass" + resultClass="array"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_Id + </select> + + <select id="GetAccountViaColumnName" + parameterClass="int" + resultMap="account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email, + Account_Banner_Option, + Account_Cart_Option + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAccountViaColumnIndex" + parameterClass="int" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllAccountsViaResultMap" + resultMap="account-result"> + select * from Accounts + order by Account_Id + </select> + + <select id="GetAllAccountsViaResultClass" + resultClass="Account"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_Id + </select> + + <select id="GetFewAccountsViaResultMap" + resultMap="account-result"> + <![CDATA[ + select * from Accounts + where Account_Id < 2 + order by Account_Id + ]]> + </select> + + <select id="GetNoAccountsViaResultMap" + resultMap="account-result"> + select * from Accounts + where Account_Id > 1000 + order by Account_Id + </select> + + + <select id="GetAccountNullableEmail" + resultMap="account-result-nullable-email"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAccountViaResultClass" + resultClass="Account"> + <![CDATA[ + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_Id = #value# + ]]> + </select> + + <select id="GetAccountViaInlineParameters" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_Id = #Id# and Account_Id = #Id# + </select> + + <select id="GetEmailAddressViaResultClass" resultClass="string"> + select Account_Email as value + from Accounts + where Account_Id = #value# + </select> + + <select id="GetEmailAddressViaResultMap" + parameterClass="int" + resultMap="email-result"> + select Account_Email + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllEmailAddressesViaResultClass" + resultClass="string"> + select Account_Email + from Accounts + order by Account_Id + </select> + + <select id="GetAllEmailAddressesViaResultMap" + resultMap="email-result"> + select Account_Email + from Accounts + order by Account_Id + </select> + + <insert id="InsertAccountViaParameterMap" + parameterMap="account-insert-params"> + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) + values + (?, ?, ?, ?, ?, ?) + </insert> + + <update id="UpdateAccountViaParameterMap" + parameterMap="update-params"> + update Accounts set + Account_FirstName = ?, + Account_LastName = ?, + Account_Email = ? + where + Account_Id = ? + </update> + + <update id="UpdateAccountViaParameterMap2" + parameterMap="update-params2"> + update Accounts set + Account_Id = ?, + Account_FirstName = ?, + Account_LastName = ?, + Account_Email = ? + where + Account_Id = ? + </update> + + <delete id="DeleteAccountViaInlineParameters"> + delete from Accounts + where + Account_Id = #Id# + </delete> + + <select id="GetAccountComplexMapping" + resultMap="indexed-account-result" + parameterClass="array"> + select * + from Accounts + where + Account_FirstName = #Account.FirstName# + And Account_LastName = #Order.City# + </select> + + <select id="GetDynamicOrderedEmailAddressesViaResultMap" + resultMap="email-result"> + select Account_Email + from Accounts + order by $value$ + </select> + + <!-- Dynamic statements --> + <select id="GetAllAccountsViaResultMapWithDynamicElement" + resultMap="account-result"> + select * from Accounts + where Account_Email $value$ '%@%' + order by Account_Id + </select> + + <select id="SimpleDynamicSubstitution" + parameterClass="Hashtable" + resultClass="Account"> + $statement$ + </select> + + <!-- Public Fields --> + <insert id="InsertAccountViaPublicFields"> + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + values + (#Id#, #FirstName#, #LastName#, #EmailAddress# + ) + </insert> + + + <!-- Inline Parameters --> + <update id="UpdateAccountViaInlineParameters" + parameterClass="Account"> + update Accounts set + Account_FirstName = #FirstName#, + Account_LastName = #LastName#, + Account_Email = #EmailAddress, dbType=VarChar, nullValue=no_email@provided.com# + where + Account_Id = #Id# + </update> + + <insert id="InsertAccountViaInlineParameters" + parameterClass="Account" > + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + values + (#Id#, #FirstName#, #LastName#, #EmailAddress, dbType=VarChar, nullValue=no_email@provided.com# + ) + </insert> + + <insert id="InsertAccountNullableEmail" + parameterClass="Account" > + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + values + ( #Id#, #FirstName#, #LastName#, #EmailAddress, dbType=VarChar# ) + </insert> + + <insert id="InsertAccountUknownParameterClass"> + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + values + ( #Id#, #FirstName#, #LastName#, #EmailAddress, dbType=VarChar# ) + </insert> + + <delete id="DeleteAccount" + parameterClass="Account"> + delete from Accounts + where Account_Id = #Id# + and Account_Id = #Id# + </delete> + + <!-- Extends statement --> + <select id="GetAllAccounts" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + </select> + + <select id="GetAllAccountsOrderByName" + extends="GetAllAccounts" + resultMap="indexed-account-result"> + order by Account_FirstName + </select> + + <select id="GetOneAccount" + extends="GetAllAccounts" + resultMap="indexed-account-result"> + where Account_Id = #value# + </select> + + <select id="GetSomeAccount" + extends="GetAllAccounts" + parameterClass="Hashtable" + resultMap="indexed-account-result"> + where Account_Id between #lowID# and #hightID# + </select> + + <select id="SelectAccountJIRA29" parameterClass="map" resultClass="Account"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_FirstName = '##$AccountName$##' + </select> + + <select id="SelectAccountJIRA29-2" + parameterClass="Hashtable" + resultClass="Account"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where 1=1 + <isNotEmpty prepend="AND" property="Foo"> + (Account_FirstName = '##$Foo$##') + </isNotEmpty> + </select> + + <select id="GetAccountWithRepeatingProperty" + parameterClass="Account" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_Id = #Id# and + Account_Id = #Id# and + Account_FirstName = #FirstName# and + Account_LastName = #LastName# and + Account_Id = #Id# + </select> + + <select id="GetAllAccountsViaCustomTypeHandler" + resultMap="account-result"> + select * from Accounts + order by Account_Id + </select> + + <!-- JIRA-110 --> + <select id="GetManyAccound" resultClass="Account"> + SELECT + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + FROM Accounts + </select> + + <select id="Get1Account" extends="GetManyAccound" resultClass="Account">WHERE Account_Id=1</select> + + <statement id="GetAccounts" resultMap="account-result"> + SELECT * + FROM + Accounts + </statement> + <!-- JIRA-110 --> + + <insert id="InsertAccountDynamic" parameterClass="Account"> + INSERT INTO Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + VALUES(#Id#, #FirstName#, #LastName# + <dynamic prepend=","> + <isNotNull prepend="," property="EmailAddress"> + #EmailAddress# + </isNotNull> + <isNull prepend="," property="EmailAddress"> + null + </isNull> + </dynamic> + ) + </insert> + + + <!-- accounts and orders --> + + <select id="getAccountWithOrders" resultMap="Account-with-Orders"> + SELECT * FROM Accounts + LEFT JOIN Orders ON + Accounts.account_id = Orders.account_id + </select> + + <resultMap id="Account-with-Orders" class="AccountWithOrders" groupBy="Account_Id"> + <result property="Id" column="Account_Id"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email" /> + <result property="Orders" resultMapping="account-orders" /> + </resultMap> + + <resultMap id="account-orders" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + </resultMap> + + + <!-- For procedure, the parameters of the parameterMap must in the same order + as for the procedure paramaters--> + <procedure id="InsertAccountViaStoreProcedure" parameterMap="account-insert-params"> + ps_InsertAccount + </procedure> + + <procedure id="SwapEmailAddresses" parameterMap="swap-params"> + ps_swap_email_address + </procedure> + + <!-- ============================================= + OPTIONAL EXPLICIT PARAMETER MAP + ============================================= --> + + <parameterMap id="swap-params"> + <parameter property="email1" column="First_Email" /> + <parameter property="email2" column="Second_Email" /> + </parameterMap> + + <parameterMap id="account-insert-params"> + <parameter property="Id" /> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="BannerOptions" dbType="Varchar" type="bool"/> + <parameter property="CartOptions" column="Account_Cart_Option" typeHandler="HundredsBool"/> + </parameterMap> + + <parameterMap id="update-params"> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="Id" /> + </parameterMap> + + <parameterMap id="update-params2"> + <parameter property="Id" /> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="Id" /> + </parameterMap> + + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/MySql/ActiveRecord.xml b/tests/unit/Data/SqlMap/maps/MySql/ActiveRecord.xml new file mode 100644 index 00000000..1c48010f --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/ActiveRecord.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<sqlMap> + + <select id="GetActiveRecordAccounts" resultClass="ActiveAccount"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email, + Account_Banner_Option, + Account_Cart_Option + from Accounts + order by Account_Id + </select> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/MySql/Category.xml b/tests/unit/Data/SqlMap/maps/MySql/Category.xml new file mode 100644 index 00000000..05c51fb5 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/Category.xml @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Category" > + + <alias> + <typeAlias alias="Category" type="IBatisNet.DataMapper.Test.Domain.Category, IBatisNet.DataMapper.Test"/> + </alias> + + + <select id="GetCategory" parameterClass="Integer" resultClass="Category"> + select + Category_ID as Id, + Category_Name as Name, + Category_Guid as GuidString + from Categories + where Category_ID = #value# + </select> + + <select id="GetCategoryGuid" parameterClass="Integer" resultClass="guid"> + select + Category_Guid as value + from Categories + where Category_ID = #value# + </select> + + <!-- Test for statement as insert --> + <!-- Needs to be <insert> vs <statement> for MySql due to selectKey --> + <insert id="InsertCategory" parameterClass="Category"> + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (#Name#, #GuidString:Varchar#); + </insert> + + <!-- --> + <insert id="InsertCategoryViaInsertStatement" parameterClass="Category" > + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (#Name#, #GuidString:Varchar#) + </insert> + + <!-- Needs to be <insert> vs <statement> for MySql due to selectKey --> + <insert id="InsertCategoryViaParameterMap" parameterMap="InsertParam"> + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (?,?); + </insert> + + <!-- Needs to be <insert> vs <statement> for MySql due to selectKey --> + <insert id="InsertCategoryNull" parameterMap="insert-null-params"> + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (?,?); + </insert> + + <update id="UpdateCategoryViaParameterMap" parameterMap="UpdateParam"> + update Categories set + Category_Name =?, + Category_Guid = ? + where + Category_Id = ? + </update> + + <procedure id="InsertCategoryViaStoreProcedure" parameterMap="category-insert-params"> + ps_InsertCategorie + </procedure> + + <insert id="InsertCategoryGenerate" parameterMap="insert-generate-params"> + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + <generate table="Categories" /> + </insert> + + <update id="UpdateCategoryGenerate" parameterMap="update-generate-params"> + <generate table="Categories" by="Category_Id"/> + </update> + + <delete id="DeleteCategoryGenerate" parameterMap="delete-generate-params"> + <generate table="Categories" by="Category_Id, Category_Name"/> + </delete> + + <select id="SelectByPKCategoryGenerate" resultClass="Category" parameterClass="Category" parameterMap="select-generate-params"> + <generate table="Categories" by="Category_Id"/> + </select> + + <select id="SelectAllCategoryGenerate" resultClass="Category" parameterMap="select-generate-params"> + <generate table="Categories" /> + </select> + + <statement id="DynamicGuid" + resultClass="Category" + parameterClass="Category"> + select + Category_ID as Id, + Category_Name as Name, + Category_Guid as Guid + from Categories + <dynamic prepend="where"> + <isNotEqual prepend="and" property="Guid" compareProperty="EmptyGuid"> + Category_Guid=#GuidString:Varchar# + </isNotEqual> + </dynamic> + </statement> + <parameterMap id="category-insert-params"> + <parameter property="Id" column="Category_Id" dbType="Int32" /> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" dbType="Varchar"/> + </parameterMap> + + <parameterMap id="InsertParam"> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" dbType="Varchar"/> + </parameterMap> + + <parameterMap id="insert-null-params"> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" nullValue="00000000-0000-0000-0000-000000000000" dbType="Varchar"/> + </parameterMap> + + <parameterMap id="UpdateParam" extends="InsertParam"> + <parameter property="Id" column="Category_Id" /> + </parameterMap> + + <!-- Used by generated statement --> + + <parameterMap id="insert-generate-params"> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" dbType="Varchar"/> + </parameterMap> + + <parameterMap id="update-generate-params" extends="insert-generate-params"> + <parameter property="Id" column="Category_Id" /> + </parameterMap> + + <parameterMap id="delete-generate-params"> + <parameter property="Id" column="Category_Id" /> + <parameter property="Name" column="Category_Name"/> + </parameterMap> + + <parameterMap id="select-generate-params"> + <parameter property="Id" column="Category_Id" /> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" dbType="Varchar"/> + </parameterMap> + + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/MySql/Complex.xml b/tests/unit/Data/SqlMap/maps/MySql/Complex.xml new file mode 100644 index 00000000..c596e555 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/Complex.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Complex" > + + <statements> + + <statement id="ComplexMap" + resultClass="int" > + select Account_ID from Accounts where Account_ID = #obj.Map.Id# + </statement> + + <insert id="InsertComplexAccountViaInlineDefaultNull" + parameterClass="Hashtable" > + insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email) + values + (#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:Varchar:no_email@provided.com# + ) + </insert> + + </statements> + + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/MySql/Document.xml b/tests/unit/Data/SqlMap/maps/MySql/Document.xml new file mode 100644 index 00000000..805ad9d4 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/Document.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Document" > + <resultMap id="document" class="Document"> + <result property="Id" column="Document_Id"/> + <result property="Title" column="Document_Title"/> + <discriminator column="Document_Type" type="string"/> + <subMap value="Book" resultMapping="book" /> + <subMap value="Newspaper" resultMapping="newspaper" /> + </resultMap> + + <resultMap id="document-custom-handler" class="Document"> + <result property="Id" column="Document_Id"/> + <result property="Title" column="Document_Title"/> + <discriminator column="Document_Type" typeHandler="CustomInheritance"/> + <subMap value="Book" resultMapping="book" /> + <subMap value="Newspaper" resultMapping="newspaper" /> + </resultMap> + + <resultMap id="book" class="Book" extends="document"> + <result property="PageNumber" column="Document_PageNumber"/> + </resultMap> + + <resultMap id="newspaper" class="Newspaper" extends="document"> + <result property="City" column="Document_City"/> + </resultMap> + + + <statement id="GetAllDocument" + resultMap="document"> + select + * + from Documents + order by Document_Type, Document_Id + </statement> + + <select id="GetTypedCollection" + listClass="DocumentCollection" + resultMap="document"> + select + * + from Documents + order by Document_Type, Document_Id + </select> + + <select id="GetAllDocumentWithCustomTypeHandler" + resultMap="document-custom-handler"> + select + * + from Documents + order by Document_Type, Document_Id + </select> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/MySql/DynamicAccount.xml b/tests/unit/Data/SqlMap/maps/MySql/DynamicAccount.xml new file mode 100644 index 00000000..5696ac65 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/DynamicAccount.xml @@ -0,0 +1,449 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Account" > + + <alias> + <typeAlias alias="Search" type="IBatisNet.DataMapper.Test.Domain.Search, IBatisNet.DataMapper.Test"/> + </alias> + + <statements> + + <select id="DynamicAll" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + </select> + + <select id="DynamicWithExtend" + extends="DynamicAll" + parameterClass="Account" + resultClass="Account"> + <dynamic prepend="WHERE" > + <isGreaterThan prepend="AND" property="Id" compareValue="0" > + Account_ID = #Id# + </isGreaterThan> + <isNotNull prepend="AND" property="Ids" > + Account_ID in + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </isNotNull> + <isNotEmpty prepend="AND" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="EmailAddress" > + <isEqual property="EmailAddress" compareValue="Joe"> + Account_Email = 'clinton.begin@ibatis.com' + </isEqual> + <isNotEqual property="EmailAddress" compareValue="Joe"> + Account_Email = #EmailAddress# + </isNotEqual> + </isNotEmpty> + </dynamic> + </select> + + <!-- IBATISNET-114: remapResults + <statement id="DynamicSqlOnColumnSelection" + parameterClass="Account" + resultClass="Account" + remapResults="true"> + SELECT + Account_ID as Id, + <dynamic> + <isEqual property="LastName" compareValue="Dalton" > + Account_FirstName as FirstName, + </isEqual> + <isEqual property="LastName" compareValue="Dalton" > + Account_LastName as LastName, + </isEqual> + </dynamic> + + Account_Email as EmailAddress + FROM + Accounts + </statement> + --> + + <statement id="DynamicIsEqual" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isEqual compareValue="Joe" > + where Account_FirstName = 'Joe' + </isEqual> + </statement> + + <statement id="DynamicIsParameterPresent" + parameterClass="integer" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isParameterPresent > + where Account_ID = #value# + </isParameterPresent> + </statement> + + <statement id="DynamicIsNotEmpty" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isNotEmpty> + where Account_FirstName = #value# + </isNotEmpty> + </statement> + + <statement id="DynamicIsGreater" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isGreaterThan compareValue="3" > + where Account_ID = 1 + </isGreaterThan> + </statement> + + <statement id="DynamicIsGreaterEqual" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isGreaterEqual compareValue="3" > + where Account_ID = 1 + </isGreaterEqual> + </statement> + + <statement id="DynamicIsLess" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isLessThan compareValue="3" > + where Account_ID = 1 + </isLessThan> + </statement> + + <statement id="DynamicIsLessEqual" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isLessEqual compareValue="3" > + where Account_ID = 1 + </isLessEqual> + </statement> + + <statement id="DynamicIsNotNull" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isNotNull> + where Account_ID = 1 + </isNotNull> + </statement> + + <statement id="DynamicIsPropertyAvailable" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isPropertyAvailable property="Id" > + where Account_ID = 1 + </isPropertyAvailable> + </statement> + + + <statement id="DynamicSubst" + parameterClass="map" + resultClass="Account"> + <dynamic> + $statement$ + </dynamic> + </statement> + + <statement id="DynamicIterate" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </statement> + + <statement id="DynamicIterate2" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </statement> + + <statement id="MultiDynamicIterate" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + and Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </statement> + + + <statement id="DynamicQueryByExample" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="WHERE" > + <isGreaterThan prepend="AND" property="Id" compareValue="0" > + Account_ID = #Id# + </isGreaterThan> + <isNotNull prepend="AND" property="Ids" > + Account_ID in + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </isNotNull> + <isNotEmpty prepend="AND" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="EmailAddress" > + <isEqual property="EmailAddress" compareValue="Joe"> + Account_Email = 'clinton.begin@ibatis.com' + </isEqual> + <isNotEqual property="EmailAddress" compareValue="Joe"> + Account_Email = #EmailAddress# + </isNotEqual> + </isNotEmpty> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend1" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend2" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + <iterate open="(" close=")" conjunction="OR"> + Account_ID = #[]# + </iterate> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend3" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + <isParameterPresent prepend="BLAH!" > + <iterate open="(" close=")" conjunction="OR"> + Account_ID = #[]# + </iterate> + </isParameterPresent> + </dynamic> + </statement> + + <statement id="DynamicWithPrepend" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isParameterPresent> + <isNotEmpty prepend="and" property="Id" > + Account_ID = #Id# + </isNotEmpty> + <isNotEmpty prepend="and" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + </isParameterPresent> + </dynamic> + </statement> + + <statement id="DynamicWithTwoDynamicElements" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isNotEmpty prepend="BLAH!" property="Id" > + Account_ID = #Id# + </isNotEmpty> + </dynamic> + <dynamic prepend="and"> + <isNotEmpty prepend="BLAH!" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + </dynamic> + </statement> + + <statement id="ComplexDynamicStatement" + cacheModel="account-cache" + resultClass="Account" + parameterClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="WHERE"> + <isNotNull prepend="AND" property="FirstName"> + (Account_FirstName = #FirstName# + <isNotNull prepend="OR" property="LastName"> + Account_LastName = #LastName# + </isNotNull> + ) + </isNotNull> + <isNotNull prepend="AND" property="EmailAddress"> + Account_Email like #EmailAddress# + </isNotNull> + <isGreaterThan prepend="AND" property="Id" compareValue="0"> + Account_ID = #Id# + </isGreaterThan> + </dynamic> + order by Account_LastName + </statement> + + <statement id="Jira-IBATISNET-11" + resultClass="Account" + parameterClass="Search"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isNotNull prepend="and" property="NumberSearch"> + ((Account_ID $Operande$ #NumberSearch#) or + (Account_ID $Operande$ #NumberSearch#)) + </isNotNull> + <isEqual prepend="and" property="StartDate" compareValue="25/12/2004"> + <![CDATA[Account_FirstName >= #StartDate# ]]> + </isEqual> + <isEqual prepend="and" property="StartDateAnd" compareValue="true"> + <![CDATA[Account_LastName >= #StartDate# ]]> + </isEqual> + </dynamic> + + order by Account_LastName + </statement> + </statements> + + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/MySql/Enumeration.xml b/tests/unit/Data/SqlMap/maps/MySql/Enumeration.xml new file mode 100644 index 00000000..930f2e5e --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/Enumeration.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Enumeration" > + + <alias> + <typeAlias alias="Enumeration" type="IBatisNet.DataMapper.Test.Domain.Enumeration, IBatisNet.DataMapper.Test"/> + </alias> + + <resultMaps> + <resultMap id="enumeration-result" class="Enumeration" > + <result property="Id" column="Enum_ID"/> + <result property="Day" column="Enum_Day"/> + <result property="Color" column="Enum_Color"/> + <result property="Month" column="Enum_Month" nullValue="All"/> + </resultMap> + </resultMaps> + + <statements> + + <select id="GetEnumerationNullValue" + parameterClass="Integer" + resultMap="enumeration-result"> + select + Enum_ID, + Enum_Day, + Enum_Color, + Enum_Month + from Enumerations + where Enum_ID = #value# + </select> + + <select id="GetEnumeration" parameterClass="Integer" resultClass="Enumeration"> + select + Enum_ID as Id, + Enum_Day as Day, + Enum_Color as Color, + Enum_Month as Month + from Enumerations + where Enum_ID = #value# + </select> + + <insert id="InsertEnumViaParameterMap" parameterMap="insert-params" > + insert into Enumerations + (Enum_ID, Enum_Day, Enum_Color, Enum_Month) + values + (?, ?, ?, ?) + </insert> + + </statements> + + <parameterMaps> + <parameterMap id="insert-params"> + <parameter property="Id" column="Enum_ID" /> + <parameter property="Day" column="Enum_Day"/> + <parameter property="Color" column="Enum_Color" /> + <parameter property="Month" column="Enum_Month" nullValue="All"/> + </parameterMap> + </parameterMaps> + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/MySql/LineItem.xml b/tests/unit/Data/SqlMap/maps/MySql/LineItem.xml new file mode 100644 index 00000000..c29524c2 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/LineItem.xml @@ -0,0 +1,188 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="LineItem" > + + <alias> + <typeAlias alias="LineItem" type="IBatisNet.DataMapper.Test.Domain.LineItem, IBatisNet.DataMapper.Test" /> + <typeAlias alias="LineItemCollection" type="IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test" /> + </alias> + + <resultMap id="LineItem-Price" class="float"> + <result property="value" column="LineItem_Price"/> + </resultMap> + + <resultMap id="LineItem" class="LineItem"> + <result property="Id" column="LineItem_Id"/> + <result property="Code" column="LineItem_Code"/> + <result property="Quantity" column="LineItem_Quantity"/> + <result property="Price" column="LineItem_Price"/> + </resultMap> + + <resultMap id="LineItemWithNullReplacement" class="LineItem"> + <result property="Id" column="LineItem_Id"/> + <result property="Code" column="LineItem_Code"/> + <result property="Quantity" column="LineItem_Quantity"/> + <result property="Price" column="LineItem_Price" nullValue="-77.77"/> + </resultMap> + + + <statement id="GetLineItemPrice" + parameterClass="array" + resultMap="LineItem-Price" > + select + LineItem_Price + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <statement id="GetLineItemsForOrder" + parameterClass="int" + listClass="TList" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems where Order_ID = #value# + </statement> + + + <statement id="GetLineItemsForOrderWithListClass" + parameterClass="int" + listClass="LineItemCollection" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems where Order_ID = #value# + order by LineItem_Code + </statement> + + <statement id="GetSpecificLineItem" + parameterClass="array" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <statement id="GetSpecificLineItemWithPicture" + parameterClass="array" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price, + LineItem_Picture as PictureData + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <select id="GetDynSpecificLineItem" + parameterClass="array" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems + where Order_ID = #Order_ID# + <dynamic> + <isNotNull property="LineItem_ID"> + and LineItem_ID = #LineItem_ID# + </isNotNull> + </dynamic> + </select> + + <statement id="GetSpecificLineItemWithNullReplacement" + parameterClass="int" + resultMap="LineItemWithNullReplacement"> + select + LineItem_ID, + LineItem_Code, + LineItem_Quantity, + LineItem_Price + from LineItems + where LineItem_ID = #value# + </statement> + + <statement id="InsertLineItem" + parameterMap="line-item-insert-params" > + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (?, ?, ?, ?, ?); + </statement> + + <statement id="InsertLineItemWithPicture" + parameterMap="line-item-insert-params-picture" > + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) + values + (?, ?, ?, ?, ?, ?); + </statement> + + <insert id="InsertLineItemPostKey" parameterClass="LineItem"> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, type=float#) + <selectKey property="Id" type="post" resultClass="int" > + select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 + </selectKey> + </insert> + + <insert id="InsertLineItemPreKey" parameterClass="LineItem"> + <selectKey property="Id" type="pre" resultClass="int" > + select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 + </selectKey> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, type=float#) + </insert> + + <insert id="InsertLineItemNoKey" parameterClass="LineItem"> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, type=float#) + </insert> + + <!-- JIRA 23 --> + <delete id="DeleteWithComments" > + <!-- Delete LineItems --> + delete from LineItems where Order_ID = 10; + <!-- Delete LineItems --> + </delete> + + <parameterMap id="line-item-insert-params"> + <parameter property="Id" /> + <parameter property="Order.Id" /> + <parameter property="Code" /> + <parameter property="Quantity" /> + <parameter property="Price" dbType="Decimal" nullValue="-99.99"/> + </parameterMap> + + <parameterMap id="line-item-insert-params-picture"> + <parameter property="Id" /> + <parameter property="Order.Id" /> + <parameter property="Code" /> + <parameter property="Quantity" /> + <parameter property="Price" dbType="Decimal" nullValue="-99.99"/> + <parameter property="PictureData" dbType="Blob" /> + </parameterMap> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/MySql/Order.xml b/tests/unit/Data/SqlMap/maps/MySql/Order.xml new file mode 100644 index 00000000..a62df9e1 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/Order.xml @@ -0,0 +1,468 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="Order"> + + <alias> + <typeAlias alias="Order" type="IBatisNet.DataMapper.Test.Domain.Order, IBatisNet.DataMapper.Test" /> + </alias> + + <!-- If the type is not specified, ADO.NET infers the + data provider Type of the Parameter from the Value property + of the Parameter object. --> + + + <resultMap id="credit-card-result" class="string"> + <result property="value" column="Order_CardNumber"/> + </resultMap> + <!-- --> + <resultMap id="order-with-lines-result" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" lazyLoad="true" type="TList" column="Order_Id" select="GetLineItemsForOrder" /> + </resultMap> + + <resultMap id="order-with-lines-result-no-lazy-load" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" type="TList" column="Order_Id" select="GetLineItemsForOrder" /> + </resultMap> + + <resultMap id="order-with-lines-result-statement-namespaces" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" lazyLoad="true" type="TList" column="Order_Id" select="LineItem.GetLineItemsForOrder" /> + </resultMap> + + <resultMap id="order-with-lines-collection" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItems" column="Order_Id" lazyLoad="true" + select="GetLineItemsForOrderWithListClass" /> + </resultMap> + + <resultMap id="order-with-lines-collection-no-lazy-load" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItems" column="Order_Id" + select="GetLineItemsForOrderWithListClass" /> + </resultMap> + + <resultMap id="order-with-lines-array" class="Order" + extends="lite-order-result-by-name"> + <result property="LineItemsArray" column="Order_Id" select="GetLineItemsForOrder"/> + </resultMap> + + <resultMap id="lite-order-map-result" class="array"> + <result property="Id" type="Int" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" type="string" column="Order_CardExpiry"/> + <result property="CardType" type="string" column="Order_CardType"/> + <result property="CardNumber" type="string" column="Order_CardNumber"/> + <result property="Street" type="string" column="Order_Street"/> + <result property="City" type="string" column="Order_City"/> + <result property="Province" type="string" column="Order_Province"/> + <result property="PostalCode" type="string" column="Order_PostalCode"/> + </resultMap> + + <resultMap id="lite-order-result-by-name" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + </resultMap> + + <resultMap id="order-hash" class="array"> + <result property="Date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + </resultMap> + + <resultMap id="order-with-types-result" class="Order"> + <result property="Id" column="Order_Id" /> + <result property="Date" column="Order_Date" type="date" /> + <result property="CardExpiry" column="Order_CardExpiry" /> + <result property="CardType" column="Order_CardType" /> + <result property="CardNumber" column="Order_CardNumber" /> + <result property="Street" column="Order_Street" /> + <result property="City" column="Order_City" /> + <result property="Province" column="Order_Province" /> + <result property="PostalCode" column="Order_PostalCode" /> + </resultMap> + + <resultMap id="lite-order-result-by-index" class="Order"> + <result property="Id" column="Order_Id" columnIndex="0"/> + <result property="Date" column="Order_Date" type="date" columnIndex="1" /> + <result property="CardExpiry" column="Order_CardExpiry" columnIndex="2"/> + <result property="CardType" column="Order_CardType" columnIndex="3" /> + <result property="CardNumber" column="Order_CardNumber" columnIndex="4" /> + <result property="Street" column="Order_Street" columnIndex="5" /> + <result property="City" column="Order_City" columnIndex="6" /> + <result property="Province" column="Order_Province" columnIndex="7"/> + <result property="PostalCode" column="Order_PostalCode" columnIndex="8" /> + </resultMap> + + <resultMap id="order-with-account-result" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="Account" column="Account_Id" select="GetAccountViaColumnName" /> + </resultMap> + + <resultMap id="order-with-collection-result" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="LineItemsList" column="Order_Id" select="GetLineItemsForOrder" /> + <result property="LineItems" column="Order_Id" select="GetLineItemsForOrder" lazyLoad="false" /> + </resultMap> + + <resultMap id="order-with-favourite-line-item" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" + column="Order_ID=Order_Id,LineItem_ID=Order_FavouriteLineItem" + select="GetSpecificLineItem" /> + </resultMap> + + <resultMap id="order-with-dyn-favourite-line-item" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" + column="Order_ID=Order_Id,LineItem_ID=Order_FavouriteLineItem" + select="GetDynSpecificLineItem" /> + </resultMap> + + <resultMap id="order-joined-favourite" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" resultMapping="LineItem" /> + </resultMap> + + <resultMap id="order-joined-favourite2" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem.Id" column="LineItem_Id"/> + <result property="FavouriteLineItem.Code" column="LineItem_Code"/> + <result property="FavouriteLineItem.Quantity" column="LineItem_Quantity"/> + <result property="FavouriteLineItem.Price" column="LineItem_Price"/> + </resultMap> + + <resultMap id="order-joined-with-account" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="Account" resultMapping="account-result-nullable-email" /> + </resultMap> + + <statement id="GetOrderLiteByColumnName" + parameterClass="integer" + resultMap="lite-order-result-by-name" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderByHashTable" + parameterClass="Int" + resultMap="order-hash" > + select Order_Date from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderLiteByColumnIndex" + parameterClass="Int" + resultMap="lite-order-result-by-index" > + select + Order_Id, + Order_Date, + Order_CardExpiry, + Order_CardType, + Order_CardNumber, + Order_Street, + Order_City, + Order_Province, + Order_PostalCode + from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithTypes" + parameterClass="Int" + resultMap="order-with-types-result" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItems" + parameterClass="Integer" + ListClass="TList" + resultMap="order-with-lines-result" > + select * from Orders where Order_Id = #value# + </statement> + + + <statement id="GetOrderWithLineItemsNoLazyLoad" + parameterClass="Integer" + resultMap="order-with-lines-result-no-lazy-load" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemsUsingStatementNamespaces" + parameterClass="Integer" + resultMap="order-with-lines-result-statement-namespaces" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetAllOrderWithLineItems" + resultMap="order-with-lines-result" > + select * from Orders + </statement> + + <statement id="GetOrderCardExpiryViaResultClass" + parameterClass="int" + resultClass="date"> + select + Order_Date as 'datetime' + from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithAccount" + parameterClass="int" + resultMap="order-with-account-result" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemsCollection" + parameterClass="Integer" + resultMap="order-with-collection-result" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderJoinedFavourite" + parameterClass="Integer" + resultMap="order-joined-favourite" > + select * from Orders, LineItems + where Orders.Order_Id = LineItems.Order_Id + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_Id = #value# + </statement> + + <statement id="GetOrderJoinedFavourite2" + parameterClass="Integer" + resultMap="order-joined-favourite2" > + select * from Orders, LineItems + where Orders.Order_Id = LineItems.Order_Id + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_Id = #value# + </statement> + + <statement id="GetOrderJoinedFavourite3" + parameterClass="Integer" + resultClass="Order" > + select + Orders.Order_Id as Id, + Order_Date as Date, + Order_CardExpiry as CardExpiry, + Order_CardType as CardType, + Order_CardNumber as CardNumber, + Order_Street as Street, + Order_City as City, + Order_Province as Province, + Order_PostalCode as PostalCode, + LineItem_ID as "FavouriteLineItem.Id", + LineItem_Code as "FavouriteLineItem.Code", + LineItem_Quantity as "FavouriteLineItem.Quantity", + LineItem_Price as "FavouriteLineItem.Price" + from Orders, LineItems + where Orders.Order_Id = LineItems.Order_Id + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_Id = #value# + </statement> + + <statement id="GetOrderWithFavouriteLineItem" + parameterClass="int" + resultMap="order-with-favourite-line-item" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemCollection" + parameterClass="int" + resultMap="order-with-lines-collection" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemCollectionNoLazy" + parameterClass="int" + resultMap="order-with-lines-collection-no-lazy-load" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderAsHastable" + parameterClass="Integer" + resultMap="lite-order-map-result" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemArray" + parameterClass="int" + resultMap="order-with-lines-array"> + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetAllCreditCardNumbersFromOrders" + resultMap="credit-card-result" > + select distinct Order_CardNumber from Orders + order by Order_CardNumber + </statement> + + <statement id="InsertOrderViaParameterMap" + parameterMap="order-insert-params-full" > + insert into Orders + (Order_Id, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + </statement> + + <statement id="InsertOrderViaExtendParameterMap" + parameterMap="insert-extend" > + insert into Orders + (Order_Id, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + </statement> + + <statement id="InsertOrderViaPublicFields"> + insert into Orders + (Order_Id, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#) + </statement> + + <select id="GetOrderWithDynFavouriteLineItem" + parameterClass="Integer" + resultMap="order-with-dyn-favourite-line-item"> + select * from Orders where Order_Id = #value# + </select> + + <select id="SelectOrderByDate" + parameterClass="array" + resultMap="lite-order-result-by-name"> + select * from Orders where Order_Date = #Foo# + </select> + + <select id="SelectOrderByDateDynamic" + parameterClass="array" + resultMap="lite-order-result-by-name"> + select * from Orders + where 1=1 + <isNotEmpty prepend="AND" property="Foo"> + (Order_Date = '$Foo$') + </isNotEmpty> + </select> + + <select id="GetAccountJIRA45" + parameterClass="int" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_ID = #value# + </select> + + <select id="GetOrderJoinWithAccount" + parameterClass="Integer" + resultMap="order-joined-with-account"> + select + Order_Id, + Order_Date, + Order_CardExpiry, + Order_CardType, + Order_CardNumber, + Order_Street, + Order_City, + Order_Province, + Order_PostalCode, + acc.Account_ID, + acc.Account_FirstName, + acc.Account_LastName, + acc.Account_Email + from Orders as ord + LEFT OUTER JOIN Accounts as acc on acc.Account_ID = ord.Account_ID + where Order_Id = #value# + </select> + + <parameterMap id="order-insert-params-full"> + <parameter property="Id" dbType="Int32"/> + <parameter property="Account.Id"/> + <parameter property="Date" nullValue="0001-01-01 00:00:00" /> + <parameter property="CardExpiry" /> + <parameter property="CardType" /> + <parameter property="CardNumber" /> + <parameter property="Street" /> + <parameter property="City" /> + <parameter property="Province" /> + <parameter property="PostalCode" /> + </parameterMap> + + <parameterMap id="params-parent"> <!-- 1043181 support request --> + <parameter property="Id" dbType="Int32"/> + <parameter property="Account.Id"/> + <parameter property="Date" nullValue="0001-01-01 00:00:00" /> + <parameter property="CardExpiry" /> + <parameter property="CardType" /> + <parameter property="CardNumber" /> + <parameter property="Street" /> + <parameter property="City" /> + <parameter property="Province" /> + <parameter property="PostalCode" /> + </parameterMap> + + <parameterMap id="insert-extend" extends="params-parent"> + </parameterMap> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/MySql/Other.xml b/tests/unit/Data/SqlMap/maps/MySql/Other.xml new file mode 100644 index 00000000..67862029 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/Other.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Other" > + + <resultMap id="other-result" class="Other" > + <result property="Int" column="Other_Int"/> + <result property="Long" column="Other_Long"/> + <result property="Bool" column="Other_Bit"/> + <result property="Bool2" column="Other_String" typeHandler="OuiNonBool"/> + </resultMap> + + <resultMap id="other-result-V1" class="Other" > + <result property="Int" column="Other_Int"/> + <result property="Long" column="Other_Long"/> + <result property="Bool" column="Other_Bit"/> + <result property="Bool2" column="Other_String" /> + </resultMap> + + <resultMap id="A-result" class="A" > + <result property="Id" column="A_ID"/> + <result property="Libelle" column="A_Libelle"/> + <result property="B" resultMapping="B-result"/> + <result property="E" resultMapping="E-result"/> + <result property="F" resultMapping="F-result"/> + </resultMap> + + <resultMap id="B-result" class="B" > + <result property="Id" column="B_ID"/> + <result property="Libelle" column="B_Libelle"/> + <result property="C" resultMapping="C-result"/> + <result property="D" resultMapping="D-result"/> + </resultMap> + + <resultMap id="C-result" class="C" > + <result property="Id" column="C_ID"/> + <result property="Libelle" column="C_Libelle"/> + </resultMap> + + <resultMap id="D-result" class="D" > + <result property="Id" column="D_ID"/> + <result property="Libelle" column="D_Libelle"/> + </resultMap> + + <resultMap id="E-result" class="E" > + <result property="Id" column="E_ID"/> + <result property="Libelle" column="E_Libelle"/> + </resultMap> + + <resultMap id="F-result" class="F" > + <result property="Id" column="F_ID"/> + <result property="Libelle" column="F_Libelle"/> + </resultMap> + + <select id="SelectComplexJoined" resultMap="A-result"> + SELECT + A.Id AS A_ID, + A.A_Libelle AS A_Libelle, + B.ID AS B_ID, + B.B_Libelle AS B_Libelle, + C.ID AS C_ID, + C.C_Libelle AS C_Libelle, + D.ID AS D_ID, + D.D_Libelle AS D_Libelle, + E.ID AS E_ID, + E.E_Libelle AS E_Libelle, + F.ID AS F_ID, + F.F_Libelle AS F_Libelle + FROM A + LEFT OUTER JOIN B ON A.B_ID = B.ID + LEFT OUTER JOIN C ON B.C_ID = C.ID + LEFT OUTER JOIN D ON B.D_ID = D.ID + LEFT OUTER JOIN E ON A.E_ID = E.ID + LEFT OUTER JOIN F ON A.F_ID = F.ID + </select> + + + <statement id="DynamicSelectByIntLong" + parameterClass="Hashtable" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + <dynamic prepend="WHERE"> + <isNotEqual prepend="AND" property="year" compareValue="0"> + Other_Int = #year# + </isNotEqual> + + <isNotEqual prepend="AND" property="areaid" compareValue="0"> + Other_Long = #areaid# + </isNotEqual> + </dynamic> + </statement> + + <statement id="DynamicSelectByBool" + parameterClass="Other" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Bit = #Bool# + </statement> + + <statement id="InsertBool" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, 'Yes') + </statement> + + <statement id="InsertCustomTypeHandler" + parameterMap="other-insert-params"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( ?, ?, ?, ?) + </statement> + + <statement id="SelectByInt" + parameterClass="int" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Int = #value# + </statement> + + <statement id="SelectByIntV1" + parameterClass="int" + resultMap="other-result-V1"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Int = #value# + </statement> + + <statement id="InsertInlineCustomTypeHandlerV1" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#) + </statement> + + <statement id="InsertInlineCustomTypeHandlerV2" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, #Bool2,typeHandler=OuiNonBool#) + </statement> + + <parameterMap id="other-insert-params"> + <parameter property="Int" /> + <parameter property="Long" /> + <parameter property="Bool" /> + <parameter property="Bool2" typeHandler="OuiNonBool"/> + </parameterMap> +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/MySql/ResultClass.xml b/tests/unit/Data/SqlMap/maps/MySql/ResultClass.xml new file mode 100644 index 00000000..3f82ac5f --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/MySql/ResultClass.xml @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="ResultClass" > + + <statement id="GetBoolean" + parameterClass="Int" + resultClass="bool" > + select 1 from Orders where Order_ID = #dummy# + </statement> + <statement id="GetBooleanWithoutResultClass" + parameterClass="Int" + extends="GetBoolean"> + </statement> + + <statement id="GetByte" + parameterClass="Int" + resultClass="string" > + select 155 from Orders where Order_ID = #value# + </statement> + <statement id="GetByteWithoutResultClass" + parameterClass="Int" + extends="GetByte"> + </statement> + + <!-- + NOTE: Use MySql 4.0.2 or higher for "cast" + --> + <statement id="GetChar" + parameterClass="Int" + resultClass="string" > + select cast('a' as char) from Orders where Order_ID = #value# + </statement> + <statement id="GetCharWithoutResultClass" + parameterClass="Int" + extends="GetChar"> + </statement> + + <statement id="GetDate" + parameterClass="Int" + resultClass="TDateTime" > + select '2003-02-15 8:15:00' as datetime from Orders where Order_ID = #value# + </statement> + <statement id="GetDateWithoutResultClass" + parameterClass="Int" + extends="GetDate"> + </statement> + + <statement id="GetDecimal" + parameterClass="Int" + resultClass="float" > + select 1.56 from Orders where Order_ID = #value# + </statement> + <statement id="GetDecimalWithoutResultClass" + parameterClass="Int" + extends="GetDecimal"> + </statement> + + <statement id="GetDouble" + parameterClass="Int" + resultClass="float" > + select 99.5 from Orders where Order_ID= #value# + </statement> + <statement id="GetDoubleWithoutResultClass" + parameterClass="Int" + extends="GetDouble"> + </statement> + + <!-- + Use binary for cast for MySql + --> + <statement id="GetGuid" + parameterClass="Int" + resultClass="guid" > + select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as binary) from Orders where Order_ID = #value# + </statement> + <statement id="GetGuidWithoutResultClass" parameterClass="Int" extends="GetGuid"> + </statement> + + <statement id="GetInt16" + parameterClass="Int" + resultClass="int" > + select 32111 from Orders where Order_ID = #value# + </statement> + <statement id="GetInt16WithoutResultClass" + parameterClass="Int" + extends="GetInt16"> + </statement> + + <statement id="GetInt32" + parameterClass="Int" + resultClass="int" > + select 999999 from Orders where Order_ID = #value# + </statement> + <statement id="GetInt32WithoutResultClass" + parameterClass="Int" + extends="GetInt32"> + </statement> + + <statement id="GetInt64" + parameterClass="Int" + resultClass="double" > + select 9223372036854775800 from Orders where Order_ID = #value# + </statement> + <statement id="GetInt64WithoutResultClass" + parameterClass="Int" + extends="GetInt64"> + </statement> + + <statement id="GetSingle" + parameterClass="Int" + resultClass="float" > + select 92233.5 from Orders where Order_ID = #value# + </statement> + <statement id="GetSingleWithoutResultClass" + parameterClass="Int" + extends="GetSingle"> + </statement> + + <statement id="GetString" + parameterClass="Int" + resultClass="string" > + select 'VISA' + from Orders where Order_ID = #value# + </statement> + <statement id="GetStringWithoutResultClass" + parameterClass="Int" + extends="GetString"> + </statement> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/mssql/Account.xml b/tests/unit/Data/SqlMap/maps/mssql/Account.xml new file mode 100644 index 00000000..8149d228 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/Account.xml @@ -0,0 +1,606 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="Account"> + + + <cacheModel id="account-cache" implementation="LRU" > + <flushInterval hours="24"/> + <flushOnExecute statement="UpdateAccountViaInlineParameters"/> + <flushOnExecute statement="UpdateAccountViaParameterMap"/> + <property id="CacheSize" value="50"/> + </cacheModel> + + + <resultMap id="account-result" class="Account" > + <result property="Id" column="Account_ID"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email" nullValue="no_email@provided.com"/> + <result property="BannerOptions" column="Account_Banner_Option" dbType="Varchar" typeHandler="OuiNonBool"/> + <result property="CartOptions" column="Account_Cart_Option" typeHandler="HundredsBool"/> + </resultMap> + <resultMap id="indexed-account-result" class="Account"> + <result property="Id" column="Account_ID" columnIndex="0"/> + <result property="FirstName" column="Account_FirstName" columnIndex="1"/> + <result property="LastName" column="Account_LastName" columnIndex="2"/> + <result property="EmailAddress" column="Account_Email" columnIndex="3" nullValue="no_email@provided.com"/> + </resultMap> + <resultMap id="account-result-nullable-email" class="Account"> + <result property="Id" column="Account_ID"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email"/> + </resultMap> + + <resultMap id="email-result" class="string"> + <result property="value" column="Account_Email"/> + </resultMap> + + <resultMap id="account-hashtable-result" class="array"> + <result property="Id" column="Account_ID"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email"/> + </resultMap> + + +<!-- ============================================= + MAPPED STATEMENTS - w/Inline Parameters +============================================= +--> + + <select id="GetAllAccountsAsArrayListViaResultClass" resultClass="TList"> + select + Account_ID as ID, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_ID + </select> + + <select id="GetAccountsDynamic" resultMap="account-result" parameterClass="array" > + select top $MaximumAllowed$ * from Accounts + <dynamic prepend="where"> + <isParameterPresent> + <isNotEmpty prepend="and" property="FirstName" > + Account_FirstName LIKE '%$FirstName$%' + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName LIKE '%$LastName$%' + </isNotEmpty> + <isNotEmpty prepend="and" property="EmailAddress" > + Account_Email LIKE '%$EmailAddress$%' + </isNotEmpty> + </isParameterPresent> + </dynamic> + order by Account_LastName + </select> + + <select id="SelectWithProperty" + resultMap="account-result"> + select * + from Accounts + where Account_FirstName = ${accountName} + </select> + + <select id="GetCachedAccountsViaResultMap" + resultMap="account-result" + cacheModel="account-cache" > + select * + from Accounts + order by Account_ID + </select> + + <select id="GetNoAccountWithCache" + parameterClass="Integer" + resultMap="account-hashtable-result" + cacheModel="account-cache"> + select * + from Accounts + where Account_ID = #value# + </select> + + <select id="GetAccountAsarray" + parameterClass="Integer" + resultMap="account-hashtable-result"> + select * + from Accounts + where Account_ID = #value# + </select> + + <select id="GetAllAccountsAsHashMapViaResultMap" + resultMap="account-hashtable-result"> + select * + from Accounts + order by Account_ID + </select> + + <select id="GetAccountAsarrayResultClass" + parameterClass="int" + resultClass="HashMap"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_ID = #value# + </select> + + <select id="GetAllAccountsAsarrayViaResultClass" + resultClass="array"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_ID + </select> + + <select id="GetAccountViaColumnName" + parameterClass="int" + resultMap="account-result"> + select + Account_ID, + Account_FirstName, + Account_LastName, + Account_Email, + Account_Banner_Option, + Account_Cart_Option + from Accounts + where Account_ID = #value# + </select> + + <select id="GetAccountViaColumnIndex" + parameterClass="int" + resultMap="indexed-account-result"> + select + Account_ID, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_ID = #value# + </select> + + <select id="GetAllAccountsViaResultMap" + resultMap="account-result"> + select * from Accounts + order by Account_ID + </select> + + <select id="GetAllAccountsViaResultClass" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_ID + </select> + + <select id="GetFewAccountsViaResultMap" + resultMap="account-result"> + <![CDATA[ + select * from Accounts + where Account_ID < 2 + order by Account_ID + ]]> + </select> + + <select id="GetNoAccountsViaResultMap" + resultMap="account-result"> + select * from Accounts + where Account_ID > 1000 + order by Account_ID + </select> + + + <select id="GetAccountNullableEmail" + resultMap="account-result-nullable-email"> + select + Account_ID, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_ID = #value# + </select> + + <select id="GetAccountViaResultClass" + resultClass="Account"> + <![CDATA[ + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_ID = #value# + ]]> + </select> + + <select id="GetAccountViaInlineParameters" + resultMap="indexed-account-result"> + select + Account_ID, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_ID = #Id# and Account_ID = #Id# + </select> + + <select id="GetEmailAddressViaResultClass" resultClass="string"> + select Account_Email as value + from Accounts + where Account_ID = #value# + </select> + + <select id="GetEmailAddressViaResultMap" + parameterClass="int" + resultMap="email-result"> + select Account_Email + from Accounts + where Account_ID = #value# + </select> + + <select id="GetAllEmailAddressesViaResultClass" + resultClass="string"> + select Account_Email + from Accounts + order by Account_ID + </select> + + <select id="GetAllEmailAddressesViaResultMap" + resultMap="email-result"> + select Account_Email + from Accounts + order by Account_ID + </select> + + <insert id="InsertAccountViaParameterMap" + parameterMap="account-insert-params"> + insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) + values + (?, ?, ?, ?, ?, ?) + </insert> + + <update id="UpdateAccountViaParameterMap" + parameterMap="update-params"> + update Accounts set + Account_FirstName = ?, + Account_LastName = ?, + Account_Email = ? + where + Account_ID = ? + </update> + + <update id="UpdateAccountViaParameterMap2" + parameterMap="update-params2"> + update Accounts set + Account_ID = ?, + Account_FirstName = ?, + Account_LastName = ?, + Account_Email = ? + where + Account_ID = ? + </update> + + <delete id="DeleteAccountViaInlineParameters"> + delete from Accounts + where + Account_ID = #Id# + </delete> + + <select id="GetAccountComplexMapping" + resultMap="indexed-account-result" + parameterClass="array"> + select * + from Accounts + where + Account_FirstName = #Account.FirstName# + And Account_LastName = #Order.City# + </select> + + <select id="GetDynamicOrderedEmailAddressesViaResultMap" + resultMap="email-result"> + select Account_Email + from Accounts + order by $value$ + </select> + + <!-- Dynamic statements --> + <select id="GetAllAccountsViaResultMapWithDynamicElement" + resultMap="indexed-account-result"> + select * from Accounts + where Account_Email $value$ '%@%' + order by Account_ID + </select> + + <select id="SimpleDynamicSubstitution" + parameterClass="array" + resultClass="Account"> + $statement$ + </select> + + <!-- Public Fields --> + <insert id="InsertAccountViaPublicFields"> + insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email) + values + (#Id#, #FirstName#, #LastName#, #EmailAddress# + ) + </insert> + + <!-- Inline Parameters --> + <update id="UpdateAccountViaInlineParameters" + parameterClass="Account"> + update Accounts set + Account_FirstName = #FirstName#, + Account_LastName = #LastName#, + Account_Email = #EmailAddress, nullValue=no_email@provided.com# + where + Account_ID = #Id# + </update> + + <insert id="InsertAccountViaInlineParameters" + parameterClass="Account" > + insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email) + values + (#Id#, #FirstName#, #LastName#, #EmailAddress, nullValue=no_email@provided.com# + ) + </insert> + + <insert id="InsertAccountNullableEmail" + parameterClass="Account" > + insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email) + values + ( #Id#, #FirstName#, #LastName#, #EmailAddress, dbType=VarChar# ) + </insert> + + <insert id="InsertAccountUknownParameterClass"> + insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email) + values + ( #Id#, #FirstName#, #LastName#, #EmailAddress, dbType=VarChar# ) + </insert> + + <delete id="DeleteAccount" parameterClass="Account"> + delete from Accounts + where Account_ID = #Id, type=integer# + and Account_ID = #Id, type=integer# + </delete> + + <!-- Extends statement --> + <select id="GetAllAccounts" + resultMap="indexed-account-result"> + select + Account_ID, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + </select> + + <select id="GetAllAccountsOrderByName" + extends="GetAllAccounts" + resultMap="indexed-account-result"> + order by Account_FirstName + </select> + + <select id="GetOneAccount" + extends="GetAllAccounts" + resultMap="indexed-account-result"> + where Account_ID = #value# + </select> + + <select id="GetSomeAccount" + extends="GetAllAccounts" + parameterClass="array" + resultMap="indexed-account-result"> + where Account_ID between #lowID# and #hightID# + </select> + + <select id="SelectAccountJIRA29" parameterClass="map" resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_FirstName = '##$AccountName$##' + </select> + + <select id="SelectAccountJIRA29-2" + parameterClass="array" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where 1=1 + <isNotEmpty prepend="AND" property="Foo"> + (Account_FirstName = '##$Foo$##') + </isNotEmpty> + </select> + + <select id="GetAccountWithRepeatingProperty" + parameterClass="Account" + resultMap="indexed-account-result"> + select + Account_ID, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_ID = #Id# and + Account_ID = #Id# and + Account_FirstName = #FirstName# and + Account_LastName = #LastName# and + Account_ID = #Id# + </select> + + <select id="GetAllAccountsViaCustomTypeHandler" + resultMap="account-result"> + select * from Accounts + order by Account_ID + </select> + + <!-- JIRA-110 --> + <select id="GetManyAccound" resultClass="Account"> + <![CDATA[ + SELECT + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + FROM Accounts + ]]> + </select> + + <select id="Get1Account" extends="GetManyAccound" resultClass="Account">WHERE Account_ID=1</select> + + <statement id="GetAccounts" resultMap="account-result"> + <![CDATA[SELECT * ]]> + <![CDATA[FROM ]]> + Accounts + </statement> + <!-- JIRA-110 --> + + <insert id="InsertAccountDynamic" parameterClass="Account"> + INSERT INTO Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email) + VALUES(#Id#, #FirstName#, #LastName# + <dynamic prepend=","> + <isNotNull prepend="," property="EmailAddress"> + #EmailAddress# + </isNotNull> + <isNull prepend="," property="EmailAddress"> + null + </isNull> + </dynamic> + ) + </insert> + + <!-- For procedure, the parameters of the parameterMap must in the same order + as for the procedure paramaters--> + <procedure id="InsertAccountViaStoreProcedure" parameterMap="account-insert-params"> + ps_InsertAccount + </procedure> + + <procedure id="SwapEmailAddresses" parameterMap="swap-params"> + ps_swap_email_address + </procedure> + + <procedure id="GetAccountViaSP" parameterMap="select-params" resultClass="Account"> + ps_SelectAccount + </procedure> + +<!-- ============================================= + OPTIONAL EXPLICIT PARAMETER MAP +============================================= --> + + <parameterMap id="swap-params"> + <parameter property="email1" column="First_Email" /> + <parameter property="email2" column="Second_Email" /> + </parameterMap> + + <parameterMap id="select-params"> + <parameter property="Account_ID" /> + </parameterMap> + + <parameterMap id="account-insert-params"> + <parameter property="Id" /> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="BannerOptions" dbType="Varchar" type="bool"/> + <parameter property="CartOptions" column="Account_Cart_Option" typeHandler="HundredsBool"/> + </parameterMap> + + <parameterMap id="update-params"> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="Id" /> + </parameterMap> + + <parameterMap id="update-params2"> + <parameter property="Id" /> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="Id" /> + </parameterMap> + + + <!-- accounts and orders --> + + <select id="getAccountWithOrders" resultMap="Account-with-Orders"> + SELECT * FROM accounts + LEFT JOIN orders ON + accounts.account_id = orders.account_id + </select> + + <resultMap id="Account-with-Orders" class="AccountWithOrders" groupBy="Account_ID"> + <result property="Id" column="Account_ID"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email" /> + <result property="Orders" resultMapping="account-orders" /> + </resultMap> + + <resultMap id="account-orders" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + </resultMap> + + <select id="GetAccountAsHashtable" + parameterClass="Integer" + resultMap="account-hashtable-result"> + select * + from Accounts + where Account_Id = #value# + </select> + + + <select id="GetAccountAsHashtableResultClass" + parameterClass="int" + resultClass="array"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllAccountsAsHashtableViaResultClass" + resultClass="array"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_Id + </select> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/mssql/Category.xml b/tests/unit/Data/SqlMap/maps/mssql/Category.xml new file mode 100644 index 00000000..6756f1fa --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/Category.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Category" > + + + <select id="GetCategory" parameterClass="Integer" resultClass="Category"> + select + Category_ID as Id, + Category_Name as Name, + Category_Guid as Guid + from Categories + where Category_ID = #value# + </select> + + + <!-- Test for statement as insert --> + <statement id="InsertCategory" parameterClass="Category" resultClass="int"> + insert into Categories + (Category_Name, Category_Guid) + values + (#Name#, #Guid:UniqueIdentifier#); + select SCOPE_IDENTITY() as value + </statement><!--Guid for Oledb, UniqueIdentifier for SqlClient,Odbc --> + + <!-- Test for Guid Parameter Class--> + <statement id="InsertCategoryGuidParameterClass" parameterClass="Guid" resultClass="int"> + insert into Categories + (Category_Name, Category_Guid) + values + ('toto', #value:UniqueIdentifier#); + select SCOPE_IDENTITY() as value + </statement><!--Guid for Oledb, UniqueIdentifier for SqlClient,Odbc --> + + <!-- JIRA 20 Test without specifying the dbtype--> + <statement id="InsertCategoryGuidParameterClassJIRA20" parameterClass="Guid" resultClass="int"> + insert into Categories + (Category_Name, Category_Guid) + values + ('toto', #value#); + select SCOPE_IDENTITY() as value + </statement> + + <insert id="InsertCategoryViaInsertStatement" parameterClass="Category" > + <selectKey property="Id" type="post" resultClass="int"> + ${selectKey} + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (#Name#, #Guid:UniqueIdentifier#) + </insert><!--Guid for Oledb, UniqueIdentifier for SqlClient, Odbc --> + + <insert id="InsertCategoryWithProperties" parameterClass="Category" > + <selectKey property="Id" type="post" resultClass="int"> + ${selectKey} + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (${MyCategoryName}, #Guid:UniqueIdentifier#) + </insert> + + <statement id="InsertCategoryViaParameterMap" parameterMap="InsertParam" resultClass="int"> + insert into Categories + (Category_Name, Category_Guid) + values + (?,?); + select SCOPE_IDENTITY() as value + </statement> + + <statement id="InsertCategoryNull" parameterMap="insert-null-params" resultClass="int"> + insert into Categories + (Category_Name, Category_Guid) + values + (?,?); + select SCOPE_IDENTITY() as value + </statement> + + <update id="UpdateCategoryViaParameterMap" parameterMap="UpdateParam"> + update Categories set + Category_Name =?, + Category_Guid = ? + where + Category_Id = ? + </update> + + <procedure id="InsertCategoryViaStoreProcedure" parameterMap="category-insert-params"> + ps_InsertCategorie + </procedure> + + <insert id="InsertCategoryGenerate" parameterMap="insert-generate-params"> + <selectKey property="Id" type="post" resultClass="int"> + select @@IDENTITY as value + </selectKey> + <generate table="Categories" /> + </insert> + + <update id="UpdateCategoryGenerate" parameterMap="update-generate-params"> + <generate table="Categories" by="Category_Id"/> + </update> + + <delete id="DeleteCategoryGenerate" parameterMap="delete-generate-params"> + <generate table="Categories" by="Category_Id, Category_Name"/> + </delete> + + <select id="SelectByPKCategoryGenerate" resultClass="Category" parameterClass="Category" parameterMap="select-generate-params"> + <generate table="Categories" by="Category_Id"/> + </select> + + <select id="SelectAllCategoryGenerate" resultClass="Category" parameterMap="select-generate-params"> + <generate table="Categories" /> + </select> + + <statement id="DynamicGuid" + resultClass="Category" + parameterClass="Category"> + select + Category_ID as Id, + Category_Name as Name, + Category_Guid as Guid + from Categories + <dynamic prepend="where"> + <isNotEqual prepend="and" property="Guid" compareProperty="EmptyGuid"> + Category_Guid=#Guid:UniqueIdentifier# + </isNotEqual> + </dynamic> + </statement> + + <parameterMap id="category-insert-params"> + <parameter property="Id" column="Category_Id" dbType="Int" /><!-- Int for SqlClient, Obdc; Integer for Oledb --> + <parameter property="Name" column="Category_Name"/> + <parameter property="Guid" column="Category_Guid" dbType="UniqueIdentifier"/><!--Guid for Oledb, UniqueIdentifier for SqlClient,Odbc --> + </parameterMap> + + <parameterMap id="InsertParam"> + <parameter property="Name" column="Category_Name"/> + <parameter property="Guid" column="Category_Guid" dbType="UniqueIdentifier"/><!--Guid for Oledb, UniqueIdentifier for SqlClient,Odbc --> + </parameterMap> + + <parameterMap id="insert-null-params"> + <parameter property="Name" column="Category_Name"/> + <parameter property="Guid" column="Category_Guid" nullValue="00000000-0000-0000-0000-000000000000" dbType="UniqueIdentifier"/><!--Guid for Oledb, UniqueIdentifier for SqlClient,Odbc --> + </parameterMap> + + <parameterMap id="UpdateParam" extends="InsertParam"> + <parameter property="Id" column="Category_Id" /> + </parameterMap> + + <!-- Used by generated statement --> + + <parameterMap id="insert-generate-params"> + <parameter property="Name" column="Category_Name"/> + <parameter property="Guid" column="Category_Guid" dbType="UniqueIdentifier"/><!--Guid for Oledb, UniqueIdentifier for SqlClient,Odbc --> + </parameterMap> + + <parameterMap id="update-generate-params" extends="insert-generate-params"> + <parameter property="Id" column="Category_Id" /> + </parameterMap> + + <parameterMap id="delete-generate-params"> + <parameter property="Id" column="Category_Id" /> + <parameter property="Name" column="Category_Name"/> + </parameterMap> + + <parameterMap id="select-generate-params"> + <parameter property="Id" column="Category_Id" /> + <parameter property="Name" column="Category_Name"/> + <parameter property="Guid" column="Category_Guid" dbType="UniqueIdentifier"/> + </parameterMap> + + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/mssql/Complex.xml b/tests/unit/Data/SqlMap/maps/mssql/Complex.xml new file mode 100644 index 00000000..91b346ca --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/Complex.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Category" > + + + <statement id="ComplexMap" + resultClass="int" > + select Account_ID from Accounts where Account_ID = #obj.Map.Id# + </statement> + + <insert id="InsertComplexAccountViaInlineDefaultNull" + parameterClass="array" > + insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email) + values + (#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:VarChar:no_email@provided.com# + ) + </insert> + + + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/mssql/Document.xml b/tests/unit/Data/SqlMap/maps/mssql/Document.xml new file mode 100644 index 00000000..de02c1ab --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/Document.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Document" > + + <resultMap id="document" class="Document"> + <result property="Id" column="Document_ID"/> + <result property="Title" column="Document_Title"/> + <discriminator column="Document_Type" type="string"/> + <subMap value="Book" resultMapping="book" /> + <subMap value="Newspaper" resultMapping="newspaper" /> + </resultMap> + + <resultMap id="document-custom-handler" class="Document"> + <result property="Id" column="Document_ID"/> + <result property="Title" column="Document_Title"/> + <discriminator column="Document_Type" typeHandler="CustomInheritance"/> + <subMap value="Book" resultMapping="book" /> + <subMap value="Newspaper" resultMapping="newspaper" /> + </resultMap> + + <resultMap id="book" class="Book" extends="document"> + <result property="PageNumber" column="Document_PageNumber"/> + </resultMap> + + <resultMap id="newspaper" class="Newspaper" extends="document"> + <result property="City" column="Document_City"/> + </resultMap> + + <select id="GetAllDocument" + resultMap="document"> + select + * + from Documents + order by Document_Type, Document_ID + </select> + + <select id="GetTypedCollection" + listClass="DocumentCollection" + resultMap="document"> + select + * + from Documents + order by Document_Type, Document_ID + </select> + + <select id="GetAllDocumentWithCustomTypeHandler" + resultMap="document-custom-handler"> + select + * + from Documents + order by Document_Type, Document_ID + </select> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/mssql/DynamicAccount.xml b/tests/unit/Data/SqlMap/maps/mssql/DynamicAccount.xml new file mode 100644 index 00000000..492cd0c8 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/DynamicAccount.xml @@ -0,0 +1,438 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Account" > + <select id="DynamicAll" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + </select> + + <select id="DynamicWithExtend" + extends="DynamicAll" + parameterClass="Account" + resultClass="Account"> + <dynamic prepend="WHERE" > + <isGreaterThan prepend="AND" property="Id" compareValue="0" > + Account_ID = #Id# + </isGreaterThan> + <isNotNull prepend="AND" property="Ids" > + Account_ID in + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </isNotNull> + <isNotEmpty prepend="AND" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="EmailAddress" > + <isEqual property="EmailAddress" compareValue="Joe"> + Account_Email = 'clinton.begin@ibatis.com' + </isEqual> + <isNotEqual property="EmailAddress" compareValue="Joe"> + Account_Email = #EmailAddress# + </isNotEqual> + </isNotEmpty> + </dynamic> + </select> + + <!-- IBATISNET-114: remapResults --> + <statement id="DynamicSqlOnColumnSelection" + parameterClass="Account" + resultClass="Account" + remapResults="true"> + SELECT + Account_ID as Id, + <dynamic> + <isEqual property="LastName" compareValue="Dalton" > + Account_FirstName as FirstName, + </isEqual> + <isEqual property="LastName" compareValue="Dalton" > + Account_LastName as LastName, + </isEqual> + </dynamic> + + Account_Email as EmailAddress + FROM + Accounts + </statement> + + <statement id="DynamicIsEqual" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isEqual compareValue="Joe" > + where Account_FirstName = 'Joe' + </isEqual> + </statement> + + <statement id="DynamicIsParameterPresent" + parameterClass="integer" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isParameterPresent > + where Account_ID = #value# + </isParameterPresent> + </statement> + + <statement id="DynamicIsNotEmpty" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isNotEmpty> + where Account_FirstName = #value# + </isNotEmpty> + </statement> + + <statement id="DynamicIsGreater" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isGreaterThan compareValue="3" > + where Account_ID = 1 + </isGreaterThan> + </statement> + + <statement id="DynamicIsGreaterEqual" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isGreaterEqual compareValue="3" > + where Account_ID = 1 + </isGreaterEqual> + </statement> + + <statement id="DynamicIsLess" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isLessThan compareValue="3" > + where Account_ID = 1 + </isLessThan> + </statement> + + <statement id="DynamicIsLessEqual" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isLessEqual compareValue="3" > + where Account_ID = 1 + </isLessEqual> + </statement> + + <statement id="DynamicIsNotNull" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isNotNull> + where Account_ID = 1 + </isNotNull> + </statement> + + <statement id="DynamicIsPropertyAvailable" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isPropertyAvailable property="Id" > + where Account_ID = 1 + </isPropertyAvailable> + </statement> + + + <statement id="DynamicSubst" + parameterClass="map" + resultClass="Account"> + <dynamic> + $statement$ + </dynamic> + </statement> + + <statement id="DynamicIterate" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </statement> + + <statement id="DynamicIterate2" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </statement> + + <statement id="MultiDynamicIterate" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + and Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </statement> + + + <statement id="DynamicQueryByExample" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="WHERE" > + <isGreaterThan prepend="AND" property="Id" compareValue="0" > + Account_ID = #Id# + </isGreaterThan> + <isNotNull prepend="AND" property="Ids" > + Account_ID in + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </isNotNull> + <isNotEmpty prepend="AND" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="EmailAddress" > + <isEqual property="EmailAddress" compareValue="Joe"> + Account_Email = 'clinton.begin@ibatis.com' + </isEqual> + <isNotEqual property="EmailAddress" compareValue="Joe"> + Account_Email = #EmailAddress# + </isNotEqual> + </isNotEmpty> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend1" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend2" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + <iterate open="(" close=")" conjunction="OR"> + Account_ID = #[]# + </iterate> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend3" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + <isParameterPresent prepend="BLAH!" > + <iterate open="(" close=")" conjunction="OR"> + Account_ID = #[]# + </iterate> + </isParameterPresent> + </dynamic> + </statement> + + <statement id="DynamicWithPrepend" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isParameterPresent> + <isNotEmpty prepend="and" property="Id" > + Account_ID = #Id# + </isNotEmpty> + <isNotEmpty prepend="and" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + </isParameterPresent> + </dynamic> + </statement> + + <statement id="DynamicWithTwoDynamicElements" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isNotEmpty prepend="BLAH!" property="Id" > + Account_ID = #Id# + </isNotEmpty> + </dynamic> + <dynamic prepend="and"> + <isNotEmpty prepend="BLAH!" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + </dynamic> + </statement> + + <statement id="ComplexDynamicStatement" + cacheModel="account-cache" + resultClass="Account" + parameterClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="WHERE"> + <isNotNull prepend="AND" property="FirstName"> + (Account_FirstName = #FirstName# + <isNotNull prepend="OR" property="LastName"> + Account_LastName = #LastName# + </isNotNull> + ) + </isNotNull> + <isNotNull prepend="AND" property="EmailAddress"> + Account_Email like #EmailAddress# + </isNotNull> + <isGreaterThan prepend="AND" property="Id" compareValue="0"> + Account_ID = #Id# + </isGreaterThan> + </dynamic> + order by Account_LastName + </statement> + + <statement id="Jira-IBATISNET-11" + resultClass="Account" + parameterClass="Search"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isNotNull prepend="and" property="NumberSearch"> + ((Account_ID $Operande$ #NumberSearch#) or + (Account_ID $Operande$ #NumberSearch#)) + </isNotNull> + <isEqual prepend="and" property="StartDate" compareValue="25/12/2004"> + <![CDATA[Account_FirstName >= #StartDate# ]]> + </isEqual> + <isEqual prepend="and" property="StartDateAnd" compareValue="true"> + <![CDATA[Account_LastName >= #StartDate# ]]> + </isEqual> + </dynamic> + + order by Account_LastName + </statement> +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/mssql/Enumeration.xml b/tests/unit/Data/SqlMap/maps/mssql/Enumeration.xml new file mode 100644 index 00000000..c010a8eb --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/Enumeration.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Enumeration" > + + <resultMap id="enumeration-result" class="Enumeration" > + <result property="Id" column="Enum_ID"/> + <result property="Day" column="Enum_Day"/> + <result property="Color" column="Enum_Color"/> + <result property="Month" column="Enum_Month" nullValue="All"/> + </resultMap> + + <select id="GetEnumerationNullValue" + parameterClass="Integer" + resultMap="enumeration-result"> + select + Enum_ID, + Enum_Day, + Enum_Color, + Enum_Month + from Enumerations + where Enum_ID = #value# + </select> + + <select id="GetEnumeration" parameterClass="Integer" resultClass="Enumeration"> + select + Enum_ID as Id, + Enum_Day as Day, + Enum_Color as Color, + Enum_Month as Month + from Enumerations + where Enum_ID = #value# + </select> + + <insert id="InsertEnumViaParameterMap" parameterMap="enum-insert-params" > + insert into Enumerations + (Enum_ID, Enum_Day, Enum_Color, Enum_Month) + values + (?, ?, ?, ?) + </insert> + + <parameterMap id="enum-insert-params"> + <parameter property="Id" column="Enum_ID" /> + <parameter property="Day" column="Enum_Day"/> + <parameter property="Color" column="Enum_Color" /> + <parameter property="Month" column="Enum_Month" nullValue="All"/> + </parameterMap> + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/mssql/LineItem.xml b/tests/unit/Data/SqlMap/maps/mssql/LineItem.xml new file mode 100644 index 00000000..33cb9294 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/LineItem.xml @@ -0,0 +1,182 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="LineItem" > + + <resultMap id="LineItem-Price" class="decimal"> + <result property="value" column="LineItem_Price"/> + </resultMap> + + <resultMap id="LineItem" class="LineItem"> + <result property="Id" column="LineItem_ID"/> + <result property="Code" column="LineItem_Code"/> + <result property="Quantity" column="LineItem_Quantity"/> + <result property="Price" column="LineItem_Price"/> + </resultMap> + + <resultMap id="LineItemWithNullReplacement" class="LineItem"> + <result property="Id" column="LineItem_ID"/> + <result property="Code" column="LineItem_Code"/> + <result property="Quantity" column="LineItem_Quantity"/> + <result property="Price" column="LineItem_Price" nullValue="-77.77"/> + </resultMap> + + <statement id="GetLineItemPrice" + parameterClass="array" + resultMap="LineItem-Price" > + select + LineItem_Price + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <statement id="GetLineItemsForOrder" + parameterClass="int" + listClass="TList" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems where Order_ID = #value# + </statement> + + <statement id="GetLineItemsForOrderWithListClass" + parameterClass="int" + listClass="LineItemCollection" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems where Order_ID = #value# + order by LineItem_Code + </statement> + + <statement id="GetSpecificLineItem" + parameterClass="array" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <statement id="GetSpecificLineItemWithPicture" + parameterClass="array" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price, + LineItem_Picture as PictureData + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <select id="GetDynSpecificLineItem" + parameterClass="HashMap" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems + where Order_ID = #Order_ID# + <dynamic> + <isNotNull property="LineItem_ID"> + and LineItem_ID = #LineItem_ID# + </isNotNull> + </dynamic> + </select> + + <statement id="GetSpecificLineItemWithNullReplacement" + parameterClass="int" + resultMap="LineItemWithNullReplacement"> + select + LineItem_ID, + LineItem_Code, + LineItem_Quantity, + LineItem_Price + from LineItems + where LineItem_ID = #value# + </statement> + + <statement id="InsertLineItem" + parameterMap="lineitem-insert-params" > + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (?, ?, ?, ?, ?); + </statement> + + <statement id="InsertLineItemWithPicture" + parameterMap="lineitem-insert-params-picture" > + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) + values + (?, ?, ?, ?, ?, ?); + </statement> + + <insert id="InsertLineItemPostKey" parameterClass="LineItem"> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, dbType=Decimal#) + <selectKey property="Id" type="post" resultClass="int" > + select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 + </selectKey> + </insert> + + <insert id="InsertLineItemPreKey" parameterClass="LineItem"> + <selectKey property="Id" type="pre" resultClass="int" > + select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 + </selectKey> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, dbType=Decimal#) + </insert> + + <insert id="InsertLineItemNoKey" parameterClass="LineItem"> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, dbType=Decimal#) + </insert> + + <!-- JIRA 23 --> + <delete id="DeleteWithComments" > + <!-- Delete LineItems --> + delete from LineItems where Order_ID = 10 + <!-- Delete LineItems --> + delete from LineItems where Order_ID = 9 + </delete> + + <parameterMap id="lineitem-insert-params"> + <parameter property="Id" /> + <parameter property="Order.Id" /> + <parameter property="Code" /> + <parameter property="Quantity" /> + <parameter property="Price" dbType="Decimal" nullValue="-99.99"/> + </parameterMap> + + <parameterMap id="lineitem-insert-params-picture"> + <parameter property="Id" /> + <parameter property="Order.Id" /> + <parameter property="Code" /> + <parameter property="Quantity" /> + <parameter property="Price" dbType="Decimal" nullValue="-99.99"/> + <parameter property="PictureData" dbType="Binary" /><!-- or Image --> + </parameterMap> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/mssql/Order.xml b/tests/unit/Data/SqlMap/maps/mssql/Order.xml new file mode 100644 index 00000000..87a2d1a0 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/Order.xml @@ -0,0 +1,475 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="Order" > + + + <resultMap id="credit-card-result" class="string"> + <result property="value" column="Order_CardNumber"/> + </resultMap> + + <resultMap id="order-with-lines-result" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" lazyLoad="true" column="Order_ID" select="GetLineItemsForOrder" /> + </resultMap> + + <resultMap id="order-with-lines-result-statement-namespaces" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" lazyLoad="true" column="Order_ID" select="LineItem.GetLineItemsForOrder" /> + </resultMap> + + <resultMap id="order-with-lines-collection" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItems" column="Order_ID" select="GetLineItemsForOrderWithListClass" /> + </resultMap> + + <resultMap id="order-with-lines-array" class="Order" + extends="lite-order-result-by-name"> + <result property="LineItemsArray" column="Order_ID" select="GetLineItemsForOrder"/> + </resultMap> + + <resultMap id="lite-order-map-result" class="array"> + <result property="Id" type="Int" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" type="string" column="Order_CardExpiry"/> + <result property="CardType" type="string" column="Order_CardType"/> + <result property="CardNumber" type="string" column="Order_CardNumber"/> + <result property="Street" type="string" column="Order_Street"/> + <result property="City" type="string" column="Order_City"/> + <result property="Province" type="string" column="Order_Province"/> + <result property="PostalCode" type="string" column="Order_PostalCode"/> + </resultMap> + + <resultMap id="lite-order-result-by-name" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + </resultMap> + + <resultMap id="order-with-types-result" class="Order"> + <result property="Id" column="Order_ID" dbType="Int"/><!-- Int for SqlClient, Obdc; Integer for Oledb --> + <result property="Date" type="date" column="Order_Date" dbType="DateTime "/> + <result property="CardExpiry" column="Order_CardExpiry" dbType="VarChar"/> + <result property="CardType" column="Order_CardType" dbType="VarChar"/> + <result property="CardNumber" column="Order_CardNumber" dbType="VarChar"/> + <result property="Street" column="Order_Street" dbType="VarChar"/> + <result property="City" column="Order_City" dbType="VarChar"/> + <result property="Province" column="Order_Province" dbType="VarChar"/> + <result property="PostalCode" column="Order_PostalCode" dbType="VarChar"/> + </resultMap> + + <resultMap id="lite-order-result-by-index" class="Order"> + <result property="Id" column="Order_ID" columnIndex="0"/> + <result property="Date" type="date" column="Order_Date" columnIndex="1" /> + <result property="CardExpiry" column="Order_CardExpiry" columnIndex="2"/> + <result property="CardType" column="Order_CardType" columnIndex="3" /> + <result property="CardNumber" column="Order_CardNumber" columnIndex="4" /> + <result property="Street" column="Order_Street" columnIndex="5" /> + <result property="City" column="Order_City" columnIndex="6" /> + <result property="Province" column="Order_Province" columnIndex="7"/> + <result property="PostalCode" column="Order_PostalCode" columnIndex="8" /> + </resultMap> + + <resultMap id="order-with-account-result" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="Account" column="Account_ID" select="GetAccountViaColumnName" /> + </resultMap> + + <resultMap id="order-with-sp-account-result" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="Account" column="Account_ID=Account_ID" select="GetAccountViaSP" /> + </resultMap> + + <resultMap id="order-with-collection-result" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="LineItemsList" column="Order_ID" select="GetLineItemsForOrder" /> + <result property="LineItems" column="Order_ID" select="GetLineItemsForOrder" lazyLoad="false" /> + </resultMap> + + <resultMap id="order-with-favourite-line-item" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" column="Order_ID=Order_ID,LineItem_ID=Order_FavouriteLineItem" select="GetSpecificLineItem" /> + </resultMap> + + <resultMap id="order-with-dyn-favourite-line-item" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" + column="Order_ID=Order_ID,LineItem_ID=Order_FavouriteLineItem" + select="GetDynSpecificLineItem" /> + </resultMap> + <resultMap id="order-joined-favourite" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" resultMapping="LineItem" /> + </resultMap> + + <resultMap id="order-joined-favourite2" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem.Id" column="LineItem_ID"/> + <result property="FavouriteLineItem.Code" column="LineItem_Code"/> + <result property="FavouriteLineItem.Quantity" column="LineItem_Quantity"/> + <result property="FavouriteLineItem.Price" column="LineItem_Price"/> + </resultMap> + + <resultMap id="order-joined-with-account" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" type="date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="Account" resultMapping="account-result-nullable-email" /> + </resultMap> + + <resultMap id="order-hash" class="array"> + <result property="Date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + </resultMap> + + <statement id="GetOrderByHashTable" + parameterClass="Int" + resultMap="order-hash" > + select Order_Date from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderLiteByColumnName" + parameterClass="Int" + resultMap="lite-order-result-by-name" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderLiteByColumnIndex" + parameterClass="Int" + resultMap="lite-order-result-by-index" > + select + Order_ID, + Order_Date, + Order_CardExpiry, + Order_CardType, + Order_CardNumber, + Order_Street, + Order_City, + Order_Province, + Order_PostalCode + from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderWithTypes" + parameterClass="Int" + resultMap="order-with-types-result" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderWithLineItems" + parameterClass="Integer" + resultMap="order-with-lines-result" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderWithLineItemsUsingStatementNamespaces" + parameterClass="Integer" + resultMap="order-with-lines-result-statement-namespaces" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetAllOrderWithLineItems" + parameterClass="Integer" + resultMap="order-with-lines-result" > + select * from Orders + </statement> + + <statement id="GetOrderCardExpiryViaResultClass" + parameterClass="int" + resultClass="date"> + select + Order_Date as datetime + from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderWithAccount" + parameterClass="int" + resultMap="order-with-account-result" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderWithAccountViaSP" + parameterClass="int" + resultMap="order-with-sp-account-result" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderWithLineItemsCollection" + parameterClass="Integer" + resultMap="order-with-collection-result" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderJoinedFavourite" + parameterClass="Integer" + resultMap="order-joined-favourite" > + select * from Orders, LineItems + where Orders.Order_ID = LineItems.Order_ID + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_ID = #value# + </statement> + + <statement id="GetOrderJoinedFavourite2" + parameterClass="Integer" + resultMap="order-joined-favourite2" > + select * from Orders, LineItems + where Orders.Order_ID = LineItems.Order_ID + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_ID = #value# + </statement> + + <statement id="GetOrderJoinedFavourite3" + parameterClass="Integer" + resultClass="Order" > + select + Orders.Order_ID as Id, + Order_Date as Date, + Order_CardExpiry as CardExpiry, + Order_CardType as CardType, + Order_CardNumber as CardNumber, + Order_Street as Street, + Order_City as City, + Order_Province as Province, + Order_PostalCode as PostalCode, + LineItem_ID as "FavouriteLineItem.Id", + LineItem_Code as "FavouriteLineItem.Code", + LineItem_Quantity as "FavouriteLineItem.Quantity", + LineItem_Price as "FavouriteLineItem.Price" + from Orders, LineItems + where Orders.Order_ID = LineItems.Order_ID + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_ID = #value# + </statement> + + <statement id="GetOrderWithFavouriteLineItem" + parameterClass="int" + resultMap="order-with-favourite-line-item" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderWithLineItemCollection" + parameterClass="int" + resultMap="order-with-lines-collection" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderAsHastable" + parameterClass="Integer" + resultMap="lite-order-map-result" > + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetOrderWithLineItemArray" + parameterClass="int" + resultMap="order-with-lines-array"> + select * from Orders where Order_ID = #value# + </statement> + + <statement id="GetAllCreditCardNumbersFromOrders" + resultMap="credit-card-result" > + select distinct Order_CardNumber from Orders + order by Order_CardNumber + </statement> + + <statement id="InsertOrderViaParameterMap" + parameterMap="order-insert-params" > + insert into Orders + (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + </statement> + + <statement id="InsertOrderViaExtendParameterMap" + parameterMap="insert-extend" > + insert into Orders + (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + </statement> + + <statement id="InsertOrderViaPublicFields"> + insert into Orders + (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#) + </statement> + + <select id="GetOrderWithDynFavouriteLineItem" + parameterClass="Integer" + resultMap="order-with-dyn-favourite-line-item"> + select * from Orders where Order_ID = #value# + </select> + + <select id="SelectOrderByDate" + parameterClass="array" + resultMap="lite-order-result-by-name"> + select * from Orders where Order_Date = #Foo# + </select> + + <select id="SelectOrderByDateDynamic" + parameterClass="array" + resultMap="lite-order-result-by-name"> + select * from Orders + where 1=1 + <isNotEmpty prepend="AND" property="Foo"> + (Order_Date = '$Foo$') + </isNotEmpty> + </select> + + <select id="GetAccountJIRA45" + parameterClass="int" + resultMap="indexed-account-result"> + select + Account_ID, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_ID = #value# + </select> + + <select id="GetOrderJoinWithAccount" + parameterClass="Integer" + resultMap="order-joined-with-account"> + select + Order_ID, + Order_Date, + Order_CardExpiry, + Order_CardType, + Order_CardNumber, + Order_Street, + Order_City, + Order_Province, + Order_PostalCode, + acc.Account_ID, + acc.Account_FirstName, + acc.Account_LastName, + acc.Account_Email + from Orders as ord + LEFT OUTER JOIN Accounts as acc on acc.Account_ID = ord.Account_ID + where Order_ID = #value# + </select> + + + <parameterMap id="order-insert-params"> + <parameter property="Id" dbType="Int"/> <!-- Int for SqlClient, Obdc; Integer for Oledb --> + <parameter property="Account.Id" type="integer"/> + <parameter property="Date" type="date" nullValue="0001-01-01 00:00:00" /> + <parameter property="CardExpiry" /> + <parameter property="CardType" /> + <parameter property="CardNumber" /> + <parameter property="Street" /> + <parameter property="City" /> + <parameter property="Province" /> + <parameter property="PostalCode" /> + </parameterMap> + + <parameterMap id="params-parent"> <!-- 1043181 support request --> + <parameter property="Id" dbType="Int"/> + <parameter property="Account.Id"/> + <parameter property="Date" type="date" nullValue="0001-01-01 00:00:00" /> + <parameter property="CardExpiry" /> + <parameter property="CardType" /> + <parameter property="CardNumber" /> + <parameter property="Street" /> + <parameter property="City" /> + <parameter property="Province" /> + <parameter property="PostalCode" /> + </parameterMap> + + <parameterMap id="insert-extend" extends="params-parent"> + </parameterMap> + + <statement id="GetOrderWithLineItemsNoLazyLoad" + parameterClass="Integer" + resultMap="order-with-lines-result-no-lazy-load" > + select * from Orders where Order_ID = #value# + </statement> + + <resultMap id="order-with-lines-result-no-lazy-load" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" type="TList" column="Order_ID" select="GetLineItemsForOrder" /> + </resultMap> + + <statement id="GetOrderWithLineItemCollectionNoLazy" + parameterClass="int" + resultMap="order-with-lines-collection-no-lazy-load" > + select * from Orders where Order_ID = #value# + </statement> + + <resultMap id="order-with-lines-collection-no-lazy-load" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItems" column="Order_ID" + select="GetLineItemsForOrderWithListClass" /> + </resultMap> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/mssql/Other.xml b/tests/unit/Data/SqlMap/maps/mssql/Other.xml new file mode 100644 index 00000000..5d64f357 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/Other.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Other" > + + <resultMap id="other-result" class="Other" > + <result property="Int" column="Other_Int"/> + <result property="Long" column="Other_Long"/> + <result property="Bool" column="Other_Bit"/> + <result property="Bool2" column="Other_String" typeHandler="OuiNonBool"/> + </resultMap> + + <resultMap id="A-result" class="A" > + <result property="Id" column="A_ID"/> + <result property="Libelle" column="A_Libelle"/> + <result property="B" resultMapping="B-result"/> + <result property="E" resultMapping="E-result"/> + <result property="F" resultMapping="F-result"/> + </resultMap> + + <resultMap id="B-result" class="B" > + <result property="Id" column="B_ID"/> + <result property="Libelle" column="B_Libelle"/> + <result property="C" resultMapping="C-result"/> + <result property="D" resultMapping="D-result"/> + </resultMap> + + <resultMap id="C-result" class="C" > + <result property="Id" column="C_ID"/> + <result property="Libelle" column="C_Libelle"/> + </resultMap> + + <resultMap id="D-result" class="D" > + <result property="Id" column="D_ID"/> + <result property="Libelle" column="D_Libelle"/> + </resultMap> + + <resultMap id="E-result" class="E" > + <result property="Id" column="E_ID"/> + <result property="Libelle" column="E_Libelle"/> + </resultMap> + + <resultMap id="F-result" class="F" > + <result property="Id" column="F_ID"/> + <result property="Libelle" column="F_Libelle"/> + </resultMap> + + <select id="SelectComplexJoined" resultMap="A-result"> + SELECT + A.Id AS A_ID, + A.A_Libelle AS A_Libelle, + B.ID AS B_ID, + B.B_Libelle AS B_Libelle, + C.ID AS C_ID, + C.C_Libelle AS C_Libelle, + D.ID AS D_ID, + D.D_Libelle AS D_Libelle, + E.ID AS E_ID, + E.E_Libelle AS E_Libelle, + F.ID AS F_ID, + F.F_Libelle AS F_Libelle + FROM A + LEFT OUTER JOIN B ON A.B_ID = B.ID + LEFT OUTER JOIN C ON B.C_ID = C.ID + LEFT OUTER JOIN D ON B.D_ID = D.ID + LEFT OUTER JOIN E ON A.E_ID = E.ID + LEFT OUTER JOIN F ON A.F_ID = F.ID + </select> + <statement id="DynamicSelectByIntLong" + parameterClass="array" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + <dynamic prepend="WHERE"> + <isNotEqual prepend="AND" property="year" compareValue="0"> + Other_Int = #year# + </isNotEqual> + + <isNotEqual prepend="AND" property="areaid" compareValue="0"> + Other_Long = #areaid# + </isNotEqual> + </dynamic> + </statement> + + <statement id="DynamicSelectByBool" + parameterClass="Other" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Bit = #Bool# + </statement> + + <statement id="InsertBool" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, 'Yes') + </statement> + + <statement id="InsertCustomTypeHandler" + parameterMap="other-insert-params"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( ?, ?, ?, ?) + </statement> + + <statement id="SelectByInt" + parameterClass="int" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Int = #value# + </statement> + + <statement id="InsertInlineCustomTypeHandlerV1" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#) + </statement> + + <statement id="InsertInlineCustomTypeHandlerV2" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, #Bool2,typeHandler=OuiNonBool#) + </statement> + + <parameterMap id="other-insert-params"> + <parameter property="Int" /> + <parameter property="Long" /> + <parameter property="Bool" /> + <parameter property="Bool2" typeHandler="OuiNonBool"/> + </parameterMap> + + + <statement id="SelectByIntV1" + parameterClass="int" + resultMap="other-result-V1"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Int = #value# + </statement> + + + <resultMap id="other-result-V1" class="Other" > + <result property="Int" column="Other_Int"/> + <result property="Long" column="Other_Long"/> + <result property="Bool" column="Other_Bit"/> + <result property="Bool2" column="Other_String" /> + </resultMap> + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/mssql/ResultClass.xml b/tests/unit/Data/SqlMap/maps/mssql/ResultClass.xml new file mode 100644 index 00000000..ac705ac1 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/mssql/ResultClass.xml @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="ResultClass" > + + <statement id="GetBoolean" + parameterClass="Int" + resultClass="bool" > + select cast(1 as bit) from Orders where Order_ID = #dummy# + </statement> + <statement id="GetBooleanWithoutResultClass" + parameterClass="Int" + extends="GetBoolean"> + </statement> + + <statement id="GetByte" + parameterClass="Int" + resultClass="int" > + select cast(155 as tinyint) from Orders where Order_ID = #value# + </statement> + <statement id="GetByteWithoutResultClass" + parameterClass="Int" + extends="GetByte"> + </statement> + + <statement id="GetChar" + parameterClass="Int" + resultClass="string" > + select cast('a' as char) from Orders where Order_ID = #value# + </statement> + <!-- SQL Server provider doesn't know char type, the resultClass type must be specified --> + <statement id="GetCharWithoutResultClass" + parameterClass="Int" resultClass="string" + extends="GetChar"> + </statement> + + <statement id="GetDate" + parameterClass="Int" + resultClass="date" > + select cast('2003-02-15 8:15:00' as datetime) as datetime from Orders where Order_ID = #value# + </statement> + <statement id="GetDateWithoutResultClass" + parameterClass="Int" + extends="GetDate"> + </statement> + + <statement id="GetDecimal" + parameterClass="Int" + resultClass="decimal" > + select cast(1.56 as decimal(9,2)) from Orders where Order_ID = #value# + </statement> + <statement id="GetDecimalWithoutResultClass" + parameterClass="Int" + extends="GetDecimal"> + </statement> + + <statement id="GetDouble" + parameterClass="Int" + resultClass="double" > + select cast(99.5 as float) from Orders where Order_ID= #value# + </statement> + <statement id="GetDoubleWithoutResultClass" + parameterClass="Int" + extends="GetDouble"> + </statement> + + <statement id="GetGuid" + parameterClass="Int" + resultClass="guid" > + select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as UniqueIdentifier) from Orders where Order_ID = #value# + </statement> + <statement id="GetGuidWithoutResultClass" parameterClass="Int" extends="GetGuid"> + </statement> + + <statement id="GetInt16" + parameterClass="Int" + resultClass="integer" > + select cast(32111 as SmallInt) from Orders where Order_ID = #value# + </statement> + <statement id="GetInt16WithoutResultClass" + parameterClass="Int" + extends="GetInt16"> + </statement> + + <statement id="GetInt32" + parameterClass="Int" + resultClass="int" > + select cast(999999 as int) from Orders where Order_ID = #value# + </statement> + <statement id="GetInt32WithoutResultClass" + parameterClass="Int" + extends="GetInt32"> + </statement> + + <statement id="GetInt64" + parameterClass="Int" + resultClass="float" > + select cast(9223372036854775800 as bigint) from Orders where Order_ID = #value# + </statement> + <statement id="GetInt64WithoutResultClass" + parameterClass="Int" + extends="GetInt64"> + </statement> + + <statement id="GetSingle" + parameterClass="Int" + resultClass="float" > + select cast(92233.5 as real) from Orders where Order_ID = #value# + </statement> + <statement id="GetSingleWithoutResultClass" + parameterClass="Int" + extends="GetSingle"> + </statement> + + <statement id="GetString" + parameterClass="Int" + resultClass="string" > + select 'VISA' + from Orders where Order_ID = #value# + </statement> + <statement id="GetStringWithoutResultClass" + parameterClass="Int" + extends="GetString"> + </statement> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/sqlite/Account.xml b/tests/unit/Data/SqlMap/maps/sqlite/Account.xml new file mode 100644 index 00000000..aa175459 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/Account.xml @@ -0,0 +1,641 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<sqlMap namespace="Account" > + + <!-- ============================================= + <resultMap + name="name" + class="name" + extend="resultMapId" + > + <result + property="name" + column="name" + columnIndex="name" + nullValue="value" + select="name" + resultMap="name" + lazyLoad="true/false" + dbType="" + /> + <procedure + name="name" + parameterMap="name" + > + <statement + name="name" + parameterClass="name" + parameterMap="name" + resultClass="name" + resultMap="name" + listClass="name" + > + <parameterMap + name="name" + class="" + > + <parameter + property="name" + dbType="" + output="true/false" + type="" + nullValue="" + extend="parameterMapId" + /> + + ============================================= --> + + <cacheModel id="account-cache" implementation="LRU" > + <flushInterval hours="24"/> + <flushOnExecute statement="UpdateAccountViaInlineParameters"/> + <flushOnExecute statement="UpdateAccountViaParameterMap"/> + <property name="size" value="10"/> + </cacheModel> + + <!-- + <cacheModel name="account-cache" implementation="LRU" > + <flushInterval hours="24"/> + <flushOnExecute statement="UpdateAccountViaInlineParameters"/> + <flushOnExecute statement="UpdateAccountViaParameterMap"/> + <property name="CacheSize" value="50"/> + </cacheModel> + --> + + + <alias> + <typeAlias alias="HundredsBool" type="IBatisNet.DataMapper.Test.Domain.HundredsTypeHandlerCallback, IBatisNet.DataMapper.Test"/> + </alias> + + <resultMap id="account-result" class="Account" > + <result property="Id" column="Account_Id"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email" nullValue="no_email@provided.com"/> + <result property="BannerOptions" column="Account_Banner_Option" typeHandler="OuiNonBool"/> + <result property="CartOptions" column="Account_Cart_Option" typeHandler="HundredsBool"/> + </resultMap> + <resultMap id="indexed-account-result" class="Account"> + <result property="Id" column="Account_Id" columnIndex="0"/> + <result property="FirstName" column="Account_FirstName" columnIndex="1"/> + <result property="LastName" column="Account_LastName" columnIndex="2"/> + <result property="EmailAddress" column="Account_Email" columnIndex="3" nullValue="no_email@provided.com"/> + </resultMap> + <resultMap id="account-result-nullable-email" class="Account"> + <result property="Id" column="Account_Id"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email"/> + </resultMap> + + <resultMap id="email-result" class="string"> + <result property="value" column="Account_Email"/> + </resultMap> + + <resultMap id="account-hashtable-result" class="array"> + <result property="Id" column="Account_Id"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email"/> + </resultMap> + + + <!-- ============================================= + MAPPED STATEMENTS - w/Inline Parameters + ============================================= + --> + + <select id="GetAllAccountsAsArrayListViaResultClass" + resultClass="TList"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_Id + </select> + + <select id="GetAccountsDynamic" resultMap="account-result" parameterClass="Hashtable" > + select * from Accounts + <dynamic prepend="where"> + <isParameterPresent> + <isNotEmpty prepend="and" property="FirstName" > + Account_FirstName LIKE '%$FirstName$%' + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName LIKE '%$LastName$%' + </isNotEmpty> + <isNotEmpty prepend="and" property="EmailAddress" > + Account_Email LIKE '%$EmailAddress$%' + </isNotEmpty> + </isParameterPresent> + </dynamic> + order by Account_LastName + limit 0, $MaximumAllowed$ + </select> + + <select id="SelectWithProperty" + resultMap="account-result"> + select * + from Accounts + where Account_FirstName = ${accountName} + </select> + + <select id="GetCachedAccountsViaResultMap" + resultMap="account-result" + cacheModel="account-cache" > + select * + from Accounts + order by Account_Id + </select> + + <select id="GetNoAccountWithCache" + parameterClass="Integer" + resultMap="account-hashtable-result" + cacheModel="account-cache"> + select * + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAccountAsHashtable" + parameterClass="Integer" + resultMap="account-hashtable-result"> + select * + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllAccountsAsHashMapViaResultMap" + resultMap="account-hashtable-result"> + select * + from Accounts + order by Account_Id + </select> + + <select id="GetAccountAsHashtableResultClass" + parameterClass="int" + resultClass="array"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllAccountsAsHashtableViaResultClass" + resultClass="array"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_Id + </select> + + <select id="GetAccountViaColumnName" + parameterClass="int" + resultMap="account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email, + Account_Banner_Option, + Account_Cart_Option + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAccountViaColumnIndex" + parameterClass="int" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllAccountsViaResultMap" + resultMap="account-result"> + select * from Accounts + order by Account_Id + </select> + + <select id="GetAllAccountsViaResultClass" + resultClass="Account"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + order by Account_Id + </select> + + <select id="GetFewAccountsViaResultMap" + resultMap="account-result"> + <![CDATA[ + select * from Accounts + where Account_Id < 2 + order by Account_Id + ]]> + </select> + + <select id="GetNoAccountsViaResultMap" + resultMap="account-result"> + select * from Accounts + where Account_Id > 1000 + order by Account_Id + </select> + + + <select id="GetAccountNullableEmail" + resultMap="account-result-nullable-email"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAccountViaResultClass" + resultClass="Account"> + <![CDATA[ + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_Id = #value# + ]]> + </select> + + <select id="GetAccountViaInlineParameters" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_Id = #Id# and Account_Id = #Id# + </select> + + <select id="GetEmailAddressViaResultClass" resultClass="string"> + select Account_Email as value + from Accounts + where Account_Id = #value# + </select> + + <select id="GetEmailAddressViaResultMap" + parameterClass="int" + resultMap="email-result"> + select Account_Email + from Accounts + where Account_Id = #value# + </select> + + <select id="GetAllEmailAddressesViaResultClass" + resultClass="string"> + select Account_Email + from Accounts + order by Account_Id + </select> + + <select id="GetAllEmailAddressesViaResultMap" + resultMap="email-result"> + select Account_Email + from Accounts + order by Account_Id + </select> + + <insert id="InsertAccountViaParameterMap" + parameterMap="account-insert-params"> + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) + values + (?, ?, ?, ?, ?, ?) + </insert> + + <update id="UpdateAccountViaParameterMap" + parameterMap="update-params"> + update Accounts set + Account_FirstName = ?, + Account_LastName = ?, + Account_Email = ? + where + Account_Id = ? + </update> + + <update id="UpdateAccountViaParameterMap2" + parameterMap="update-params2"> + update Accounts set + Account_Id = ?, + Account_FirstName = ?, + Account_LastName = ?, + Account_Email = ? + where + Account_Id = ? + </update> + + <delete id="DeleteAccountViaInlineParameters"> + delete from Accounts + where + Account_Id = #Id# + </delete> + + <select id="GetAccountComplexMapping" + resultMap="indexed-account-result" + parameterClass="array"> + select * + from Accounts + where + Account_FirstName = #Account.FirstName# + And Account_LastName = #Order.City# + </select> + + <select id="GetDynamicOrderedEmailAddressesViaResultMap" + resultMap="email-result"> + select Account_Email + from Accounts + order by $value$ + </select> + + <!-- Dynamic statements --> + <select id="GetAllAccountsViaResultMapWithDynamicElement" + resultMap="account-result"> + select * from Accounts + where Account_Email $value$ '%@%' + order by Account_Id + </select> + + <select id="SimpleDynamicSubstitution" + parameterClass="Hashtable" + resultClass="Account"> + $statement$ + </select> + + <!-- Public Fields --> + <insert id="InsertAccountViaPublicFields"> + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + values + (#Id#, #FirstName#, #LastName#, #EmailAddress# + ) + </insert> + + + <!-- Inline Parameters --> + <update id="UpdateAccountViaInlineParameters" + parameterClass="Account"> + update Accounts set + Account_FirstName = #FirstName#, + Account_LastName = #LastName#, + Account_Email = #EmailAddress, dbType=VarChar, nullValue=no_email@provided.com# + where + Account_Id = #Id# + </update> + + <insert id="InsertAccountViaInlineParameters" + parameterClass="Account" > + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + values + (#Id#, #FirstName#, #LastName#, #EmailAddress, dbType=VarChar, nullValue=no_email@provided.com# + ) + </insert> + + <insert id="InsertAccountNullableEmail" + parameterClass="Account" > + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + values + ( #Id#, #FirstName#, #LastName#, #EmailAddress, dbType=VarChar# ) + </insert> + + <insert id="InsertAccountUknownParameterClass"> + insert into Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + values + ( #Id#, #FirstName#, #LastName#, #EmailAddress, dbType=VarChar# ) + </insert> + + <delete id="DeleteAccount" + parameterClass="Account"> + delete from Accounts + where Account_Id = #Id# + and Account_Id = #Id# + </delete> + + <!-- Extends statement --> + <select id="GetAllAccounts" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + </select> + + <select id="GetAllAccountsOrderByName" + extends="GetAllAccounts" + resultMap="indexed-account-result"> + order by Account_FirstName + </select> + + <select id="GetOneAccount" + extends="GetAllAccounts" + resultMap="indexed-account-result"> + where Account_Id = #value# + </select> + + <select id="GetSomeAccount" + extends="GetAllAccounts" + parameterClass="Hashtable" + resultMap="indexed-account-result"> + where Account_Id between #lowID# and #hightID# + </select> + + <select id="SelectAccountJIRA29" parameterClass="map" resultClass="Account"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where Account_FirstName = '##$AccountName$##' + </select> + + <select id="SelectAccountJIRA29-2" + parameterClass="Hashtable" + resultClass="Account"> + select + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + where 1=1 + <isNotEmpty prepend="AND" property="Foo"> + (Account_FirstName = '##$Foo$##') + </isNotEmpty> + </select> + + <select id="GetAccountWithRepeatingProperty" + parameterClass="Account" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_Id = #Id# and + Account_Id = #Id# and + Account_FirstName = #FirstName# and + Account_LastName = #LastName# and + Account_Id = #Id# + </select> + + <select id="GetAllAccountsViaCustomTypeHandler" + resultMap="account-result"> + select * from Accounts + order by Account_Id + </select> + + <!-- JIRA-110 --> + <select id="GetManyAccound" resultClass="Account"> + SELECT + Account_Id as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + FROM Accounts + </select> + + <select id="Get1Account" extends="GetManyAccound" resultClass="Account">WHERE Account_Id=1</select> + + <statement id="GetAccounts" resultMap="account-result"> + SELECT * + FROM + Accounts + </statement> + <!-- JIRA-110 --> + + <insert id="InsertAccountDynamic" parameterClass="Account"> + INSERT INTO Accounts + (Account_Id, Account_FirstName, Account_LastName, Account_Email) + VALUES(#Id#, #FirstName#, #LastName# + <dynamic prepend=","> + <isNotNull prepend="," property="EmailAddress"> + #EmailAddress# + </isNotNull> + <isNull prepend="," property="EmailAddress"> + null + </isNull> + </dynamic> + ) + </insert> + + + <!-- accounts and orders --> + + <select id="getAccountWithOrders" resultMap="Account-with-Orders"> + SELECT + Accounts.Account_Id as Account_Id, + Accounts.Account_FirstName as Account_FirstName, + Accounts.Account_LastName as Account_LastName, + Accounts.Account_Email as Account_Email, + Accounts.Account_Banner_Option as Account_Banner_Option, + Accounts.Account_Cart_Option as Account_Cart_Option, + Orders.Order_Id as Order_Id, + Orders.Order_Date as Order_Date, + Orders.Order_CardType as Order_CardType, + Orders.Order_CardNumber as Order_CardNumber, + Orders.Order_CardExpiry as Order_CardExpiry, + Orders.Order_Street as Order_Street, + Orders.Order_City as Order_City, + Orders.Order_Province as Order_Province, + Orders.Order_PostalCode as Order_PostalCode, + Orders.Order_FavouriteLineItem as Order_FavouriteLineItem + FROM accounts + LEFT JOIN orders ON + accounts.account_id = orders.account_id + </select> + + <resultMap id="Account-with-Orders" class="AccountWithOrders" groupBy="Account_Id"> + <result property="Id" column="Account_Id"/> + <result property="FirstName" column="Account_FirstName"/> + <result property="LastName" column="Account_LastName"/> + <result property="EmailAddress" column="Account_Email" /> + <result property="Orders" resultMapping="account-orders" /> + </resultMap> + + <resultMap id="account-orders" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + </resultMap> + + + <!-- For procedure, the parameters of the parameterMap must in the same order + as for the procedure paramaters--> + <procedure id="InsertAccountViaStoreProcedure" parameterMap="account-insert-params"> + ps_InsertAccount + </procedure> + + <procedure id="SwapEmailAddresses" parameterMap="swap-params"> + ps_swap_email_address + </procedure> + + <!-- ============================================= + OPTIONAL EXPLICIT PARAMETER MAP + ============================================= --> + + <parameterMap id="swap-params"> + <parameter property="email1" column="First_Email" /> + <parameter property="email2" column="Second_Email" /> + </parameterMap> + + <parameterMap id="account-insert-params"> + <parameter property="Id" /> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="BannerOptions" dbType="Varchar" type="bool"/> + <parameter property="CartOptions" column="Account_Cart_Option" typeHandler="HundredsBool"/> + </parameterMap> + + <parameterMap id="update-params"> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="Id" /> + </parameterMap> + + <parameterMap id="update-params2"> + <parameter property="Id" /> + <parameter property="FirstName" /> + <parameter property="LastName" /> + <parameter property="EmailAddress" nullValue="no_email@provided.com"/> + <parameter property="Id" /> + </parameterMap> + + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/sqlite/ActiveRecord.xml b/tests/unit/Data/SqlMap/maps/sqlite/ActiveRecord.xml new file mode 100644 index 00000000..1c48010f --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/ActiveRecord.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<sqlMap> + + <select id="GetActiveRecordAccounts" resultClass="ActiveAccount"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email, + Account_Banner_Option, + Account_Cart_Option + from Accounts + order by Account_Id + </select> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/sqlite/Category.xml b/tests/unit/Data/SqlMap/maps/sqlite/Category.xml new file mode 100644 index 00000000..05c51fb5 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/Category.xml @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Category" > + + <alias> + <typeAlias alias="Category" type="IBatisNet.DataMapper.Test.Domain.Category, IBatisNet.DataMapper.Test"/> + </alias> + + + <select id="GetCategory" parameterClass="Integer" resultClass="Category"> + select + Category_ID as Id, + Category_Name as Name, + Category_Guid as GuidString + from Categories + where Category_ID = #value# + </select> + + <select id="GetCategoryGuid" parameterClass="Integer" resultClass="guid"> + select + Category_Guid as value + from Categories + where Category_ID = #value# + </select> + + <!-- Test for statement as insert --> + <!-- Needs to be <insert> vs <statement> for MySql due to selectKey --> + <insert id="InsertCategory" parameterClass="Category"> + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (#Name#, #GuidString:Varchar#); + </insert> + + <!-- --> + <insert id="InsertCategoryViaInsertStatement" parameterClass="Category" > + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (#Name#, #GuidString:Varchar#) + </insert> + + <!-- Needs to be <insert> vs <statement> for MySql due to selectKey --> + <insert id="InsertCategoryViaParameterMap" parameterMap="InsertParam"> + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (?,?); + </insert> + + <!-- Needs to be <insert> vs <statement> for MySql due to selectKey --> + <insert id="InsertCategoryNull" parameterMap="insert-null-params"> + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + insert into Categories + (Category_Name, Category_Guid) + values + (?,?); + </insert> + + <update id="UpdateCategoryViaParameterMap" parameterMap="UpdateParam"> + update Categories set + Category_Name =?, + Category_Guid = ? + where + Category_Id = ? + </update> + + <procedure id="InsertCategoryViaStoreProcedure" parameterMap="category-insert-params"> + ps_InsertCategorie + </procedure> + + <insert id="InsertCategoryGenerate" parameterMap="insert-generate-params"> + <selectKey property="Id" type="post" resultClass="int"> + select LAST_INSERT_ID() as value + </selectKey> + <generate table="Categories" /> + </insert> + + <update id="UpdateCategoryGenerate" parameterMap="update-generate-params"> + <generate table="Categories" by="Category_Id"/> + </update> + + <delete id="DeleteCategoryGenerate" parameterMap="delete-generate-params"> + <generate table="Categories" by="Category_Id, Category_Name"/> + </delete> + + <select id="SelectByPKCategoryGenerate" resultClass="Category" parameterClass="Category" parameterMap="select-generate-params"> + <generate table="Categories" by="Category_Id"/> + </select> + + <select id="SelectAllCategoryGenerate" resultClass="Category" parameterMap="select-generate-params"> + <generate table="Categories" /> + </select> + + <statement id="DynamicGuid" + resultClass="Category" + parameterClass="Category"> + select + Category_ID as Id, + Category_Name as Name, + Category_Guid as Guid + from Categories + <dynamic prepend="where"> + <isNotEqual prepend="and" property="Guid" compareProperty="EmptyGuid"> + Category_Guid=#GuidString:Varchar# + </isNotEqual> + </dynamic> + </statement> + <parameterMap id="category-insert-params"> + <parameter property="Id" column="Category_Id" dbType="Int32" /> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" dbType="Varchar"/> + </parameterMap> + + <parameterMap id="InsertParam"> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" dbType="Varchar"/> + </parameterMap> + + <parameterMap id="insert-null-params"> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" nullValue="00000000-0000-0000-0000-000000000000" dbType="Varchar"/> + </parameterMap> + + <parameterMap id="UpdateParam" extends="InsertParam"> + <parameter property="Id" column="Category_Id" /> + </parameterMap> + + <!-- Used by generated statement --> + + <parameterMap id="insert-generate-params"> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" dbType="Varchar"/> + </parameterMap> + + <parameterMap id="update-generate-params" extends="insert-generate-params"> + <parameter property="Id" column="Category_Id" /> + </parameterMap> + + <parameterMap id="delete-generate-params"> + <parameter property="Id" column="Category_Id" /> + <parameter property="Name" column="Category_Name"/> + </parameterMap> + + <parameterMap id="select-generate-params"> + <parameter property="Id" column="Category_Id" /> + <parameter property="Name" column="Category_Name"/> + <parameter property="GuidString" column="Category_Guid" dbType="Varchar"/> + </parameterMap> + + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/sqlite/Complex.xml b/tests/unit/Data/SqlMap/maps/sqlite/Complex.xml new file mode 100644 index 00000000..c596e555 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/Complex.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Complex" > + + <statements> + + <statement id="ComplexMap" + resultClass="int" > + select Account_ID from Accounts where Account_ID = #obj.Map.Id# + </statement> + + <insert id="InsertComplexAccountViaInlineDefaultNull" + parameterClass="Hashtable" > + insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email) + values + (#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:Varchar:no_email@provided.com# + ) + </insert> + + </statements> + + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/sqlite/Document.xml b/tests/unit/Data/SqlMap/maps/sqlite/Document.xml new file mode 100644 index 00000000..83028e05 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/Document.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Document" > + + <resultMap id="document" class="Document"> + <result property="Id" column="Document_Id" type="integer" /> + <result property="Title" column="Document_Title"/> + <discriminator column="Document_Type" type="string"/> + <subMap value="Book" resultMapping="book" /> + <subMap value="Newspaper" resultMapping="newspaper" /> + </resultMap> + + <resultMap id="document-custom-handler" class="Document"> + <result property="Id" column="Document_Id" type="integer"/> + <result property="Title" column="Document_Title"/> + <discriminator column="Document_Type" typeHandler="CustomInheritance"/> + <subMap value="Book" resultMapping="book" /> + <subMap value="Newspaper" resultMapping="newspaper" /> + </resultMap> + + <resultMap id="book" class="Book" extends="document"> + <result property="PageNumber" column="Document_PageNumber"/> + </resultMap> + + <resultMap id="newspaper" class="Newspaper" extends="document"> + <result property="City" column="Document_City"/> + </resultMap> + + <statement id="GetAllDocument" + resultMap="document"> + select + * + from Documents + order by Document_Type, Document_Id + </statement> + + <select id="GetTypedCollection" + listClass="DocumentCollection" + resultMap="document"> + select + * + from Documents + order by Document_Type, Document_Id + </select> + + <select id="GetAllDocumentWithCustomTypeHandler" + resultMap="document-custom-handler"> + select + * + from Documents + order by Document_Type, Document_Id + </select> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/sqlite/DynamicAccount.xml b/tests/unit/Data/SqlMap/maps/sqlite/DynamicAccount.xml new file mode 100644 index 00000000..429a745a --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/DynamicAccount.xml @@ -0,0 +1,447 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Account" > + + <alias> + <typeAlias alias="Search" type="IBatisNet.DataMapper.Test.Domain.Search, IBatisNet.DataMapper.Test"/> + </alias> + + <statements> + + <select id="DynamicAll" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + </select> + + <select id="DynamicWithExtend" + extends="DynamicAll" + parameterClass="Account" + resultClass="Account"> + <dynamic prepend="WHERE" > + <isGreaterThan prepend="AND" property="Id" compareValue="0" > + Account_ID = #Id# + </isGreaterThan> + <isNotNull prepend="AND" property="Ids" > + Account_ID in + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </isNotNull> + <isNotEmpty prepend="AND" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="EmailAddress" > + <isEqual property="EmailAddress" compareValue="Joe"> + Account_Email = 'clinton.begin@ibatis.com' + </isEqual> + <isNotEqual property="EmailAddress" compareValue="Joe"> + Account_Email = #EmailAddress# + </isNotEqual> + </isNotEmpty> + </dynamic> + </select> + + <!-- IBATISNET-114: remapResults --> + <statement id="DynamicSqlOnColumnSelection" + parameterClass="Account" + resultClass="Account"> + SELECT + Account_ID as Id, + <dynamic> + <isEqual property="LastName" compareValue="Dalton" > + Account_FirstName as FirstName, + </isEqual> + <isEqual property="LastName" compareValue="Dalton" > + Account_LastName as LastName, + </isEqual> + </dynamic> + + Account_Email as EmailAddress + FROM + Accounts + </statement> + + <statement id="DynamicIsEqual" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isEqual compareValue="Joe" > + where Account_FirstName = 'Joe' + </isEqual> + </statement> + + <statement id="DynamicIsParameterPresent" + parameterClass="integer" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isParameterPresent > + where Account_ID = #value# + </isParameterPresent> + </statement> + + <statement id="DynamicIsNotEmpty" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isNotEmpty> + where Account_FirstName = #value# + </isNotEmpty> + </statement> + + <statement id="DynamicIsGreater" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isGreaterThan compareValue="3" > + where Account_ID = 1 + </isGreaterThan> + </statement> + + <statement id="DynamicIsGreaterEqual" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isGreaterEqual compareValue="3" > + where Account_ID = 1 + </isGreaterEqual> + </statement> + + <statement id="DynamicIsLess" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isLessThan compareValue="3" > + where Account_ID = 1 + </isLessThan> + </statement> + + <statement id="DynamicIsLessEqual" + parameterClass="int" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isLessEqual compareValue="3" > + where Account_ID = 1 + </isLessEqual> + </statement> + + <statement id="DynamicIsNotNull" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isNotNull> + where Account_ID = 1 + </isNotNull> + </statement> + + <statement id="DynamicIsPropertyAvailable" + parameterClass="string" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <isPropertyAvailable property="Id" > + where Account_ID = 1 + </isPropertyAvailable> + </statement> + + + <statement id="DynamicSubst" + parameterClass="map" + resultClass="Account"> + <dynamic> + $statement$ + </dynamic> + </statement> + + <statement id="DynamicIterate" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </statement> + + <statement id="DynamicIterate2" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </statement> + + <statement id="MultiDynamicIterate" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + WHERE Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + and Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </statement> + + + <statement id="DynamicQueryByExample" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="WHERE" > + <isGreaterThan prepend="AND" property="Id" compareValue="0" > + Account_ID = #Id# + </isGreaterThan> + <isNotNull prepend="AND" property="Ids" > + Account_ID in + <iterate property="Ids" open="(" close=")" conjunction="," > + #Ids[]# + </iterate> + </isNotNull> + <isNotEmpty prepend="AND" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + <isNotEmpty prepend="AND" property="EmailAddress" > + <isEqual property="EmailAddress" compareValue="Joe"> + Account_Email = 'clinton.begin@ibatis.com' + </isEqual> + <isNotEqual property="EmailAddress" compareValue="Joe"> + Account_Email = #EmailAddress# + </isNotEqual> + </isNotEmpty> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend1" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + Account_ID IN + <iterate open="(" close=")" conjunction=","> + #[]# + </iterate> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend2" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + <iterate open="(" close=")" conjunction="OR"> + Account_ID = #[]# + </iterate> + </dynamic> + </statement> + + <statement id="DynamicIterateWithPrepend3" + parameterClass="list" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where" > + <isParameterPresent prepend="BLAH!" > + <iterate open="(" close=")" conjunction="OR"> + Account_ID = #[]# + </iterate> + </isParameterPresent> + </dynamic> + </statement> + + <statement id="DynamicWithPrepend" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isParameterPresent> + <isNotEmpty prepend="and" property="Id" > + Account_ID = #Id# + </isNotEmpty> + <isNotEmpty prepend="and" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + </isParameterPresent> + </dynamic> + </statement> + + <statement id="DynamicWithTwoDynamicElements" + parameterClass="Account" + resultClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isNotEmpty prepend="BLAH!" property="Id" > + Account_ID = #Id# + </isNotEmpty> + </dynamic> + <dynamic prepend="and"> + <isNotEmpty prepend="BLAH!" property="FirstName" > + Account_FirstName = #FirstName# + </isNotEmpty> + <isNotEmpty prepend="and" property="LastName" > + Account_LastName = #LastName# + </isNotEmpty> + </dynamic> + </statement> + + <statement id="ComplexDynamicStatement" + cacheModel="account-cache" + resultClass="Account" + parameterClass="Account"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="WHERE"> + <isNotNull prepend="AND" property="FirstName"> + (Account_FirstName = #FirstName# + <isNotNull prepend="OR" property="LastName"> + Account_LastName = #LastName# + </isNotNull> + ) + </isNotNull> + <isNotNull prepend="AND" property="EmailAddress"> + Account_Email like #EmailAddress# + </isNotNull> + <isGreaterThan prepend="AND" property="Id" compareValue="0"> + Account_ID = #Id# + </isGreaterThan> + </dynamic> + order by Account_LastName + </statement> + + <statement id="Jira-IBATISNET-11" + resultClass="Account" + parameterClass="Search"> + select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress + from Accounts + <dynamic prepend="where"> + <isNotNull prepend="and" property="NumberSearch"> + ((Account_ID $Operande$ #NumberSearch#) or + (Account_ID $Operande$ #NumberSearch#)) + </isNotNull> + <isEqual prepend="and" property="StartDate" compareValue="25/12/2004"> + <![CDATA[Account_FirstName >= #StartDate# ]]> + </isEqual> + <isEqual prepend="and" property="StartDateAnd" compareValue="true"> + <![CDATA[Account_LastName >= #StartDate# ]]> + </isEqual> + </dynamic> + + order by Account_LastName + </statement> + </statements> + + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/sqlite/Enumeration.xml b/tests/unit/Data/SqlMap/maps/sqlite/Enumeration.xml new file mode 100644 index 00000000..58391c5d --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/Enumeration.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Enumeration" > + + <resultMaps> + <resultMap id="enumeration-result" class="Enumeration" > + <result property="Id" column="Enum_ID"/> + <result property="Day" column="Enum_Day"/> + <result property="Color" column="Enum_Color"/> + <result property="Month" column="Enum_Month" nullValue="All"/> + </resultMap> + </resultMaps> + + <statements> + + <select id="GetEnumerationNullValue" + parameterClass="Integer" + resultMap="enumeration-result"> + select + Enum_ID, + Enum_Day, + Enum_Color, + Enum_Month + from Enumerations + where Enum_ID = #value# + </select> + + <select id="GetEnumeration" parameterClass="Integer" resultClass="Enumeration"> + select + Enum_ID as Id, + Enum_Day as Day, + Enum_Color as Color, + Enum_Month as Month + from Enumerations + where Enum_ID = #value# + </select> + + <insert id="InsertEnumViaParameterMap" parameterMap="insert-params" > + insert into Enumerations + (Enum_ID, Enum_Day, Enum_Color, Enum_Month) + values + (?, ?, ?, ?) + </insert> + + </statements> + + <parameterMaps> + <parameterMap id="insert-params"> + <parameter property="Id" column="Enum_ID" /> + <parameter property="Day" column="Enum_Day"/> + <parameter property="Color" column="Enum_Color" /> + <parameter property="Month" column="Enum_Month" nullValue="All"/> + </parameterMap> + </parameterMaps> + +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/sqlite/LineItem.xml b/tests/unit/Data/SqlMap/maps/sqlite/LineItem.xml new file mode 100644 index 00000000..95cc4af7 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/LineItem.xml @@ -0,0 +1,183 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="LineItem" > + + <resultMap id="LineItem-Price" class="float"> + <result property="value" column="LineItem_Price"/> + </resultMap> + + <resultMap id="LineItem" class="LineItem"> + <result property="Id" column="LineItem_Id"/> + <result property="Code" column="LineItem_Code"/> + <result property="Quantity" column="LineItem_Quantity"/> + <result property="Price" column="LineItem_Price"/> + </resultMap> + + <resultMap id="LineItemWithNullReplacement" class="LineItem"> + <result property="Id" column="LineItem_Id"/> + <result property="Code" column="LineItem_Code"/> + <result property="Quantity" column="LineItem_Quantity"/> + <result property="Price" column="LineItem_Price" nullValue="-77.77"/> + </resultMap> + + + <statement id="GetLineItemPrice" + parameterClass="array" + resultMap="LineItem-Price" > + select + LineItem_Price + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <statement id="GetLineItemsForOrder" + parameterClass="int" + listClass="TList" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems where Order_ID = #value# + </statement> + + + <statement id="GetLineItemsForOrderWithListClass" + parameterClass="int" + listClass="LineItemCollection" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems where Order_ID = #value# + order by LineItem_Code + </statement> + + <statement id="GetSpecificLineItem" + parameterClass="array" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <statement id="GetSpecificLineItemWithPicture" + parameterClass="array" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price, + LineItem_Picture as PictureData + from LineItems + where Order_ID = #Order_ID# + and LineItem_ID = #LineItem_ID# + </statement> + + <select id="GetDynSpecificLineItem" + parameterClass="array" + resultClass="LineItem"> + select + LineItem_ID as Id, + LineItem_Code as Code, + LineItem_Quantity as Quantity, + LineItem_Price as Price + from LineItems + where Order_ID = #Order_ID# + <dynamic> + <isNotNull property="LineItem_ID"> + and LineItem_ID = #LineItem_ID# + </isNotNull> + </dynamic> + </select> + + <statement id="GetSpecificLineItemWithNullReplacement" + parameterClass="int" + resultMap="LineItemWithNullReplacement"> + select + LineItem_ID, + LineItem_Code, + LineItem_Quantity, + LineItem_Price + from LineItems + where LineItem_ID = #value# + </statement> + + <statement id="InsertLineItem" + parameterMap="line-item-insert-params" > + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (?, ?, ?, ?, ?); + </statement> + + <statement id="InsertLineItemWithPicture" + parameterMap="line-item-insert-params-picture" > + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) + values + (?, ?, ?, ?, ?, ?); + </statement> + + <insert id="InsertLineItemPostKey" parameterClass="LineItem"> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, type=float#) + <selectKey property="Id" type="post" resultClass="int" > + select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 + </selectKey> + </insert> + + <insert id="InsertLineItemPreKey" parameterClass="LineItem"> + <selectKey property="Id" type="pre" resultClass="int" > + select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 + </selectKey> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, type=float#) + </insert> + + <insert id="InsertLineItemNoKey" parameterClass="LineItem"> + insert into LineItems + (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) + values + (#Id#, #Order.Id#, #Code#, #Quantity#, #Price, type=float#) + </insert> + + <!-- JIRA 23 --> + <delete id="DeleteWithComments" > + <!-- Delete LineItems --> + delete from LineItems where Order_ID = 10; + <!-- Delete LineItems --> + </delete> + + <parameterMap id="line-item-insert-params"> + <parameter property="Id" /> + <parameter property="Order.Id" /> + <parameter property="Code" /> + <parameter property="Quantity" /> + <parameter property="Price" dbType="Decimal" nullValue="-99.99"/> + </parameterMap> + + <parameterMap id="line-item-insert-params-picture"> + <parameter property="Id" /> + <parameter property="Order.Id" /> + <parameter property="Code" /> + <parameter property="Quantity" /> + <parameter property="Price" dbType="Decimal" nullValue="-99.99"/> + <parameter property="PictureData" dbType="Blob" /> + </parameterMap> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/sqlite/Order.xml b/tests/unit/Data/SqlMap/maps/sqlite/Order.xml new file mode 100644 index 00000000..17b45d35 --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/Order.xml @@ -0,0 +1,503 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="Order"> + + <!-- If the type is not specified, ADO.NET infers the + data provider Type of the Parameter from the Value property + of the Parameter object. --> + + + <resultMap id="credit-card-result" class="string"> + <result property="value" column="Order_CardNumber"/> + </resultMap> + <!-- --> + <resultMap id="order-with-lines-result" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" lazyLoad="true" type="TList" column="Order_Id" select="GetLineItemsForOrder" /> + </resultMap> + + <resultMap id="order-with-lines-result-no-lazy-load" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" type="TList" column="Order_Id" select="GetLineItemsForOrder" /> + </resultMap> + + <resultMap id="order-with-lines-result-statement-namespaces" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItemsList" lazyLoad="true" type="TList" column="Order_Id" select="LineItem.GetLineItemsForOrder" /> + </resultMap> + + <resultMap id="order-with-lines-collection" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItems" column="Order_Id" lazyLoad="true" + select="GetLineItemsForOrderWithListClass" /> + </resultMap> + + <resultMap id="order-with-lines-collection-no-lazy-load" class="Order" + extends="lite-order-result-by-name" > + <result property="LineItems" column="Order_Id" + select="GetLineItemsForOrderWithListClass" /> + </resultMap> + + <resultMap id="order-with-lines-array" class="Order" + extends="lite-order-result-by-name"> + <result property="LineItemsArray" column="Order_Id" select="GetLineItemsForOrder"/> + </resultMap> + + <resultMap id="lite-order-map-result" class="array"> + <result property="Id" type="Int" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" type="string" column="Order_CardExpiry"/> + <result property="CardType" type="string" column="Order_CardType"/> + <result property="CardNumber" type="string" column="Order_CardNumber"/> + <result property="Street" type="string" column="Order_Street"/> + <result property="City" type="string" column="Order_City"/> + <result property="Province" type="string" column="Order_Province"/> + <result property="PostalCode" type="string" column="Order_PostalCode"/> + </resultMap> + + <resultMap id="lite-order-result-by-name" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + </resultMap> + + <resultMap id="order-hash" class="array"> + <result property="Date" column="Order_Date" nullValue="0001-01-01 00:00:00"/> + </resultMap> + + <resultMap id="order-with-types-result" class="Order"> + <result property="Id" column="Order_Id" /> + <result property="Date" column="Order_Date" type="date" /> + <result property="CardExpiry" column="Order_CardExpiry" /> + <result property="CardType" column="Order_CardType" /> + <result property="CardNumber" column="Order_CardNumber" /> + <result property="Street" column="Order_Street" /> + <result property="City" column="Order_City" /> + <result property="Province" column="Order_Province" /> + <result property="PostalCode" column="Order_PostalCode" /> + </resultMap> + + <resultMap id="lite-order-result-by-index" class="Order"> + <result property="Id" column="Order_Id" columnIndex="0"/> + <result property="Date" column="Order_Date" type="date" columnIndex="1" /> + <result property="CardExpiry" column="Order_CardExpiry" columnIndex="2"/> + <result property="CardType" column="Order_CardType" columnIndex="3" /> + <result property="CardNumber" column="Order_CardNumber" columnIndex="4" /> + <result property="Street" column="Order_Street" columnIndex="5" /> + <result property="City" column="Order_City" columnIndex="6" /> + <result property="Province" column="Order_Province" columnIndex="7"/> + <result property="PostalCode" column="Order_PostalCode" columnIndex="8" /> + </resultMap> + + <resultMap id="order-with-account-result" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="Account" column="Account_Id" select="GetAccountViaColumnName" /> + </resultMap> + + <resultMap id="order-with-collection-result" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="LineItemsList" column="Order_Id" select="GetLineItemsForOrder" /> + <result property="LineItems" column="Order_Id" select="GetLineItemsForOrder" lazyLoad="false" /> + </resultMap> + + <resultMap id="order-with-favourite-line-item" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" + column="Order_ID=Order_Id,LineItem_ID=Order_FavouriteLineItem" + select="GetSpecificLineItem" /> + </resultMap> + + <resultMap id="order-with-dyn-favourite-line-item" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" + column="Order_ID=Order_Id,LineItem_ID=Order_FavouriteLineItem" + select="GetDynSpecificLineItem" /> + </resultMap> + + <resultMap id="order-joined-favourite" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem" resultMapping="LineItem" /> + </resultMap> + + <resultMap id="order-joined-favourite2" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="FavouriteLineItem.Id" column="LineItem_Id"/> + <result property="FavouriteLineItem.Code" column="LineItem_Code"/> + <result property="FavouriteLineItem.Quantity" column="LineItem_Quantity"/> + <result property="FavouriteLineItem.Price" column="LineItem_Price"/> + </resultMap> + + <resultMap id="order-joined-with-account" class="Order"> + <result property="Id" column="Order_Id"/> + <result property="Date" type="date" column="Order_Date" nullValue="01/01/0001 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="Account" resultMapping="account-result-nullable-email" /> + </resultMap> + + <statement id="GetOrderLiteByColumnName" + parameterClass="integer" + resultMap="lite-order-result-by-name" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderByHashTable" + parameterClass="Int" + resultMap="order-hash" > + select Order_Date from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderLiteByColumnIndex" + parameterClass="Int" + resultMap="lite-order-result-by-index" > + select + Order_Id, + Order_Date, + Order_CardExpiry, + Order_CardType, + Order_CardNumber, + Order_Street, + Order_City, + Order_Province, + Order_PostalCode + from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithTypes" + parameterClass="Int" + resultMap="order-with-types-result" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItems" + parameterClass="Integer" + ListClass="TList" + resultMap="order-with-lines-result" > + select * from Orders where Order_Id = #value# + </statement> + + + <statement id="GetOrderWithLineItemsNoLazyLoad" + parameterClass="Integer" + resultMap="order-with-lines-result-no-lazy-load" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemsUsingStatementNamespaces" + parameterClass="Integer" + resultMap="order-with-lines-result-statement-namespaces" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetAllOrderWithLineItems" + resultMap="order-with-lines-result" > + select * from Orders + </statement> + + <statement id="GetOrderCardExpiryViaResultClass" + parameterClass="int" + resultClass="date"> + select + Order_Date as 'datetime' + from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithAccount" + parameterClass="int" + resultMap="order-with-account-result" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemsCollection" + parameterClass="Integer" + resultMap="order-with-collection-result" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderJoinedFavourite" + parameterClass="Integer" + resultMap="order-joined-favourite" > + select + Orders.Order_Id as Order_Id, + Orders.Account_Id as Account_Id, + Orders.Order_Date as Order_Date, + Orders.Order_CardType as Order_CardType, + Orders.Order_CardNumber as Order_CardNumber, + Orders.Order_CardExpiry as Order_CardExpiry, + Orders.Order_Street as Order_Street, + Orders.Order_City as Order_City, + Orders.Order_Province as Order_Province, + Orders.Order_PostalCode as Order_PostalCode, + Orders.Order_FavouriteLineItem as Order_FavouriteLineItem, + LineItems.LineItem_Id as LineItem_Id, + LineItems.Order_Id as Order_Id, + LineItems.LineItem_Code as LineItem_Code, + LineItems.LineItem_Quantity as LineItem_Quantity, + LineItems.LineItem_Price as LineItem_Price, + LineItems.LineItem_Picture as LineItem_Picture + + from Orders, LineItems + where Orders.Order_Id = LineItems.Order_Id + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_Id = #value# + </statement> + + <statement id="GetOrderJoinedFavourite2" + parameterClass="Integer" + resultMap="order-joined-favourite2" > + select + + Orders.Order_Id as Order_Id, + Orders.Account_Id as Account_Id, + Orders.Order_Date as Order_Date, + Orders.Order_CardType as Order_CardType, + Orders.Order_CardNumber as Order_CardNumber, + Orders.Order_CardExpiry as Order_CardExpiry, + Orders.Order_Street as Order_Street, + Orders.Order_City as Order_City, + Orders.Order_Province as Order_Province, + Orders.Order_PostalCode as Order_PostalCode, + Orders.Order_FavouriteLineItem as Order_FavouriteLineItem, + LineItems.LineItem_Id as LineItem_Id, + LineItems.Order_Id as Order_Id, + LineItems.LineItem_Code as LineItem_Code, + LineItems.LineItem_Quantity as LineItem_Quantity, + LineItems.LineItem_Price as LineItem_Price, + LineItems.LineItem_Picture as LineItem_Picture + + from Orders, LineItems + where Orders.Order_Id = LineItems.Order_Id + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_Id = #value# + </statement> + + <statement id="GetOrderJoinedFavourite3" + parameterClass="Integer" + resultClass="Order" > + select + Orders.Order_Id as Id, + Order_Date as Date, + Order_CardExpiry as CardExpiry, + Order_CardType as CardType, + Order_CardNumber as CardNumber, + Order_Street as Street, + Order_City as City, + Order_Province as Province, + Order_PostalCode as PostalCode, + LineItem_ID as "FavouriteLineItem.Id", + LineItem_Code as "FavouriteLineItem.Code", + LineItem_Quantity as "FavouriteLineItem.Quantity", + LineItem_Price as "FavouriteLineItem.Price" + from Orders, LineItems + where Orders.Order_Id = LineItems.Order_Id + and Order_FavouriteLineItem = LineItems.LineItem_ID + and Orders.Order_Id = #value# + </statement> + + <statement id="GetOrderWithFavouriteLineItem" + parameterClass="int" + resultMap="order-with-favourite-line-item" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemCollection" + parameterClass="int" + resultMap="order-with-lines-collection" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemCollectionNoLazy" + parameterClass="int" + resultMap="order-with-lines-collection-no-lazy-load" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderAsHastable" + parameterClass="Integer" + resultMap="lite-order-map-result" > + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetOrderWithLineItemArray" + parameterClass="int" + resultMap="order-with-lines-array"> + select * from Orders where Order_Id = #value# + </statement> + + <statement id="GetAllCreditCardNumbersFromOrders" + resultMap="credit-card-result" > + select distinct Order_CardNumber from Orders + order by Order_CardNumber + </statement> + + <statement id="InsertOrderViaParameterMap" + parameterMap="order-insert-params-full" > + insert into Orders + (Order_Id, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + </statement> + + <statement id="InsertOrderViaExtendParameterMap" + parameterMap="insert-extend" > + insert into Orders + (Order_Id, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + </statement> + + <statement id="InsertOrderViaPublicFields"> + insert into Orders + (Order_Id, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, + Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) + values + (#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#) + </statement> + + <select id="GetOrderWithDynFavouriteLineItem" + parameterClass="Integer" + resultMap="order-with-dyn-favourite-line-item"> + select * from Orders where Order_Id = #value# + </select> + + <select id="SelectOrderByDate" + parameterClass="array" + resultMap="lite-order-result-by-name"> + select * from Orders where Order_Date = #Foo# + </select> + + <select id="SelectOrderByDateDynamic" + parameterClass="array" + resultMap="lite-order-result-by-name"> + select * from Orders + where 1=1 + <isNotEmpty prepend="AND" property="Foo"> + (Order_Date = '$Foo$') + </isNotEmpty> + </select> + + <select id="GetAccountJIRA45" + parameterClass="int" + resultMap="indexed-account-result"> + select + Account_Id, + Account_FirstName, + Account_LastName, + Account_Email + from Accounts + where Account_ID = #value# + </select> + + <select id="GetOrderJoinWithAccount" + parameterClass="Integer" + resultMap="order-joined-with-account"> + select + Order_Id, + Order_Date, + Order_CardExpiry, + Order_CardType, + Order_CardNumber, + Order_Street, + Order_City, + Order_Province, + Order_PostalCode, + acc.Account_ID as Account_ID, + acc.Account_FirstName as Account_FirstName, + acc.Account_LastName as Account_LastName, + acc.Account_Email as Account_Email + from Orders as ord + LEFT OUTER JOIN Accounts as acc on acc.Account_ID = ord.Account_ID + where Order_Id = #value# + </select> + + <parameterMap id="order-insert-params-full"> + <parameter property="Id" dbType="Int32"/> + <parameter property="Account.Id"/> + <parameter property="Date" nullValue="0001-01-01 00:00:00" /> + <parameter property="CardExpiry" /> + <parameter property="CardType" /> + <parameter property="CardNumber" /> + <parameter property="Street" /> + <parameter property="City" /> + <parameter property="Province" /> + <parameter property="PostalCode" /> + </parameterMap> + + <parameterMap id="params-parent"> <!-- 1043181 support request --> + <parameter property="Id" dbType="Int32"/> + <parameter property="Account.Id"/> + <parameter property="Date" nullValue="0001-01-01 00:00:00" /> + <parameter property="CardExpiry" /> + <parameter property="CardType" /> + <parameter property="CardNumber" /> + <parameter property="Street" /> + <parameter property="City" /> + <parameter property="Province" /> + <parameter property="PostalCode" /> + </parameterMap> + + <parameterMap id="insert-extend" extends="params-parent"> + </parameterMap> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/sqlite/Other.xml b/tests/unit/Data/SqlMap/maps/sqlite/Other.xml new file mode 100644 index 00000000..f8683f7e --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/Other.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMap namespace="Other" > + + <resultMap id="other-result" class="Other" > + <result property="Int" column="Other_Int"/> + <result property="Long" column="Other_Long"/> + <result property="Bool" column="Other_Bit"/> + <result property="Bool2" column="Other_String" typeHandler="OuiNonBool"/> + </resultMap> + + <resultMap id="other-result-V1" class="Other" > + <result property="Int" column="Other_Int"/> + <result property="Long" column="Other_Long"/> + <result property="Bool" column="Other_Bit"/> + <result property="Bool2" column="Other_String" /> + </resultMap> + + <resultMap id="A-result" class="A" > + <result property="Id" column="A_ID"/> + <result property="Libelle" column="A_Libelle"/> + <result property="B" resultMapping="B-result"/> + <result property="E" resultMapping="E-result"/> + <result property="F" resultMapping="F-result"/> + </resultMap> + + <resultMap id="B-result" class="B" > + <result property="Id" column="B_ID"/> + <result property="Libelle" column="B_Libelle"/> + <result property="C" resultMapping="C-result"/> + <result property="D" resultMapping="D-result"/> + </resultMap> + + <resultMap id="C-result" class="C" > + <result property="Id" column="C_ID"/> + <result property="Libelle" column="C_Libelle"/> + </resultMap> + + <resultMap id="D-result" class="D" > + <result property="Id" column="D_ID"/> + <result property="Libelle" column="D_Libelle"/> + </resultMap> + + <resultMap id="E-result" class="E" > + <result property="Id" column="E_ID"/> + <result property="Libelle" column="E_Libelle"/> + </resultMap> + + <resultMap id="F-result" class="F" > + <result property="Id" column="F_ID"/> + <result property="Libelle" column="F_Libelle"/> + </resultMap> + + <select id="SelectComplexJoined" resultMap="A-result"> + SELECT + A.Id AS A_ID, + A.A_Libelle AS A_Libelle, + B.ID AS B_ID, + B.B_Libelle AS B_Libelle, + C.ID AS C_ID, + C.C_Libelle AS C_Libelle, + D.ID AS D_ID, + D.D_Libelle AS D_Libelle, + E.ID AS E_ID, + E.E_Libelle AS E_Libelle, + F.ID AS F_ID, + F.F_Libelle AS F_Libelle + FROM A + LEFT OUTER JOIN B ON A.B_ID = B.ID + LEFT OUTER JOIN C ON B.C_ID = C.ID + LEFT OUTER JOIN D ON B.D_ID = D.ID + LEFT OUTER JOIN E ON A.E_ID = E.ID + LEFT OUTER JOIN F ON A.F_ID = F.ID + </select> + + + <statement id="DynamicSelectByIntLong" + parameterClass="Hashtable" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + <dynamic prepend="WHERE"> + <isNotEqual prepend="AND" property="year" compareValue="0"> + Other_Int = #year# + </isNotEqual> + + <isNotEqual prepend="AND" property="areaid" compareValue="0"> + Other_Long = #areaid# + </isNotEqual> + </dynamic> + </statement> + + <statement id="DynamicSelectByBool" + parameterClass="Other" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Bit = #Bool# + </statement> + + <statement id="InsertBool" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, 'Yes') + </statement> + + <statement id="InsertCustomTypeHandler" + parameterMap="other-insert-params"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( ?, ?, ?, ?) + </statement> + + <statement id="SelectByInt" + parameterClass="int" + resultMap="other-result"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Int = #value# + </statement> + + <statement id="SelectByIntV1" + parameterClass="int" + resultMap="other-result-V1"> + select + Other_Int, + Other_Long, + Other_Bit, + Other_String + from Others + Where Other_Int = #value# + </statement> + + <statement id="InsertInlineCustomTypeHandlerV1" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#) + </statement> + + <statement id="InsertInlineCustomTypeHandlerV2" + parameterClass="Other"> + Insert into Others + ( Other_Int, Other_Long, Other_Bit, Other_String ) + values + ( #Int#, #Long#, #Bool#, #Bool2,typeHandler=OuiNonBool#) + </statement> + + <parameterMap id="other-insert-params"> + <parameter property="Int" /> + <parameter property="Long" /> + <parameter property="Bool" /> + <parameter property="Bool2" typeHandler="OuiNonBool"/> + </parameterMap> +</sqlMap> diff --git a/tests/unit/Data/SqlMap/maps/sqlite/ResultClass.xml b/tests/unit/Data/SqlMap/maps/sqlite/ResultClass.xml new file mode 100644 index 00000000..8be5fcca --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/sqlite/ResultClass.xml @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<sqlMap namespace="ResultClass" > + + <statement id="GetBoolean" + parameterClass="Int" + resultClass="bool" > + select 1 from Orders where Order_ID = #dummy# + </statement> + <statement id="GetBooleanWithoutResultClass" + parameterClass="Int" + extends="GetBoolean"> + </statement> + + <statement id="GetByte" + parameterClass="Int" + resultClass="string" > + select 155 from Orders where Order_ID = #value# + </statement> + <statement id="GetByteWithoutResultClass" + parameterClass="Int" + extends="GetByte"> + </statement> + + <!-- + NOTE: Use MySql 4.0.2 or higher for "cast" + --> + <statement id="GetChar" + parameterClass="Int" + resultClass="string" > + select 'a' from Orders where Order_ID = #value# + </statement> + <statement id="GetCharWithoutResultClass" + parameterClass="Int" + extends="GetChar"> + </statement> + + <statement id="GetDate" + parameterClass="Int" + resultClass="TDateTime" > + select '2003-02-15 8:15:00' as datetime from Orders where Order_ID = #value# + </statement> + <statement id="GetDateWithoutResultClass" + parameterClass="Int" + extends="GetDate"> + </statement> + + <statement id="GetDecimal" + parameterClass="Int" + resultClass="float" > + select 1.56 from Orders where Order_ID = #value# + </statement> + <statement id="GetDecimalWithoutResultClass" + parameterClass="Int" + extends="GetDecimal"> + </statement> + + <statement id="GetDouble" + parameterClass="Int" + resultClass="float" > + select 99.5 from Orders where Order_ID= #value# + </statement> + <statement id="GetDoubleWithoutResultClass" + parameterClass="Int" + extends="GetDouble"> + </statement> + + <!-- + Use binary for cast for MySql + --> + <statement id="GetGuid" + parameterClass="Int" + resultClass="guid" > + select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as binary) from Orders where Order_ID = #value# + </statement> + <statement id="GetGuidWithoutResultClass" parameterClass="Int" extends="GetGuid"> + </statement> + + <statement id="GetInt16" + parameterClass="Int" + resultClass="int" > + select 32111 from Orders where Order_ID = #value# + </statement> + <statement id="GetInt16WithoutResultClass" + parameterClass="Int" + extends="GetInt16"> + </statement> + + <statement id="GetInt32" + parameterClass="Int" + resultClass="int" > + select 999999 from Orders where Order_ID = #value# + </statement> + <statement id="GetInt32WithoutResultClass" + parameterClass="Int" + extends="GetInt32"> + </statement> + + <statement id="GetInt64" + parameterClass="Int" + resultClass="double" > + select 9223372036854775800 from Orders where Order_ID = #value# + </statement> + <statement id="GetInt64WithoutResultClass" + parameterClass="Int" + extends="GetInt64"> + </statement> + + <statement id="GetSingle" + parameterClass="Int" + resultClass="float" > + select 92233.5 from Orders where Order_ID = #value# + </statement> + <statement id="GetSingleWithoutResultClass" + parameterClass="Int" + extends="GetSingle"> + </statement> + + <statement id="GetString" + parameterClass="Int" + resultClass="string" > + select 'VISA' + from Orders where Order_ID = #value# + </statement> + <statement id="GetStringWithoutResultClass" + parameterClass="Int" + extends="GetString"> + </statement> + +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/maps/tests.xml b/tests/unit/Data/SqlMap/maps/tests.xml new file mode 100644 index 00000000..d2f45c2f --- /dev/null +++ b/tests/unit/Data/SqlMap/maps/tests.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<sqlmap> + +<statement id="test" parameterClass="array" > + <![CDATA[ + SELECT a.*, b.* + FROM img_request a + left join hello_mst b on a.img_pat_id=b.pat_id + WHERE (img_requested_ap_dt >= #fromdt# and img_requested_ap_dt <= #todt#) + ]]> +</statement> + +<select id="GetAllProgress" parameterClass="array" extends="test"> + <![CDATA[ + AND img_progress =#status# + ]]> +</select> + +</sqlmap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/mssql.xml b/tests/unit/Data/SqlMap/mssql.xml new file mode 100644 index 00000000..d2bec5d5 --- /dev/null +++ b/tests/unit/Data/SqlMap/mssql.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMapConfig> + + <properties resource="properties.config"/> + + <settings> + <setting useStatementNamespaces="false"/> + <setting cacheModelsEnabled="true"/> + </settings> + + <!-- ==== Database configuration ========= --> + <provider class="TAdodbProvider" > + <!-- connection string set in common.php --> + <datasource /> + </provider> + + <typeHandlers> + <typeHandler type="bool" dbType="Varchar" callback="OuiNonBool"/> + </typeHandlers> + + <sqlMaps> + <sqlMap name="Account" resource="maps/mssql/Account.xml"/> + <sqlMap name="DynamicAccount" resource="maps/mssql/DynamicAccount.xml"/> + <sqlMap name="Order" resource="maps/mssql/Order.xml"/> + <sqlMap name="Category" resource="maps/mssql/Category.xml"/> + <sqlMap name="Complex" resource="maps/mssql/Complex.xml"/> + <sqlMap name="LineItem" resource="maps/mssql/LineItem.xml"/> + <sqlMap name="Enumeration" resource="maps/mssql/Enumeration.xml"/> + <sqlMap name="Other" resource="maps/mssql/Other.xml"/> + <sqlMap name="ResultClass" resource="maps/mssql/ResultClass.xml"/> + <sqlMap name="Document" resource="maps/mssql/Document.xml"/> + </sqlMaps> +</sqlMapConfig>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/mysql.xml b/tests/unit/Data/SqlMap/mysql.xml new file mode 100644 index 00000000..b4ac85b8 --- /dev/null +++ b/tests/unit/Data/SqlMap/mysql.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMapConfig> + + <properties> + <property name="selectKey" value="select @@IDENTITY as value" /> + <property name="MyCategoryName" value="'Film'" /> + <property name="accountName" value="'Joe'" /> + </properties> + + <typeHandlers> + <typeHandler dbType="Varchar" class="OuiNonBool"/> + <typeHandler dbType="date" class="TDateTimeHandler" /> + </typeHandlers> + + <sqlMaps> + <sqlMap name="Account" resource="maps/MySql/Account.xml"/> + <sqlMap name="DynamicAccount" resource="maps/MySql/DynamicAccount.xml"/> + <sqlMap name="Order" resource="maps/MySql/Order.xml"/> + <sqlMap name="Category" resource="maps/MySql/Category.xml"/> + <sqlMap name="Complex" resource="maps/MySql/Complex.xml"/> + <sqlMap name="LineItem" resource="maps/MySql/LineItem.xml"/> + <sqlMap name="Enumeration" resource="maps/MySql/Enumeration.xml"/> + <sqlMap name="Other" resource="maps/MySql/Other.xml"/> + <sqlMap name="ResultClass" resource="maps/MySql/ResultClass.xml"/> + <sqlMap name="Document" resource="maps/MySql/Document.xml"/> + <sqlMap resource="maps/MySql/ActiveRecord.xml"/> + </sqlMaps> + +</sqlMapConfig>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/properties.config b/tests/unit/Data/SqlMap/properties.config new file mode 100644 index 00000000..4906531e --- /dev/null +++ b/tests/unit/Data/SqlMap/properties.config @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" ?> +<settings> + + <add key="selectKey" value="select @@IDENTITY as value" /> + <add key="MyCategoryName" value="'Film'" /> + <add key="accountName" value="'Joe'" /> + +</settings> diff --git a/tests/unit/Data/SqlMap/queryForListLimitTest.php b/tests/unit/Data/SqlMap/queryForListLimitTest.php new file mode 100644 index 00000000..7038dc68 --- /dev/null +++ b/tests/unit/Data/SqlMap/queryForListLimitTest.php @@ -0,0 +1,38 @@ +<?php + +require_once(dirname(__FILE__).'/BaseCase.php'); + +/** + * @package System.Data.SqlMap + */ +class queryForListLimitTest extends BaseCase +{ + function __construct() + { + parent::__construct(); + + $this->initSqlMap(); + + //force autoload + new Account; + } + + function resetDatabase() + { + $this->initScript('account-init.sql'); + } + + function test_accounts_limit_2() + { + $list1 = $this->sqlmap->queryForList('GetAllAccountsAsArrayListViaResultClass',null,null,1,2); + $this->assertEqual(count($list1),2); + + $this->assertEqual($list1[0][0],'2'); + $this->assertEqual($list1[0][1],'Averel'); + $this->assertEqual($list1[0][2],'Dalton'); + + $this->assertEqual($list1[1][0],'3'); + $this->assertEqual($list1[1][1],'William'); + $this->assertEqual($list1[1][2],'Dalton'); + } +} diff --git a/tests/unit/Data/SqlMap/resources/data.db b/tests/unit/Data/SqlMap/resources/data.db Binary files differnew file mode 100644 index 00000000..b8c158cc --- /dev/null +++ b/tests/unit/Data/SqlMap/resources/data.db diff --git a/tests/unit/Data/SqlMap/resources/person.xml b/tests/unit/Data/SqlMap/resources/person.xml new file mode 100644 index 00000000..b4d93960 --- /dev/null +++ b/tests/unit/Data/SqlMap/resources/person.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" ?> +<sqlMap namespace="Person" > + + <typeAlias alias="Person" type="Person" /> + + <resultMap id="SelectResult" class="Person"> + <result property="ID" column="per_id" /> + <result property="FirstName" column="per_first_name" /> + <result property="LastName" column="per_last_name" /> + <result property="BirthDate" column="per_birth_date" /> + <result property="WeightInKilograms" column="per_weight_kg" /> + <result property="HeightInMeters" column="per_height_m" /> + </resultMap> + + <select id="Person.SelectAll" resultMap="SelectResult"> + SELECT + per_id, + per_first_name, + per_last_name, + per_birth_date, + per_weight_kg, + per_height_m + FROM + person + </select> +</sqlMap>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/resources/sqlmap.xml b/tests/unit/Data/SqlMap/resources/sqlmap.xml new file mode 100644 index 00000000..ee24a3ef --- /dev/null +++ b/tests/unit/Data/SqlMap/resources/sqlmap.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<sqlMapConfig> + + <provider class="TAdodb"> + <datasource driver="sqlite" host="resources/test.db" /> + </provider> + + <sqlMaps> + <sqlMap id="Person" resource="person.xml"/> + </sqlMaps> + +</sqlMapConfig>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/resources/test.db b/tests/unit/Data/SqlMap/resources/test.db Binary files differnew file mode 100644 index 00000000..b8c158cc --- /dev/null +++ b/tests/unit/Data/SqlMap/resources/test.db diff --git a/tests/unit/Data/SqlMap/resources/tests.db b/tests/unit/Data/SqlMap/resources/tests.db new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/tests/unit/Data/SqlMap/resources/tests.db diff --git a/tests/unit/Data/SqlMap/scripts/mssql/DBCreation.sql b/tests/unit/Data/SqlMap/scripts/mssql/DBCreation.sql new file mode 100644 index 00000000..b4e017d7 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/DBCreation.sql @@ -0,0 +1,89 @@ +-- MSQL DATABASE + +IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet') + DROP DATABASE [IBatisNet] +GO + +CREATE DATABASE [IBatisNet] + COLLATE Latin1_General_CI_AS +GO + +exec sp_dboption N'IBatisNet', N'autoclose', N'true' +GO + +exec sp_dboption N'IBatisNet', N'bulkcopy', N'false' +GO + +exec sp_dboption N'IBatisNet', N'trunc. log', N'true' +GO + +exec sp_dboption N'IBatisNet', N'torn page detection', N'true' +GO + +exec sp_dboption N'IBatisNet', N'read only', N'false' +GO + +exec sp_dboption N'IBatisNet', N'dbo use', N'false' +GO + +exec sp_dboption N'IBatisNet', N'single', N'false' +GO + +exec sp_dboption N'IBatisNet', N'autoshrink', N'true' +GO + +exec sp_dboption N'IBatisNet', N'ANSI null default', N'false' +GO + +exec sp_dboption N'IBatisNet', N'recursive triggers', N'false' +GO + +exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false' +GO + +exec sp_dboption N'IBatisNet', N'concat null yields null', N'false' +GO + +exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false' +GO + +exec sp_dboption N'IBatisNet', N'default to local cursor', N'false' +GO + +exec sp_dboption N'IBatisNet', N'quoted identifier', N'false' +GO + +exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false' +GO + +exec sp_dboption N'IBatisNet', N'auto create statistics', N'true' +GO + +exec sp_dboption N'IBatisNet', N'auto update statistics', N'true' +GO + +if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) + exec sp_dboption N'IBatisNet', N'db chaining', N'false' +GO + +if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') + exec sp_droplogin N'IBatisNet' +GO + +use [IBatisNet] +GO + +if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') +BEGIN + declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) + select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english' + exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang +END +GO + +if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382) + EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet' +GO + +exec sp_addrolemember N'db_owner', N'IBatisNet' +GO
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mssql/DataBase.sql b/tests/unit/Data/SqlMap/scripts/mssql/DataBase.sql new file mode 100644 index 00000000..75a1f974 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/DataBase.sql @@ -0,0 +1,179 @@ +-- MSQL DATABASE 'IBatisNet' + +IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet') + DROP DATABASE [IBatisNet] +GO + +CREATE DATABASE [IBatisNet] + COLLATE Latin1_General_CI_AS +GO + +exec sp_dboption N'IBatisNet', N'autoclose', N'true' +GO + +exec sp_dboption N'IBatisNet', N'bulkcopy', N'false' +GO + +exec sp_dboption N'IBatisNet', N'trunc. log', N'true' +GO + +exec sp_dboption N'IBatisNet', N'torn page detection', N'true' +GO + +exec sp_dboption N'IBatisNet', N'read only', N'false' +GO + +exec sp_dboption N'IBatisNet', N'dbo use', N'false' +GO + +exec sp_dboption N'IBatisNet', N'single', N'false' +GO + +exec sp_dboption N'IBatisNet', N'autoshrink', N'true' +GO + +exec sp_dboption N'IBatisNet', N'ANSI null default', N'false' +GO + +exec sp_dboption N'IBatisNet', N'recursive triggers', N'false' +GO + +exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false' +GO + +exec sp_dboption N'IBatisNet', N'concat null yields null', N'false' +GO + +exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false' +GO + +exec sp_dboption N'IBatisNet', N'default to local cursor', N'false' +GO + +exec sp_dboption N'IBatisNet', N'quoted identifier', N'false' +GO + +exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false' +GO + +exec sp_dboption N'IBatisNet', N'auto create statistics', N'true' +GO + +exec sp_dboption N'IBatisNet', N'auto update statistics', N'true' +GO + +if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) + exec sp_dboption N'IBatisNet', N'db chaining', N'false' +GO + +if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') + exec sp_droplogin N'IBatisNet' +GO + +use [IBatisNet] +GO + +if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') +BEGIN + declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) + select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english' + exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang +END +GO + +if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382) + EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet' +GO + +exec sp_addrolemember N'db_owner', N'IBatisNet' +GO + +-- MSQL DATABASE 'NHibernate' + +IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'NHibernate') + DROP DATABASE [NHibernate] +GO + +CREATE DATABASE [NHibernate] + COLLATE Latin1_General_CI_AS +GO + +exec sp_dboption N'NHibernate', N'autoclose', N'true' +GO + +exec sp_dboption N'NHibernate', N'bulkcopy', N'false' +GO + +exec sp_dboption N'NHibernate', N'trunc. log', N'true' +GO + +exec sp_dboption N'NHibernate', N'torn page detection', N'true' +GO + +exec sp_dboption N'NHibernate', N'read only', N'false' +GO + +exec sp_dboption N'NHibernate', N'dbo use', N'false' +GO + +exec sp_dboption N'NHibernate', N'single', N'false' +GO + +exec sp_dboption N'NHibernate', N'autoshrink', N'true' +GO + +exec sp_dboption N'NHibernate', N'ANSI null default', N'false' +GO + +exec sp_dboption N'NHibernate', N'recursive triggers', N'false' +GO + +exec sp_dboption N'NHibernate', N'ANSI nulls', N'false' +GO + +exec sp_dboption N'NHibernate', N'concat null yields null', N'false' +GO + +exec sp_dboption N'NHibernate', N'cursor close on commit', N'false' +GO + +exec sp_dboption N'NHibernate', N'default to local cursor', N'false' +GO + +exec sp_dboption N'NHibernate', N'quoted identifier', N'false' +GO + +exec sp_dboption N'NHibernate', N'ANSI warnings', N'false' +GO + +exec sp_dboption N'NHibernate', N'auto create statistics', N'true' +GO + +exec sp_dboption N'NHibernate', N'auto update statistics', N'true' +GO + +if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) + exec sp_dboption N'NHibernate', N'db chaining', N'false' +GO + +if exists (select * from master.dbo.syslogins where loginname = N'NHibernate') + exec sp_droplogin N'NHibernate' +GO + +use [NHibernate] +GO + +if not exists (select * from master.dbo.syslogins where loginname = N'NHibernate') +BEGIN + declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) + select @logindb = N'NHibernate', @loginpass=N'test', @loginlang = N'us_english' + exec sp_addlogin N'NHibernate', @loginpass, @logindb, @loginlang +END +GO + +if not exists (select * from dbo.sysusers where name = N'NHibernate' and uid < 16382) + EXEC sp_grantdbaccess N'NHibernate', N'NHibernate' +GO + +exec sp_addrolemember N'db_owner', N'NHibernate' +GO
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mssql/README-embed-param.txt b/tests/unit/Data/SqlMap/scripts/mssql/README-embed-param.txt new file mode 100644 index 00000000..639e61a8 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/README-embed-param.txt @@ -0,0 +1,8 @@ +Technique for creating large sample test data from: + +http://www.sql-server-performance.com/jc_large_data_operations.asp + +Make sure you have enough space and have either enough processing power or +enough patience to run the Embed Parameters in Statement tests. + +Run embed-parameters-setup-init.sql prior to running tests. diff --git a/tests/unit/Data/SqlMap/scripts/mssql/account-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/account-init.sql new file mode 100644 index 00000000..4b8e3ece --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/account-init.sql @@ -0,0 +1,47 @@ +-- Creating Table + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Accounts]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Orders_Accounts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) + ALTER TABLE [dbo].[Orders] DROP CONSTRAINT FK_Orders_Accounts + + drop table [dbo].[Accounts] +END + +CREATE TABLE [dbo].[Accounts] ( + [Account_ID] [int] NOT NULL , + [Account_FirstName] [varchar] (32) NOT NULL , + [Account_LastName] [varchar] (32) NOT NULL , + [Account_Email] [varchar] (128) NULL, + [Account_Banner_Option] [varchar] (255), + [Account_Cart_Option] [int] +) ON [PRIMARY] + +ALTER TABLE [dbo].[Accounts] WITH NOCHECK ADD + CONSTRAINT [PK_Account] PRIMARY KEY CLUSTERED + ( + [Account_ID] + ) ON [PRIMARY] + +-- Creating Test Data + +INSERT INTO [dbo].[Accounts] VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200); +INSERT INTO [dbo].[Accounts] VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200); +INSERT INTO [dbo].[Accounts] VALUES(3,'William', 'Dalton', null, 'Non', 100); +INSERT INTO [dbo].[Accounts] VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100); +INSERT INTO [dbo].[Accounts] VALUES(5,'Gilles', 'Bayon', null, 'Oui', 100); + +-- Store procedure + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_InsertAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) +drop procedure [dbo].[ps_InsertAccount] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_SelectAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) +drop procedure [dbo].[ps_SelectAccount] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_swap_email_address]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) +drop procedure [dbo].[ps_swap_email_address] + + diff --git a/tests/unit/Data/SqlMap/scripts/mssql/account-procedure.sql b/tests/unit/Data/SqlMap/scripts/mssql/account-procedure.sql new file mode 100644 index 00000000..fdb5c3d9 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/account-procedure.sql @@ -0,0 +1,12 @@ +CREATE PROCEDURE dbo.[ps_InsertAccount] +@Account_ID [int], +@Account_FirstName [nvarchar] (40), +@Account_LastName [varchar] (32), +@Account_Email [varchar] (128), +@Account_Banner_Option [varchar] (255), +@Account_Cart_Option [int] +AS +insert into Accounts + (Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) +values + (@Account_ID, @Account_FirstName, @Account_LastName, @Account_Email, @Account_Banner_Option, @Account_Cart_Option) diff --git a/tests/unit/Data/SqlMap/scripts/mssql/category-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/category-init.sql new file mode 100644 index 00000000..d7a7cfa5 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/category-init.sql @@ -0,0 +1,17 @@ +-- Creating Table + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +drop table [dbo].[Categories] + +CREATE TABLE [dbo].[Categories] ( + [Category_Id] [int] IDENTITY (1, 1) NOT NULL , + [Category_Name] [varchar] (32) NULL, + [Category_Guid] [uniqueidentifier] NULL +) ON [PRIMARY] + +-- Store procedure + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_InsertCategorie]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) +drop procedure [dbo].[ps_InsertCategorie] diff --git a/tests/unit/Data/SqlMap/scripts/mssql/category-procedure.sql b/tests/unit/Data/SqlMap/scripts/mssql/category-procedure.sql new file mode 100644 index 00000000..bf565e87 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/category-procedure.sql @@ -0,0 +1,10 @@ +CREATE PROCEDURE dbo.[ps_InsertCategorie] +@Category_Id [int] output, +@Category_Name [varchar] (32), +@Category_Guid [uniqueidentifier] +AS +insert into Categories + (Category_Name, Category_Guid ) +values + (@Category_Name, @Category_Guid) +SELECT @Category_Id = SCOPE_IDENTITY()
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mssql/documents-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/documents-init.sql new file mode 100644 index 00000000..b268c258 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/documents-init.sql @@ -0,0 +1,34 @@ +-- Creating Table + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Documents]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) + ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders + + drop table [dbo].[Documents] +END + +CREATE TABLE [dbo].[Documents] ( + [Document_ID] [int] NOT NULL , + [Document_Title] [varchar] (32) NULL , + [Document_Type] [varchar] (32) NULL , + [Document_PageNumber] [int] NULL , + [Document_City] [varchar] (32) NULL +) ON [PRIMARY] + +ALTER TABLE [dbo].[Documents] WITH NOCHECK ADD + CONSTRAINT [PK_Documents] PRIMARY KEY CLUSTERED + ( + [Document_ID] + ) ON [PRIMARY] + +-- Creating Test Data + +INSERT INTO [dbo].[Documents] VALUES (1, 'The World of Null-A', 'Book', 55, null); +INSERT INTO [dbo].[Documents] VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon'); +INSERT INTO [dbo].[Documents] VALUES (3, 'Lord of the Rings', 'Book', 3587, null); +INSERT INTO [dbo].[Documents] VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris'); +INSERT INTO [dbo].[Documents] VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris'); +INSERT INTO [dbo].[Documents] VALUES (6, 'Foundation', 'Monograph', 557, null); diff --git a/tests/unit/Data/SqlMap/scripts/mssql/embed-param-setup-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/embed-param-setup-init.sql new file mode 100644 index 00000000..c0bf20e8 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/embed-param-setup-init.sql @@ -0,0 +1,94 @@ +-- Technique for creating large sample test data from +-- http://www.sql-server-performance.com/jc_large_data_operations.asp + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecords]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +drop table [dbo].[ManyRecords] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecordsTest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +drop table [dbo].[ManyRecordsTest] + + + +-- Create Data Storage Table +CREATE TABLE [dbo].[ManyRecords] ( + [Many_FirstID] [int] NOT NULL, + [Many_SecondID] [int] NOT NULL, + [Many_ThirdID] [int] NOT NULL, + [Many_FourthID] [int] NOT NULL, + [Many_FifthID] [int] NOT NULL, + [Many_SequenceID] [int] NOT NULL, + [Many_DistributedID] [int] NOT NULL, + [Many_SampleCharValue] [char] (10) NOT NULL, + [Many_SampleDecimal] [decimal] (9,4) NOT NULL, + [Many_SampleMoney] [money] NOT NULL, + [Many_SampleDate] [datetime] NOT NULL, + [Many_SequenceDate] [datetime] NOT NULL ) +ON [PRIMARY] + + + +-- Create Sample Data of 1 million records (increase if needed) +BEGIN TRANSACTION + DECLARE @intIndex int, @rowCount int, @seqCount int, @distValue int + SELECT @intIndex = 1, @rowCount = 1000000, @seqCount = 10000 + SELECT @distValue = @rowCount/10000 + + WHILE @intIndex <= @rowCount + BEGIN + INSERT INTO [dbo].[ManyRecords] ( + [Many_FirstID], + [Many_SecondID], + [Many_ThirdID], + [Many_FourthID], + [Many_FifthID], + [Many_SequenceID], + [Many_DistributedID], + [Many_SampleCharValue], + [Many_SampleDecimal], + [Many_SampleMoney], + [Many_SampleDate], + [Many_SequenceDate] ) + VALUES ( + @intIndex, -- First + @intIndex/2, -- Second + @intIndex/4, -- Third + @intIndex/10, -- Fourth + @intIndex/20, -- Fifth + (@intIndex-1)/@seqCount + 1, -- Sequential value + (@intIndex-1)%(@distValue) + 1, -- Distributed value + CHAR(65 + 26*rand())+CHAR(65 + 26*rand())+CHAR(65 + 26*rand())+CONVERT(char(6),CONVERT(int,100000*(9.0*rand()+1.0)))+CHAR(65 + 26*rand()), -- Char Value + 10000*rand(), -- Decimal value + 10000*rand(), -- Money value + DATEADD(hour,100000*rand(),'1990-01-01'), -- Date value + DATEADD(hour,@intIndex/5,'1990-01-01') ) -- Sequential date value + + SET @intIndex = @intIndex + 1 + END +COMMIT TRANSACTION + + + +-- Create Test table using storage table sample data +SELECT + [Many_FirstID], + [Many_SecondID], + [Many_ThirdID], + [Many_FourthID], + [Many_FifthID], + [Many_SequenceID], + [Many_DistributedID], + [Many_SampleCharValue], + [Many_SampleDecimal], + [Many_SampleMoney], + [Many_SampleDate], + [Many_SequenceDate] +INTO [dbo].[ManyRecordsTest] +FROM [dbo].[ManyRecords] + + + +-- Create Test table indexes +CREATE INDEX [IDX_ManyRecordsTest_Seq] ON [dbo].[ManyRecordsTest] ([Many_SequenceID]) WITH SORT_IN_TEMPDB +CREATE INDEX [IDX_ManyRecordsTest_Dist] ON [dbo].[ManyRecordsTest] ([Many_DistributedID]) WITH SORT_IN_TEMPDB
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mssql/embed-param-test-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/embed-param-test-init.sql new file mode 100644 index 00000000..f776b158 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/embed-param-test-init.sql @@ -0,0 +1,32 @@ +-- Technique for creating large sample test data from +-- http://www.sql-server-performance.com/jc_large_data_operations.asp + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecordsTest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +drop table [dbo].[ManyRecordsTest] + + + +-- Create Test table using storage table sample data +SELECT + [Many_FirstID], + [Many_SecondID], + [Many_ThirdID], + [Many_FourthID], + [Many_FifthID], + [Many_SequenceID], + [Many_DistributedID], + [Many_SampleCharValue], + [Many_SampleDecimal], + [Many_SampleMoney], + [Many_SampleDate], + [Many_SequenceDate] +INTO [dbo].[ManyRecordsTest] +FROM [dbo].[ManyRecords] + + + +-- Create Test table indexes +CREATE INDEX [IDX_ManyRecordsTest_Seq] ON [dbo].[ManyRecordsTest] ([Many_SequenceID]) WITH SORT_IN_TEMPDB +CREATE INDEX [IDX_ManyRecordsTest_Dist] ON [dbo].[ManyRecordsTest] ([Many_DistributedID]) WITH SORT_IN_TEMPDB
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mssql/enumeration-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/enumeration-init.sql new file mode 100644 index 00000000..65b1e26f --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/enumeration-init.sql @@ -0,0 +1,30 @@ +-- Creating Table + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Enumerations]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[Enumerations] +END + +CREATE TABLE [dbo].[Enumerations] ( + [Enum_ID] [int] NOT NULL , + [Enum_Day] [int] NOT NULL , + [Enum_Color] [int] NOT NULL, + [Enum_Month] [int] NULL +) ON [PRIMARY] + +ALTER TABLE [dbo].[Enumerations] WITH NOCHECK ADD + CONSTRAINT [PK_Enum] PRIMARY KEY CLUSTERED + ( + [Enum_ID] + ) ON [PRIMARY] + +-- Creating Test Data + +INSERT INTO [dbo].[Enumerations] VALUES(1, 1, 1, 128); +INSERT INTO [dbo].[Enumerations] VALUES(2, 2, 2, 2048); +INSERT INTO [dbo].[Enumerations] VALUES(3, 3, 4, 256); +INSERT INTO [dbo].[Enumerations] VALUES(4, 4, 8, null); + + diff --git a/tests/unit/Data/SqlMap/scripts/mssql/line-item-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/line-item-init.sql new file mode 100644 index 00000000..e25a49dd --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/line-item-init.sql @@ -0,0 +1,53 @@ +-- Creating Table + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LineItems]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +drop table [dbo].[LineItems] + +CREATE TABLE [dbo].[LineItems] ( + [LineItem_ID] [int] NOT NULL , + [Order_ID] [int] NOT NULL , + [LineItem_Code] [varchar] (32) NOT NULL , + [LineItem_Quantity] [int] NOT NULL , + [LineItem_Price] [decimal](18, 2) NULL, + [LineItem_Picture] [image] null +) ON [PRIMARY] + +ALTER TABLE [dbo].[LineItems] WITH NOCHECK ADD + CONSTRAINT [PK_LinesItem] PRIMARY KEY CLUSTERED + ( + [LineItem_ID], + [Order_ID] + ) ON [PRIMARY] + +ALTER TABLE [dbo].[LineItems] ADD + CONSTRAINT [FK_LineItems_Orders] FOREIGN KEY + ( + [Order_ID] + ) REFERENCES [dbo].[Orders] ( + [Order_ID] + ) +-- Creating Test Data + +INSERT INTO [dbo].[LineItems] VALUES (1, 10, 'ESM-34', 1, 45.43, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 10, 'QSM-98', 8, 8.40, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 9, 'DSM-78', 2, 45.40, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 9, 'TSM-12', 2, 32.12, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 8, 'DSM-16', 4, 41.30, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 8, 'GSM-65', 1, 2.20, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 7, 'WSM-27', 7, 52.10, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 7, 'ESM-23', 2, 123.34, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 6, 'QSM-39', 9, 12.12, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 6, 'ASM-45', 6, 78.77, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 5, 'ESM-48', 3, 43.87, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 5, 'WSM-98', 7, 5.40, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 4, 'RSM-57', 2, 78.90, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 4, 'XSM-78', 9, 2.34, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 3, 'DSM-59', 3, 5.70, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 3, 'DSM-53', 3, 98.78, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 2, 'DSM-37', 4, 7.80, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 2, 'FSM-12', 2, 55.78, null); +INSERT INTO [dbo].[LineItems] VALUES (1, 1, 'ESM-48', 8, 87.60, null); +INSERT INTO [dbo].[LineItems] VALUES (2, 1, 'ESM-23', 1, 55.40, null); + diff --git a/tests/unit/Data/SqlMap/scripts/mssql/more-account-records.sql b/tests/unit/Data/SqlMap/scripts/mssql/more-account-records.sql new file mode 100644 index 00000000..e526309d --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/more-account-records.sql @@ -0,0 +1,11 @@ + + + +-- Creating Test Data + +INSERT INTO [dbo].[Accounts] VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com', 'Oui', 200); +INSERT INTO [dbo].[Accounts] VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com', 'Oui', 200); +INSERT INTO [dbo].[Accounts] VALUES(8,'Ming', 'Li Foo', null, 'Non', 100); +INSERT INTO [dbo].[Accounts] VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com', 'Oui', 200); +INSERT INTO [dbo].[Accounts] VALUES(10,'Robert', 'O''Timmins', null, 'Non', 100); + diff --git a/tests/unit/Data/SqlMap/scripts/mssql/order-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/order-init.sql new file mode 100644 index 00000000..0f1e2438 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/order-init.sql @@ -0,0 +1,54 @@ +-- Creating Table + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) + ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders + + drop table [dbo].[Orders] +END + +CREATE TABLE [dbo].[Orders] ( + [Order_ID] [int] NOT NULL , + [Account_ID] [int] NULL , + [Order_Date] [datetime] NULL , + [Order_CardType] [varchar] (32) NULL , + [Order_CardNumber] [varchar] (32) NULL , + [Order_CardExpiry] [varchar] (32) NULL , + [Order_Street] [varchar] (32) NULL , + [Order_City] [varchar] (32) NULL , + [Order_Province] [varchar] (32) NULL , + [Order_PostalCode] [varchar] (32) NULL , + [Order_FavouriteLineItem] [int] NULL +) ON [PRIMARY] + +ALTER TABLE [dbo].[Orders] WITH NOCHECK ADD + CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED + ( + [Order_ID] + ) ON [PRIMARY] + + +ALTER TABLE [dbo].[Orders] ADD + CONSTRAINT [FK_Orders_Accounts] FOREIGN KEY + ( + [Account_ID] + ) REFERENCES [dbo].[Accounts] ( + [Account_ID] + ) +-- Creating Test Data -- 2003-02-15 8:15:00/ 2003-02-15 8:15:00 + +INSERT INTO [dbo].[Orders] VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); +INSERT INTO [dbo].[Orders] VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); +INSERT INTO [dbo].[Orders] VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); +INSERT INTO [dbo].[Orders] VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); +INSERT INTO [dbo].[Orders] VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); +INSERT INTO [dbo].[Orders] VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); +INSERT INTO [dbo].[Orders] VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); +INSERT INTO [dbo].[Orders] VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); +INSERT INTO [dbo].[Orders] VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); +INSERT INTO [dbo].[Orders] VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); +INSERT INTO [dbo].[Orders] VALUES (11, null, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY',1); + diff --git a/tests/unit/Data/SqlMap/scripts/mssql/other-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/other-init.sql new file mode 100644 index 00000000..645a6eea --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/other-init.sql @@ -0,0 +1,145 @@ +-- Creating Table + +use [IBatisNet] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Others]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[Others] +END + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[A] +END +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[B]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[B] +END +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[C]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[C] +END +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[D]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[D] +END +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[E]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[E] +END +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[F]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[F] +END + + +CREATE TABLE [dbo].[Others] ( + [Other_Int] [int] NULL , + [Other_Long] [BigInt] NULL, + [Other_Bit] [Bit] NOT NULL DEFAULT (0), + [Other_String] [varchar] (32) NOT NULL +) ON [PRIMARY] + +CREATE TABLE [dbo].[F] ( + [ID] [varchar] (50) NOT NULL , + [F_Libelle] [varchar] (50) NULL , + CONSTRAINT [PK_F] PRIMARY KEY CLUSTERED + ( + [ID] + ) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[E] ( + [ID] [varchar] (50) NOT NULL , + [E_Libelle] [varchar] (50) NULL , + CONSTRAINT [PK_E] PRIMARY KEY CLUSTERED + ( + [ID] + ) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[D] ( + [ID] [varchar] (50) NOT NULL , + [D_Libelle] [varchar] (50) NULL , + CONSTRAINT [PK_D] PRIMARY KEY CLUSTERED + ( + [ID] + ) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[C] ( + [ID] [varchar] (50) NOT NULL , + [C_Libelle] [varchar] (50) NULL , + CONSTRAINT [PK_C] PRIMARY KEY CLUSTERED + ( + [ID] + ) ON [PRIMARY] +) ON [PRIMARY] + + +CREATE TABLE [dbo].[B] ( + [ID] [varchar] (50) NOT NULL , + [C_ID] [varchar] (50) NULL , + [D_ID] [varchar] (50) NULL , + [B_Libelle] [varchar] (50) NULL , + CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED + ( + [ID] + ) ON [PRIMARY] , + CONSTRAINT [FK_B_C] FOREIGN KEY + ( + [C_ID] + ) REFERENCES [C] ( + [ID] + ), + CONSTRAINT [FK_B_D] FOREIGN KEY + ( + [D_ID] + ) REFERENCES [D] ( + [ID] + ) +) ON [PRIMARY] + + +CREATE TABLE [dbo].[A] ( + [Id] [varchar] (50) NOT NULL , + [B_ID] [varchar] (50) NULL , + [E_ID] [varchar] (50) NULL , + [F_ID] [varchar] (50) NULL , + [A_Libelle] [varchar] (50) NULL + CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED + ( + [Id] + ) ON [PRIMARY] , + CONSTRAINT [FK_A_B] FOREIGN KEY + ( + [B_ID] + ) REFERENCES [B] ( + [ID] + ), + CONSTRAINT [FK_A_E] FOREIGN KEY + ( + [E_ID] + ) REFERENCES [E] ( + [ID] + ), + CONSTRAINT [FK_A_F] FOREIGN KEY + ( + [F_ID] + ) REFERENCES [F] ( + [ID] + ) +) ON [PRIMARY] + + +-- Creating Test Data + +INSERT INTO [dbo].[Others] VALUES(1, 8888888, 0, 'Oui'); +INSERT INTO [dbo].[Others] VALUES(2, 9999999999, 1, 'Non'); + +INSERT INTO [dbo].[F] VALUES('f', 'fff'); +INSERT INTO [dbo].[E] VALUES('e', 'eee'); +INSERT INTO [dbo].[D] VALUES('d', 'ddd'); +INSERT INTO [dbo].[C] VALUES('c', 'ccc'); +INSERT INTO [dbo].[B] VALUES('b', 'c', null, 'bbb'); +INSERT INTO [dbo].[A] VALUES('a', 'b', 'e', null, 'aaa');
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mssql/ps_SelectAccount.sql b/tests/unit/Data/SqlMap/scripts/mssql/ps_SelectAccount.sql new file mode 100644 index 00000000..bf3ae13d --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/ps_SelectAccount.sql @@ -0,0 +1,10 @@ +CREATE PROCEDURE dbo.[ps_SelectAccount] +@Account_ID [int] +AS +select + Account_ID as Id, + Account_FirstName as FirstName, + Account_LastName as LastName, + Account_Email as EmailAddress +from Accounts +where Account_ID = @Account_ID
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mssql/swap-procedure.sql b/tests/unit/Data/SqlMap/scripts/mssql/swap-procedure.sql new file mode 100644 index 00000000..981ffc5f --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/swap-procedure.sql @@ -0,0 +1,34 @@ +CREATE PROCEDURE dbo.[ps_swap_email_address] +@First_Email [nvarchar] (64) output, +@Second_Email [nvarchar] (64) output +AS + +Declare @ID1 int +Declare @ID2 int + +Declare @Email1 [nvarchar] (64) +Declare @Email2 [nvarchar] (64) + + SELECT @ID1 = Account_ID, @Email1 = Account_Email + from Accounts + where Account_Email = @First_Email + + SELECT @ID2 = Account_ID, @Email2 = Account_Email + from Accounts + where Account_Email = @Second_Email + + UPDATE Accounts + set Account_Email = @Email2 + where Account_ID = @ID1 + + UPDATE Accounts + set Account_Email = @Email1 + where Account_ID = @ID2 + + SELECT @First_Email = Account_Email + from Accounts + where Account_ID = @ID1 + + SELECT @Second_Email = Account_Email + from Accounts + where Account_ID = @ID2 diff --git a/tests/unit/Data/SqlMap/scripts/mssql/user-init.sql b/tests/unit/Data/SqlMap/scripts/mssql/user-init.sql new file mode 100644 index 00000000..7551da42 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mssql/user-init.sql @@ -0,0 +1,17 @@ +-- Creating Table + +use [NHibernate] + +if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN + drop table [dbo].[Users] +END + +CREATE TABLE [dbo].[Users] ( + LogonID nvarchar(20) NOT NULL default '0', + Name nvarchar(40) default NULL, + Password nvarchar(20) default NULL, + EmailAddress nvarchar(40) default NULL, + LastLogon datetime default NULL, + PRIMARY KEY (LogonID) +) diff --git a/tests/unit/Data/SqlMap/scripts/mysql/DataBase.sql b/tests/unit/Data/SqlMap/scripts/mysql/DataBase.sql new file mode 100644 index 00000000..159b1f4a --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/DataBase.sql @@ -0,0 +1,356 @@ +-- +-- Table structure for table `A` +-- + +DROP TABLE IF EXISTS `A`; +CREATE TABLE `A` ( + `ID` varchar(50) NOT NULL, + `B_ID` varchar(50) default NULL, + `E_ID` varchar(50) default NULL, + `F_ID` varchar(50) default NULL, + `A_Libelle` varchar(50) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_A_B` (`B_ID`), + KEY `FK_A_E` (`E_ID`), + KEY `FK_A_F` (`F_ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `A` +-- + +INSERT INTO `A` (`ID`, `B_ID`, `E_ID`, `F_ID`, `A_Libelle`) VALUES ('a', 'b', 'e', NULL, 'aaa'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Accounts` +-- + +DROP TABLE IF EXISTS `Accounts`; +CREATE TABLE `Accounts` ( + `Account_Id` int(11) NOT NULL, + `Account_FirstName` varchar(32) NOT NULL, + `Account_LastName` varchar(32) NOT NULL, + `Account_Email` varchar(128) default NULL, + `Account_Banner_Option` varchar(255) default NULL, + `Account_Cart_Option` int(11) default NULL, + PRIMARY KEY (`Account_Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `Accounts` +-- + +INSERT INTO `Accounts` (`Account_Id`, `Account_FirstName`, `Account_LastName`, `Account_Email`, `Account_Banner_Option`, `Account_Cart_Option`) VALUES (1, 'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200), +(2, 'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200), +(3, 'William', 'Dalton', NULL, 'Non', 100), +(4, 'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100), +(5, 'Gilles', 'Bayon', NULL, 'Oui', 100); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `B` +-- + +DROP TABLE IF EXISTS `B`; +CREATE TABLE `B` ( + `ID` varchar(50) NOT NULL, + `C_ID` varchar(50) default NULL, + `D_ID` varchar(50) default NULL, + `B_Libelle` varchar(50) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_B_C` (`C_ID`), + KEY `FK_B_D` (`D_ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `B` +-- + +INSERT INTO `B` (`ID`, `C_ID`, `D_ID`, `B_Libelle`) VALUES ('b', 'c', NULL, 'bbb'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `C` +-- + +DROP TABLE IF EXISTS `C`; +CREATE TABLE `C` ( + `ID` varchar(50) NOT NULL, + `C_Libelle` varchar(50) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `C` +-- + +INSERT INTO `C` (`ID`, `C_Libelle`) VALUES ('c', 'ccc'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Categories` +-- + +DROP TABLE IF EXISTS `Categories`; +CREATE TABLE `Categories` ( + `Category_Id` int(11) NOT NULL auto_increment, + `Category_Name` varchar(32) default NULL, + `Category_Guid` varchar(36) default NULL, + PRIMARY KEY (`Category_Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `Categories` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `D` +-- + +DROP TABLE IF EXISTS `D`; +CREATE TABLE `D` ( + `ID` varchar(50) NOT NULL, + `D_Libelle` varchar(50) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `D` +-- + +INSERT INTO `D` (`ID`, `D_Libelle`) VALUES ('d', 'ddd'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Documents` +-- + +DROP TABLE IF EXISTS `Documents`; +CREATE TABLE `Documents` ( + `Document_Id` int(11) NOT NULL, + `Document_Title` varchar(32) default NULL, + `Document_Type` varchar(32) default NULL, + `Document_PageNumber` int(11) default NULL, + `Document_City` varchar(32) default NULL, + PRIMARY KEY (`Document_Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `Documents` +-- + +INSERT INTO `Documents` (`Document_Id`, `Document_Title`, `Document_Type`, `Document_PageNumber`, `Document_City`) VALUES (1, 'The World of Null-A', 'Book', 55, NULL), +(2, 'Le Progres de Lyon', 'Newspaper', NULL, 'Lyon'), +(3, 'Lord of the Rings', 'Book', 3587, NULL), +(4, 'Le Canard enchaine', 'Tabloid', NULL, 'Paris'), +(5, 'Le Monde', 'Broadsheet', NULL, 'Paris'), +(6, 'Foundation', 'Monograph', 557, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `E` +-- + +DROP TABLE IF EXISTS `E`; +CREATE TABLE `E` ( + `ID` varchar(50) NOT NULL, + `E_Libelle` varchar(50) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `E` +-- + +INSERT INTO `E` (`ID`, `E_Libelle`) VALUES ('e', 'eee'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Enumerations` +-- + +DROP TABLE IF EXISTS `Enumerations`; +CREATE TABLE `Enumerations` ( + `Enum_Id` int(11) NOT NULL, + `Enum_Day` int(11) NOT NULL, + `Enum_Color` int(11) NOT NULL, + `Enum_Month` int(11) default NULL, + PRIMARY KEY (`Enum_Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `Enumerations` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `F` +-- + +DROP TABLE IF EXISTS `F`; +CREATE TABLE `F` ( + `ID` varchar(50) NOT NULL, + `F_Libelle` varchar(50) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `F` +-- + +INSERT INTO `F` (`ID`, `F_Libelle`) VALUES ('f', 'fff'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `LineItems` +-- + +DROP TABLE IF EXISTS `LineItems`; +CREATE TABLE `LineItems` ( + `LineItem_Id` int(11) NOT NULL, + `Order_Id` int(11) NOT NULL, + `LineItem_Code` varchar(32) NOT NULL, + `LineItem_Quantity` int(11) NOT NULL, + `LineItem_Price` decimal(18,2) default NULL, + `LineItem_Picture` blob, + PRIMARY KEY (`Order_Id`,`LineItem_Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `LineItems` +-- + +INSERT INTO `LineItems` (`LineItem_Id`, `Order_Id`, `LineItem_Code`, `LineItem_Quantity`, `LineItem_Price`, `LineItem_Picture`) VALUES (1, 1, 'ESM-48', 8, 87.60, NULL), +(2, 1, 'ESM-23', 1, 55.40, NULL), +(1, 2, 'DSM-37', 4, 7.80, NULL), +(2, 2, 'FSM-12', 2, 55.78, NULL), +(1, 3, 'DSM-59', 3, 5.70, NULL), +(2, 3, 'DSM-53', 3, 98.78, NULL), +(1, 4, 'RSM-57', 2, 78.90, NULL), +(2, 4, 'XSM-78', 9, 2.34, NULL), +(1, 5, 'ESM-48', 3, 43.87, NULL), +(2, 5, 'WSM-98', 7, 5.40, NULL), +(1, 6, 'QSM-39', 9, 12.12, NULL), +(2, 6, 'ASM-45', 6, 78.77, NULL), +(1, 7, 'WSM-27', 7, 52.10, NULL), +(2, 7, 'ESM-23', 2, 123.34, NULL), +(1, 8, 'DSM-16', 4, 41.30, NULL), +(2, 8, 'GSM-65', 1, 2.20, NULL), +(1, 9, 'DSM-78', 2, 45.40, NULL), +(2, 9, 'TSM-12', 2, 32.12, NULL), +(1, 10, 'ESM-34', 1, 45.43, NULL), +(2, 10, 'QSM-98', 8, 8.40, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Orders` +-- + +DROP TABLE IF EXISTS `Orders`; +CREATE TABLE `Orders` ( + `Order_Id` int(11) NOT NULL, + `Account_Id` int(11) default NULL, + `Order_Date` datetime default NULL, + `Order_CardType` varchar(32) default NULL, + `Order_CardNumber` varchar(32) default NULL, + `Order_CardExpiry` varchar(32) default NULL, + `Order_Street` varchar(32) default NULL, + `Order_City` varchar(32) default NULL, + `Order_Province` varchar(32) default NULL, + `Order_PostalCode` varchar(32) default NULL, + `Order_FavouriteLineItem` int(11) default NULL, + PRIMARY KEY (`Order_Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `Orders` +-- + +INSERT INTO `Orders` (`Order_Id`, `Account_Id`, `Order_Date`, `Order_CardType`, `Order_CardNumber`, `Order_CardExpiry`, `Order_Street`, `Order_City`, `Order_Province`, `Order_PostalCode`, `Order_FavouriteLineItem`) VALUES (1, 1, '2003-02-15 08:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4', 2), +(2, 4, '2003-02-15 08:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4', 1), +(3, 3, '2003-02-15 08:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4', 2), +(4, 2, '2003-02-15 08:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4', 1), +(5, 5, '2003-02-15 08:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4', 2), +(6, 5, '2003-02-15 08:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4', 1), +(7, 4, '2003-02-15 08:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4', 2), +(8, 3, '2003-02-15 08:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4', 1), +(9, 2, '2003-02-15 08:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4', 2), +(10, 1, '2003-02-15 08:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4', 1), +(11, NULL, '2003-02-15 08:15:00', 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY', 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Others` +-- + +DROP TABLE IF EXISTS `Others`; +CREATE TABLE `Others` ( + `Other_Int` int(11) default NULL, + `Other_Long` bigint(20) default NULL, + `Other_Bit` bit(1) NOT NULL default '\0', + `Other_String` varchar(32) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `Others` +-- + +INSERT INTO `Others` (`Other_Int`, `Other_Long`, `Other_Bit`, `Other_String`) VALUES (1, 8888888, '\0', 'Oui'), +(2, 9999999999, '', 'Non'), +(99, 1966, '', 'Non'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Users` +-- + +DROP TABLE IF EXISTS `Users`; +CREATE TABLE `Users` ( + `LogonId` varchar(20) NOT NULL default '0', + `Name` varchar(40) default NULL, + `Password` varchar(20) default NULL, + `EmailAddress` varchar(40) default NULL, + `LastLogon` datetime default NULL, + PRIMARY KEY (`LogonId`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `Users` +-- + + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `A` +-- +ALTER TABLE `A` + ADD CONSTRAINT `FK_A_B` FOREIGN KEY (`B_ID`) REFERENCES `B` (`ID`), + ADD CONSTRAINT `FK_A_E` FOREIGN KEY (`E_ID`) REFERENCES `E` (`ID`), + ADD CONSTRAINT `FK_A_F` FOREIGN KEY (`F_ID`) REFERENCES `F` (`ID`); + +-- +-- Constraints for table `B` +-- +ALTER TABLE `B` + ADD CONSTRAINT `FK_B_C` FOREIGN KEY (`C_ID`) REFERENCES `C` (`ID`), + ADD CONSTRAINT `FK_B_D` FOREIGN KEY (`D_ID`) REFERENCES `D` (`ID`); diff --git a/tests/unit/Data/SqlMap/scripts/mysql/account-init.sql b/tests/unit/Data/SqlMap/scripts/mysql/account-init.sql new file mode 100644 index 00000000..6b102597 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/account-init.sql @@ -0,0 +1,7 @@ +TRUNCATE `Accounts`; + +INSERT INTO Accounts VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200); +INSERT INTO Accounts VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200); +INSERT INTO Accounts VALUES(3,'William', 'Dalton', null, 'Non', 100); +INSERT INTO Accounts VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100); +INSERT INTO Accounts VALUES(5,'Gilles', 'Bayon', null, 'Oui', 100);
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mysql/account-procedure.sql b/tests/unit/Data/SqlMap/scripts/mysql/account-procedure.sql new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/account-procedure.sql @@ -0,0 +1 @@ + diff --git a/tests/unit/Data/SqlMap/scripts/mysql/category-init.sql b/tests/unit/Data/SqlMap/scripts/mysql/category-init.sql new file mode 100644 index 00000000..0c2b447f --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/category-init.sql @@ -0,0 +1 @@ +TRUNCATE `Categories`; diff --git a/tests/unit/Data/SqlMap/scripts/mysql/category-procedure.sql b/tests/unit/Data/SqlMap/scripts/mysql/category-procedure.sql new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/category-procedure.sql diff --git a/tests/unit/Data/SqlMap/scripts/mysql/documents-init.sql b/tests/unit/Data/SqlMap/scripts/mysql/documents-init.sql new file mode 100644 index 00000000..258ae532 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/documents-init.sql @@ -0,0 +1,8 @@ +TRUNCATE `Documents`; + +INSERT INTO Documents VALUES (1, 'The World of Null-A', 'Book', 55, null); +INSERT INTO Documents VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon'); +INSERT INTO Documents VALUES (3, 'Lord of the Rings', 'Book', 3587, null); +INSERT INTO Documents VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris'); +INSERT INTO Documents VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris'); +INSERT INTO Documents VALUES (6, 'Foundation', 'Monograph', 557, null); diff --git a/tests/unit/Data/SqlMap/scripts/mysql/enumeration-init.sql b/tests/unit/Data/SqlMap/scripts/mysql/enumeration-init.sql new file mode 100644 index 00000000..4c0a7dee --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/enumeration-init.sql @@ -0,0 +1,6 @@ +TRUNCATE `Enumerations`; + +INSERT INTO Enumerations VALUES(1, 1, 1, 128); +INSERT INTO Enumerations VALUES(2, 2, 2, 2048); +INSERT INTO Enumerations VALUES(3, 3, 4, 256); +INSERT INTO Enumerations VALUES(4, 4, 8, null); diff --git a/tests/unit/Data/SqlMap/scripts/mysql/line-item-init.sql b/tests/unit/Data/SqlMap/scripts/mysql/line-item-init.sql new file mode 100644 index 00000000..9a96d525 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/line-item-init.sql @@ -0,0 +1,24 @@ + +TRUNCATE `LineItems`; + +INSERT INTO LineItems VALUES (1, 10, 'ESM-34', 1, 45.43, null); +INSERT INTO LineItems VALUES (2, 10, 'QSM-98', 8, 8.40, null); +INSERT INTO LineItems VALUES (1, 9, 'DSM-78', 2, 45.40, null); +INSERT INTO LineItems VALUES (2, 9, 'TSM-12', 2, 32.12, null); +INSERT INTO LineItems VALUES (1, 8, 'DSM-16', 4, 41.30, null); +INSERT INTO LineItems VALUES (2, 8, 'GSM-65', 1, 2.20, null); +INSERT INTO LineItems VALUES (1, 7, 'WSM-27', 7, 52.10, null); +INSERT INTO LineItems VALUES (2, 7, 'ESM-23', 2, 123.34, null); +INSERT INTO LineItems VALUES (1, 6, 'QSM-39', 9, 12.12, null); +INSERT INTO LineItems VALUES (2, 6, 'ASM-45', 6, 78.77, null); +INSERT INTO LineItems VALUES (1, 5, 'ESM-48', 3, 43.87, null); +INSERT INTO LineItems VALUES (2, 5, 'WSM-98', 7, 5.40, null); +INSERT INTO LineItems VALUES (1, 4, 'RSM-57', 2, 78.90, null); +INSERT INTO LineItems VALUES (2, 4, 'XSM-78', 9, 2.34, null); +INSERT INTO LineItems VALUES (1, 3, 'DSM-59', 3, 5.70, null); +INSERT INTO LineItems VALUES (2, 3, 'DSM-53', 3, 98.78, null); +INSERT INTO LineItems VALUES (1, 2, 'DSM-37', 4, 7.80, null); +INSERT INTO LineItems VALUES (2, 2, 'FSM-12', 2, 55.78, null); +INSERT INTO LineItems VALUES (1, 1, 'ESM-48', 8, 87.60, null); +INSERT INTO LineItems VALUES (2, 1, 'ESM-23', 1, 55.40, null); + diff --git a/tests/unit/Data/SqlMap/scripts/mysql/more-account-records.sql b/tests/unit/Data/SqlMap/scripts/mysql/more-account-records.sql new file mode 100644 index 00000000..de33a256 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/more-account-records.sql @@ -0,0 +1,7 @@ + +INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com', 'Oui', 200); +INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com', 'Oui', 200); +INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null, 'Non', 100); +INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com', 'Oui', 200); +INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null, 'Non', 100); + diff --git a/tests/unit/Data/SqlMap/scripts/mysql/order-init.sql b/tests/unit/Data/SqlMap/scripts/mysql/order-init.sql new file mode 100644 index 00000000..2af33cb2 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/order-init.sql @@ -0,0 +1,15 @@ +TRUNCATE `Orders`; + + +INSERT INTO Orders VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); +INSERT INTO Orders VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); +INSERT INTO Orders VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); +INSERT INTO Orders VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); +INSERT INTO Orders VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); +INSERT INTO Orders VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); +INSERT INTO Orders VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); +INSERT INTO Orders VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); +INSERT INTO Orders VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); +INSERT INTO Orders VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); +INSERT INTO Orders VALUES (11, null, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY',1); + diff --git a/tests/unit/Data/SqlMap/scripts/mysql/other-init.sql b/tests/unit/Data/SqlMap/scripts/mysql/other-init.sql new file mode 100644 index 00000000..409de6d3 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/other-init.sql @@ -0,0 +1,18 @@ + +TRUNCATE `Others`; +TRUNCATE `A`; +TRUNCATE `B`; +TRUNCATE `C`; +TRUNCATE `D`; +TRUNCATE `E`; +TRUNCATE `F`; + +INSERT INTO Others VALUES(1, 8888888, 0, 'Oui'); +INSERT INTO Others VALUES(2, 9999999999, 1, 'Non'); + +INSERT INTO F VALUES('f', 'fff'); +INSERT INTO E VALUES('e', 'eee'); +INSERT INTO D VALUES('d', 'ddd'); +INSERT INTO C VALUES('c', 'ccc'); +INSERT INTO B VALUES('b', 'c', null, 'bbb'); +INSERT INTO A VALUES('a', 'b', 'e', null, 'aaa');
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/scripts/mysql/swap-procedure.sql b/tests/unit/Data/SqlMap/scripts/mysql/swap-procedure.sql new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/swap-procedure.sql diff --git a/tests/unit/Data/SqlMap/scripts/mysql/user-init.sql b/tests/unit/Data/SqlMap/scripts/mysql/user-init.sql new file mode 100644 index 00000000..fe9c0c67 --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/mysql/user-init.sql @@ -0,0 +1,2 @@ + +TRUNCATE `users`; diff --git a/tests/unit/Data/SqlMap/scripts/sqlite/database.sql b/tests/unit/Data/SqlMap/scripts/sqlite/database.sql new file mode 100644 index 00000000..6bef6f4c --- /dev/null +++ b/tests/unit/Data/SqlMap/scripts/sqlite/database.sql @@ -0,0 +1,242 @@ +# +# : A +# +DROP TABLE A; + +CREATE TABLE A +( + ID VARCHAR(50) NOT NULL PRIMARY KEY, + B_ID VARCHAR(50), + E_ID VARCHAR(50), + F_ID VARCHAR(50), + A_Libelle VARCHAR(50) +); + +INSERT INTO A VALUES ('a', 'b', 'e', NULL, 'aaa'); + + +# +# : Accounts +# +DROP TABLE Accounts; +CREATE TABLE Accounts +( + Account_Id INTEGER NOT NULL PRIMARY KEY, + Account_FirstName VARCHAR(32) NOT NULL, + Account_LastName VARCHAR(32) NOT NULL, + Account_Email VARCHAR(128), + Account_Banner_Option VARCHAR(255), + Account_Cart_Option INT +); + +INSERT INTO Accounts VALUES ('1', 'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', '200'); +INSERT INTO Accounts VALUES ('2', 'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', '200'); +INSERT INTO Accounts VALUES ('3', 'William', 'Dalton', NULL, 'Non', '100'); +INSERT INTO Accounts VALUES ('4', 'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', '100'); +INSERT INTO Accounts VALUES ('5', 'Gilles', 'Bayon', NULL, 'Oui', '100'); + + +# +# : B +# +DROP TABLE B; +CREATE TABLE B +( + ID VARCHAR(50) NOT NULL PRIMARY KEY, + C_ID VARCHAR(50), + D_ID VARCHAR(50), + B_Libelle VARCHAR(50) +); + +INSERT INTO B VALUES ('b', 'c', NULL, 'bbb'); + + +# +# : C +# +DROP TABLE C; +CREATE TABLE C +( + ID VARCHAR(50) NOT NULL PRIMARY KEY, + C_Libelle VARCHAR(50) +); + +INSERT INTO C VALUES ('c', 'ccc'); + + +# +# : Categories +# +DROP TABLE Categories; +create table Categories +( + Category_Id INTEGER NOT NULL PRIMARY KEY, + Category_Name varchar(32), + Category_Guid varchar(36) +); + + +# +# : D +# +DROP TABLE D; +CREATE TABLE D +( + ID VARCHAR(50) NOT NULL PRIMARY KEY, + D_Libelle VARCHAR(50) +); + +INSERT INTO D VALUES ('d', 'ddd'); + + +# +# : Documents +# +DROP TABLE Documents; +CREATE TABLE Documents +( + Document_Id INT NOT NULL PRIMARY KEY, + Document_Title VARCHAR(32), + Document_Type VARCHAR(32), + Document_PageNumber INT, + Document_City VARCHAR(32) +); + +INSERT INTO Documents VALUES ('1', 'The World of Null-A', 'Book', '55', NULL); +INSERT INTO Documents VALUES ('2', 'Le Progres de Lyon', 'Newspaper', NULL, 'Lyon'); +INSERT INTO Documents VALUES ('3', 'Lord of the Rings', 'Book', '3587', NULL); +INSERT INTO Documents VALUES ('4', 'Le Canard enchaine', 'Tabloid', NULL, 'Paris'); +INSERT INTO Documents VALUES ('5', 'Le Monde', 'Broadsheet', NULL, 'Paris'); +INSERT INTO Documents VALUES ('6', 'Foundation', 'Monograph', '557', NULL); + + +# +# : E +# +DROP TABLE E; +CREATE TABLE E +( + ID VARCHAR(50) NOT NULL PRIMARY KEY, + E_Libelle VARCHAR(50) +); + + +INSERT INTO E VALUES ('e', 'eee'); + + +# +# : Enumerations +# +DROP TABLE Enumerations; +create table Enumerations +( + Enum_Id int not null, + Enum_Day int not null, + Enum_Color int not null, + Enum_Month int +); + + +INSERT INTO Enumerations VALUES ('1', '1', '1', '128'); +INSERT INTO Enumerations VALUES ('2', '2', '2', '2048'); +INSERT INTO Enumerations VALUES ('3', '3', '4', '256'); +INSERT INTO Enumerations VALUES ('4', '4', '8', NULL); + + +# +# : F +# +DROP TABLE F; +CREATE TABLE F +( + ID VARCHAR(50) NOT NULL PRIMARY KEY, + F_Libelle VARCHAR(50) +); + +INSERT INTO F VALUES ('f', 'fff'); + + +# +# : LineItems +# +DROP TABLE LineItems; +CREATE TABLE LineItems +( + LineItem_Id INTEGER NOT NULL, + Order_Id INT NOT NULL, + LineItem_Code VARCHAR(32) NOT NULL, + LineItem_Quantity INT NOT NULL, + LineItem_Price DECIMAL(18,2), + LineItem_Picture BLOB +); + + +INSERT INTO LineItems VALUES ('1', '10', 'ESM-34', '1', '45.43', NULL); +INSERT INTO LineItems VALUES ('2', '10', 'QSM-98', '8', '8.40', NULL); +INSERT INTO LineItems VALUES ('1', '9', 'DSM-78', '2', '45.40', NULL); +INSERT INTO LineItems VALUES ('2', '9', 'TSM-12', '2', '32.12', NULL); +INSERT INTO LineItems VALUES ('1', '8', 'DSM-16', '4', '41.30', NULL); +INSERT INTO LineItems VALUES ('2', '8', 'GSM-65', '1', '2.20', NULL); +INSERT INTO LineItems VALUES ('1', '7', 'WSM-27', '7', '52.10', NULL); +INSERT INTO LineItems VALUES ('2', '7', 'ESM-23', '2', '123.34', NULL); +INSERT INTO LineItems VALUES ('1', '6', 'QSM-39', '9', '12.12', NULL); +INSERT INTO LineItems VALUES ('2', '6', 'ASM-45', '6', '78.77', NULL); +INSERT INTO LineItems VALUES ('1', '5', 'ESM-48', '3', '43.87', NULL); +INSERT INTO LineItems VALUES ('2', '5', 'WSM-98', '7', '5.40', NULL); +INSERT INTO LineItems VALUES ('1', '4', 'RSM-57', '2', '78.90', NULL); +INSERT INTO LineItems VALUES ('2', '4', 'XSM-78', '9', '2.34', NULL); +INSERT INTO LineItems VALUES ('1', '3', 'DSM-59', '3', '5.70', NULL); +INSERT INTO LineItems VALUES ('2', '3', 'DSM-53', '3', '98.78', NULL); +INSERT INTO LineItems VALUES ('1', '2', 'DSM-37', '4', '7.80', NULL); +INSERT INTO LineItems VALUES ('2', '2', 'FSM-12', '2', '55.78', NULL); +INSERT INTO LineItems VALUES ('1', '1', 'ESM-48', '8', '87.60', NULL); +INSERT INTO LineItems VALUES ('2', '1', 'ESM-23', '1', '55.40', NULL); + + +# +# : Orders +# +DROP TABLE Orders; +CREATE TABLE Orders +( + Order_Id INTEGER NOT NULL PRIMARY KEY, + Account_Id INT, + Order_Date DATETIME, + Order_CardType VARCHAR(32), + Order_CardNumber VARCHAR(32), + Order_CardExpiry VARCHAR(32), + Order_Street VARCHAR(32), + Order_City VARCHAR(32), + Order_Province VARCHAR(32), + Order_PostalCode VARCHAR(32), + Order_FavouriteLineItem INT +); + +INSERT INTO Orders VALUES ('1', '1', '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4', '2'); +INSERT INTO Orders VALUES ('2', '4', '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4', '1'); +INSERT INTO Orders VALUES ('3', '3', '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4', '2'); +INSERT INTO Orders VALUES ('4', '2', '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4', '1'); +INSERT INTO Orders VALUES ('5', '5', '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4', '2'); +INSERT INTO Orders VALUES ('6', '5', '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4', '1'); +INSERT INTO Orders VALUES ('7', '4', '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4', '2'); +INSERT INTO Orders VALUES ('8', '3', '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4', '1'); +INSERT INTO Orders VALUES ('9', '2', '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4', '2'); +INSERT INTO Orders VALUES ('10', '1', '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4', '1'); +INSERT INTO Orders VALUES ('11', NULL, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY', '1'); + + +# +# : Others +# +DROP TABLE Others; +create table Others +( + Other_Int int, + Other_Long bigint, + Other_Bit bit not null default 0, + Other_String varchar(32) not null +); + +INSERT INTO Others VALUES ('1', '8888888', '0', 'Oui'); +INSERT INTO Others VALUES ('2', '9999999999', '1', 'Non'); + diff --git a/tests/unit/Data/SqlMap/sqlite.xml b/tests/unit/Data/SqlMap/sqlite.xml new file mode 100644 index 00000000..ea5f3356 --- /dev/null +++ b/tests/unit/Data/SqlMap/sqlite.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<sqlMapConfig> + + <!-- properties that replaces instanceof $name$ in the sqlmap files --> + <properties> + <property name="selectKey" value="select @@IDENTITY as value" /> + <property name="MyCategoryName" value="'Film'" /> + <property name="accountName" value="'Joe'" /> + </properties> + + <!-- type handlers --> + <typeHandlers> + <typeHandler class="OuiNonBool" dbType="Varchar" /> + </typeHandlers> + + <!-- sqlmap configurations --> + <sqlMaps> + <sqlMap resource="maps/sqlite/Account.xml"/> + <sqlMap resource="maps/sqlite/DynamicAccount.xml"/> + <sqlMap resource="maps/sqlite/Order.xml"/> + <sqlMap resource="maps/sqlite/Category.xml"/> + <sqlMap resource="maps/sqlite/Complex.xml"/> + <sqlMap resource="maps/sqlite/LineItem.xml"/> + <sqlMap resource="maps/sqlite/Enumeration.xml"/> + <sqlMap resource="maps/sqlite/Other.xml"/> + <sqlMap resource="maps/sqlite/ResultClass.xml"/> + <sqlMap resource="maps/sqlite/Document.xml"/> + <sqlMap resource="maps/sqlite/ActiveRecord.xml"/> + </sqlMaps> + +</sqlMapConfig>
\ No newline at end of file diff --git a/tests/unit/Data/SqlMap/sqlite/backup.db b/tests/unit/Data/SqlMap/sqlite/backup.db Binary files differnew file mode 100644 index 00000000..4f5a353d --- /dev/null +++ b/tests/unit/Data/SqlMap/sqlite/backup.db diff --git a/tests/unit/Data/SqlMap/sqlite/tests.db b/tests/unit/Data/SqlMap/sqlite/tests.db Binary files differnew file mode 100644 index 00000000..eabfcab5 --- /dev/null +++ b/tests/unit/Data/SqlMap/sqlite/tests.db diff --git a/tests/unit/Data/SqlMap/sqlmap.xml b/tests/unit/Data/SqlMap/sqlmap.xml new file mode 100644 index 00000000..e6877f16 --- /dev/null +++ b/tests/unit/Data/SqlMap/sqlmap.xml @@ -0,0 +1,21 @@ +<sqlmap> + + <statement + id="findNotVisitedWatchedTopicList" + resultClass="TopicRecord" + parametrClass="array" + > + <![CDATA[ + SELECT rt.* + FROM rbx_watched_topic as rwt + LEFT JOIN rbx_topic as rt + ON rwt.topic_id = rt.topic_id + WHERE user_id = #user_id# AND + ( rt.created > #last_visit# OR + rt.modified > #last_visit# OR + rwt.visited = 0 ) + ORDER BY rt.title ASC + ]]> + </statement> + +</sqlmap>
\ No newline at end of file diff --git a/tests/unit/Data/TableGateway/BaseGatewayTest.php b/tests/unit/Data/TableGateway/BaseGatewayTest.php new file mode 100644 index 00000000..b97ef4a0 --- /dev/null +++ b/tests/unit/Data/TableGateway/BaseGatewayTest.php @@ -0,0 +1,96 @@ +<?php +Prado::using('System.Data.*'); +Prado::using('System.Data.DataGateway.TTableGateway'); + +/** + * @package System.Data.TableGateway + */ +class BaseGatewayTest extends PHPUnit_Framework_TestCase +{ + protected $gateway1; + protected $gateway2; + + /** + * @return TTableGateway + */ + function getGateway() + { + if($this->gateway1===null) + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + $this->gateway1 = new TTableGateway('address', $conn); + } + return $this->gateway1; + } + + /** + * @return TTableGateway + */ + function getGateway2() + { + if($this->gateway2===null) + { + $conn = new TDbConnection('pgsql:host=localhost;dbname=test', 'test','test'); + $this->gateway2 = new TTableGateway('department_sections', $conn); + } + return $this->gateway2; + } + + function setup() + { + $this->delete_all(); + } + + function add_record1() + { + $result = $this->getGateway()->insert($this->get_record1()); + $this->assertTrue(intval($result) > 0); + } + function add_record2() + { + $result = $this->getGateway()->insert($this->get_record2()); + $this->assertTrue(intval($result) > 0); + } + function get_record1() + { + return array( + 'username' => 'Username', + 'phone' => 121987, + 'field1_boolean' => true, + 'field2_date' => '2007-12-25', + 'field3_double' => 121.1, + 'field4_integer' => 3, + 'field5_text' => 'asdasd', + 'field6_time' => '12:40:00', + 'field7_timestamp' => 'NOW', + 'field8_money' => '$121.12', + 'field9_numeric' => 98.2232, + 'int_fk1'=>1, + 'int_fk2'=>1, + ); + } + + + function get_record2() + { + return array( + 'username' => 'record2', + 'phone' => 45233, + 'field1_boolean' => false, + 'field2_date' => '2004-10-05', + 'field3_double' => 1221.1, + 'field4_integer' => 2, + 'field5_text' => 'hello world', + 'field6_time' => '22:40:00', + 'field7_timestamp' => 'NOW', + 'field8_money' => '$1121.12', + 'field9_numeric' => 8.2213, + 'int_fk1'=>1, + 'int_fk2'=>1, + ); + } + function delete_all() + { + $this->getGateway()->deleteAll('1=1'); + } +}
\ No newline at end of file diff --git a/tests/unit/Data/TableGateway/CountTest.php b/tests/unit/Data/TableGateway/CountTest.php new file mode 100644 index 00000000..074d935b --- /dev/null +++ b/tests/unit/Data/TableGateway/CountTest.php @@ -0,0 +1,18 @@ +<?php + +require_once(dirname(__FILE__).'/BaseGatewayTest.php'); + +/** + * @package System.Data.TableGateway + */ +class CountTest extends BaseGatewayTest +{ + function test_simple_count() + { + $result = $this->getGateway2()->count(); + $this->assertEqual(44,$result); + + $result = $this->getGateway2()->count('department_id = ?', 1); + $this->assertEqual(4, $result); + } +}
\ No newline at end of file diff --git a/tests/unit/Data/TableGateway/MagicCallTest.php b/tests/unit/Data/TableGateway/MagicCallTest.php new file mode 100644 index 00000000..56cc85b3 --- /dev/null +++ b/tests/unit/Data/TableGateway/MagicCallTest.php @@ -0,0 +1,33 @@ +<?php + +require_once(dirname(__FILE__).'/BaseGatewayTest.php'); + +/** + * @package System.Data.TableGateway + */ +class MagicCallTest extends BaseGatewayTest +{ + function test_magic_call() + { + $this->add_record1(); $this->add_record2(); + + $result = $this->getGateway()->findByUsername("record2"); + $this->assertEqual($result['username'], 'record2'); + } + + function test_combined_and_or() + { + $this->add_record1(); $this->add_record2(); + + $result = $this->getGateway()->findAllByUsername_OR_phone('Username', '45233')->readAll(); + $this->assertEqual(2, count($result)); + } + + function test_no_result() + { + $this->add_record1(); $this->add_record2(); + $result = $this->getGateway()->findAllByUsername_and_phone('Username', '45233')->readAll(); + + $this->assertEqual(0, count($result)); + } +}
\ No newline at end of file diff --git a/tests/unit/Data/TableGateway/TableGatewayDeleteByPkTest.php b/tests/unit/Data/TableGateway/TableGatewayDeleteByPkTest.php new file mode 100644 index 00000000..6bcaeb91 --- /dev/null +++ b/tests/unit/Data/TableGateway/TableGatewayDeleteByPkTest.php @@ -0,0 +1,54 @@ +<?php + +require_once(dirname(__FILE__).'/BaseGatewayTest.php'); + +/** + * @package System.Data.TableGateway + */ +class TableGatewayDeleteByPkTest extends BaseGatewayTest +{ + function test_delete_by_1_pk() + { + $this->add_record1(); + $id = $this->getGateway()->getLastInsertId(); + $deleted = $this->getGateway()->deleteByPk($id); + + $this->assertEqual(1, $deleted); + } + + function test_delete_by_multiple_pk() + { + $this->add_record1(); + $id1 = $this->getGateway()->getLastInsertId(); + $this->add_record2(); + $id2 = $this->getGateway()->getLastInsertId(); + + $deleted = $this->getGateway()->deleteByPk($id1, $id2); + + $this->assertEqual(2, $deleted); + } + + function test_delete_by_multiple_pk2() + { + $this->add_record1(); + $id1 = $this->getGateway()->getLastInsertId(); + $this->add_record2(); + $id2 = $this->getGateway()->getLastInsertId(); + + $deleted = $this->getGateway()->deleteByPk(array($id1, $id2)); + + $this->assertEqual(2, $deleted); + } + + function test_delete_by_multiple_pk3() + { + $this->add_record1(); + $id1 = $this->getGateway()->getLastInsertId(); + $this->add_record2(); + $id2 = $this->getGateway()->getLastInsertId(); + + $deleted = $this->getGateway()->deleteByPk(array(array($id1), array($id2))); + + $this->assertEqual(2, $deleted); + } +}
\ No newline at end of file diff --git a/tests/unit/Data/TableGateway/TableGatewayPgsqlTest.php b/tests/unit/Data/TableGateway/TableGatewayPgsqlTest.php new file mode 100644 index 00000000..234f70bd --- /dev/null +++ b/tests/unit/Data/TableGateway/TableGatewayPgsqlTest.php @@ -0,0 +1,58 @@ +<?php +require_once(dirname(__FILE__).'/BaseGatewayTest.php'); + +/** + * @package System.Data.TableGateway + */ +class TableGatewayPgsqlTest extends BaseGatewayTest +{ + + function test_update() + { + $this->add_record1(); + $address = array('username' => 'tester 1', 'field5_text'=>null); + $result = $this->getGateway()->update($address, 'username = ?', 'Username'); + $this->assertTrue($result); + + $test = $this->getGateway()->find('username = ?', 'tester 1'); + unset($test['id']); + $expect = $this->get_record1(); + $expect['username'] = 'tester 1'; + $expect['field5_text'] = null; + unset($expect['field7_timestamp']); unset($test['field7_timestamp']); + $this->assertEqual($expect, $test); + + $this->assertTrue($this->getGateway()->deleteAll('username = ?', 'tester 1')); + } + + function test_update_named() + { + $this->add_record1(); + $address = array('username' => 'tester 1', 'field5_text'=>null); + $result = $this->getGateway()->update($address, 'username = :name', array(':name'=>'Username')); + $this->assertTrue($result); + + $test = $this->getGateway()->find('username = :name', array(':name'=>'tester 1')); + unset($test['id']); + $expect = $this->get_record1(); + $expect['username'] = 'tester 1'; + $expect['field5_text'] = null; + unset($expect['field7_timestamp']); unset($test['field7_timestamp']); + $this->assertEqual($expect, $test); + + $this->assertTrue($this->getGateway()->deleteAll('username = :name', array(':name'=>'tester 1'))); + } + + function test_find_all() + { + $this->add_record1(); + $this->add_record2(); + + $results = $this->getGateway()->findAll('true')->readAll(); + $this->assertEqual(count($results), 2); + + $result = $this->getGateway()->findAllBySql('SELECT username FROM address WHERE phone = ?', '45233')->read(); + $this->assertEqual($result['username'], 'record2'); + } + +}
\ No newline at end of file diff --git a/tests/unit/Data/TableGateway/TableInfoGatewayTest.php b/tests/unit/Data/TableGateway/TableInfoGatewayTest.php new file mode 100644 index 00000000..24b94690 --- /dev/null +++ b/tests/unit/Data/TableGateway/TableInfoGatewayTest.php @@ -0,0 +1,19 @@ +<?php + +require_once(dirname(__FILE__).'/BaseGatewayTest.php'); + +/** + * @package System.Data.TableGateway + */ +class TableInfoGatewayTest extends BaseGatewayTest +{ + function test_table_info() + { + $conn = $this->getGateway()->getDbConnection(); + $this->add_record1(); + $this->add_record2(); + $info = TDbMetaData::getInstance($conn)->getTableInfo('address'); + $table = new TTableGateway($info, $conn); + $this->assertEqual(count($table->findAll()->readAll()), 2); + } +}
\ No newline at end of file diff --git a/tests/unit/Data/TableGateway/TestFindByPk.php b/tests/unit/Data/TableGateway/TestFindByPk.php new file mode 100644 index 00000000..f23fafa7 --- /dev/null +++ b/tests/unit/Data/TableGateway/TestFindByPk.php @@ -0,0 +1,50 @@ +<?php + +require_once(dirname(__FILE__).'/BaseGatewayTest.php'); + +/** + * @package System.Data.TableGateway + */ +class TestFindByPk extends BaseGatewayTest +{ + function test_one_key() + { + $this->add_record1(); + $id = $this->getGateway()->getLastInsertId(); + $result = $this->getGateway()->findByPk($id); + + $record1 = $this->get_record1(); + + //clean and ignore some fields + unset($result['id']); + unset($result['field7_timestamp']); + unset($record1['field7_timestamp']); + $result['phone'] = intval($result['phone']); + $result['field9_numeric'] = floatval($result['field9_numeric']); + + $this->assertEqual($record1, $result); + } + + function test_composite_key() + { + $gateway = $this->getGateway2(); + + $result = $gateway->findByPk(1,1); + $expect = array("department_id" => 1, "section_id" => 1, "order" => 0); + $this->assertEqual($expect, $result); + } + + function test_find_all_keys() + { + $gateway = $this->getGateway2(); + + $result = $gateway->findAllByPks(array(1,1), array(3,13))->readAll(); + + $expect = array( + array("department_id" => 1, "section_id" => 1, "order" => 0), + array("department_id" => 3, "section_id" => 13, "order" => 0)); + + $this->assertEqual($expect, $result); + + } +}
\ No newline at end of file |