feed_handler_test.rb
3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
require File.dirname(__FILE__) + '/../test_helper'
class FeedHandlerTest < ActiveSupport::TestCase
def setup
@handler = FeedHandler.new
@container = nil
end
attr_reader :handler
def container
@container ||= create(:feed_reader_block)
end
should 'fetch feed content' do
content = handler.fetch(container.address)
assert_match /<description>Feed content<\/description>/, content
assert_match /<title>Feed for unit tests<\/title>/, content
end
should 'parse feed content' do
content = ""
open(container.address) do |s| content = s.read end
parse = handler.parse(content)
assert_equal 'Feed for unit tests', parse.title
assert_equal 'http://localhost/feed-test', parse.link
assert_equal 'Last POST', parse.items[0].title
end
should 'process feed and populate container' do
handler.process(container)
assert_equal 'Feed for unit tests', container.feed_title
assert_equivalent ["First POST", "Second POST", "Last POST"], container.feed_items.map {|item| item[:title]}
end
should 'raise exception when parser nil' do
handler = FeedHandler.new
assert_raise FeedHandler::ParseError do
handler.parse(nil)
end
end
should 'raise exception when parser invalid content' do
handler = FeedHandler.new
assert_raise FeedHandler::ParseError do
handler.parse('<invalid>content</invalid>')
end
end
should 'raise exception when fetch nil' do
handler = FeedHandler.new
assert_raise FeedHandler::FetchError do
handler.fetch(nil)
end
end
should 'raise exception when fetch invalid address' do
handler = FeedHandler.new
assert_raise FeedHandler::FetchError do
handler.fetch('bli://invalid@address')
end
end
should 'save only latest N posts from feed' do
container.limit = 1
handler.process(container)
assert_equal 1, container.feed_items.size
end
should 'clear the container before processing' do
container.expects(:clear)
handler.process(container)
end
should 'finish fetch after processing' do
container.expects(:finish_fetch)
handler.process(container)
end
should 'finish fetch even in case of crash' do
container.expects(:clear).raises(Exception.new("crash"))
container.expects(:finish_fetch)
handler.process(container)
end
should 'identifies itself as noosfero user agent' do
handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}"}, anything).returns('bli content')
assert_equal 'bli content', handler.fetch('http://site.org/feed.xml')
end
[:external_feed, :feed_reader_block].each do |container_class|
should "reset the errors count after a successfull run (#{container_class})" do
container = build(container_class, :update_errors => 1, :address => RAILS_ROOT + '/test/fixtures/files/feed.xml')
handler.expects(:actually_process_container).with(container)
handler.process(container)
assert_equal 0, container.update_errors
end
should "set error message and disable in case of errors (#{container_class})" do
FeedHandler.stubs(:max_errors).returns(4)
container = create(container_class)
handler.stubs(:actually_process_container).with(container).raises(Exception.new("crash"))
# in the first 4 errors, we are ok
4.times { handler.process(container) }
assert !container.error_message.blank?, 'should set the error message for the first <max_errors> errors (%s)' % container_class
assert container.enabled, 'must keep container enabled during the first <max_errors> errors (%s)' % container_class
# 5 errors it too much
handler.process(container)
assert !container.error_message.blank?, 'must set error message in container after <max_errors> errors (%s)' % container_class
assert !container.enabled, 'must disable continer after <max_errors> errors (%s)' % container_class
end
end
end