From 6c9d05f6afd05ff83697c9b4665dd76dadaf3635 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Mon, 9 Nov 2009 21:12:42 -0500 Subject: [PATCH] fix FS#113 --- classes/ComicPressNavigation.inc | 24 ++++++++++------- test/ComicPressNavigationTest.php | 44 ++++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/classes/ComicPressNavigation.inc b/classes/ComicPressNavigation.inc index 4dca364..31288a9 100644 --- a/classes/ComicPressNavigation.inc +++ b/classes/ComicPressNavigation.inc @@ -14,44 +14,50 @@ class ComicPressNavigation { if (is_object($post)) { if (isset($post->ID)) { $cache_key = 'navigation-' . $post->ID; - + if (($result = wp_cache_get($cache_key, 'comicpress')) !== false) { foreach ($result as $key => $post_id) { $nev[$key] = get_post($post_id); } } - + // global previous/next foreach (array('previous', 'next') as $field) { $nav[$field] = $this->_dbi->{"get_${field}_comic"}(null, $post); } - + // global first/last foreach (array('first', 'last') as $field) { $nav[$field] = $this->_dbi->{"get_${field}_comic"}(null); } - + if ($category = $this->_storyline->get_valid_post_category($post->ID)) { // storyline previous/next foreach (array('previous', 'next') as $field) { $nav["storyline-${field}"] = $this->_dbi->{"get_${field}_comic"}($category, $post); } - + // adjacent storyline nodes if (is_array($valid = $this->_storyline->valid($category))) { foreach ($valid as $field) { - $nav["storyline-chapter-${field}"] = $this->_dbi->get_first_comic($this->_storyline->{$field}($category)); + $all_adjacents = $this->_storyline->all_adjacent($category, $field); + foreach ($all_adjacents as $adjacent_category) { + $result = $this->_dbi->get_first_comic($adjacent_category); + if (!empty($result)) { + $nav["storyline-chapter-${field}"] = $result; break; + } + } } } } - + $cache_data = array(); foreach ($nav as $key => $output_post) { if (!empty($output_post)) { $cache_data[$key] = $output_post->ID; } } - + wp_cache_set($cache_key, $cache_data, 'comicpress'); - + return $nav; } } diff --git a/test/ComicPressNavigationTest.php b/test/ComicPressNavigationTest.php index e848ec8..7579fe1 100644 --- a/test/ComicPressNavigationTest.php +++ b/test/ComicPressNavigationTest.php @@ -12,7 +12,7 @@ class ComicPressNavigationTest extends PHPUnit_Framework_TestCase { _reset_wp(); $this->nav = new ComicPressNavigation(); } - + function testGetPostNav() { $dbi = $this->getMock('ComicPressDBInterface', array('get_previous_comic', 'get_next_comic', 'get_first_comic', 'get_last_comic')); $storyline = new ComicPressStoryline(); @@ -34,18 +34,54 @@ class ComicPressNavigationTest extends PHPUnit_Framework_TestCase { $dbi->expects($this->at(3))->method('get_last_comic')->with(null); $dbi->expects($this->at(4))->method('get_previous_comic')->with(2, $post); $dbi->expects($this->at(5))->method('get_next_comic')->with(2, $post); - $dbi->expects($this->at(6))->method('get_first_comic')->with(1); - $dbi->expects($this->at(7))->method('get_first_comic')->with(3); + $dbi->expects($this->at(6))->method('get_first_comic')->with(1)->will($this->returnValue((object)array('ID' => 1))); + $dbi->expects($this->at(7))->method('get_first_comic')->with(3)->will($this->returnValue((object)array('ID' => 1))); $this->nav->_dbi = $dbi; $this->nav->_storyline = $storyline; $this->assertFalse(wp_cache_get('navigation-1', 'comicpress')); - + $this->nav->get_post_nav($post); $this->assertTrue(wp_cache_get('navigation-1', 'comicpress') !== false); } + + function testSkipEmptyCategories() { + $dbi = $this->getMock('ComicPressDBInterface', array('get_previous_comic', 'get_next_comic', 'get_first_comic', 'get_last_comic')); + $storyline = new ComicPressStoryline(); + + $storyline->_structure = array( + '1' => array('next' => 2), + '2' => array('previous' => 1, 'next' => 3), + '3' => array('previous' => 2) + ); + + wp_insert_post(array('ID' => 1)); + $post = get_post(1); + + wp_set_post_categories(1, array(1)); + + $dbi->expects($this->any())->method('get_first_comic')->will($this->returnCallback(array(&$this, 'callbackTestSkipEmptyCategories'))); + + $this->nav->_dbi = $dbi; + $this->nav->_storyline = $storyline; + + $nav = $this->nav->get_post_nav($post); + + $this->assertEquals(10, $nav['storyline-chapter-next']->ID); + } + + function callbackTestSkipEmptyCategories($category_id) { + if (!is_null($category_id)) { + switch ($category_id) { + case 3: return (object)array('ID' => 10); + default: return false; + } + } else { + return (object)array('ID' => 1); + } + } } ?> \ No newline at end of file