/test/testsuite/generator/builder/om/GeneratedObjectRelTest.php
PHP | 366 lines | 244 code | 62 blank | 60 comment | 0 complexity | 9c53f7e9d68ea0400296f98b52a0e84a MD5 | raw file
- <?php
- /**
- * This file is part of the Propel package.
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @license MIT License
- */
- require_once dirname(__FILE__) . '/../../../../tools/helpers/bookstore/BookstoreEmptyTestBase.php';
- /**
- * Tests relationships between generated Object classes.
- *
- * This test uses generated Bookstore classes to test the behavior of various
- * object operations. The _idea_ here is to test every possible generated method
- * from Object.tpl; if necessary, bookstore will be expanded to accommodate this.
- *
- * The database is relaoded before every test and flushed after every test. This
- * means that you can always rely on the contents of the databases being the same
- * for each test method in this class. See the BookstoreDataPopulator::populate()
- * method for the exact contents of the database.
- *
- * @see BookstoreDataPopulator
- * @author Hans Lellelid <hans@xmpl.org>
- * @package generator.builder.om
- */
- class GeneratedObjectRelTest extends BookstoreEmptyTestBase
- {
- protected function setUp()
- {
- parent::setUp();
- }
- /**
- * Tests one side of a bi-directional setting of many-to-many relationships.
- */
- public function testManyToMany_Dir1()
- {
- $list = new BookClubList();
- $list->setGroupLeader('Archimedes Q. Porter');
- // No save ...
- $book = new Book();
- $book->setTitle( "Jungle Expedition Handbook" );
- $book->setISBN('TEST');
- // No save ...
- $this->assertEquals(0, count($list->getBookListRels()) );
- $this->assertEquals(0, count($book->getBookListRels()) );
- $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) );
- $xref = new BookListRel();
- $xref->setBook($book);
- $list->addBookListRel($xref);
- $this->assertEquals(1, count($list->getBookListRels()));
- $this->assertEquals(1, count($book->getBookListRels()) );
- $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) );
- $list->save();
- $this->assertEquals(1, count($list->getBookListRels()) );
- $this->assertEquals(1, count($book->getBookListRels()) );
- $this->assertEquals(1, count(BookListRelPeer::doSelect(new Criteria())) );
- }
- /**
- * Tests reverse setting of one of many-to-many relationship, with all saves cascaded.
- */
- public function testManyToMany_Dir2_Unsaved()
- {
- $list = new BookClubList();
- $list->setGroupLeader('Archimedes Q. Porter');
- // No save ...
- $book = new Book();
- $book->setTitle( "Jungle Expedition Handbook" );
- $book->setISBN('TEST');
- // No save (yet) ...
- $this->assertEquals(0, count($list->getBookListRels()) );
- $this->assertEquals(0, count($book->getBookListRels()) );
- $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) );
- $xref = new BookListRel();
- $xref->setBookClubList($list);
- $book->addBookListRel($xref);
- $this->assertEquals(1, count($list->getBookListRels()) );
- $this->assertEquals(1, count($book->getBookListRels()) );
- $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) );
- $book->save();
- $this->assertEquals(1, count($list->getBookListRels()) );
- $this->assertEquals(1, count($book->getBookListRels()) );
- $this->assertEquals(1, count(BookListRelPeer::doSelect(new Criteria())) );
- }
- /**
- * Tests reverse setting of relationships, saving one of the objects first.
- * @link http://propel.phpdb.org/trac/ticket/508
- */
- public function testManyToMany_Dir2_Saved()
- {
- $list = new BookClubList();
- $list->setGroupLeader('Archimedes Q. Porter');
- $list->save();
- $book = new Book();
- $book->setTitle( "Jungle Expedition Handbook" );
- $book->setISBN('TEST');
- // No save (yet) ...
- $this->assertEquals(0, count($list->getBookListRels()) );
- $this->assertEquals(0, count($book->getBookListRels()) );
- $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) );
- // Now set the relationship from the opposite direction.
- $xref = new BookListRel();
- $xref->setBookClubList($list);
- $book->addBookListRel($xref);
- $this->assertEquals(1, count($list->getBookListRels()) );
- $this->assertEquals(1, count($book->getBookListRels()) );
- $this->assertEquals(0, count(BookListRelPeer::doSelect(new Criteria())) );
- $book->save();
- $this->assertEquals(1, count($list->getBookListRels()) );
- $this->assertEquals(1, count($book->getBookListRels()) );
- $this->assertEquals(1, count(BookListRelPeer::doSelect(new Criteria())) );
- }
-
- public function testManyToManyGetterExists()
- {
- $this->assertTrue(method_exists('BookClubList', 'getBooks'), 'Object generator correcly adds getter for the crossRefFk');
- $this->assertFalse(method_exists('BookClubList', 'getBookClubLists'), 'Object generator correcly adds getter for the crossRefFk');
- }
-
- public function testManyToManyGetterNewObject()
- {
- $blc1 = new BookClubList();
- $books = $blc1->getBooks();
- $this->assertTrue($books instanceof PropelObjectCollection, 'getCrossRefFK() returns a Propel collection');
- $this->assertEquals('Book', $books->getModel(), 'getCrossRefFK() returns a collection of the correct model');
- $this->assertEquals(0, count($books), 'getCrossRefFK() returns an empty list for new objects');
- $query = BookQuery::create()
- ->filterByTitle('Harry Potter and the Order of the Phoenix');
- $books = $blc1->getBooks($query);
- $this->assertEquals(0, count($books), 'getCrossRefFK() accepts a query as first parameter');
- }
-
- public function testManyToManyGetter()
- {
- BookstoreDataPopulator::populate();
- $blc1 = BookClubListQuery::create()->findOneByGroupLeader('Crazyleggs');
- $books = $blc1->getBooks();
- $this->assertTrue($books instanceof PropelObjectCollection, 'getCrossRefFK() returns a Propel collection');
- $this->assertEquals('Book', $books->getModel(), 'getCrossRefFK() returns a collection of the correct model');
- $this->assertEquals(2, count($books), 'getCrossRefFK() returns the correct list of objects');
- $query = BookQuery::create()
- ->filterByTitle('Harry Potter and the Order of the Phoenix');
- $books = $blc1->getBooks($query);
- $this->assertEquals(1, count($books), 'getCrossRefFK() accepts a query as first parameter');
- }
- public function testManyToManyCounterExists()
- {
- $this->assertTrue(method_exists('BookClubList', 'countBooks'), 'Object generator correcly adds counter for the crossRefFk');
- $this->assertFalse(method_exists('BookClubList', 'countBookClubLists'), 'Object generator correcly adds counter for the crossRefFk');
- }
-
- public function testManyToManyCounterNewObject()
- {
- $blc1 = new BookClubList();
- $nbBooks = $blc1->countBooks();
- $this->assertEquals(0, $nbBooks, 'countCrossRefFK() returns 0 for new objects');
- $query = BookQuery::create()
- ->filterByTitle('Harry Potter and the Order of the Phoenix');
- $nbBooks = $blc1->countBooks($query);
- $this->assertEquals(0, $nbBooks, 'countCrossRefFK() accepts a query as first parameter');
- }
-
- public function testManyToManyCounter()
- {
- BookstoreDataPopulator::populate();
- $blc1 = BookClubListQuery::create()->findOneByGroupLeader('Crazyleggs');
- $nbBooks = $blc1->countBooks();
- $this->assertEquals(2, $nbBooks, 'countCrossRefFK() returns the correct list of objects');
- $query = BookQuery::create()
- ->filterByTitle('Harry Potter and the Order of the Phoenix');
- $nbBooks = $blc1->countBooks($query);
- $this->assertEquals(1, $nbBooks, 'countCrossRefFK() accepts a query as first parameter');
- }
-
- public function testManyToManyAdd()
- {
- $list = new BookClubList();
- $list->setGroupLeader('Archimedes Q. Porter');
- $book = new Book();
- $book->setTitle( "Jungle Expedition Handbook" );
- $book->setISBN('TEST');
-
- $list->addBook($book);
- $this->assertEquals(1, $list->countBooks(), 'addCrossFk() sets the internal collection properly');
- $this->assertEquals(1, $list->countBookListRels(), 'addCrossFk() sets the internal cross reference collection properly');
-
- $list->save();
- $this->assertFalse($book->isNew(), 'related object is saved if added');
- $rels = $list->getBookListRels();
- $rel = $rels[0];
- $this->assertFalse($rel->isNew(), 'cross object is saved if added');
-
- $list->clearBookListRels();
- $list->clearBooks();
- $books = $list->getBooks();
- $expected = new PropelObjectCollection(array($book));
- $expected->setModel('Book');
- $this->assertEquals($expected, $books, 'addCrossFk() adds the object properly');
- $this->assertEquals(1, $list->countBookListRels());
- }
-
- /**
- * Test behavior of columns that are implicated in multiple foreign keys.
- * @link http://propel.phpdb.org/trac/ticket/228
- */
- public function testMultiFkImplication()
- {
- BookstoreDataPopulator::populate();
- // Create a new bookstore, contest, bookstore_contest, and bookstore_contest_entry
- $b = new Bookstore();
- $b->setStoreName("Foo!");
- $b->save();
- $c = new Contest();
- $c->setName("Bookathon Contest");
- $c->save();
- $bc = new BookstoreContest();
- $bc->setBookstore($b);
- $bc->setContest($c);
- $bc->save();
- $c = new Customer();
- $c->setName("Happy Customer");
- $c->save();
- $bce = new BookstoreContestEntry();
- $bce->setBookstore($b);
- $bce->setBookstoreContest($bc);
- $bce->setCustomer($c);
- $bce->save();
- $bce->setBookstoreId(null);
- $this->assertNull($bce->getBookstoreContest());
- $this->assertNull($bce->getBookstore());
- }
- /**
- * Test the clearing of related object collection.
- * @link http://www.propelorm.org/ticket/529
- */
- public function testClearRefFk()
- {
- BookstoreDataPopulator::populate();
- $book = new Book();
- $book->setISBN("Foo-bar-baz");
- $book->setTitle("The book title");
- // No save ...
- $r = new Review();
- $r->setReviewedBy('Me');
- $r->setReviewDate(new DateTime("now"));
- $book->addReview($r);
- // No save (yet) ...
- $this->assertEquals(1, count($book->getReviews()) );
- $book->clearReviews();
- $this->assertEquals(0, count($book->getReviews()));
- }
-
- /**
- * Test the clearing of related object collection via a many-to-many association.
- * @link http://www.propelorm.org/ticket/1374
- */
- public function testClearCrossFk()
- {
- $book = new Book();
- $bookClub = new BookClubList();
- $book->addBookClubList($bookClub);
- $this->assertEquals(1, count($book->getBookClubLists()));
- $book->clear();
- $this->assertEquals(0, count($book->getBookClubLists()));
- }
- /**
- * This tests to see whether modified objects are being silently overwritten by calls to fk accessor methods.
- * @link http://propel.phpdb.org/trac/ticket/509#comment:5
- */
- public function testModifiedObjectOverwrite()
- {
- BookstoreDataPopulator::populate();
- $author = new Author();
- $author->setFirstName("John");
- $author->setLastName("Public");
- $books = $author->getBooks(); // empty, of course
- $this->assertEquals(0, count($books), "Expected empty collection.");
- $book = new Book();
- $book->setTitle("A sample book");
- $book->setISBN("INITIAL ISBN");
- $author->addBook($book);
- $author->save();
- $book->setISBN("MODIFIED ISBN");
- $books = $author->getBooks();
- $this->assertEquals(1, count($books), "Expected 1 book.");
- $this->assertSame($book, $books[0], "Expected the same object to be returned by fk accessor.");
- $this->assertEquals("MODIFIED ISBN", $books[0]->getISBN(), "Expected the modified value NOT to have been overwritten.");
- }
- public function testFKGetterUseInstancePool()
- {
- BookstoreDataPopulator::populate();
- BookPeer::clearInstancePool();
- AuthorPeer::clearInstancePool();
- $con = Propel::getConnection(BookPeer::DATABASE_NAME);
- $author = AuthorPeer::doSelectOne(new Criteria(), $con);
- // populate book instance pool
- $books = $author->getBooks(null, $con);
- $sql = $con->getLastExecutedQuery();
- $author = $books[0]->getAuthor($con);
- $this->assertEquals($sql, $con->getLastExecutedQuery(), 'refFK getter uses instance pool if possible');
- }
-
- public function testRefFKGetJoin()
- {
- BookstoreDataPopulator::populate();
- BookPeer::clearInstancePool();
- AuthorPeer::clearInstancePool();
- PublisherPeer::clearInstancePool();
- $con = Propel::getConnection(BookPeer::DATABASE_NAME);
- $author = AuthorPeer::doSelectOne(new Criteria(), $con);
- // populate book instance pool
- $books = $author->getBooksJoinPublisher(null, $con);
- $sql = $con->getLastExecutedQuery();
- $publisher = $books[0]->getPublisher($con);
- $this->assertEquals($sql, $con->getLastExecutedQuery(), 'refFK getter uses instance pool if possible');
- }
- }