From 00399c56361535575ad839de1b5af414217f2a48 Mon Sep 17 00:00:00 2001 From: romanb Date: Tue, 5 Jun 2007 20:02:11 +0000 Subject: [PATCH] added a testcase --- tests/Query/OneToOneFetchingTestCase.php | 268 +++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 tests/Query/OneToOneFetchingTestCase.php diff --git a/tests/Query/OneToOneFetchingTestCase.php b/tests/Query/OneToOneFetchingTestCase.php new file mode 100644 index 000000000..4a02ca78c --- /dev/null +++ b/tests/Query/OneToOneFetchingTestCase.php @@ -0,0 +1,268 @@ +. + */ + +/** + * Doctrine_Query_MultiJoin2_TestCase + * + * @package Doctrine + * @author Konsta Vesterinen + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + */ +class Doctrine_Query_OneToOneFetching_TestCase extends Doctrine_UnitTestCase +{ + public function prepareData() + { } + public function prepareTables() + { + $this->tables[] = 'QueryTest_Category'; + $this->tables[] = 'QueryTest_Board'; + $this->tables[] = 'QueryTest_User'; + $this->tables[] = 'QueryTest_Entry'; + $this->tables[] = 'QueryTest_Rank'; + parent::prepareTables(); + } + public function testInitializeData() + { + $query = new Doctrine_Query($this->connection); + + $cat = new QueryTest_Category(); + + $cat->rootCategoryId = 0; + $cat->parentCategoryId = 0; + $cat->name = "Testcat"; + $cat->position = 0; + $cat->save(); + + $board = new QueryTest_Board(); + $board->name = "Testboard"; + $board->categoryId = $cat->id; + $board->position = 0; + $board->save(); + + $author = new QueryTest_User(); + $author->username = "romanbb"; + $author->save(); + + $lastEntry = new QueryTest_Entry(); + $lastEntry->authorId = $author->id; + $lastEntry->date = 1234; + $lastEntry->save(); + + // Set the last entry + $board->lastEntry = $lastEntry; + $board->save(); + + $visibleRank = new QueryTest_Rank(); + $visibleRank->title = "Freak"; + $visibleRank->color = "red"; + $visibleRank->icon = "freak.png"; + $visibleRank->save(); + + // grant him a rank + $author->visibleRank = $visibleRank; + $author->save(); + + } + + /** + * Tests that one-one relations are correctly loaded with array fetching + * when the related records EXIST. + * + * !!! Currently it produces a notice with: + * !!! Array to string conversion in Doctrine\Hydrate.php on line 937 + * + * !!! And shortly after exits with a fatal error: + * !!! Fatal error: Cannot create references to/from string offsets nor overloaded objects + * !!! in Doctrine\Hydrate.php on line 939 + */ + /*public function testOneToOneArrayFetchingWithExistingRelations() + { + $query = new Doctrine_Query($this->connection); + try { + $categories = $query->select("c.*, b*, le.*, a.username, vr.title, vr.color, vr.icon") + ->from("QueryTest_Category c") + ->leftJoin("c.boards b") + ->leftJoin("b.lastEntry le") + ->leftJoin("le.author a") + ->leftJoin("a.visibleRank vr") + ->execute(array(), Doctrine::FETCH_ARRAY); + + // --> currently quits here with a fatal error! <-- + + // check boards/categories + $this->assertEqual(1, count($categories)); + $this->assertTrue(isset($categories[0]['boards'])); + $this->assertEqual(1, count($categories[0]['boards'])); + + // get the baord for inspection + $board = $categories[0]['boards'][0]; + + $this->assertTrue(isset($board['lastEntry'])); + + // lastentry should've 2 fields. one regular field, one relation. + $this->assertEqual(2, count($board['lastEntry'])); + $this->assertEqual(1234, (int)$board['lastEntry']['date']); + $this->assertTrue(isset($board['lastEntry']['author'])); + + // author should've 2 fields. one regular field, one relation. + $this->assertEqual(2, count($board['lastEntry']['author'])); + $this->assertEqual('romanbb', $board['lastEntry']['author']['username']); + $this->assertTrue(isset($board['lastEntry']['author']['visibleRank'])); + + // visibleRank should've 3 regular fields + $this->assertEqual(3, count($board['lastEntry']['author']['visibleRank'])); + $this->assertEqual('Freak', $board['lastEntry']['author']['visibleRank']['title']); + $this->assertEqual('red', $board['lastEntry']['author']['visibleRank']['color']); + $this->assertEqual('freak.png', $board['lastEntry']['author']['visibleRank']['icon']); + + } catch (Doctrine_Exception $e) { + $this->fail(); + } + }*/ + + /** + * Tests that one-one relations are correctly loaded with array fetching + * when the related records DONT EXIST. + */ + public function testOneToOneArrayFetchingWithEmptyRelations() + { + // temporarily remove the relation to fake a non-existant one + $board = $this->connection->query("FROM QueryTest_Board b WHERE b.name = ?", array('Testboard'))->getFirst(); + $lastEntryId = $board->lastEntryId; + $board->lastEntryId = 0; + $board->save(); + + $query = new Doctrine_Query($this->connection); + try { + $categories = $query->select("c.*, b*, le.*, a.username, vr.title, vr.color, vr.icon") + ->from("QueryTest_Category c") + ->leftJoin("c.boards b") + ->leftJoin("b.lastEntry le") + ->leftJoin("le.author a") + ->leftJoin("a.visibleRank vr") + ->execute(array(), Doctrine::FETCH_ARRAY); + + // check boards/categories + $this->assertEqual(1, count($categories)); + $this->assertTrue(isset($categories[0]['boards'])); + $this->assertEqual(1, count($categories[0]['boards'])); + + // get the board for inspection + $tmpBoard = $categories[0]['boards'][0]; + + $this->assertTrue(!isset($tmpBoard['lastEntry'])); + + } catch (Doctrine_Exception $e) { + $this->fail(); + } + + $board->lastEntryId = $lastEntryId; + $board->save(); + } + + /** + * Tests that one-one relations are correctly loaded with record fetching + * when the related records EXIST. + */ + public function testOneToOneRecordFetchingWithExistingRelations() + { + $query = new Doctrine_Query($this->connection); + try { + $categories = $query->select("c.*, b*, le.*, a.username, vr.title, vr.color, vr.icon") + ->from("QueryTest_Category c") + ->leftJoin("c.boards b") + ->leftJoin("b.lastEntry le") + ->leftJoin("le.author a") + ->leftJoin("a.visibleRank vr") + ->execute(); + + // check boards/categories + $this->assertEqual(1, count($categories)); + $this->assertEqual(1, count($categories[0]['boards'])); + + // get the baord for inspection + $board = $categories[0]['boards'][0]; + + // lastentry should've 2 fields. one regular field, one relation. + $this->assertEqual(2, count($board['lastEntry'])); + $this->assertEqual(1234, (int)$board['lastEntry']['date']); + $this->assertTrue(isset($board['lastEntry']['author'])); + + // author should've 2 fields. one regular field, one relation. + $this->assertEqual(2, count($board['lastEntry']['author'])); + $this->assertEqual('romanbb', $board['lastEntry']['author']['username']); + $this->assertTrue(isset($board['lastEntry']['author']['visibleRank'])); + + // visibleRank should've 3 regular fields + $this->assertEqual(3, count($board['lastEntry']['author']['visibleRank'])); + $this->assertEqual('Freak', $board['lastEntry']['author']['visibleRank']['title']); + $this->assertEqual('red', $board['lastEntry']['author']['visibleRank']['color']); + $this->assertEqual('freak.png', $board['lastEntry']['author']['visibleRank']['icon']); + + } catch (Doctrine_Exception $e) { + $this->fail(); + } + } + + /** + * Tests that one-one relations are correctly loaded with record fetching + * when the related records DONT EXIST. + */ + public function testOneToOneRecordFetchingWithEmptyRelations() + { + // temporarily remove the relation to fake a non-existant one + $board = $this->connection->query("FROM QueryTest_Board b WHERE b.name = ?", array('Testboard'))->getFirst(); + $lastEntryId = $board->lastEntryId; + $board->lastEntryId = 0; + $board->save(); + + $query = new Doctrine_Query($this->connection); + try { + $categories = $query->select("c.*, b*, le.*, a.username, vr.title, vr.color, vr.icon") + ->from("QueryTest_Category c") + ->leftJoin("c.boards b") + ->leftJoin("b.lastEntry le") + ->leftJoin("le.author a") + ->leftJoin("a.visibleRank vr") + ->execute(); + + // check boards/categories + $this->assertEqual(1, count($categories)); + $this->assertTrue(isset($categories[0]['boards'])); + $this->assertEqual(1, count($categories[0]['boards'])); + + // get the board for inspection + $tmpBoard = $categories[0]['boards'][0]; + + $this->assertTrue(!isset($board['lastEntry'])); + + } catch (Doctrine_Exception $e) { + $this->fail(); + } + + $board->lastEntryId = $lastEntryId; + $board->save(); + } +}