Commit 1a2f1931f49d544f3d636a8e3df925dc871b73c5
Committed by
Antonio Terceiro
1 parent
4a74f898
Exists in
master
and in
29 other branches
ActionItem935: external blog repeater
Showing
32 changed files
with
412 additions
and
85 deletions
Show diff stats
app/helpers/blog_helper.rb
@@ -35,4 +35,5 @@ module BlogHelper | @@ -35,4 +35,5 @@ module BlogHelper | ||
35 | article_title(article) + content_tag('p', article.to_html) + | 35 | article_title(article) + content_tag('p', article.to_html) + |
36 | content_tag('p', link_to( number_of_comments(article), article.url.merge(:form => 'opened', :anchor => 'comment_form') ), :class => 'metadata') | 36 | content_tag('p', link_to( number_of_comments(article), article.url.merge(:form => 'opened', :anchor => 'comment_form') ), :class => 'metadata') |
37 | end | 37 | end |
38 | + | ||
38 | end | 39 | end |
app/helpers/content_viewer_helper.rb
@@ -20,7 +20,7 @@ module ContentViewerHelper | @@ -20,7 +20,7 @@ module ContentViewerHelper | ||
20 | unless args[:no_link] | 20 | unless args[:no_link] |
21 | title = content_tag('h3', link_to(article.name, article.url), :class => 'title') | 21 | title = content_tag('h3', link_to(article.name, article.url), :class => 'title') |
22 | end | 22 | end |
23 | - title << content_tag('span', _("%s, by %s") % [show_date(article.created_at), link_to(article.author.name, article.author.url)], :class => 'created-at') | 23 | + title << content_tag('span', _("%s, by %s") % [show_date(article.published_at), link_to(article.author.name, article.author.url)], :class => 'created-at') |
24 | end | 24 | end |
25 | title | 25 | title |
26 | end | 26 | end |
app/models/article.rb
@@ -20,6 +20,10 @@ class Article < ActiveRecord::Base | @@ -20,6 +20,10 @@ class Article < ActiveRecord::Base | ||
20 | 20 | ||
21 | settings_items :display_hits, :type => :boolean, :default => true | 21 | settings_items :display_hits, :type => :boolean, :default => true |
22 | 22 | ||
23 | + before_create do |article| | ||
24 | + article.published_at = article.created_at if article.published_at.nil? | ||
25 | + end | ||
26 | + | ||
23 | def self.human_attribute_name(attrib) | 27 | def self.human_attribute_name(attrib) |
24 | case attrib.to_sym | 28 | case attrib.to_sym |
25 | when :name | 29 | when :name |
app/models/blog.rb
1 | class Blog < Folder | 1 | class Blog < Folder |
2 | 2 | ||
3 | - has_many :posts, :class_name => 'Article', :foreign_key => 'parent_id', :source => :children, :conditions => [ 'type != ?', 'RssFeed' ], :order => 'created_at DESC' | 3 | + has_many :posts, :class_name => 'Article', :foreign_key => 'parent_id', :source => :children, :conditions => [ 'type != ?', 'RssFeed' ], :order => 'published_at DESC' |
4 | 4 | ||
5 | attr_accessor :feed_attrs | 5 | attr_accessor :feed_attrs |
6 | attr_accessor :filter | 6 | attr_accessor :filter |
@@ -56,7 +56,7 @@ class Blog < Folder | @@ -56,7 +56,7 @@ class Blog < Folder | ||
56 | article = self | 56 | article = self |
57 | children = if filter and filter[:year] and filter[:month] | 57 | children = if filter and filter[:year] and filter[:month] |
58 | filter_date = DateTime.parse("#{filter[:year]}-#{filter[:month]}-01") | 58 | filter_date = DateTime.parse("#{filter[:year]}-#{filter[:month]}-01") |
59 | - posts.paginate :page => npage, :per_page => posts_per_page, :conditions => [ 'created_at between ? and ?', filter_date, filter_date + 1.month - 1.day ] | 59 | + posts.paginate :page => npage, :per_page => posts_per_page, :conditions => [ 'published_at between ? and ?', filter_date, filter_date + 1.month - 1.day ] |
60 | else | 60 | else |
61 | posts.paginate :page => npage, :per_page => posts_per_page | 61 | posts.paginate :page => npage, :per_page => posts_per_page |
62 | end | 62 | end |
@@ -64,4 +64,33 @@ class Blog < Folder | @@ -64,4 +64,33 @@ class Blog < Folder | ||
64 | render :file => 'content_viewer/blog_page', :locals => {:article => article, :children => children} | 64 | render :file => 'content_viewer/blog_page', :locals => {:article => article, :children => children} |
65 | end | 65 | end |
66 | end | 66 | end |
67 | + | ||
68 | + has_one :external_feed, :foreign_key => 'blog_id' | ||
69 | + | ||
70 | + attr_accessor :external_feed_data | ||
71 | + def external_feed_builder=(efeed) | ||
72 | + self.external_feed_data = efeed | ||
73 | + end | ||
74 | + | ||
75 | + def validate | ||
76 | + unless self.external_feed_data.nil? | ||
77 | + if self.external_feed(true) && self.external_feed.id == self.external_feed_data[:id].to_i | ||
78 | + self.external_feed.attributes = self.external_feed_data | ||
79 | + else | ||
80 | + self.build_external_feed(self.external_feed_data) | ||
81 | + end | ||
82 | + self.external_feed.valid? | ||
83 | + self.external_feed.errors.delete(:blog_id) # dont validate here relation: external_feed <-> blog | ||
84 | + self.external_feed.errors.each do |attr,msg| | ||
85 | + self.errors.add(attr, msg) | ||
86 | + end | ||
87 | + end | ||
88 | + end | ||
89 | + | ||
90 | + after_save do |blog| | ||
91 | + if blog.external_feed | ||
92 | + blog.external_feed.save | ||
93 | + end | ||
94 | + end | ||
95 | + | ||
67 | end | 96 | end |
app/models/blog_archives_block.rb
@@ -18,10 +18,10 @@ class BlogArchivesBlock < Block | @@ -18,10 +18,10 @@ class BlogArchivesBlock < Block | ||
18 | return nil unless owner.has_blog? | 18 | return nil unless owner.has_blog? |
19 | results = '' | 19 | results = '' |
20 | posts = owner.blog.posts | 20 | posts = owner.blog.posts |
21 | - posts.group_by{|i| i.created_at.year}.each do |year, results_by_year| | 21 | + posts.group_by{|i| i.published_at.year}.each do |year, results_by_year| |
22 | results << content_tag('li', content_tag('strong', "#{year} (#{results_by_year.size})")) | 22 | results << content_tag('li', content_tag('strong', "#{year} (#{results_by_year.size})")) |
23 | results << "<ul class='#{year}-archive'>" | 23 | results << "<ul class='#{year}-archive'>" |
24 | - results_by_year.group_by{|i| [ ('%02d' % i.created_at.month()), gettext(MONTHS[i.created_at.month() - 1])]}.sort.each do |month, results_by_month| | 24 | + results_by_year.group_by{|i| [ ('%02d' % i.published_at.month()), gettext(MONTHS[i.published_at.month() - 1])]}.sort.each do |month, results_by_month| |
25 | results << content_tag('li', link_to("#{month[1]} (#{results_by_month.size})", owner.generate_url(:controller => 'content_viewer', :action => 'view_page', :page => [owner.blog.path, year, month[0]]))) | 25 | results << content_tag('li', link_to("#{month[1]} (#{results_by_month.size})", owner.generate_url(:controller => 'content_viewer', :action => 'view_page', :page => [owner.blog.path, year, month[0]]))) |
26 | end | 26 | end |
27 | results << "</ul>" | 27 | results << "</ul>" |
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
1 | +class ExternalFeed < ActiveRecord::Base | ||
2 | + | ||
3 | + belongs_to :blog | ||
4 | + validates_presence_of :blog_id | ||
5 | + validates_presence_of :address, :if => lambda {|efeed| efeed.enabled} | ||
6 | + validates_uniqueness_of :blog_id | ||
7 | + | ||
8 | + def add_item(title, link, date, content) | ||
9 | + article = TinyMceArticle.new(:name => title, :profile => blog.profile, :body => content, :published_at => date, :source => link, :profile => blog.profile, :parent => blog) | ||
10 | + unless blog.children.exists?(:slug => article.slug) | ||
11 | + article.save! | ||
12 | + end | ||
13 | + end | ||
14 | + | ||
15 | + def clear | ||
16 | + # do nothing | ||
17 | + end | ||
18 | + def finish_fetch | ||
19 | + if self.only_once | ||
20 | + self.enabled = 'false' | ||
21 | + end | ||
22 | + self.save! | ||
23 | + end | ||
24 | + | ||
25 | + def limit | ||
26 | + 0 | ||
27 | + end | ||
28 | + | ||
29 | +end |
app/models/feed_reader_block.rb
@@ -48,6 +48,9 @@ class FeedReaderBlock < Block | @@ -48,6 +48,9 @@ class FeedReaderBlock < Block | ||
48 | self.feed_items = [] | 48 | self.feed_items = [] |
49 | self.feed_title = nil | 49 | self.feed_title = nil |
50 | end | 50 | end |
51 | + def finish_fetch | ||
52 | + self.save! | ||
53 | + end | ||
51 | 54 | ||
52 | def content | 55 | def content |
53 | block_title(title) + formatted_feed_content | 56 | block_title(title) + formatted_feed_content |
app/views/cms/_blog.rhtml
1 | +<%= error_messages_for 'blog' %> | ||
2 | + | ||
1 | <h3><%= _('My Blog') %></h3> | 3 | <h3><%= _('My Blog') %></h3> |
2 | 4 | ||
3 | <%= render :file => 'shared/tiny_mce' %> | 5 | <%= render :file => 'shared/tiny_mce' %> |
@@ -8,12 +10,26 @@ | @@ -8,12 +10,26 @@ | ||
8 | 10 | ||
9 | <%= labelled_form_field(_('Posts per page:'), f.select(:posts_per_page, [5, 10, 20, 50, 100])) %> | 11 | <%= labelled_form_field(_('Posts per page:'), f.select(:posts_per_page, [5, 10, 20, 50, 100])) %> |
10 | 12 | ||
11 | -<% fields_for 'article[feed]', @article.feed do |feed| %> | ||
12 | - | ||
13 | -<%= labelled_form_field(_('Limit of posts in RSS Feed'), feed.select(:limit, ['5', '10', '20', '50'])) %> | ||
14 | - | ||
15 | -<%= labelled_form_field(_('Use as description in RSS Feed:'), feed.select(:feed_item_description, [ [ _('Article abstract'), 'abstract'], [ _('Article body'), 'body']])) %> | 13 | +<% f.fields_for 'feed', @article.feed do |feed| %> |
14 | + <%= labelled_form_field(_('Limit of posts in RSS Feed'), feed.select(:limit, ['5', '10', '20', '50'])) %> | ||
15 | + <%= labelled_form_field(_('Use as description in RSS Feed:'), feed.select(:feed_item_description, [ [ _('Article abstract'), 'abstract'], [ _('Article body'), 'body']])) %> | ||
16 | +<% end %> | ||
16 | 17 | ||
18 | +<% f.fields_for 'external_feed_builder', @article.external_feed do |efeed| %> | ||
19 | + <div id='fetch-external-feed'> | ||
20 | + <% enabled = @article.external_feed && @article.external_feed.enabled %> | ||
21 | + <% only_once = @article.external_feed ? @article.external_feed.only_once : true %> | ||
22 | + <%= labelled_check_box(_('Fetch posts from an external feed'), 'article[external_feed_builder][enabled]', 'true', enabled, {:onchange => "$('external-feed-options').toggle()"}) %> | ||
23 | + <%= hidden_field_tag 'article[external_feed_builder][enabled]', 'false' %> | ||
24 | + <div id='external-feed-options' style="display: <%= enabled ? 'block' : 'none' %>"> | ||
25 | + <%= efeed.hidden_field(:id) %> | ||
26 | + <%= labelled_form_field( _('Feed address'), efeed.text_field(:address) ) %> | ||
27 | + <div id='external-feed-options-only-once'> | ||
28 | + <%= labelled_radio_button( _('Fetch posts only once'), 'article[external_feed_builder][only_once]', 'true', only_once) %> | ||
29 | + <%= labelled_radio_button( _('Fetch posts always'), 'article[external_feed_builder][only_once]', 'false', !only_once) %> | ||
30 | + </div> | ||
31 | + </div> | ||
32 | + </div> | ||
17 | <% end %> | 33 | <% end %> |
18 | 34 | ||
19 | <%= javascript_tag "$('back_to').value = 'control_panel'" %> | 35 | <%= javascript_tag "$('back_to').value = 'control_panel'" %> |
app/views/content_viewer/blog_page.rhtml
1 | +<%= content_tag('em', _('(external feed was not loaded yet)'), :id => 'external-feed-info', :class => 'metadata') if article.blog? && article.external_feed && article.external_feed.fetched_at.nil? %> | ||
2 | + | ||
1 | <div><%= article.body %></div> | 3 | <div><%= article.body %></div> |
2 | <hr/> | 4 | <hr/> |
3 | <%= (children.compact.empty? ? content_tag('em', _('(no posts)')) : list_posts(user, children)) %> | 5 | <%= (children.compact.empty? ? content_tag('em', _('(no posts)')) : list_posts(user, children)) %> |
4 | - | ||
5 | - |
app/views/content_viewer/view_page.rhtml
@@ -97,6 +97,11 @@ | @@ -97,6 +97,11 @@ | ||
97 | </div> | 97 | </div> |
98 | <% end %> | 98 | <% end %> |
99 | 99 | ||
100 | +<% if ! @page.source.nil? and ! @page.source.empty?%> | ||
101 | +<div id="article-source"> | ||
102 | + <%= _('Source: %s') % link_to(@page.source, @page.source) %> | ||
103 | +</div> | ||
104 | +<% end %> | ||
100 | 105 | ||
101 | <div class="comments"> | 106 | <div class="comments"> |
102 | <% if @page.accept_comments? %> | 107 | <% if @page.accept_comments? %> |
db/migrate/063_add_published_at_and_source_to_articles.rb
0 → 100644
@@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
1 | +class AddPublishedAtAndSourceToArticles < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + add_column :articles, :published_at, :date | ||
4 | + add_column :article_versions, :published_at, :date | ||
5 | + | ||
6 | + execute('UPDATE articles SET published_at = created_at WHERE published_at IS NULL') | ||
7 | + execute('UPDATE article_versions SET published_at = created_at WHERE published_at IS NULL') | ||
8 | + | ||
9 | + add_column :articles, :source, :string, :null => true | ||
10 | + add_column :article_versions, :source, :string, :null => true | ||
11 | + end | ||
12 | + | ||
13 | + def self.down | ||
14 | + remove_column :articles, :published_at | ||
15 | + remove_column :article_versions, :published_at | ||
16 | + remove_column :articles, :source | ||
17 | + remove_column :article_versions, :source | ||
18 | + end | ||
19 | +end |
@@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
1 | +class CreateExternalFeeds < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + create_table :external_feeds do |t| | ||
4 | + t.string :feed_title | ||
5 | + t.date :fetched_at | ||
6 | + t.string :address | ||
7 | + t.integer :blog_id, :null => false | ||
8 | + t.boolean :enabled, :null => false, :default => true | ||
9 | + t.boolean :only_once, :null => false, :default => true | ||
10 | + t.timestamps | ||
11 | + end | ||
12 | + end | ||
13 | + | ||
14 | + def self.down | ||
15 | + drop_table :external_feeds | ||
16 | + end | ||
17 | +end |
db/schema.rb
@@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
9 | # | 9 | # |
10 | # It's strongly recommended to check this file into your version control system. | 10 | # It's strongly recommended to check this file into your version control system. |
11 | 11 | ||
12 | -ActiveRecord::Schema.define(:version => 62) do | 12 | +ActiveRecord::Schema.define(:version => 64) do |
13 | 13 | ||
14 | create_table "article_versions", :force => true do |t| | 14 | create_table "article_versions", :force => true do |t| |
15 | t.integer "article_id" | 15 | t.integer "article_id" |
@@ -42,6 +42,8 @@ ActiveRecord::Schema.define(:version => 62) do | @@ -42,6 +42,8 @@ ActiveRecord::Schema.define(:version => 62) do | ||
42 | t.text "setting" | 42 | t.text "setting" |
43 | t.boolean "notify_comments", :default => false | 43 | t.boolean "notify_comments", :default => false |
44 | t.integer "hits", :default => 0 | 44 | t.integer "hits", :default => 0 |
45 | + t.date "published_at" | ||
46 | + t.string "source" | ||
45 | end | 47 | end |
46 | 48 | ||
47 | create_table "articles", :force => true do |t| | 49 | create_table "articles", :force => true do |t| |
@@ -75,6 +77,8 @@ ActiveRecord::Schema.define(:version => 62) do | @@ -75,6 +77,8 @@ ActiveRecord::Schema.define(:version => 62) do | ||
75 | t.text "setting" | 77 | t.text "setting" |
76 | t.boolean "notify_comments", :default => true | 78 | t.boolean "notify_comments", :default => true |
77 | t.integer "hits", :default => 0 | 79 | t.integer "hits", :default => 0 |
80 | + t.date "published_at" | ||
81 | + t.string "source" | ||
78 | end | 82 | end |
79 | 83 | ||
80 | create_table "articles_categories", :id => false, :force => true do |t| | 84 | create_table "articles_categories", :id => false, :force => true do |t| |
@@ -160,6 +164,17 @@ ActiveRecord::Schema.define(:version => 62) do | @@ -160,6 +164,17 @@ ActiveRecord::Schema.define(:version => 62) do | ||
160 | t.string "theme" | 164 | t.string "theme" |
161 | end | 165 | end |
162 | 166 | ||
167 | + create_table "external_feeds", :force => true do |t| | ||
168 | + t.string "feed_title" | ||
169 | + t.date "fetched_at" | ||
170 | + t.string "address" | ||
171 | + t.integer "blog_id", :null => false | ||
172 | + t.boolean "enabled", :default => true, :null => false | ||
173 | + t.boolean "only_once", :default => true, :null => false | ||
174 | + t.datetime "created_at" | ||
175 | + t.datetime "updated_at" | ||
176 | + end | ||
177 | + | ||
163 | create_table "favorite_enteprises_people", :id => false, :force => true do |t| | 178 | create_table "favorite_enteprises_people", :id => false, :force => true do |t| |
164 | t.integer "person_id" | 179 | t.integer "person_id" |
165 | t.integer "enterprise_id" | 180 | t.integer "enterprise_id" |
lib/feed_handler.rb
@@ -32,7 +32,7 @@ class FeedHandler | @@ -32,7 +32,7 @@ class FeedHandler | ||
32 | parse.items[0..container.limit-1].each do |item| | 32 | parse.items[0..container.limit-1].each do |item| |
33 | container.add_item(item.title, item.link, item.date, item.content) | 33 | container.add_item(item.title, item.link, item.date, item.content) |
34 | end | 34 | end |
35 | - container.save! | 35 | + container.finish_fetch |
36 | end | 36 | end |
37 | end | 37 | end |
38 | 38 |
public/stylesheets/article.css
@@ -32,6 +32,16 @@ | @@ -32,6 +32,16 @@ | ||
32 | font-size: 10px; | 32 | font-size: 10px; |
33 | } | 33 | } |
34 | 34 | ||
35 | +#article-source { | ||
36 | + color: #999; | ||
37 | + font-size: 11px; | ||
38 | + text-align: right; | ||
39 | + font-weight: bold; | ||
40 | +} | ||
41 | +#article-source a { | ||
42 | + font-weight: normal; | ||
43 | +} | ||
44 | + | ||
35 | /* * * Comments * * */ | 45 | /* * * Comments * * */ |
36 | 46 | ||
37 | .comments { } | 47 | .comments { } |
@@ -183,12 +193,18 @@ | @@ -183,12 +193,18 @@ | ||
183 | margin-bottom: 2px; | 193 | margin-bottom: 2px; |
184 | } | 194 | } |
185 | 195 | ||
196 | +.metadata, | ||
186 | .blog-post .metadata { | 197 | .blog-post .metadata { |
187 | display: block; | 198 | display: block; |
188 | text-align: center; | 199 | text-align: center; |
189 | font-size: small; | 200 | font-size: small; |
190 | } | 201 | } |
191 | 202 | ||
203 | +.metadata { | ||
204 | + text-align: right; | ||
205 | + color: gray; | ||
206 | +} | ||
207 | + | ||
192 | #content .created-at { | 208 | #content .created-at { |
193 | color: gray; | 209 | color: gray; |
194 | font-size: small; | 210 | font-size: small; |
@@ -237,3 +253,5 @@ | @@ -237,3 +253,5 @@ | ||
237 | text-align: center; | 253 | text-align: center; |
238 | font-size: small; | 254 | font-size: small; |
239 | } | 255 | } |
256 | + | ||
257 | + |
public/stylesheets/controller_cms.css
@@ -122,3 +122,26 @@ div.file-manager-button a:hover { | @@ -122,3 +122,26 @@ div.file-manager-button a:hover { | ||
122 | .file-manager-small .file-manager-controls * { | 122 | .file-manager-small .file-manager-controls * { |
123 | text-align: right; | 123 | text-align: right; |
124 | } | 124 | } |
125 | + | ||
126 | +/************* external blog options *****************/ | ||
127 | + | ||
128 | +#fetch-external-feed { | ||
129 | + border: 1px solid #EEE; | ||
130 | + padding: 5px; | ||
131 | + margin: 5px 0; | ||
132 | + width: 460px | ||
133 | +} | ||
134 | +#fetch-external-feed label, | ||
135 | +#fetch-external-feed .formfield, | ||
136 | +#fetch-external-feed #external-feed-options #external-feed-options-only-once label, | ||
137 | +#fetch-external-feed #external-feed-options #external-feed-options-only-once .formfieldline, | ||
138 | +#fetch-external-feed #external-feed-options #external-feed-options-only-once .formfield { | ||
139 | + display: inline; | ||
140 | +} | ||
141 | +#fetch-external-feed .type-text input { | ||
142 | + width: 400px; | ||
143 | +} | ||
144 | +#fetch-external-feed #external-feed-options label, | ||
145 | +#fetch-external-feed #external-feed-options .formfield { | ||
146 | + display: block; | ||
147 | +} |
script/feed-updater
1 | #!/usr/bin/env ruby | 1 | #!/usr/bin/env ruby |
2 | require File.dirname(__FILE__) + '/../config/environment' | 2 | require File.dirname(__FILE__) + '/../config/environment' |
3 | 3 | ||
4 | -FeedReaderBlock.find(:all).each do |feed_block| | ||
5 | - unless feed_block.address.nil? | 4 | +(FeedReaderBlock.find(:all) + ExternalFeed.find(:all, :conditions => {:enabled => true})).each do |container| |
5 | + unless container.address.nil? | ||
6 | begin | 6 | begin |
7 | handler = FeedHandler.new | 7 | handler = FeedHandler.new |
8 | - handler.process(feed_block) | ||
9 | - RAILS_DEFAULT_LOGGER.info("%s ID %d fetched at %s" % [feed_block.class.name, feed_block.id, feed_block.fetched_at]) | 8 | + handler.process(container) |
9 | + RAILS_DEFAULT_LOGGER.info("%s ID %d fetched at %s" % [container.class.name, container.id, container.fetched_at]) | ||
10 | rescue FeedHandler::ParseError => ex | 10 | rescue FeedHandler::ParseError => ex |
11 | - RAILS_DEFAULT_LOGGER.warn("Error parsing content from %s ID %d\n%s" % [feed_block.class.name, feed_block.id, ex.to_s]) | 11 | + RAILS_DEFAULT_LOGGER.warn("Error parsing content from %s ID %d\n%s" % [container.class.name, container.id, ex.to_s]) |
12 | rescue FeedHandler::FetchError => ex | 12 | rescue FeedHandler::FetchError => ex |
13 | - RAILS_DEFAULT_LOGGER.warn("Error fetching content from %s ID %d\n%s" % [feed_block.class.name, feed_block.id, ex.to_s]) | 13 | + RAILS_DEFAULT_LOGGER.warn("Error fetching content from %s ID %d\n%s" % [container.class.name, container.id, ex.to_s]) |
14 | rescue Exception => ex | 14 | rescue Exception => ex |
15 | - RAILS_DEFAULT_LOGGER.warn("Unknown error from %s ID %d\n%s" % [feed_block.class.name, feed_block.id, ex.to_s]) | 15 | + RAILS_DEFAULT_LOGGER.warn("Unknown error from %s ID %d\n%s" % [container.class.name, container.id, ex.to_s]) |
16 | end | 16 | end |
17 | end | 17 | end |
18 | end | 18 | end |
test/functional/cms_controller_test.rb
@@ -716,7 +716,7 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -716,7 +716,7 @@ class CmsControllerTest < Test::Unit::TestCase | ||
716 | end | 716 | end |
717 | 717 | ||
718 | should 'offer to edit a blog' do | 718 | should 'offer to edit a blog' do |
719 | - profile.articles << Blog.new(:name => 'blog test') | 719 | + profile.articles << Blog.new(:name => 'blog test', :profile => profile) |
720 | 720 | ||
721 | profile.articles.reload | 721 | profile.articles.reload |
722 | assert profile.has_blog? | 722 | assert profile.has_blog? |
@@ -727,7 +727,7 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -727,7 +727,7 @@ class CmsControllerTest < Test::Unit::TestCase | ||
727 | end | 727 | end |
728 | 728 | ||
729 | should 'not offer to add folder to blog' do | 729 | should 'not offer to add folder to blog' do |
730 | - profile.articles << Blog.new(:name => 'blog test') | 730 | + profile.articles << Blog.new(:name => 'blog test', :profile => profile) |
731 | 731 | ||
732 | profile.articles.reload | 732 | profile.articles.reload |
733 | assert profile.has_blog? | 733 | assert profile.has_blog? |
@@ -737,7 +737,7 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -737,7 +737,7 @@ class CmsControllerTest < Test::Unit::TestCase | ||
737 | end | 737 | end |
738 | 738 | ||
739 | should 'not show feed subitem for blog' do | 739 | should 'not show feed subitem for blog' do |
740 | - profile.articles << Blog.new(:name => 'Blog for test') | 740 | + profile.articles << Blog.new(:name => 'Blog for test', :profile => profile) |
741 | 741 | ||
742 | profile.articles.reload | 742 | profile.articles.reload |
743 | assert profile.has_blog? | 743 | assert profile.has_blog? |
@@ -748,7 +748,7 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -748,7 +748,7 @@ class CmsControllerTest < Test::Unit::TestCase | ||
748 | end | 748 | end |
749 | 749 | ||
750 | should 'update feed options by edit blog form' do | 750 | should 'update feed options by edit blog form' do |
751 | - profile.articles << Blog.new(:name => 'Blog for test') | 751 | + profile.articles << Blog.new(:name => 'Blog for test', :profile => profile) |
752 | post :edit, :profile => profile.identifier, :id => profile.blog.id, :article => { :feed => { :limit => 7 } } | 752 | post :edit, :profile => profile.identifier, :id => profile.blog.id, :article => { :feed => { :limit => 7 } } |
753 | assert_equal 7, profile.blog.feed.limit | 753 | assert_equal 7, profile.blog.feed.limit |
754 | end | 754 | end |
@@ -770,8 +770,9 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -770,8 +770,9 @@ class CmsControllerTest < Test::Unit::TestCase | ||
770 | end | 770 | end |
771 | 771 | ||
772 | should 'update blog posts_per_page setting' do | 772 | should 'update blog posts_per_page setting' do |
773 | - profile.articles << Blog.new(:name => 'Blog for test') | 773 | + profile.articles << Blog.new(:name => 'Blog for test', :profile => profile) |
774 | post :edit, :profile => profile.identifier, :id => profile.blog.id, :article => { :posts_per_page => 5 } | 774 | post :edit, :profile => profile.identifier, :id => profile.blog.id, :article => { :posts_per_page => 5 } |
775 | + profile.blog.reload | ||
775 | assert_equal 5, profile.blog.posts_per_page | 776 | assert_equal 5, profile.blog.posts_per_page |
776 | end | 777 | end |
777 | 778 | ||
@@ -909,4 +910,36 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -909,4 +910,36 @@ class CmsControllerTest < Test::Unit::TestCase | ||
909 | assert_template nil | 910 | assert_template nil |
910 | assert_redirected_to file.url.merge(:view => true) | 911 | assert_redirected_to file.url.merge(:view => true) |
911 | end | 912 | end |
913 | + | ||
914 | + should 'display external feed options when edit blog' do | ||
915 | + get :new, :profile => profile.identifier, :type => 'Blog' | ||
916 | + assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][enabled]' } | ||
917 | + assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][address]' } | ||
918 | + end | ||
919 | + | ||
920 | + should "display 'Fetch posts from an external feed' checked if blog has enabled external feed" do | ||
921 | + profile.articles << Blog.new(:title => 'test blog', :profile => profile) | ||
922 | + profile.blog.create_external_feed(:address => 'address', :enabled => true) | ||
923 | + get :edit, :profile => profile.identifier, :id => profile.blog.id | ||
924 | + assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][enabled]', :checked => 'checked' } | ||
925 | + end | ||
926 | + | ||
927 | + should "display 'Fetch posts from an external feed' unchecked if blog has disabled external feed" do | ||
928 | + profile.articles << Blog.new(:title => 'test blog', :profile => profile) | ||
929 | + profile.blog.create_external_feed(:address => 'address', :enabled => false) | ||
930 | + get :edit, :profile => profile.identifier, :id => profile.blog.id | ||
931 | + assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][enabled]', :checked => nil } | ||
932 | + end | ||
933 | + | ||
934 | + should "hide external feed options when 'Fetch posts from an external feed' unchecked" do | ||
935 | + get :new, :profile => profile.identifier, :type => 'Blog' | ||
936 | + assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][enabled]', :checked => nil } | ||
937 | + assert_tag :tag => 'div', :attributes => { :id => 'external-feed-options', :style => 'display: none' } | ||
938 | + end | ||
939 | + | ||
940 | + should 'only_once option marked by default' do | ||
941 | + get :new, :profile => profile.identifier, :type => 'Blog' | ||
942 | + assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][only_once]', :checked => 'checked', :value => 'true' } | ||
943 | + end | ||
944 | + | ||
912 | end | 945 | end |
test/functional/content_viewer_controller_test.rb
@@ -14,8 +14,9 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -14,8 +14,9 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
14 | @response = ActionController::TestResponse.new | 14 | @response = ActionController::TestResponse.new |
15 | 15 | ||
16 | @profile = create_user('testinguser').person | 16 | @profile = create_user('testinguser').person |
17 | + @environment = @profile.environment | ||
17 | end | 18 | end |
18 | - attr_reader :profile | 19 | + attr_reader :profile, :environment |
19 | 20 | ||
20 | def test_local_files_reference | 21 | def test_local_files_reference |
21 | page = profile.articles.build(:name => 'test') | 22 | page = profile.articles.build(:name => 'test') |
@@ -638,9 +639,9 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -638,9 +639,9 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
638 | end | 639 | end |
639 | 640 | ||
640 | should 'extract year and month from path' do | 641 | should 'extract year and month from path' do |
641 | - blog = Blog.create!(:name => 'A blog test', :profile => profile) | ||
642 | - year, month = blog.created_at.year.to_s, '%02d' % blog.created_at.month | ||
643 | - get :view_page, :profile => profile.identifier, :page => [blog.path, year, month] | 642 | + profile.articles << Blog.new(:name => 'A blog test', :profile => profile) |
643 | + year, month = profile.blog.created_at.year.to_s, '%02d' % profile.blog.created_at.month | ||
644 | + get :view_page, :profile => profile.identifier, :page => [profile.blog.path, year, month] | ||
644 | assert_equal({ :year => year.to_s, :month => month.to_s }, assigns(:page).filter) | 645 | assert_equal({ :year => year.to_s, :month => month.to_s }, assigns(:page).filter) |
645 | end | 646 | end |
646 | 647 | ||
@@ -693,17 +694,17 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -693,17 +694,17 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
693 | 694 | ||
694 | should 'add meta tag to rss feed on view blog' do | 695 | should 'add meta tag to rss feed on view blog' do |
695 | login_as(profile.identifier) | 696 | login_as(profile.identifier) |
696 | - a = Blog.create!(:name => 'article folder', :profile => profile) | ||
697 | - get :view_page, :profile => profile.identifier, :page => [a.path] | ||
698 | - assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => /\/#{profile.identifier}\/blog\/feed/} | 697 | + profile.articles << Blog.new(:title => 'article blog', :profile => profile) |
698 | + get :view_page, :profile => profile.identifier, :page => ['blog'] | ||
699 | + assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" } | ||
699 | end | 700 | end |
700 | 701 | ||
701 | should 'add meta tag to rss feed on view post blog' do | 702 | should 'add meta tag to rss feed on view post blog' do |
702 | login_as(profile.identifier) | 703 | login_as(profile.identifier) |
703 | - a = Blog.create!(:name => 'article folder', :profile => profile) | ||
704 | - t = TextileArticle.create!(:name => 'first post', :parent => a, :profile => profile) | ||
705 | - get :view_page, :profile => profile.identifier, :page => [t.path] | ||
706 | - assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => /\/#{profile.identifier}\/blog\/feed/} | 704 | + profile.articles << Blog.new(:name => 'article folder', :profile => profile) |
705 | + profile.blog.posts << TextileArticle.new(:name => 'first post', :parent => profile.blog, :profile => profile) | ||
706 | + get :view_page, :profile => profile.identifier, :page => ['blog', 'first-post'] | ||
707 | + assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" } | ||
707 | end | 708 | end |
708 | 709 | ||
709 | should 'link to post with comment form opened' do | 710 | should 'link to post with comment form opened' do |
@@ -787,4 +788,16 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -787,4 +788,16 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
787 | assert_template 'slideshow' | 788 | assert_template 'slideshow' |
788 | end | 789 | end |
789 | 790 | ||
791 | + should 'display source from article' do | ||
792 | + profile.articles << TextileArticle.new(:name => "Article one", :profile => profile, :source => 'http://www.original-source.invalid') | ||
793 | + get :view_page, :profile => profile.identifier, :page => ['article-one'] | ||
794 | + assert_tag :tag => 'div', :attributes => { :id => 'article-source' }, :content => /http:\/\/www.original-source.invalid/ | ||
795 | + end | ||
796 | + | ||
797 | + should 'not display source if article has no source' do | ||
798 | + profile.articles << TextileArticle.new(:name => "Article one", :profile => profile) | ||
799 | + get :view_page, :profile => profile.identifier, :page => ['article-one'] | ||
800 | + assert_no_tag :tag => 'div', :attributes => { :id => 'article-source' } | ||
801 | + end | ||
802 | + | ||
790 | end | 803 | end |
test/functional/profile_design_controller_test.rb
@@ -274,7 +274,7 @@ class ProfileDesignControllerTest < Test::Unit::TestCase | @@ -274,7 +274,7 @@ class ProfileDesignControllerTest < Test::Unit::TestCase | ||
274 | end | 274 | end |
275 | 275 | ||
276 | should 'offer to create blog archives block only if has blog' do | 276 | should 'offer to create blog archives block only if has blog' do |
277 | - Blog.create!(:name => 'Blog test', :profile => holder) | 277 | + holder.articles << Blog.new(:name => 'Blog test', :profile => holder) |
278 | get :add_block, :profile => 'designtestuser' | 278 | get :add_block, :profile => 'designtestuser' |
279 | assert_tag :tag => 'input', :attributes => { :id => 'type_blogarchivesblock', :value => 'BlogArchivesBlock' } | 279 | assert_tag :tag => 'input', :attributes => { :id => 'type_blogarchivesblock', :value => 'BlogArchivesBlock' } |
280 | end | 280 | end |
test/functional/profile_editor_controller_test.rb
@@ -628,7 +628,7 @@ class ProfileEditorControllerTest < Test::Unit::TestCase | @@ -628,7 +628,7 @@ class ProfileEditorControllerTest < Test::Unit::TestCase | ||
628 | 628 | ||
629 | should 'offer to config blog in control panel' do | 629 | should 'offer to config blog in control panel' do |
630 | profile.articles << Blog.new(:name => 'My blog', :profile => profile) | 630 | profile.articles << Blog.new(:name => 'My blog', :profile => profile) |
631 | - get :index, :profile => 'default_user' | 631 | + get :index, :profile => profile.identifier |
632 | assert_tag :tag => 'a', :attributes => { :href => "/myprofile/default_user/cms/edit/#{profile.blog.id}" } | 632 | assert_tag :tag => 'a', :attributes => { :href => "/myprofile/default_user/cms/edit/#{profile.blog.id}" } |
633 | end | 633 | end |
634 | 634 |
test/unit/article_test.rb
@@ -684,4 +684,13 @@ class ArticleTest < Test::Unit::TestCase | @@ -684,4 +684,13 @@ class ArticleTest < Test::Unit::TestCase | ||
684 | assert_equal profile, Article.new(:last_changed_by => nil, :profile => profile).author | 684 | assert_equal profile, Article.new(:last_changed_by => nil, :profile => profile).author |
685 | end | 685 | end |
686 | 686 | ||
687 | + should 'have published_at' do | ||
688 | + assert_respond_to Article.new, :published_at | ||
689 | + end | ||
690 | + | ||
691 | + should 'published_at is same as created_at if not set' do | ||
692 | + a = Article.create!(:name => 'Published at', :profile => profile) | ||
693 | + assert_equal a.created_at, a.published_at | ||
694 | + end | ||
695 | + | ||
687 | end | 696 | end |
test/unit/blog_archives_block_test.rb
@@ -4,7 +4,7 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | @@ -4,7 +4,7 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | ||
4 | 4 | ||
5 | def setup | 5 | def setup |
6 | @profile = create_user('flatline').person | 6 | @profile = create_user('flatline').person |
7 | - @profile.articles << Blog.new(:name => 'blog', :profile => @profile) | 7 | + @profile.articles << Blog.new(:name => 'blog-test', :profile => @profile) |
8 | end | 8 | end |
9 | attr_reader :profile | 9 | attr_reader :profile |
10 | 10 | ||
@@ -22,7 +22,7 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | @@ -22,7 +22,7 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | ||
22 | blog = profile.blog | 22 | blog = profile.blog |
23 | for i in 1..10 do | 23 | for i in 1..10 do |
24 | post = TextileArticle.create!(:name => "post #{i} test", :profile => profile, :parent => blog) | 24 | post = TextileArticle.create!(:name => "post #{i} test", :profile => profile, :parent => blog) |
25 | - post.update_attribute(:created_at, date) | 25 | + post.update_attribute(:published_at, date) |
26 | end | 26 | end |
27 | block = BlogArchivesBlock.new | 27 | block = BlogArchivesBlock.new |
28 | block.stubs(:owner).returns(profile) | 28 | block.stubs(:owner).returns(profile) |
@@ -34,19 +34,18 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | @@ -34,19 +34,18 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | ||
34 | blog = profile.blog | 34 | blog = profile.blog |
35 | for i in 1..10 do | 35 | for i in 1..10 do |
36 | post = TextileArticle.create!(:name => "post #{i} test", :profile => profile, :parent => blog) | 36 | post = TextileArticle.create!(:name => "post #{i} test", :profile => profile, :parent => blog) |
37 | - post.update_attribute(:created_at, date) | 37 | + post.update_attribute(:published_at, date) |
38 | end | 38 | end |
39 | block = BlogArchivesBlock.new | 39 | block = BlogArchivesBlock.new |
40 | block.stubs(:owner).returns(profile) | 40 | block.stubs(:owner).returns(profile) |
41 | assert_tag_in_string block.content, :tag => 'a', :content => 'January (10)', :attributes => {:href => /2008\/01/} | 41 | assert_tag_in_string block.content, :tag => 'a', :content => 'January (10)', :attributes => {:href => /2008\/01/} |
42 | end | 42 | end |
43 | 43 | ||
44 | - | ||
45 | should 'order list of amount posts' do | 44 | should 'order list of amount posts' do |
46 | blog = profile.blog | 45 | blog = profile.blog |
47 | for i in 1..10 do | 46 | for i in 1..10 do |
48 | post = TextileArticle.create!(:name => "post #{i} test", :profile => profile, :parent => blog) | 47 | post = TextileArticle.create!(:name => "post #{i} test", :profile => profile, :parent => blog) |
49 | - post.update_attribute(:created_at, DateTime.parse("2008-#{i}-01")) | 48 | + post.update_attribute(:published_at, DateTime.parse("2008-#{i}-01")) |
50 | end | 49 | end |
51 | block = BlogArchivesBlock.new | 50 | block = BlogArchivesBlock.new |
52 | block.stubs(:owner).returns(profile) | 51 | block.stubs(:owner).returns(profile) |
test/unit/blog_test.rb
@@ -38,24 +38,16 @@ class BlogTest < ActiveSupport::TestCase | @@ -38,24 +38,16 @@ class BlogTest < ActiveSupport::TestCase | ||
38 | assert_equal 'body', b.feed.feed_item_description | 38 | assert_equal 'body', b.feed.feed_item_description |
39 | end | 39 | end |
40 | 40 | ||
41 | - should 'get first blog from profile' do | ||
42 | - p = create_user('testuser').person | ||
43 | - b = Blog.create!(:profile => p, :name => 'blog_feed_test') | ||
44 | - assert_equal p.blog, b | ||
45 | - end | ||
46 | - | ||
47 | should 'save feed options' do | 41 | should 'save feed options' do |
48 | p = create_user('testuser').person | 42 | p = create_user('testuser').person |
49 | - b = Blog.create!(:profile => p, :name => 'blog_feed_test') | 43 | + p.articles << Blog.new(:profile => p, :name => 'blog_feed_test') |
50 | p.blog.feed = { :limit => 7 } | 44 | p.blog.feed = { :limit => 7 } |
51 | assert_equal 7, p.blog.feed.limit | 45 | assert_equal 7, p.blog.feed.limit |
52 | end | 46 | end |
53 | 47 | ||
54 | should 'save feed options after create blog' do | 48 | should 'save feed options after create blog' do |
55 | p = create_user('testuser').person | 49 | p = create_user('testuser').person |
56 | - b = Blog.create!(:profile => p, :name => 'blog_feed_test', :feed => { :limit => 7 }) | ||
57 | - | ||
58 | - p.blog.feed.reload | 50 | + p.articles << Blog.new(:profile => p, :name => 'blog_feed_test', :feed => { :limit => 7 }) |
59 | assert_equal 7, p.blog.feed.limit | 51 | assert_equal 7, p.blog.feed.limit |
60 | end | 52 | end |
61 | 53 | ||
@@ -65,16 +57,16 @@ class BlogTest < ActiveSupport::TestCase | @@ -65,16 +57,16 @@ class BlogTest < ActiveSupport::TestCase | ||
65 | end | 57 | end |
66 | 58 | ||
67 | should 'update posts per page setting' do | 59 | should 'update posts per page setting' do |
68 | - p = create_user('testusermerda').person | ||
69 | - blog = Blog.create!(:profile => p, :name => 'Blog test') | ||
70 | - blog.reload | ||
71 | - blog.posts_per_page = 5 | 60 | + p = create_user('testuser').person |
61 | + p.articles << Blog.new(:profile => p, :name => 'Blog test') | ||
62 | + blog = p.blog | ||
63 | + blog.posts_per_page = 7 | ||
72 | assert blog.save! | 64 | assert blog.save! |
73 | - assert_equal 5, blog.posts_per_page | 65 | + assert_equal 7, p.blog.posts_per_page |
74 | end | 66 | end |
75 | 67 | ||
76 | should 'has posts' do | 68 | should 'has posts' do |
77 | - p = create_user('testusermerda').person | 69 | + p = create_user('testuser').person |
78 | blog = Blog.create!(:profile => p, :name => 'Blog test') | 70 | blog = Blog.create!(:profile => p, :name => 'Blog test') |
79 | post = TextileArticle.create!(:name => 'First post', :profile => p, :parent => blog) | 71 | post = TextileArticle.create!(:name => 'First post', :profile => p, :parent => blog) |
80 | blog.children << post | 72 | blog.children << post |
@@ -82,25 +74,56 @@ class BlogTest < ActiveSupport::TestCase | @@ -82,25 +74,56 @@ class BlogTest < ActiveSupport::TestCase | ||
82 | end | 74 | end |
83 | 75 | ||
84 | should 'not includes rss feed in posts' do | 76 | should 'not includes rss feed in posts' do |
85 | - p = create_user('testusermerda').person | 77 | + p = create_user('testuser').person |
86 | blog = Blog.create!(:profile => p, :name => 'Blog test') | 78 | blog = Blog.create!(:profile => p, :name => 'Blog test') |
87 | assert_includes blog.children, blog.feed | 79 | assert_includes blog.children, blog.feed |
88 | assert_not_includes blog.posts, blog.feed | 80 | assert_not_includes blog.posts, blog.feed |
89 | end | 81 | end |
90 | 82 | ||
91 | - should 'list posts ordered by created at' do | ||
92 | - p = create_user('testusermerda').person | 83 | + should 'list posts ordered by published at' do |
84 | + p = create_user('testuser').person | ||
93 | blog = Blog.create!(:profile => p, :name => 'Blog test') | 85 | blog = Blog.create!(:profile => p, :name => 'Blog test') |
94 | newer = TextileArticle.create!(:name => 'Post 2', :parent => blog, :profile => p) | 86 | newer = TextileArticle.create!(:name => 'Post 2', :parent => blog, :profile => p) |
95 | - older = TextileArticle.create!(:name => 'Post 1', :parent => blog, :profile => p, :created_at => Time.now - 1.month) | 87 | + older = TextileArticle.create!(:name => 'Post 1', :parent => blog, :profile => p, :published_at => Time.now - 1.month) |
96 | assert_equal [newer, older], blog.posts | 88 | assert_equal [newer, older], blog.posts |
97 | end | 89 | end |
98 | 90 | ||
99 | should 'has filter' do | 91 | should 'has filter' do |
100 | - p = create_user('testusermerda').person | 92 | + p = create_user('testuser').person |
101 | blog = Blog.create!(:profile => p, :name => 'Blog test') | 93 | blog = Blog.create!(:profile => p, :name => 'Blog test') |
102 | blog.filter = {:param => 'value'} | 94 | blog.filter = {:param => 'value'} |
103 | assert_equal 'value', blog.filter[:param] | 95 | assert_equal 'value', blog.filter[:param] |
104 | end | 96 | end |
105 | 97 | ||
98 | + should 'has one external feed' do | ||
99 | + p = create_user('testuser').person | ||
100 | + blog = Blog.create!(:profile => p, :name => 'Blog test') | ||
101 | + efeed = blog.create_external_feed(:address => 'http://invalid.url') | ||
102 | + assert_equal efeed, blog.external_feed | ||
103 | + end | ||
104 | + | ||
105 | + should 'build external feed after save' do | ||
106 | + p = create_user('testuser').person | ||
107 | + blog = Blog.new(:profile => p, :name => 'Blog test') | ||
108 | + blog.external_feed_builder = { :address => 'feed address' } | ||
109 | + blog.save! | ||
110 | + assert blog.external_feed.valid? | ||
111 | + end | ||
112 | + | ||
113 | + should 'update external feed' do | ||
114 | + p = create_user('testuser').person | ||
115 | + blog = Blog.new(:profile => p, :name => 'Blog test') | ||
116 | + blog.create_external_feed(:address => 'feed address') | ||
117 | + blog.external_feed_builder = { :address => 'address edited' } | ||
118 | + blog.save! | ||
119 | + assert_equal 'address edited', blog.external_feed.address | ||
120 | + end | ||
121 | + | ||
122 | + should 'invalid blog if has invalid external_feed' do | ||
123 | + p = create_user('testuser').person | ||
124 | + blog = Blog.new(:profile => p, :name => 'Blog test', :external_feed_builder => {:enabled => true}) | ||
125 | + blog.save | ||
126 | + assert ! blog.valid? | ||
127 | + end | ||
128 | + | ||
106 | end | 129 | end |
test/unit/content_viewer_helper_test.rb
@@ -11,17 +11,17 @@ class ContentViewerHelperTest < Test::Unit::TestCase | @@ -11,17 +11,17 @@ class ContentViewerHelperTest < Test::Unit::TestCase | ||
11 | end | 11 | end |
12 | attr :profile | 12 | attr :profile |
13 | 13 | ||
14 | - should 'display created-at for blog posts' do | 14 | + should 'display published-at for blog posts' do |
15 | blog = Blog.create!(:name => 'Blog test', :profile => profile) | 15 | blog = Blog.create!(:name => 'Blog test', :profile => profile) |
16 | post = TextileArticle.create!(:name => 'post test', :profile => profile, :parent => blog) | 16 | post = TextileArticle.create!(:name => 'post test', :profile => profile, :parent => blog) |
17 | result = article_title(post) | 17 | result = article_title(post) |
18 | - assert_match /#{show_date(post.created_at)}, by .*#{profile.identifier}/, result | 18 | + assert_match /#{show_date(post.published_at)}, by .*#{profile.identifier}/, result |
19 | end | 19 | end |
20 | 20 | ||
21 | - should 'not display created-at for non-blog posts' do | 21 | + should 'not display published-at for non-blog posts' do |
22 | article = TextileArticle.create!(:name => 'article for test', :profile => profile) | 22 | article = TextileArticle.create!(:name => 'article for test', :profile => profile) |
23 | result = article_title(article) | 23 | result = article_title(article) |
24 | - assert_no_match /#{show_date(article.created_at)}, by .*#{profile.identifier}/, result | 24 | + assert_no_match /#{show_date(article.published_at)}, by .*#{profile.identifier}/, result |
25 | end | 25 | end |
26 | 26 | ||
27 | should 'create link on title of blog posts' do | 27 | should 'create link on title of blog posts' do |
@@ -54,7 +54,7 @@ class ContentViewerHelperTest < Test::Unit::TestCase | @@ -54,7 +54,7 @@ class ContentViewerHelperTest < Test::Unit::TestCase | ||
54 | end | 54 | end |
55 | 55 | ||
56 | should 'not list feed article' do | 56 | should 'not list feed article' do |
57 | - profile.articles << Blog.new(:name => 'Blog test') | 57 | + profile.articles << Blog.new(:name => 'Blog test', :profile => profile) |
58 | assert_includes profile.blog.children.map{|i| i.class}, RssFeed | 58 | assert_includes profile.blog.children.map{|i| i.class}, RssFeed |
59 | result = list_posts(nil, profile.blog.posts) | 59 | result = list_posts(nil, profile.blog.posts) |
60 | assert_no_match /feed/, result | 60 | assert_no_match /feed/, result |
@@ -64,10 +64,10 @@ class ContentViewerHelperTest < Test::Unit::TestCase | @@ -64,10 +64,10 @@ class ContentViewerHelperTest < Test::Unit::TestCase | ||
64 | blog = Blog.create!(:name => 'Blog test', :profile => profile) | 64 | blog = Blog.create!(:name => 'Blog test', :profile => profile) |
65 | 65 | ||
66 | nov = TextileArticle.create!(:name => 'November post', :parent => blog, :profile => profile) | 66 | nov = TextileArticle.create!(:name => 'November post', :parent => blog, :profile => profile) |
67 | - nov.update_attributes!(:created_at => DateTime.parse('2008-11-15')) | 67 | + nov.update_attributes!(:published_at => DateTime.parse('2008-11-15')) |
68 | 68 | ||
69 | sep = TextileArticle.create!(:name => 'September post', :parent => blog, :profile => profile) | 69 | sep = TextileArticle.create!(:name => 'September post', :parent => blog, :profile => profile) |
70 | - sep.update_attribute(:created_at, DateTime.parse('2008-09-10')) | 70 | + sep.update_attribute(:published_at, DateTime.parse('2008-09-10')) |
71 | 71 | ||
72 | blog.reload | 72 | blog.reload |
73 | blog.filter = {:year => 2008, :month => 11} | 73 | blog.filter = {:year => 2008, :month => 11} |
@@ -0,0 +1,63 @@ | @@ -0,0 +1,63 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | + | ||
3 | +class ExternalFeedTest < ActiveSupport::TestCase | ||
4 | + | ||
5 | + def setup | ||
6 | + @profile = create_user('test-person').person | ||
7 | + @blog = Blog.create!(:name => 'test-blog', :profile => @profile) | ||
8 | + end | ||
9 | + attr_reader :profile, :blog | ||
10 | + | ||
11 | + should 'require blog' do | ||
12 | + e = ExternalFeed.new(:address => 'http://localhost') | ||
13 | + assert !e.valid? | ||
14 | + e.blog = blog | ||
15 | + assert e.save! | ||
16 | + end | ||
17 | + | ||
18 | + should 'belongs to blog' do | ||
19 | + e = ExternalFeed.create!(:address => 'http://localhost', :blog => blog) | ||
20 | + e.reload | ||
21 | + assert_equal blog, e.blog | ||
22 | + end | ||
23 | + | ||
24 | + should 'not add same item twice' do | ||
25 | + e = ExternalFeed.create!(:address => 'http://localhost', :blog => blog) | ||
26 | + assert e.add_item('Article title', 'http://orig.link.invalid', Time.now, 'Content for external post') | ||
27 | + assert !e.add_item('Article title', 'http://orig.link.invalid', Time.now, 'Content for external post') | ||
28 | + assert_equal 1, e.blog.posts.size | ||
29 | + end | ||
30 | + | ||
31 | + should 'nothing when clear' do | ||
32 | + assert_respond_to ExternalFeed.new, :clear | ||
33 | + end | ||
34 | + | ||
35 | + should 'not limit' do | ||
36 | + assert_equal 0, ExternalFeed.new.limit | ||
37 | + end | ||
38 | + | ||
39 | + should 'disable external feed if fetch only once on finish fetch' do | ||
40 | + e = ExternalFeed.create(:address => 'http://localhost', :blog => blog, :only_once => true, :enabled => true) | ||
41 | + assert e.enabled | ||
42 | + assert e.finish_fetch | ||
43 | + assert !e.enabled | ||
44 | + end | ||
45 | + | ||
46 | + should 'add items to blog as posts' do | ||
47 | + handler = FeedHandler.new | ||
48 | + e = ExternalFeed.create!(:address => 'test/fixtures/files/feed.xml', :blog => blog, :enabled => true) | ||
49 | + handler.process(e) | ||
50 | + assert_equal ["Last POST", "Second POST", "First POST"], e.blog.posts.map{|i| i.title} | ||
51 | + end | ||
52 | + | ||
53 | + should 'require address if enabled' do | ||
54 | + e = ExternalFeed.new(:blog => blog, :enabled => true) | ||
55 | + assert !e.valid? | ||
56 | + end | ||
57 | + | ||
58 | + should 'not require address if disabled' do | ||
59 | + e = ExternalFeed.new(:blog => blog, :enabled => false) | ||
60 | + assert e.valid? | ||
61 | + end | ||
62 | + | ||
63 | +end |
test/unit/feed_handler_test.rb
@@ -68,8 +68,8 @@ class FeedHandlerTest < Test::Unit::TestCase | @@ -68,8 +68,8 @@ class FeedHandlerTest < Test::Unit::TestCase | ||
68 | handler.process(container) | 68 | handler.process(container) |
69 | end | 69 | end |
70 | 70 | ||
71 | - should 'save after processing' do | ||
72 | - container.expects(:save!) | 71 | + should 'finish_fetch after processing' do |
72 | + container.expects(:finish_fetch) | ||
73 | handler.process(container) | 73 | handler.process(container) |
74 | end | 74 | end |
75 | 75 |
test/unit/feed_reader_block_test.rb
@@ -68,4 +68,9 @@ class FeedReaderBlockTest < ActiveSupport::TestCase | @@ -68,4 +68,9 @@ class FeedReaderBlockTest < ActiveSupport::TestCase | ||
68 | assert_equal [], feed.feed_items | 68 | assert_equal [], feed.feed_items |
69 | end | 69 | end |
70 | 70 | ||
71 | + should 'save! when commit' do | ||
72 | + feed.expects(:save!) | ||
73 | + feed.finish_fetch | ||
74 | + end | ||
75 | + | ||
71 | end | 76 | end |
test/unit/profile_test.rb
@@ -1160,7 +1160,7 @@ class ProfileTest < Test::Unit::TestCase | @@ -1160,7 +1160,7 @@ class ProfileTest < Test::Unit::TestCase | ||
1160 | 1160 | ||
1161 | should 'has blog' do | 1161 | should 'has blog' do |
1162 | p = create_user('testuser').person | 1162 | p = create_user('testuser').person |
1163 | - b = Blog.create!(:profile => p, :name => 'blog_feed_test') | 1163 | + p.articles << Blog.new(:profile => p, :name => 'blog_feed_test') |
1164 | assert p.has_blog? | 1164 | assert p.has_blog? |
1165 | end | 1165 | end |
1166 | 1166 | ||
@@ -1169,12 +1169,6 @@ class ProfileTest < Test::Unit::TestCase | @@ -1169,12 +1169,6 @@ class ProfileTest < Test::Unit::TestCase | ||
1169 | assert !p.has_blog? | 1169 | assert !p.has_blog? |
1170 | end | 1170 | end |
1171 | 1171 | ||
1172 | - should 'get blog when has blog' do | ||
1173 | - p = create_user('testuser').person | ||
1174 | - b = Blog.create!(:profile => p, :name => 'blog_feed_test') | ||
1175 | - assert_equal b, p.blog | ||
1176 | - end | ||
1177 | - | ||
1178 | should 'get nil when no blog' do | 1172 | should 'get nil when no blog' do |
1179 | p = create_user('testuser').person | 1173 | p = create_user('testuser').person |
1180 | assert_nil p.blog | 1174 | assert_nil p.blog |
test/unit/published_article_test.rb
@@ -56,10 +56,10 @@ class PublishedArticleTest < ActiveSupport::TestCase | @@ -56,10 +56,10 @@ class PublishedArticleTest < ActiveSupport::TestCase | ||
56 | @article.expects(:parent).returns(parent) | 56 | @article.expects(:parent).returns(parent) |
57 | parent.expects(:blog?).returns(true) | 57 | parent.expects(:blog?).returns(true) |
58 | prof = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | 58 | prof = Community.create!(:name => 'test_comm', :identifier => 'test_comm') |
59 | - blog = Blog.create!(:profile => prof, :name => 'Blog test') | 59 | + prof.articles << Blog.new(:profile => prof, :name => 'Blog test') |
60 | p = PublishedArticle.create!(:reference_article => @article, :profile => prof) | 60 | p = PublishedArticle.create!(:reference_article => @article, :profile => prof) |
61 | 61 | ||
62 | - assert_equal p.parent, blog | 62 | + assert_equal p.parent, prof.blog |
63 | end | 63 | end |
64 | 64 | ||
65 | should 'not be created in community blog if did not come from a blog' do | 65 | should 'not be created in community blog if did not come from a blog' do |
test/unit/rss_feed_test.rb
@@ -109,7 +109,7 @@ class RssFeedTest < Test::Unit::TestCase | @@ -109,7 +109,7 @@ class RssFeedTest < Test::Unit::TestCase | ||
109 | 109 | ||
110 | should 'list blog posts with more recent first and respecting limit' do | 110 | should 'list blog posts with more recent first and respecting limit' do |
111 | profile = create_user('testuser').person | 111 | profile = create_user('testuser').person |
112 | - blog = Blog.create(:name => 'blog', :profile => profile) | 112 | + blog = Blog.create!(:name => 'blog-test', :profile => profile) |
113 | posts = [] | 113 | posts = [] |
114 | 6.times do |i| | 114 | 6.times do |i| |
115 | posts << TextArticle.create!(:name => "post #{i}", :profile => profile, :parent => blog) | 115 | posts << TextArticle.create!(:name => "post #{i}", :profile => profile, :parent => blog) |
@@ -123,7 +123,7 @@ class RssFeedTest < Test::Unit::TestCase | @@ -123,7 +123,7 @@ class RssFeedTest < Test::Unit::TestCase | ||
123 | 123 | ||
124 | should 'list only published posts from blog' do | 124 | should 'list only published posts from blog' do |
125 | profile = create_user('testuser').person | 125 | profile = create_user('testuser').person |
126 | - blog = Blog.create(:name => 'blog', :profile => profile) | 126 | + blog = Blog.create!(:name => 'blog-test', :profile => profile) |
127 | posts = [] | 127 | posts = [] |
128 | 5.times do |i| | 128 | 5.times do |i| |
129 | posts << TextArticle.create!(:name => "post #{i}", :profile => profile, :parent => blog) | 129 | posts << TextArticle.create!(:name => "post #{i}", :profile => profile, :parent => blog) |
@@ -0,0 +1,9 @@ | @@ -0,0 +1,9 @@ | ||
1 | +# monkey patch to remove a single error from the errors collection | ||
2 | +# http://dev.rubyonrails.org/ticket/8137 | ||
3 | + | ||
4 | +ActiveRecord::Errors.module_eval do | ||
5 | + # remove a single error from the errors collection by key | ||
6 | + def delete(key) | ||
7 | + @errors.delete(key.to_s) | ||
8 | + end | ||
9 | +end |