diff --git a/code/VersionFeed_Controller.php b/code/VersionFeed_Controller.php index 52b10a2..3f31ea0 100644 --- a/code/VersionFeed_Controller.php +++ b/code/VersionFeed_Controller.php @@ -32,7 +32,7 @@ class VersionFeed_Controller extends Extension { // Cache the diffs to remove DOS possibility. $cache = SS_Cache::factory('VersionFeed_Controller'); $cache->setOption('automatic_serialization', true); - $key = 'changes' . $this->owner->Version; + $key = implode('_', array('changes', $this->owner->ID, $this->owner->Version)); $entries = $cache->load($key); if(!$entries || isset($_GET['flush'])) { $entries = $this->owner->getDiffedChanges(); @@ -85,6 +85,8 @@ class VersionFeed_Controller extends Extension { $cache->save($changeList, $key); } + } else { + $changeList = new ArrayList(); } // Produce output diff --git a/templates/Page_allchanges_rss.ss b/templates/Page_allchanges_rss.ss new file mode 100644 index 0000000..f319cdc --- /dev/null +++ b/templates/Page_allchanges_rss.ss @@ -0,0 +1,25 @@ + + + + $Title + $Link + + + <% loop Entries %> + + $Title.XML + $GeneratedLink + + <% if DiffTitle %> + $DiffTitle.XML + <% end_if %> + <% if DiffContent %> + $DiffContent.AbsoluteLinks.XML + <% end_if %> + + $LastEdited.Rfc822 + $GeneratedLink + + <% end_loop %> + + diff --git a/templates/Page_changes_rss.ss b/templates/Page_changes_rss.ss new file mode 100644 index 0000000..f319cdc --- /dev/null +++ b/templates/Page_changes_rss.ss @@ -0,0 +1,25 @@ + + + + $Title + $Link + + + <% loop Entries %> + + $Title.XML + $GeneratedLink + + <% if DiffTitle %> + $DiffTitle.XML + <% end_if %> + <% if DiffContent %> + $DiffContent.AbsoluteLinks.XML + <% end_if %> + + $LastEdited.Rfc822 + $GeneratedLink + + <% end_loop %> + + diff --git a/tests/VersionFeedFunctionalTest.php b/tests/VersionFeedFunctionalTest.php new file mode 100644 index 0000000..bdbe9cd --- /dev/null +++ b/tests/VersionFeedFunctionalTest.php @@ -0,0 +1,97 @@ + array('VersionFeed'), + 'Page_Controller' => array('VersionFeed_Controller'), + ); + + public function testPublicHistory() { + $page = $this->createPageWithChanges(array('PublicHistory' => false)); + + $response = $this->get($page->RelativeLink('changes')); + $this->assertEquals(404, $response->getStatusCode()); + + $response = $this->get($page->RelativeLink('allchanges')); + $this->assertEquals(200, $response->getStatusCode()); + $xml = simplexml_load_string($response->getBody()); + $this->assertFalse((bool)$xml->channel->item); + + $page = $this->createPageWithChanges(array('PublicHistory' => true)); + + $response = $this->get($page->RelativeLink('changes')); + $this->assertEquals(200, $response->getStatusCode()); + $xml = simplexml_load_string($response->getBody()); + $this->assertTrue((bool)$xml->channel->item); + + $response = $this->get($page->RelativeLink('allchanges')); + $this->assertEquals(200, $response->getStatusCode()); + $xml = simplexml_load_string($response->getBody()); + $this->assertTrue((bool)$xml->channel->item); + } + + public function testContainsChangesForPageOnly() { + $page1 = $this->createPageWithChanges(array('Title' => 'Page1')); + $page2 = $this->createPageWithChanges(array('Title' => 'Page2')); + + $response = $this->get($page1->RelativeLink('changes')); + $xml = simplexml_load_string($response->getBody()); + $titles = array_map(function($item) {return (string)$item->title;}, $xml->xpath('//item')); + // TODO Unclear if this should contain the original version + $this->assertContains('Changed: Page1', $titles); + $this->assertNotContains('Changed: Page2', $titles); + + $response = $this->get($page2->RelativeLink('changes')); + $xml = simplexml_load_string($response->getBody()); + $titles = array_map(function($item) {return (string)$item->title;}, $xml->xpath('//item')); + // TODO Unclear if this should contain the original version + $this->assertNotContains('Changed: Page1', $titles); + $this->assertContains('Changed: Page2', $titles); + } + + public function testContainsAllChangesForAllPages() { + $page1 = $this->createPageWithChanges(array('Title' => 'Page1')); + $page2 = $this->createPageWithChanges(array('Title' => 'Page2')); + + $response = $this->get($page1->RelativeLink('allchanges')); + $xml = simplexml_load_string($response->getBody()); + $titles = array_map(function($item) {return (string)$item->title;}, $xml->xpath('//item')); + $this->assertContains('Page1', $titles); + $this->assertContains('Page2', $titles); + } + + protected function createPageWithChanges($seed = null) { + $page = new Page(); + + $seed = array_merge(array( + 'Title' => 'My Title', + 'Content' => 'My Content' + ), $seed); + $page->update($seed); + $page->write(); + $page->publish('Stage', 'Live'); + + $page->update(array( + 'Title' => 'Changed: ' . $seed['Title'], + 'Content' => 'Changed: ' . $seed['Content'], + )); + $page->write(); + $page->publish('Stage', 'Live'); + + $page->update(array( + 'Title' => 'Changed again: ' . $seed['Title'], + 'Content' => 'Changed again: ' . $seed['Content'], + )); + $page->write(); + $page->publish('Stage', 'Live'); + + $page->update(array( + 'Title' => 'Unpublished: ' . $seed['Title'], + 'Content' => 'Unpublished: ' . $seed['Content'], + )); + $page->write(); + + return $page; + } + +} \ No newline at end of file diff --git a/tests/VersionFeedTest.php b/tests/VersionFeedTest.php new file mode 100644 index 0000000..6b94d80 --- /dev/null +++ b/tests/VersionFeedTest.php @@ -0,0 +1,39 @@ +markTestIncomplete(); + } + + public function testDiffedChangesIncludesFullHistory() { + $this->markTestIncomplete(); + } + + public function testDiffedChangesTitle() { + $page = new Page(array('Title' => 'My Title')); + $page->write(); + $page->publish('Stage', 'Live'); + $feed = new VersionFeed(); + $feed->setOwner($page); + + $page->Title = 'My Changed Title'; + $page->write(); + $page->publish('Stage', 'Live'); + + $page->Title = 'My Unpublished Changed Title'; + $page->write(); + + $this->assertContains( + _t('RSSHistory.TITLECHANGED', 'Title has changed:') . 'My Changed Title', + array_map('strip_tags', $feed->getDiffedChanges()->column('DiffTitle')), + 'Detects published title changes' + ); + + $this->assertNotContains( + _t('RSSHistory.TITLECHANGED', 'Title has changed:') . 'My Unpublished Changed Title', + array_map('strip_tags', $feed->getDiffedChanges()->column('DiffTitle')), + 'Ignores unpublished title changes' + ); + } + +} \ No newline at end of file