Files
pathfinder/app/app/cortex/test_relation.php

335 lines
8.7 KiB
PHP

<?php
use App\Controller;
class Test_Relation {
/**
* unify results for better comparison
*/
private function getResult($result)
{
$out = array();
foreach ($result as $row) {
if(is_object($row))
$row = $row->cast();
unset($row['_id']);
unset($row['id']);
unset($row['aid']);
unset($row['uid']);
unset($row['nid']);
unset($row['tid']);
unset($row['pid']);
unset($row['profile_id']);
foreach ($row as $col => $val) {
if (empty($val) || is_null($val))
unset($row[$col]);
}
$out[] = $row;
}
return $out;
}
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());
$test->expect(
json_encode($allnews) ==
'[{"title":"Responsive Images","text":"Lorem Ipsun"},{"title":"CSS3 Showcase","text":"News Text 2"},{"title":"Touchable Interfaces","text":"Lorem Foo"}]',
$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(
$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'
);
$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'
);
$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();
}
}