Commit 32e3c06e8db35f5051f05951f56f96583247da02

Authored by Antonio Terceiro
1 parent 47bbb6bf

ActionItem936: enhancements done in pair

  * making the block available for environments
  * moving the status message to the block footer
  * renaming `clean` to `clear`
  * moving all feed processing logic to FeedHandler
  * copied style from recent documents block
  * using actual ActiveRecord object for testing
app/controllers/admin/environment_design_controller.rb
... ... @@ -3,7 +3,7 @@ class EnvironmentDesignController < BoxOrganizerController
3 3 protect 'edit_environment_design', :environment
4 4  
5 5 def available_blocks
6   - @available_blocks ||= [ LoginBlock, EnvironmentStatisticsBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, PeopleBlock, SellersSearchBlock, LinkListBlock ]
  6 + @available_blocks ||= [ LoginBlock, EnvironmentStatisticsBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, PeopleBlock, SellersSearchBlock, LinkListBlock, FeedReaderBlock ]
7 7 end
8 8  
9 9 end
... ...
app/models/feed_reader_block.rb
... ... @@ -27,13 +27,16 @@ class FeedReaderBlock < Block
27 27 end
28 28  
29 29 def formatted_feed_content
  30 + return "<ul>\n" +
  31 + self.feed_items.map{ |item| "<li><a href='#{item[:link]}'>#{item[:title]}</a></li>" }.join("\n") +
  32 + "</ul>"
  33 + end
  34 +
  35 + def footer
30 36 if self.fetched_at.nil? or self.feed_items.empty?
31   - return ("<p class='feed-reader-block-error'>%s</p>" % _('Feed content was not loaded yet'))
  37 + _('Feed content was not loaded yet')
32 38 else
33   - return "<ul class='feed-reader-block-list'>" +
34   - self.feed_items.map{ |item| "<li><a href='#{item[:link]}' class='feed-reader-block-item'>#{item[:title]}</a></li>" }.join("\n") +
35   - "</ul>" +
36   - "<div class='feed-reader-block-fetched-at'>#{_("Updated: %s") % show_date(self.fetched_at)}</div>"
  39 + _("Updated: %s") % show_date(self.fetched_at)
37 40 end
38 41 end
39 42  
... ... @@ -41,7 +44,7 @@ class FeedReaderBlock &lt; Block
41 44 self.feed_items << {:title => title, :link => link}
42 45 end
43 46  
44   - def clean
  47 + def clear
45 48 self.feed_items = []
46 49 self.feed_title = nil
47 50 end
... ...
lib/feed_handler.rb
... ... @@ -23,12 +23,16 @@ class FeedHandler
23 23 end
24 24  
25 25 def process(container)
26   - content = fetch(container.address)
27   - container.fetched_at = Time.now
28   - parse = parse(content)
29   - container.feed_title = parse.title
30   - parse.items[0..container.limit-1].each do |item|
31   - container.add_item(item.title, item.link, item.date, item.content)
  26 + container.class.transaction do
  27 + container.clear
  28 + content = fetch(container.address)
  29 + container.fetched_at = Time.now
  30 + parse = parse(content)
  31 + container.feed_title = parse.title
  32 + parse.items[0..container.limit-1].each do |item|
  33 + container.add_item(item.title, item.link, item.date, item.content)
  34 + end
  35 + container.save!
