function run() { $test = new \Test(); /** @var \Base $f3 */ $f3 = \Base::instance(); $news = new NewsModel(); $news->load(); $dummy = array('title' => 'copy test', 'text' => 'Lorem ipsum dolor sit amet.', 'author' => 1, 'tags' => array(3)); $f3->set('record1', $dummy); $news->copyto('record2'); $test->expect($f3->exists('record2'), 'copyto: raw record copied to hive'); $news->reset(); $news->copyfrom('record1'); $test->expect($news->title = 'copy test' && ($news->text = 'Lorem ipsum dolor sit amet.'), 'copyfrom: hydrate from hive key'); $test->expect($news->author instanceof AuthorModel && !$news->author->dry() && $news->tags instanceof \DB\CortexCollection, 'copyfrom: relations hydrated successful'); $test->expect($news->get('author', true) == 1, 'get raw data from relational field'); $news->reset(); $news->copyfrom('record2', 'title;author'); $test->expect($news->title = 'Responsive Images' && $news->get('author', true) == 2 && $news->text == NULL, 'copyfrom: limit fields with split-able string'); $news->reset(); $news->copyfrom('record2', array('title')); $test->expect($news->title = 'Responsive Images' && $news->text == NULL, 'copyfrom: limit fields by array'); $news->reset(); $news->copyfrom($dummy, function ($fields) { return array_intersect_key($fields, array_flip(array('title'))); }); $test->expect($news->title = 'copy test', 'copyfrom: copy from array instead of hive key'); $test->expect($news->title = 'copy test' && $news->text == NULL, 'copyfrom: limit fields by callback function'); $all = $news->find(); $allTitle = $all->getAll('title'); $test->expect(count($allTitle) == 3 && $allTitle[0] == 'Responsive Images' && $allTitle[1] == 'CSS3 Showcase' && $allTitle[2] == 'Touchable Interfaces', 'collection getAll returns all values of selected field'); $newsByID = $all->getBy('_id'); $test->expect(array_keys($newsByID) == array(1, 2, 3), 'collection getBy sorts by given field'); $newsByAuthorID = $all->getBy('author', true); $test->expect(array_keys($newsByAuthorID) == array(2, 1) && count($newsByAuthorID[2]) == 2 && count($newsByAuthorID[1]) == 1, 'collection getBy nested sort by author'); $allTitle = array(); foreach ($all as $record) { $allTitle[] = $record->title; } $test->expect(count($allTitle) == 3 && $allTitle[0] == 'Responsive Images' && $allTitle[1] == 'CSS3 Showcase' && $allTitle[2] == 'Touchable Interfaces', 'collection is traversable'); $news->reset(); $news->load(); $r = $news->cast(null, 0); $test->expect($r['tags2'] == null && is_int($r['author']), 'simple cast without relations'); $r = $news->cast(null, 1); $test->expect(is_array($r['tags2']) && is_array($r['author']), '1-level nested cast'); $r = $news->cast(null, 2); $test->expect(is_array($r['author']['profile']), '2-level nested cast'); $r = $news->cast(null, array('*' => 2)); $test->expect(is_array($r['author']['profile']), '2-level nested cast, alternative'); $r = $news->cast(null, array('*' => 0, 'author' => 0)); $test->expect(is_array($r['author']) && $r['tags2'] == null && $r['author']['news'] == null && $r['author']['profile'] == null, 'custom cast'); $r = $news->cast(null, array('*' => 0, 'author' => array('*' => 1))); $test->expect(is_array($r['author']) && $r['tags2'] == null && is_array($r['author']['news']) && is_array($r['author']['profile']), 'custom nested cast'); $r = $news->cast(null, array('*' => 0, 'author' => array('*' => 0, 'profile' => 0))); $test->expect(is_array($r['author']) && $r['tags2'] == null && $r['author']['news'] == null && is_array($r['author']['profile']) && is_int($r['author']['profile']['author']), 'custom nested cast with exclusions'); $r = $news->cast(null, array('*' => 0, 'author' => array('*' => 0, 'profile' => 1))); $test->expect(is_array($r['author']) && $r['tags2'] == null && $r['author']['news'] == null && is_array($r['author']['profile']) && is_array($r['author']['profile']['author']), 'custom multi-level nested cast'); $filterA = array('foo1 = ? and bar1 = ?', 10, 20); $filterB = array('foo2 = ? and bar2 = ?', 30, 40); $filterC = array('foo3 = ? and bar3 = ?', 50, 60); $filter = $news->mergeFilter(array($filterA, $filterB, $filterC), 'or'); $test->expect($filter == array('( foo1 = ? and bar1 = ? ) or ( foo2 = ? and bar2 = ? ) or ( foo3 = ? and bar3 = ? )', 10, 20, 30, 40, 50, 60), 'merge multiple filters'); /////////////////////////////////// return $test->results(); }
function run($db, $type) { $test = new \Test(); // clear existing data \AuthorModel::setdown(); \TagModel::setdown(); \NewsModel::setdown(); \ProfileModel::setdown(); // setup models \AuthorModel::setup(); \TagModel::setup(); \NewsModel::setup(); \ProfileModel::setup(); // setup Author /////////////////////////////////// $author_id = array(); $author = new \AuthorModel(); $ac = $author::resolveConfiguration(); $author_pk = is_int(strpos($type, 'sql')) ? $ac['primary'] : '_id'; $author->name = 'Johnny English'; $author->save(); $author_id[] = $author->_id; $author->reset(); $author->name = 'Ridley Scott'; $author->save(); $author_id[] = $author->_id; $author->reset(); $author->name = 'James T. Kirk'; $author->save(); $author_id[] = $author->_id; $author->reset(); $allauthors = $author->find()->castAll(); $allauthors = $this->getResult($allauthors); $test->expect(json_encode($allauthors) == '[{"name":"Johnny English"},{"name":"Ridley Scott"},{"name":"James T. Kirk"}]', $type . ': all AuthorModel items created'); // setup Tags /////////////////////////////////// $tag_id = array(); $tag = new \TagModel(); $tc = $tag::resolveConfiguration(); $tag_pk = is_int(strpos($type, 'sql')) ? $tc['primary'] : '_id'; $tag->title = 'Web Design'; $tag->save(); $tag_id[] = $tag->_id; $tag->reset(); $tag->title = 'Responsive'; $tag->save(); $tag_id[] = $tag->_id; $tag->reset(); $tag->title = 'Usability'; $tag->save(); $tag_id[] = $tag->_id; $tag->reset(); $allTags = $this->getResult($tag->find()); $test->expect(json_encode($allTags) == '[{"title":"Web Design"},{"title":"Responsive"},{"title":"Usability"}]', $type . ': all TagModel items created'); // setup News /////////////////////////////////// $news_id = array(); $news = new \NewsModel(); $nc = $news::resolveConfiguration(); $news_pk = is_int(strpos($type, 'sql')) ? $nc['primary'] : '_id'; $news->title = 'Responsive Images'; $news->text = 'Lorem Ipsun'; $news->save(); $news_id[] = $news->_id; $news->reset(); $news->title = 'CSS3 Showcase'; $news->text = 'News Text 2'; $news->save(); $news_id[] = $news->_id; $news->reset(); $news->title = 'Touchable Interfaces'; $news->text = 'Lorem Foo'; $news->save(); $news_id[] = $news->_id; $news->reset(); $allnews = $this->getResult($news->find(null, array('order' => 'title'))); $test->expect(count($allnews) == 3 && $allnews[0]['title'] == 'CSS3 Showcase' && $allnews[1]['title'] == 'Responsive Images' && $allnews[2]['title'] == 'Touchable Interfaces', $type . ': all NewsModel items created'); // belongs-to author relation /////////////////////////////////// $author->load(); $news->load(array($news_pk . ' = ?', $news_id[0])); $news->author = $author; $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[0])); $test->expect($news->author->name == 'Johnny English', $type . ': belongs-to-one: author relation created'); $news->author = NULL; $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[0])); $test->expect(empty($news->author), $type . ': belongs-to-one: author relation released'); $news->author = $author->_id; $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[0])); $test->expect($news->author->name == 'Johnny English', $type . ': belongs-to-one: relation created by raw id'); // belongs-to-many tag relation /////////////////////////////////// $tag1 = new \TagModel(); $tag1->load(array($tag_pk . ' = ?', $tag_id[0])); $tag2 = new \TagModel(); $tag2->load(array($tag_pk . ' = ?', $tag_id[1])); $news->tags = array($tag1, $tag2); $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[0])); $test->expect($news->tags[0]->title == 'Web Design' && $news->tags[1]->title == 'Responsive', $type . ': belongs-to-many: relations created with array of mapper objects'); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[1])); $news->tags = array($tag_id[1], $tag_id[2]); $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[1])); $test->expect(count($news->tags) == 2 && $news->tags[0]->title == 'Responsive' && $news->tags[1]->title == 'Usability', $type . ': belongs-to-many: relations created with array of IDs'); $news->tags = null; $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[1])); $test->expect(empty($news->tags), $type . ': belongs-to-many: relations released'); $tag->reset(); $news->load(array($news_pk . ' = ?', $news_id[1])); $news->tags = $tag->load(array($tag_pk . ' != ?', $tag_id[0])); $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[1])); $test->expect($news->tags[0]->title == 'Responsive' && $news->tags[1]->title == 'Usability', $type . ': belongs-to-many: relations created with hydrated mapper'); $news->reset(); $tag->reset(); $news->load(array($news_pk . ' = ?', $news_id[2])); $news->tags = $tag_id[0] . ';' . $tag_id[2]; $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[2])); $test->expect($news->tags[0]->title == 'Web Design' && $news->tags[1]->title == 'Usability', $type . ': belongs-to-many: relations created with split-able string'); $test->expect(is_object($news->tags) && $news->tags instanceof \DB\CortexCollection, $type . ': belongs-to-many: result is collection'); // has-one relation /////////////////////////////////// $profile = new ProfileModel(); $pc = $profile::resolveConfiguration(); $profile_pk = is_int(strpos($type, 'sql')) ? $pc['primary'] : '_id'; $profile->message = 'Hello World'; $profile->author = $author->load(array($author_pk . ' = ?', $author_id[0])); $profile->save(); $profile_id = $profile->_id; $profile->reset(); $author->reset(); $author->load(array($author_pk . ' = ?', $author_id[0])); $profile->load(array($profile_pk . ' = ?', $profile_id)); $test->expect($author->profile->message == 'Hello World' && $profile->author->name == "Johnny English", $type . ': has-one: relation assigned'); $profile->reset(); $profile->message = 'I\'m feeling lucky'; $profile->image = 'lolcat.jpg'; $author->reset(); $author->load(array($author_pk . ' = ?', $author_id[1])); $author->profile = $profile; $author->save(); $profile->reset(); $author->reset(); $author->load(array($author_pk . ' = ?', $author_id[1])); $test->expect($author->profile->message == 'I\'m feeling lucky', $type . ': has-one: inverse relation'); // has-many relation /////////////////////////////////// $author->load(array($author_pk . ' = ?', $author_id[0])); $result = $this->getResult($author->news); $test->expect($result[0]['title'] == "Responsive Images" && $result[0]['tags'][0]['title'] == 'Web Design' && $result[0]['tags'][1]['title'] == 'Responsive', $type . ': has-many inverse relation'); // many to many relation /////////////////////////////////// $news->load(array($news_pk . ' = ?', $news_id[0])); $news->tags2 = array($tag_id[0], $tag_id[1]); $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[0])); $test->expect($news->tags2[0]['title'] == 'Web Design' && $news->tags2[1]['title'] == 'Responsive', $type . ': many-to-many relation created'); $test->expect(is_object($news->tags2) && $news->tags2 instanceof \DB\CortexCollection, $type . ': many-to-many: result is collection'); $tag3 = $tag->load(array($tag_pk . ' = ?', $tag_id[2])); $news->tags2[] = $tag3; $news->save(); $a = count($news->tags2); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[0])); $test->expect(count($news->tags2) == 3 && $a == 3, $type . ': many-to-many relation added implicitly'); $news->load(array($news_pk . ' = ?', $news_id[0])); $news->tags2 = NULL; $news->save(); $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[0])); $test->expect(is_null($news->tags2), $type . ': many-to-many relation released'); $news->reset(); $news->title = 'Can it run Crysis?'; $news->text = 'XOXO'; $news->tags2 = array($tag_id[0]); $news->save(); $news_id[] = $news->_id; $news->reset(); $news->load(array($news_pk . ' = ?', $news_id[3])); $a = count($news->tags2); $tag1 = $tag->find(array($tag_pk . ' = ?', $tag_id[0])); $b = count($tag1[0]->news); $c = $tag1[0]->news[0]->title == 'Can it run Crysis?'; $news->erase(); $tag1 = $tag->find(array($tag_pk . ' = ?', $tag_id[0])); $d = count($tag1[0]->news); $test->expect($a == 1 && $b == 1 && $c && $d == 0, $type . ': many-to-many relation cleaned by erase cascade'); $news->load(array($news_pk . ' = ?', $news_id[0])); $all = $news->find(); $test->expect($all[1]->tags2 === NULL && $all[2]->author === NULL, $type . ': empty relations are NULL'); $arr = $news->cast(); $test->expect(is_array($arr['tags']), $type . ': collection becomes array in casted model'); if ($type == 'mongo') { $test->expect(is_string($arr['_id']), $type . ': id becomes string in casted model'); } /////////////////////////////////// return $test->results(); }