@@ -3,13 +3,18 @@
require_once ('apps/navigation/lib/Navigation.php');

class NavigationTest extends PHPUnit_Framework_TestCase {
function test_navigation () {
$n = new Navigation;
protected static $n;
protected static $about_node;
protected static $blog_node;
protected static $contact_node;

function test_single_node () {
self::$n = new Navigation;

/**
* This is the tree on first install, just an index page.
*/
$n->tree = array (
self::$n->tree = array (
(object) array (
'data' => 'Home',
'attr' => (object) array (
@@ -24,9 +29,11 @@ function test_navigation () {
*
* index
*/
$this->assertEquals ($n->get_all_ids (), array ('index'));
self::$this->assertEquals (self::$n->get_all_ids (), array ('index'));
}

$blog_node = (object) array (
function test_adding_node () {
self::$blog_node = (object) array (
'data' => 'Blog',
'attr' => (object) array (
'id' => 'blog',
@@ -37,17 +44,19 @@ function test_navigation () {
/**
* Add blog page.
*/
$n->add ($blog_node, 'index');
self::$n->add (self::$blog_node, 'index');

/**
* Should have second id now:
*
* index
* - blog
*/
$this->assertEquals ($n->get_all_ids (), array ('index', 'blog'));
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'blog'));
}

$about_node = (object) array (
function test_adding_subnode () {
self::$about_node = (object) array (
'data' => 'About',
'attr' => (object) array (
'id' => 'about',
@@ -58,7 +67,7 @@ function test_navigation () {
/**
* Add about page under blog.
*/
$n->add ($about_node, 'blog');
self::$n->add (self::$about_node, 'blog');

/**
* Should have third id now under blog:
@@ -67,31 +76,41 @@ function test_navigation () {
* - blog
* - about
*/
$this->assertEquals ($n->get_all_ids (), array ('index', 'blog', 'about'));
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'blog', 'about'));

// Make sure about is under blog.
$this->assertEquals ($n->parent ('about')->attr->id, $blog_node->attr->id);
$this->assertEquals (self::$n->parent ('about')->attr->id, self::$blog_node->attr->id);
}

function test_find_node () {
// Find the about node and verify it.
$this->assertEquals ($n->node ('about')->attr->id, $about_node->attr->id);
$this->assertEquals (self::$n->node ('about')->attr->id, self::$about_node->attr->id);
}

function test_paths () {
// Test all paths
$this->assertEquals ($n->path ('index'), array ('index'));
$this->assertEquals ($n->path ('blog'), array ('index', 'blog'));
$this->assertEquals ($n->path ('about'), array ('index', 'blog', 'about'));
$this->assertEquals (self::$n->path ('index'), array ('index'));
$this->assertEquals (self::$n->path ('blog'), array ('index', 'blog'));
$this->assertEquals (self::$n->path ('about'), array ('index', 'blog', 'about'));

// Test paths with titles
$this->assertEquals ($n->path ('blog', true), array ('index' => 'Home', 'blog' => 'Blog'));
$this->assertEquals (self::$n->path ('blog', true), array ('index' => 'Home', 'blog' => 'Blog'));
}

function test_sections () {
// Test sections
$this->assertEquals ($n->sections (), array ('index', 'blog'));
$this->assertEquals (self::$n->sections (), array ('index', 'blog'));
}

function test_remove () {
// Remove about and verify.
$n->remove ('about');
$this->assertFalse (isset ($n->node ('blog')->children));
$this->assertNull ($n->node ('about'));
$this->assertEquals ($n->get_all_ids (), array ('index', 'blog'));
self::$n->remove ('about');
$this->assertFalse (isset (self::$n->node ('blog')->children));
$this->assertNull (self::$n->node ('about'));
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'blog'));
}

function test_remove_with_children () {
/**
* Add about and remove blog and verify.
*
@@ -101,13 +120,15 @@ function test_navigation () {
* - blog
* - about
*/
$n->add ($about_node, 'blog');
$this->assertEquals ($n->get_all_ids (), array ('index', 'blog', 'about'));
$n->remove ('blog');
$this->assertNull ($n->node ('about'));
$this->assertNull ($n->node ('blog'));
$this->assertEquals ($n->get_all_ids (), array ('index'));
self::$n->add (self::$about_node, 'blog');
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'blog', 'about'));
self::$n->remove ('blog');
$this->assertNull (self::$n->node ('about'));
$this->assertNull (self::$n->node ('blog'));
$this->assertEquals (self::$n->get_all_ids (), array ('index'));
}

function test_add_remove () {
/**
* Add blog to root and verify add/remove root nodes.
*
@@ -116,20 +137,22 @@ function test_navigation () {
* index
* about
*/
$about_node = (object) array (
self::$about_node = (object) array (
'data' => 'About',
'attr' => (object) array (
'id' => 'about',
'sort' => 0
)
);

$n->add ($about_node);
$this->assertEquals ($n->get_all_ids (), array ('index', 'about'));
$this->assertEquals ($n->node ('about')->attr->sort, 1);
$n->remove ('about');
$this->assertEquals (count ($n->tree), 1);
self::$n->add (self::$about_node);
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'about'));
$this->assertEquals (self::$n->node ('about')->attr->sort, 1);
self::$n->remove ('about');
$this->assertEquals (count (self::$n->tree), 1);
}

function test_remove_non_recursive () {
/**
* Add blog and about and contact nodes and test remove() non-recursive.
*
@@ -140,42 +163,44 @@ function test_navigation () {
* - contact
* - blog
*/
$about_node = (object) array (
self::$about_node = (object) array (
'data' => 'About',
'attr' => (object) array (
'id' => 'about',
'sort' => 0
)
);

$contact_node = (object) array (
self::$contact_node = (object) array (
'data' => 'Contact',
'attr' => (object) array (
'id' => 'contact',
'sort' => 0
)
);

$blog_node = (object) array (
self::$blog_node = (object) array (
'data' => 'Blog',
'attr' => (object) array (
'id' => 'blog',
'sort' => 0
)
);

$n->add ($about_node);
$n->add ($contact_node, 'about');
$n->add ($blog_node, 'about');
$this->assertEquals ($n->get_all_ids (), array ('index', 'about', 'contact', 'blog'));

$n->remove ('about', false);
$this->assertEquals ($n->get_all_ids (), array ('index', 'contact', 'blog'));
$this->assertEquals ($n->parent ('contact'), null);
$this->assertEquals ($n->parent ('blog'), null);
$n->remove ('contact');
$n->remove ('blog');
self::$n->add (self::$about_node);
self::$n->add (self::$contact_node, 'about');
self::$n->add (self::$blog_node, 'about');
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'about', 'contact', 'blog'));

self::$n->remove ('about', false);
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'contact', 'blog'));
$this->assertEquals (self::$n->parent ('contact'), null);
$this->assertEquals (self::$n->parent ('blog'), null);
self::$n->remove ('contact');
self::$n->remove ('blog');
}

function test_remove_path () {
/**
* Add node in two places and test remove_path().
*
@@ -186,32 +211,34 @@ function test_navigation () {
* - about
* about
*/
$about_node = (object) array (
self::$about_node = (object) array (
'data' => 'About',
'attr' => (object) array (
'id' => 'about',
'sort' => 0
)
);

$contact_node = (object) array (
self::$contact_node = (object) array (
'data' => 'Contact',
'attr' => (object) array (
'id' => 'contact',
'sort' => 0
)
);

$n->add ($about_node);
$n->add ($contact_node, 'index');
$n->add ($about_node, 'contact');
$this->assertEquals ($n->get_all_ids (), array ('index', 'contact', 'about', 'about'));
$n->remove_path (array ('index', 'contact', 'about'));
$contact = $n->node ('contact');
self::$n->add (self::$about_node);
self::$n->add (self::$contact_node, 'index');
self::$n->add (self::$about_node, 'contact');
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'contact', 'about', 'about'));
self::$n->remove_path (array ('index', 'contact', 'about'));
$contact = self::$n->node ('contact');
$this->assertFalse (isset ($contact->children));
$n->remove ('contact');
$n->remove ('about');
self::$n->remove ('contact');
self::$n->remove ('about');
}

function test_move () {
/**
* Add blog and about and contact nodes and test move().
*
@@ -222,34 +249,34 @@ function test_navigation () {
* - blog
* - contact
*/
$about_node = (object) array (
self::$about_node = (object) array (
'data' => 'About',
'attr' => (object) array (
'id' => 'about',
'sort' => 0
)
);

$contact_node = (object) array (
self::$contact_node = (object) array (
'data' => 'Contact',
'attr' => (object) array (
'id' => 'contact',
'sort' => 0
)
);

$blog_node = (object) array (
self::$blog_node = (object) array (
'data' => 'Blog',
'attr' => (object) array (
'id' => 'blog',
'sort' => 0
)
);

$n->add ($about_node, 'index');
$n->add ($contact_node, 'index');
$n->add ($blog_node, 'about');
$this->assertEquals ($n->get_all_ids (), array ('index', 'about', 'blog', 'contact'));
self::$n->add (self::$about_node, 'index');
self::$n->add (self::$contact_node, 'index');
self::$n->add (self::$blog_node, 'about');
$this->assertEquals (self::$n->get_all_ids (), array ('index', 'about', 'blog', 'contact'));

/**
* Move contact under about. New structure:
@@ -259,8 +286,8 @@ function test_navigation () {
* - blog
* - contact
*/
$n->move ('contact', 'about');
$this->assertEquals ($n->parent ('contact')->attr->id, 'about');
self::$n->move ('contact', 'about');
$this->assertEquals (self::$n->parent ('contact')->attr->id, 'about');

/**
* Move contact under blog. New structure:
@@ -270,10 +297,10 @@ function test_navigation () {
* - blog
* - contact
*/
$n->move ('contact', 'blog');
$this->assertEquals ($n->parent ('contact')->attr->id, 'blog');
$this->assertEquals ($n->parent ('blog')->attr->id, 'about');
$this->assertEquals ($n->parent ('about')->attr->id, 'index');
self::$n->move ('contact', 'blog');
$this->assertEquals (self::$n->parent ('contact')->attr->id, 'blog');
$this->assertEquals (self::$n->parent ('blog')->attr->id, 'about');
$this->assertEquals (self::$n->parent ('about')->attr->id, 'index');

/**
* Move blog to top. New structure:
@@ -283,9 +310,9 @@ function test_navigation () {
* blog
* - contact
*/
$n->move ('blog', false);
$this->assertEquals ($n->parent ('contact')->attr->id, 'blog');
$this->assertEquals ($n->parent ('blog'), null);
self::$n->move ('blog', false);
$this->assertEquals (self::$n->parent ('contact')->attr->id, 'blog');
$this->assertEquals (self::$n->parent ('blog'), null);

/**
* Move blog to after about under index. New structure:
@@ -295,11 +322,11 @@ function test_navigation () {
* - blog
* - contact
*/
$n->move ('blog', 'about', 'after');
$this->assertEquals ($n->parent ('blog')->attr->id, 'index');
$this->assertEquals ($n->parent ('contact')->attr->id, 'blog');
$this->assertEquals ($n->node ('about')->attr->sort, 0);
$this->assertEquals ($n->node ('blog')->attr->sort, 1);
self::$n->move ('blog', 'about', 'after');
$this->assertEquals (self::$n->parent ('blog')->attr->id, 'index');
$this->assertEquals (self::$n->parent ('contact')->attr->id, 'blog');
$this->assertEquals (self::$n->node ('about')->attr->sort, 0);
$this->assertEquals (self::$n->node ('blog')->attr->sort, 1);

/**
* Move blog to after about under index. New structure:
@@ -309,11 +336,11 @@ function test_navigation () {
* - contact
* - blog
*/
$n->move ('contact', 'blog', 'before');
$this->assertEquals ($n->parent ('contact')->attr->id, 'index');
$this->assertEquals ($n->node ('about')->attr->sort, 0);
$this->assertEquals ($n->node ('contact')->attr->sort, 1);
$this->assertEquals ($n->node ('blog')->attr->sort, 2);
self::$n->move ('contact', 'blog', 'before');
$this->assertEquals (self::$n->parent ('contact')->attr->id, 'index');
$this->assertEquals (self::$n->node ('about')->attr->sort, 0);
$this->assertEquals (self::$n->node ('contact')->attr->sort, 1);
$this->assertEquals (self::$n->node ('blog')->attr->sort, 2);

/**
* Move blog to before index. New structure:
@@ -323,10 +350,10 @@ function test_navigation () {
* - about
* - contact
*/
$n->move ('blog', 'index', 'before');
$this->assertEquals ($n->parent ('blog'), null);
$this->assertEquals ($n->node ('blog')->attr->sort, 0);
$this->assertEquals ($n->node ('index')->attr->sort, 1);
self::$n->move ('blog', 'index', 'before');
$this->assertEquals (self::$n->parent ('blog'), null);
$this->assertEquals (self::$n->node ('blog')->attr->sort, 0);
$this->assertEquals (self::$n->node ('index')->attr->sort, 1);

/**
* Move blog to after index. New structure:
@@ -336,10 +363,10 @@ function test_navigation () {
* - contact
* blog
*/
$n->move ('blog', 'index', 'after');
$this->assertEquals ($n->parent ('blog'), null);
$this->assertEquals ($n->node ('index')->attr->sort, 0);
$this->assertEquals ($n->node ('blog')->attr->sort, 1);
self::$n->move ('blog', 'index', 'after');
$this->assertEquals (self::$n->parent ('blog'), null);
$this->assertEquals (self::$n->node ('index')->attr->sort, 0);
$this->assertEquals (self::$n->node ('blog')->attr->sort, 1);

/**
* Move index to after blog. New structure:
@@ -349,11 +376,11 @@ function test_navigation () {
* - about
* - contact
*/
$n->move ('index', 'blog', 'after');
$this->assertEquals ($n->parent ('blog'), null);
$this->assertEquals ($n->node ('blog')->attr->sort, 0);
$this->assertEquals ($n->node ('index')->attr->sort, 1);
$this->assertEquals (count ($n->node ('index')->children), 2);
self::$n->move ('index', 'blog', 'after');
$this->assertEquals (self::$n->parent ('blog'), null);
$this->assertEquals (self::$n->node ('blog')->attr->sort, 0);
$this->assertEquals (self::$n->node ('index')->attr->sort, 1);
$this->assertEquals (count (self::$n->node ('index')->children), 2);

/**
* Move index to before blog. New structure:
@@ -363,11 +390,11 @@ function test_navigation () {
* - contact
* blog
*/
$n->move ('index', 'blog', 'before');
$this->assertEquals ($n->parent ('blog'), null);
$this->assertEquals ($n->node ('index')->attr->sort, 0);
$this->assertEquals ($n->node ('blog')->attr->sort, 1);
$this->assertEquals (count ($n->node ('index')->children), 2);
self::$n->move ('index', 'blog', 'before');
$this->assertEquals (self::$n->parent ('blog'), null);
$this->assertEquals (self::$n->node ('index')->attr->sort, 0);
$this->assertEquals (self::$n->node ('blog')->attr->sort, 1);
$this->assertEquals (count (self::$n->node ('index')->children), 2);
}
}

@@ -8,6 +8,10 @@
class Foobar extends Model {}

class VersionsTest extends PHPUnit_Framework_TestCase {
protected static $foo;
protected static $foo2;
protected static $v;

static function setUpBeforeClass () {
Database::open (array ('master' => true, 'driver' => 'sqlite', 'file' => ':memory:'));
db_execute ('create table foobar (id int not null, name char(32) not null)');
@@ -34,35 +38,44 @@ static function tearDownAfterClass () {
unset ($GLOBALS['user']);
}

function test_versions () {
$foo = new Foobar (array ('id' => 1, 'name' => 'Test'));
$foo->put ();
function test_add () {
self::$foo = new Foobar (array ('id' => 1, 'name' => 'Test'));
self::$foo->put ();

$v = Versions::add ($foo);
self::$v = Versions::add (self::$foo);
$this->assertEquals (db_shift ('select count(*) from versions'), 1);
$this->assertEquals ($v->class, 'Foobar');
$this->assertEquals ($v->pkey, 1);
$this->assertEquals ($v->user, 0);
$foo2 = Versions::restore ($v);
$this->assertEquals ($foo, $foo2);
$this->assertEquals (self::$v->class, 'Foobar');
$this->assertEquals (self::$v->pkey, 1);
$this->assertEquals (self::$v->user, 0);
}

function test_restore () {
self::$foo2 = Versions::restore (self::$v);
$this->assertEquals (self::$foo, self::$foo2);
}

function test_diff () {
// test diff
$foo->name = 'Test2';
$foo->put ();
self::$foo->name = 'Test2';
self::$foo->put ();

$v = Versions::add ($foo);
$v = Versions::add (self::$foo);
$this->assertEquals (db_shift ('select count(*) from versions'), 2);

$modified = Versions::diff ($foo2, $foo);
$modified = Versions::diff (self::$foo2, self::$foo);
$this->assertEquals ($modified[0], 'name');
}

function test_history () {
// test history
$history = Versions::history ($foo);
$history = Versions::history (self::$foo);
$this->assertEquals (count ($history), 2);

$modified = Versions::diff ($history[0], $history[1]);
$this->assertEquals ($modified[0], 'name');
}

function test_recent () {
// test recent
$recent = Versions::recent ();
$this->assertEquals (count ($recent), 1);