RedUNIT\Base\Bean::testUpdateQueries PHP Method

testUpdateQueries() public method

Test whether the number of update queries executed is limited to the ones that are absolutely necessary to sync the database.
public testUpdateQueries ( ) : void
return void
    public function testUpdateQueries()
    {
        $book = R::dispense('book');
        $book->title = 'Eye of Wight';
        $book->xownPageList = R::dispense('page', 10);
        $book->sharedCategoryList = R::dispense('category', 2);
        $n = 1;
        foreach ($book->xownPageList as $page) {
            $page->number = $n++;
        }
        $book->sharedCategory[0]->name = 'adventure';
        $book->sharedCategory[1]->name = 'puzzle';
        $book->author = R::dispense('author');
        $book->author->name = 'John';
        $book->map = R::dispense('map');
        $book->map->name = 'Wight';
        $book->map->xownLocationList = R::dispense('location', 3);
        asrt($book->getMeta('tainted'), TRUE);
        asrt($book->getMeta('changed'), TRUE);
        R::store($book);
        asrt($book->getMeta('tainted'), FALSE);
        asrt($book->getMeta('changed'), FALSE);
        $logger = R::debug(1, 1);
        $book = $book->fresh();
        asrt($book->getMeta('tainted'), FALSE);
        asrt($book->getMeta('changed'), FALSE);
        $book->author;
        asrt($book->getMeta('tainted'), TRUE);
        asrt($book->getMeta('changed'), FALSE);
        $logger->clear();
        R::store($book);
        //read only, no updates
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 0);
        $book->title = 'Spirit of the Stones';
        R::store($book);
        //changed title, 1 update
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 1);
        $logger->clear();
        //store again, no changes, no updates
        R::store($book);
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 0);
        $logger->clear();
        $book = $book->fresh();
        $book->xownPageList;
        asrt($book->getMeta('tainted'), TRUE);
        asrt($book->getMeta('changed'), FALSE);
        R::store($book);
        //access only, no update
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 0);
        $logger->clear();
        $book = $book->fresh();
        $book->sharedCategoryList;
        asrt($book->getMeta('tainted'), TRUE);
        asrt($book->getMeta('changed'), FALSE);
        R::store($book);
        //access only, no update
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 0);
        $logger->clear();
        $book = $book->fresh();
        unset($book->xownPageList[5]);
        asrt($book->getMeta('tainted'), TRUE);
        asrt($book->getMeta('changed'), FALSE);
        R::store($book);
        //remove only, no update, just 1 delete
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 0);
        $numberOfUpdateQueries = $logger->grep('DELETE');
        asrt(count($numberOfUpdateQueries), 1);
        $book = $book->fresh();
        asrt(count($book->xownPageList), 9);
        $logger->clear();
        $book = $book->fresh();
        $book->xownPageList[] = R::dispense('page');
        asrt($book->getMeta('tainted'), TRUE);
        asrt($book->getMeta('changed'), FALSE);
        R::store($book);
        //no update, 1 insert, just adding
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 0);
        $numberOfUpdateQueries = $logger->grep('INSERT');
        asrt(count($numberOfUpdateQueries), 1);
        $book = $book->fresh();
        asrt(count($book->xownPageList), 10);
        $logger->clear();
        $book = $book->fresh();
        $book->map->xownLocationList[1]->name = 'Horshoe Bay';
        asrt($book->getMeta('tainted'), TRUE);
        asrt($book->getMeta('changed'), FALSE);
        asrt($book->map->getMeta('tainted'), TRUE);
        asrt($book->map->getMeta('changed'), FALSE);
        asrt($book->map->xownLocationList[1]->getMeta('tainted'), TRUE);
        asrt($book->map->xownLocationList[1]->getMeta('changed'), TRUE);
        R::store($book);
        //1 update for child of parent, no other updates
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 1);
        $book = $book->fresh();
        asrt($book->map->xownLocationList[1]->name, 'Horshoe Bay');
        $logger->clear();
        R::store($book);
        //just access, no updates
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 0);
        $logger->clear();
        $book = $book->fresh();
        $book->ownPageList[2]->number = 99;
        R::store($book);
        //1 update, do not update rest of pages or book itself
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 1);
        $book = $book->fresh();
        $book->author->name = 'Worsley';
        $logger->clear();
        R::store($book);
        //1 update for parent
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 1);
        $author = R::dispense('author');
        $author->name = 'J.W.';
        R::store($author);
        $book = $book->fresh();
        $book->author = $author;
        $author->name = 'JW';
        $logger->clear();
        R::store($book);
        //2 updates, one for author, one for link field: author_id needs update.
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 2);
        $author->country = R::dispense('country')->setAttr('name', 'England');
        R::store($author);
        $book = $book->fresh();
        $book->author->country->name = 'Wight';
        $logger->clear();
        R::store($book);
        //1 update, country only, dont update for intermediate parents: book -> author -> ...
        $numberOfUpdateQueries = $logger->grep('UPDATE');
        asrt(count($numberOfUpdateQueries), 1);
    }