32 36 end
33 37 end
34 38  
... ...
public/stylesheets/blocks/feed-reader-block.css
1   -.feed-reader-block-fetched-at {
  1 +#content .feed-reader-block {
  2 + padding: 10px 0px 10px 10px;
  3 + overflow: hidden;
  4 +}
  5 +
  6 +.feed-reader-block ul {
  7 + margin: 0px;
  8 + padding: 0px 0px 0px 20px;
  9 +}
  10 +.feed-reader-block li {
  11 + margin: 0px;
  12 + padding: 0px;
  13 +}
  14 +
  15 +.feed-reader-block a {
  16 + text-decoration: none;
  17 +}
  18 +
  19 +.feed-reader-block .block-footer-content {
2 20 color: #CCC;
3 21 font-size: 11px;
4 22 text-align: center;
... ...
script/feed-updater
... ... @@ -4,10 +4,8 @@ require File.dirname(__FILE__) + &#39;/../config/environment&#39;
4 4 FeedReaderBlock.find(:all).each do |feed_block|
5 5 unless feed_block.address.nil?
6 6 begin
7   - feed_block.clean
8 7 handler = FeedHandler.new
9 8 handler.process(feed_block)
10   - feed_block.save!
11 9 RAILS_DEFAULT_LOGGER.info("%s ID %d fetched at %s" % [feed_block.class.name, feed_block.id, feed_block.fetched_at])
12 10 rescue FeedHandler::ParseError => ex
13 11 RAILS_DEFAULT_LOGGER.warn("Error parsing content from %s ID %d\n%s" % [feed_block.class.name, feed_block.id, ex.to_s])
... ...
test/unit/feed_handler_test.rb
... ... @@ -2,26 +2,9 @@ require File.dirname(__FILE__) + &#39;/../test_helper&#39;
2 2  
3 3 class FeedHandlerTest < Test::Unit::TestCase
4 4  
5   - class FeedContainer
6   - attr_accessor :limit
7   - attr_accessor :fetched_at
8   - attr_accessor :feed_title
9   - attr_accessor :feed_items
10   - attr_accessor :address
11   - def initialize
12   - self.limit = 5
13   - self.feed_title = "Feed Container Mocked"
14   - self.feed_items = []
15   - self.address = 'test/fixtures/files/feed.xml'
16   - end
17   - def add_item(title, link, date, content)
18   - self.feed_items << title
19   - end
20   - end
21   -
22 5 def setup
23 6 @handler = FeedHandler.new
24   - @container = FeedContainer.new
  7 + @container = FeedReaderBlock.create!(:box_id => 99999, :address => 'test/fixtures/files/feed.xml')
25 8 end
26 9 attr_reader :handler, :container
27 10  
... ... @@ -43,7 +26,7 @@ class FeedHandlerTest &lt; Test::Unit::TestCase
43 26 should 'process feed and populate container' do
44 27 handler.process(container)
45 28 assert_equal 'Feed for unit tests', container.feed_title
46   - assert_equal ["Last POST", "Second POST", "First POST"], container.feed_items
  29 + assert_equal ["Last POST", "Second POST", "First POST"], container.feed_items.map {|item| item[:title]}
47 30 end
48 31  
49 32 should 'raise exception when parser nil' do
... ... @@ -80,4 +63,14 @@ class FeedHandlerTest &lt; Test::Unit::TestCase
80 63 assert_equal 1, container.feed_items.size
81 64 end
82 65  
  66 + should 'clear the container before processing' do
  67 + container.expects(:clear)
  68 + handler.process(container)
  69 + end
  70 +
  71 + should 'save after processing' do
  72 + container.expects(:save!)
  73 + handler.process(container)
  74 + end
  75 +
83 76 end
... ...
test/unit/feed_reader_block_test.rb
... ... @@ -52,20 +52,18 @@ class FeedReaderBlockTest &lt; ActiveSupport::TestCase
52 52 end
53 53  
54 54 should 'notice when content not fetched yet' do
55   - assert_tag_in_string feed.content, :tag => 'p', :content => 'Feed content was not loaded yet'
  55 + assert_equal'Feed content was not loaded yet', feed.footer
56 56 end
57 57  
58 58 should 'display last fetched date' do
59 59 feed.feed_items = ['one', 'two']
60   - assert_tag_in_string feed.content, :tag => 'div',
61   - :content => "Updated: #{show_date(@fetched_at)}",
62   - :attributes => {:class => 'feed-reader-block-fetched-at'}
  60 + assert_equal "Updated: #{show_date(@fetched_at)}", feed.footer
63 61 end
64 62  
65 63 should 'clear feed title and items' do
66 64 feed.feed_items = %w[ last-post second-post first-post ]
67 65 feed.feed_title = 'Feed Test'
68   - feed.clean
  66 + feed.clear
69 67 assert_nil feed.feed_title
70 68 assert_equal [], feed.feed_items
71 69 end
... ...