Commit 3ea04c54b00333b383bb1ac250c1f586ba822231
Exists in
master
and in
29 other branches
Merge commit 'refs/merge-requests/188' of git://gitorious.org/noosfero/noosfero …
…into merge-requests/188
Showing
14 changed files
with
276 additions
and
31 deletions
Show diff stats
app/helpers/application_helper.rb
@@ -30,6 +30,10 @@ module ApplicationHelper | @@ -30,6 +30,10 @@ module ApplicationHelper | ||
30 | 30 | ||
31 | include AccountHelper | 31 | include AccountHelper |
32 | 32 | ||
33 | + include BlogHelper | ||
34 | + | ||
35 | + include ContentViewerHelper | ||
36 | + | ||
33 | def locale | 37 | def locale |
34 | (@page && !@page.language.blank?) ? @page.language : FastGettext.locale | 38 | (@page && !@page.language.blank?) ? @page.language : FastGettext.locale |
35 | end | 39 | end |
@@ -994,6 +998,36 @@ module ApplicationHelper | @@ -994,6 +998,36 @@ module ApplicationHelper | ||
994 | content | 998 | content |
995 | end | 999 | end |
996 | 1000 | ||
1001 | + # Please, use link_to by default! | ||
1002 | + # This method was created to work around to inexplicable | ||
1003 | + # chain of problems when display_short_format was called | ||
1004 | + # from Article model for an ArticleBlock. | ||
1005 | + def link_to_article(text, article, anchor=nil) | ||
1006 | + if article.profile.domains.empty? | ||
1007 | + href = "/#{article.url[:profile]}/" | ||
1008 | + else | ||
1009 | + href = "http://#{article.profile.domains.first.name}/" | ||
1010 | + end | ||
1011 | + href += article.url[:page].join('/') | ||
1012 | + href += '#' + anchor if anchor | ||
1013 | + content_tag('a', text, :href => href) | ||
1014 | + end | ||
1015 | + | ||
1016 | + def display_short_format(article, options={}) | ||
1017 | + options[:comments_link] ||= true | ||
1018 | + options[:read_more_link] ||= true | ||
1019 | + html = content_tag('div', | ||
1020 | + article.lead + | ||
1021 | + content_tag('div', | ||
1022 | + (options[:comments_link] ? link_to_comments(article) : '') + | ||
1023 | + (options[:read_more_link] ? link_to_article( _('Read more'), article) : ''), | ||
1024 | + :class => 'read-more' | ||
1025 | + ), | ||
1026 | + :class => 'short-post' | ||
1027 | + ) | ||
1028 | + html | ||
1029 | + end | ||
1030 | + | ||
997 | def colorpicker_field(object_name, method, options = {}) | 1031 | def colorpicker_field(object_name, method, options = {}) |
998 | text_field(object_name, method, options.merge(:class => 'colorpicker_field')) | 1032 | text_field(object_name, method, options.merge(:class => 'colorpicker_field')) |
999 | end | 1033 | end |
app/helpers/blog_helper.rb
@@ -18,7 +18,8 @@ module BlogHelper | @@ -18,7 +18,8 @@ module BlogHelper | ||
18 | pagination = will_paginate(articles, { | 18 | pagination = will_paginate(articles, { |
19 | :param_name => 'npage', | 19 | :param_name => 'npage', |
20 | :previous_label => _('« Newer posts'), | 20 | :previous_label => _('« Newer posts'), |
21 | - :next_label => _('Older posts »') | 21 | + :next_label => _('Older posts »'), |
22 | + :params => {:action=>"view_page", :page=>articles.first.parent.path.split('/'), :controller=>"content_viewer"} | ||
22 | }) | 23 | }) |
23 | content = [] | 24 | content = [] |
24 | artic_len = articles.length | 25 | artic_len = articles.length |
@@ -46,18 +47,6 @@ module BlogHelper | @@ -46,18 +47,6 @@ module BlogHelper | ||
46 | article_title(article, :no_comments => no_comments) + html | 47 | article_title(article, :no_comments => no_comments) + html |
47 | end | 48 | end |
48 | 49 | ||
49 | - def display_short_format(article) | ||
50 | - html = content_tag('div', | ||
51 | - article.lead + | ||
52 | - content_tag('div', | ||
53 | - link_to_comments(article) + | ||
54 | - link_to( _('Read more'), article.url), | ||
55 | - :class => 'read-more'), | ||
56 | - :class => 'short-post' | ||
57 | - ) | ||
58 | - html | ||
59 | - end | ||
60 | - | ||
61 | def display_full_format(article) | 50 | def display_full_format(article) |
62 | html = article_to_html(article) | 51 | html = article_to_html(article) |
63 | html = content_tag('p', html) if ! html.include?('</p>') | 52 | html = content_tag('p', html) if ! html.include?('</p>') |
app/helpers/content_viewer_helper.rb
@@ -2,6 +2,7 @@ module ContentViewerHelper | @@ -2,6 +2,7 @@ module ContentViewerHelper | ||
2 | 2 | ||
3 | include BlogHelper | 3 | include BlogHelper |
4 | include ForumHelper | 4 | include ForumHelper |
5 | + include ActionView::Helpers::TagHelper | ||
5 | 6 | ||
6 | def number_of_comments(article) | 7 | def number_of_comments(article) |
7 | n = article.comments.without_spam.count | 8 | n = article.comments.without_spam.count |
@@ -36,7 +37,7 @@ module ContentViewerHelper | @@ -36,7 +37,7 @@ module ContentViewerHelper | ||
36 | 37 | ||
37 | def link_to_comments(article, args = {}) | 38 | def link_to_comments(article, args = {}) |
38 | return '' unless article.accept_comments? | 39 | return '' unless article.accept_comments? |
39 | - link_to(number_of_comments(article), article.url.merge(:anchor => 'comments_list') ) | 40 | + link_to_article number_of_comments(article), article, 'comments_list' |
40 | end | 41 | end |
41 | 42 | ||
42 | def article_translations(article) | 43 | def article_translations(article) |
app/helpers/dates_helper.rb
@@ -23,11 +23,13 @@ module DatesHelper | @@ -23,11 +23,13 @@ module DatesHelper | ||
23 | end | 23 | end |
24 | 24 | ||
25 | # formats a date for displaying. | 25 | # formats a date for displaying. |
26 | - def show_date(date, use_numbers = false) | 26 | + def show_date(date, use_numbers = false, year=true) |
27 | if date && use_numbers | 27 | if date && use_numbers |
28 | - _('%{month}/%{day}/%{year}') % { :day => date.day, :month => date.month, :year => date.year } | 28 | + date_format = year ? _('%{month}/%{day}/%{year}') : _('%{month}/%{day}') |
29 | + date_format % { :day => date.day, :month => date.month, :year => date.year } | ||
29 | elsif date | 30 | elsif date |
30 | - _('%{month} %{day}, %{year}') % { :day => date.day, :month => month_name(date.month), :year => date.year } | 31 | + date_format = year ? _('%{month_name} %{day}, %{year}') : _('%{month_name} %{day}') |
32 | + date_format % { :day => date.day, :month_name => month_name(date.month), :year => date.year } | ||
31 | else | 33 | else |
32 | '' | 34 | '' |
33 | end | 35 | end |
@@ -46,7 +48,27 @@ module DatesHelper | @@ -46,7 +48,27 @@ module DatesHelper | ||
46 | if (date1 == date2) || (date2.nil?) | 48 | if (date1 == date2) || (date2.nil?) |
47 | show_date(date1, use_numbers) | 49 | show_date(date1, use_numbers) |
48 | else | 50 | else |
49 | - _('from %{date1} to %{date2}') % {:date1 => show_date(date1, use_numbers), :date2 => show_date(date2, use_numbers)} | 51 | + if date1.year == date2.year |
52 | + if date1.month == date2.month | ||
53 | + _('from %{month} %{day1} to %{day2}, %{year}') % { | ||
54 | + :day1 => date1.day, | ||
55 | + :day2 => date2.day, | ||
56 | + :month => use_numbers ? date1.month : month_name(date1.month), | ||
57 | + :year => date1.year | ||
58 | + } | ||
59 | + else | ||
60 | + _('from %{date1} to %{date2}, %{year}') % { | ||
61 | + :date1 => show_date(date1, use_numbers, false), | ||
62 | + :date2 => show_date(date2, use_numbers, false), | ||
63 | + :year => date1.year | ||
64 | + } | ||
65 | + end | ||
66 | + else | ||
67 | + _('from %{date1} to %{date2}') % { | ||
68 | + :date1 => show_date(date1, use_numbers), | ||
69 | + :date2 => show_date(date2, use_numbers) | ||
70 | + } | ||
71 | + end | ||
50 | end | 72 | end |
51 | end | 73 | end |
52 | 74 |
app/models/article.rb
@@ -236,8 +236,13 @@ class Article < ActiveRecord::Base | @@ -236,8 +236,13 @@ class Article < ActiveRecord::Base | ||
236 | # The implementation in this class just provides the +body+ attribute as the | 236 | # The implementation in this class just provides the +body+ attribute as the |
237 | # HTML. Other article types can override this method to provide customized | 237 | # HTML. Other article types can override this method to provide customized |
238 | # views of themselves. | 238 | # views of themselves. |
239 | + # (To override short format representation, override the lead method) | ||
239 | def to_html(options = {}) | 240 | def to_html(options = {}) |
240 | - body || '' | 241 | + if options[:format] == 'short' |
242 | + display_short_format(self) | ||
243 | + else | ||
244 | + body || '' | ||
245 | + end | ||
241 | end | 246 | end |
242 | 247 | ||
243 | include ApplicationHelper | 248 | include ApplicationHelper |
app/models/article_block.rb
@@ -12,7 +12,11 @@ class ArticleBlock < Block | @@ -12,7 +12,11 @@ class ArticleBlock < Block | ||
12 | block = self | 12 | block = self |
13 | lambda do | 13 | lambda do |
14 | block_title(block.title) + | 14 | block_title(block.title) + |
15 | - (block.article ? article_to_html(block.article, :gallery_view => false) : _('Article not selected yet.')) | 15 | + (block.article ? article_to_html(block.article, |
16 | + :gallery_view => false, | ||
17 | + :inside_block => block, # For Blogs and folders | ||
18 | + :format => block.visualization_format # For Articles and contents | ||
19 | + ) : _('Article not selected yet.')) | ||
16 | end | 20 | end |
17 | end | 21 | end |
18 | 22 | ||
@@ -49,4 +53,14 @@ class ArticleBlock < Block | @@ -49,4 +53,14 @@ class ArticleBlock < Block | ||
49 | self.box.owner.kind_of?(Environment) ? self.box.owner.portal_community.articles : self.box.owner.articles | 53 | self.box.owner.kind_of?(Environment) ? self.box.owner.portal_community.articles : self.box.owner.articles |
50 | end | 54 | end |
51 | 55 | ||
56 | + def posts_per_page | ||
57 | + self.settings[:posts_per_page] or 1 | ||
58 | + end | ||
59 | + | ||
60 | + def posts_per_page= value | ||
61 | + value = value.to_i | ||
62 | + self.settings[:posts_per_page] = value if value > 0 | ||
63 | + end | ||
64 | + | ||
65 | + settings_items :visualization_format, :type => :string, :default => 'short' | ||
52 | end | 66 | end |
app/models/blog.rb
@@ -24,8 +24,9 @@ class Blog < Folder | @@ -24,8 +24,9 @@ class Blog < Folder | ||
24 | # FIXME isn't this too much including just to be able to generate some HTML? | 24 | # FIXME isn't this too much including just to be able to generate some HTML? |
25 | include ActionView::Helpers::TagHelper | 25 | include ActionView::Helpers::TagHelper |
26 | def to_html(options = {}) | 26 | def to_html(options = {}) |
27 | + me = self | ||
27 | lambda do | 28 | lambda do |
28 | - render :file => 'content_viewer/blog_page' | 29 | + render :file => 'content_viewer/blog_page', :locals => { :blog=>me, :inside_block=>options[:inside_block] } |
29 | end | 30 | end |
30 | end | 31 | end |
31 | 32 |
app/models/event.rb
@@ -104,18 +104,30 @@ class Event < Article | @@ -104,18 +104,30 @@ class Event < Article | ||
104 | } | 104 | } |
105 | } | 105 | } |
106 | 106 | ||
107 | + # TODO: some good soul, please clean this ugly hack: | ||
107 | if self.body | 108 | if self.body |
108 | html.div('_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____', :class => 'event-description') | 109 | html.div('_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____', :class => 'event-description') |
109 | end | 110 | end |
110 | } | 111 | } |
111 | 112 | ||
112 | if self.body | 113 | if self.body |
113 | - result.sub!('_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____', self.body) | 114 | + if options[:format] == 'short' |
115 | + result.sub!('_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____', display_short_format(self)) | ||
116 | + else | ||
117 | + result.sub!('_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____', self.body) | ||
118 | + end | ||
114 | end | 119 | end |
115 | 120 | ||
116 | result | 121 | result |
117 | end | 122 | end |
118 | 123 | ||
124 | + def lead | ||
125 | + content_tag('div', | ||
126 | + show_period(start_date, end_date), | ||
127 | + :class => 'event-dates' | ||
128 | + ) + super | ||
129 | + end | ||
130 | + | ||
119 | def event? | 131 | def event? |
120 | true | 132 | true |
121 | end | 133 | end |
app/views/box_organizer/_article_block.rhtml
1 | -<div class='article-block-edition'> | 1 | +<div class="article-block-edition"> |
2 | <% if @block.box.owner.kind_of?(Environment) and @block.box.owner.portal_community.nil? %> | 2 | <% if @block.box.owner.kind_of?(Environment) and @block.box.owner.portal_community.nil? %> |
3 | - <p id='no_portal_community'> | 3 | + <p id="no_portal_community"> |
4 | <%= _("You don't have an community defined as the portal community. Define it before use this block properly.") %> | 4 | <%= _("You don't have an community defined as the portal community. Define it before use this block properly.") %> |
5 | </p> | 5 | </p> |
6 | <% else %> | 6 | <% else %> |
7 | - <% articles = @block.available_articles.select {|article| !article.folder? } %> | ||
8 | - <%= select_tag('block[article_id]', options_for_select_with_title(articles.map {|item| [item.path, item.id]}, @block.article ? @block.article.id : nil)) %> | 7 | + <% |
8 | + articles = @block.available_articles.select {|a| !a.folder? || a.blog? } | ||
9 | + firstText = articles[articles.find_index{|a| a.kind_of?TextArticle}||-1] | ||
10 | + selected = @block.article || firstText | ||
11 | + %> | ||
12 | + <%= select_tag( | ||
13 | + 'block[article_id]', | ||
14 | + options_for_select_with_title(articles.map {|item| [item.path, item.id]}, selected.id), | ||
15 | + :onchange => 'this.changedTo(this.value)' | ||
16 | + )%> | ||
17 | + <div id="block_blog_options" style="display:none"> | ||
18 | + <%= labelled_form_field( | ||
19 | + _('Number of posts:'), | ||
20 | + text_field_tag('block[posts_per_page]', @block.posts_per_page) | ||
21 | + )%> | ||
22 | + </div> | ||
23 | + <%= labelled_form_field( | ||
24 | + _('How to display this content:'), | ||
25 | + select_tag( | ||
26 | + 'block[visualization_format]', | ||
27 | + options_for_select([[_('Lead'), 'short'], [_('Full post'), 'full']], @block.visualization_format) | ||
28 | + ) | ||
29 | + )%> | ||
30 | + <% blogs = @block.available_articles.select{|a|a.blog?} %> | ||
31 | + <script> | ||
32 | + var select = jQuery("#block_article_id")[0]; | ||
33 | + select.blogs = <%= blogs.map{|b| b.id.to_s }.to_json %>; | ||
34 | + select.changedTo = function(articleId) { | ||
35 | + var blogSelected = this.blogs.indexOf(articleId) != -1; | ||
36 | + jQuery("#block_blog_options").toggle(blogSelected); | ||
37 | + } | ||
38 | + select.changedTo('<%= selected.id %>'); | ||
39 | + </script> | ||
9 | <% end %> | 40 | <% end %> |
10 | </div> | 41 | </div> |
app/views/content_viewer/blog_page.rhtml
1 | -<% add_rss_feed_to_head(@page.name, @page.feed.url) if @page.blog? && @page.feed %> | 1 | +<% add_rss_feed_to_head(blog.name, blog.feed.url) if blog.blog? && blog.feed %> |
2 | 2 | ||
3 | -<%= content_tag('em', _('(external feed was not loaded yet)'), :id => 'external-feed-info', :class => 'metadata') if @page.blog? && @page.external_feed && @page.external_feed.enabled && @page.external_feed.fetched_at.nil? %> | 3 | +<%= content_tag('em', _('(external feed was not loaded yet)'), :id => 'external-feed-info', :class => 'metadata') if blog.blog? && blog.external_feed && blog.external_feed.enabled && blog.external_feed.fetched_at.nil? %> |
4 | 4 | ||
5 | <div> | 5 | <div> |
6 | <div class='blog-description'> | 6 | <div class='blog-description'> |
7 | - <%= @page.body %> | 7 | + <%= blog.body %> |
8 | </div> | 8 | </div> |
9 | </div> | 9 | </div> |
10 | <hr class="pre-posts"/> | 10 | <hr class="pre-posts"/> |
11 | <div class="blog-posts"> | 11 | <div class="blog-posts"> |
12 | - <%= (@page.empty? ? content_tag('em', _('(no posts)')) : list_posts(@posts, @page.visualization_format)) %> | 12 | + <%= |
13 | + posts = @posts | ||
14 | + format = blog.visualization_format | ||
15 | + if inside_block | ||
16 | + posts = blog.posts.paginate(:page=>1, :per_page=>inside_block.posts_per_page) | ||
17 | + format = inside_block.visualization_format | ||
18 | + end | ||
19 | + (blog.empty? ? content_tag('em', _('(no posts)')) : list_posts(posts, format)) | ||
20 | + %> | ||
13 | </div> | 21 | </div> |
@@ -0,0 +1,56 @@ | @@ -0,0 +1,56 @@ | ||
1 | +require "#{File.dirname(__FILE__)}/../test_helper" | ||
2 | + | ||
3 | +class BlocksIntegrationTest < ActionController::IntegrationTest | ||
4 | + def blog_on_article_block_bootstrap | ||
5 | + profile = fast_create(Profile) | ||
6 | + blog = fast_create(Blog, :name => 'Blog', :profile_id => profile.id) | ||
7 | + fast_create(TinyMceArticle, :name => "First Post", :profile_id => profile.id, :parent_id => blog.id, :body => '<p> Wasserstoffbombe </p>') | ||
8 | + fast_create(TinyMceArticle, :name => "A Post", :profile_id => profile.id, :parent_id => blog.id, :body => '<p>Lorem ipsum dolor sit amet</p> <p>Second paragraph</p>') | ||
9 | + block = ArticleBlock.new | ||
10 | + block.article = blog | ||
11 | + profile.boxes << Box.new | ||
12 | + profile.boxes.first.blocks << block | ||
13 | + return block | ||
14 | + end | ||
15 | + | ||
16 | + should 'allow blog as article block content' do | ||
17 | + block = blog_on_article_block_bootstrap | ||
18 | + get "/profile/#{block.owner.identifier}" | ||
19 | + assert_match(/Lorem ipsum dolor sit amet/, @response.body) | ||
20 | + end | ||
21 | + | ||
22 | + should 'display short version for block posts on article block' do | ||
23 | + block = blog_on_article_block_bootstrap | ||
24 | + get "/profile/#{block.owner.identifier}" | ||
25 | + assert_no_match(/Second paragraph/, @response.body) | ||
26 | + end | ||
27 | + | ||
28 | + should 'display full version for block posts on article block' do | ||
29 | + block = blog_on_article_block_bootstrap | ||
30 | + block.visualization_format = 'full' | ||
31 | + block.save! | ||
32 | + get "/profile/#{block.owner.identifier}" | ||
33 | + assert_match(/Second paragraph/, @response.body) | ||
34 | + end | ||
35 | + | ||
36 | + should 'display configured number of blog posts on article block' do | ||
37 | + block = blog_on_article_block_bootstrap | ||
38 | + block.posts_per_page = 2 | ||
39 | + block.save! | ||
40 | + get "/profile/#{block.owner.identifier}" | ||
41 | + assert_match(/Lorem ipsum dolor sit amet/, @response.body) | ||
42 | + assert_match(/Wasserstoffbombe/, @response.body) | ||
43 | + end | ||
44 | + | ||
45 | + should 'link correctly in pagination' do | ||
46 | + block = blog_on_article_block_bootstrap | ||
47 | + p = block.owner | ||
48 | + b = block.article | ||
49 | + f = fast_create(Folder, :name => 'Folder1', :profile_id => p.id) | ||
50 | + b.parent = f | ||
51 | + b.save! | ||
52 | + get "/profile/#{block.owner.identifier}" | ||
53 | + assert_tag :tag => 'a', :attributes => { :href => "/#{p.identifier}/#{f.slug}/#{b.slug}?npage=2" } | ||
54 | + end | ||
55 | + | ||
56 | +end |
test/unit/application_helper_test.rb
@@ -657,6 +657,43 @@ class ApplicationHelperTest < ActiveSupport::TestCase | @@ -657,6 +657,43 @@ class ApplicationHelperTest < ActiveSupport::TestCase | ||
657 | assert_not_nil add_zoom_to_images | 657 | assert_not_nil add_zoom_to_images |
658 | end | 658 | end |
659 | 659 | ||
660 | + should 'link to article' do | ||
661 | + c = fast_create(Community) | ||
662 | + a = fast_create(TinyMceArticle, :profile_id => c.id) | ||
663 | + assert_equal( | ||
664 | + "<a href=\"/#{c.identifier}/#{a.slug}\">x</a>", | ||
665 | + link_to_article('x', a) ) | ||
666 | + end | ||
667 | + | ||
668 | + should 'link to article, with anchor' do | ||
669 | + c = fast_create(Community) | ||
670 | + a = fast_create(TinyMceArticle, :profile_id => c.id) | ||
671 | + assert_equal( | ||
672 | + "<a href=\"/#{c.identifier}/#{a.slug}#place\">x</a>", | ||
673 | + link_to_article('x', a, 'place') ) | ||
674 | + end | ||
675 | + | ||
676 | + should 'link to article, in a blog' do | ||
677 | + c = fast_create(Community) | ||
678 | + b = fast_create(Blog, :profile_id => c.id) | ||
679 | + a = fast_create(TinyMceArticle, :profile_id => c.id, :parent_id => b.id) | ||
680 | + a.save! # needed to link to the parent blog | ||
681 | + assert_equal( | ||
682 | + "<a href=\"/#{c.identifier}/#{b.slug}/#{a.slug}\">x</a>", | ||
683 | + link_to_article('x', a) ) | ||
684 | + end | ||
685 | + | ||
686 | + should 'link to article, in a profile with domain' do | ||
687 | + c = fast_create(Community) | ||
688 | + c.domains << Domain.new(:name=>'domain.xyz') | ||
689 | + b = fast_create(Blog, :profile_id => c.id) | ||
690 | + a = fast_create(TinyMceArticle, :profile_id => c.id, :parent_id => b.id) | ||
691 | + a.save! | ||
692 | + assert_equal( | ||
693 | + "<a href=\"http://domain.xyz/#{b.slug}/#{a.slug}\">x</a>", | ||
694 | + link_to_article('x', a) ) | ||
695 | + end | ||
696 | + | ||
660 | protected | 697 | protected |
661 | include NoosferoTestHelper | 698 | include NoosferoTestHelper |
662 | 699 |
test/unit/article_test.rb
@@ -97,6 +97,21 @@ class ArticleTest < ActiveSupport::TestCase | @@ -97,6 +97,21 @@ class ArticleTest < ActiveSupport::TestCase | ||
97 | assert_equal '', a.to_html | 97 | assert_equal '', a.to_html |
98 | end | 98 | end |
99 | 99 | ||
100 | + should 'provide short html version' do | ||
101 | + a = fast_create(Article, :body => 'full body', :abstract => 'lead') | ||
102 | + a.stubs(:url).returns({:x=>'none'}) | ||
103 | + a.stubs(:link_to).returns('<link>') | ||
104 | + def a.content_tag (tag, content, c=nil) | ||
105 | + "<#{tag}>#{content}</#{tag}>" | ||
106 | + end | ||
107 | + assert_match /<div>lead.*/, a.to_html(:format=>'short') | ||
108 | + end | ||
109 | + | ||
110 | + should 'provide full html version' do | ||
111 | + a = fast_create(Article, :body => 'full body', :abstract => 'lead') | ||
112 | + assert_equal 'full body', a.to_html(:format=>'full body') | ||
113 | + end | ||
114 | + | ||
100 | should 'provide first paragraph of HTML version' do | 115 | should 'provide first paragraph of HTML version' do |
101 | profile = create_user('testinguser').person | 116 | profile = create_user('testinguser').person |
102 | a = fast_create(Article, :name => 'my article', :profile_id => profile.id) | 117 | a = fast_create(Article, :name => 'my article', :profile_id => profile.id) |
test/unit/dates_helper_test.rb
@@ -10,20 +10,40 @@ class DatesHelperTest < ActiveSupport::TestCase | @@ -10,20 +10,40 @@ class DatesHelperTest < ActiveSupport::TestCase | ||
10 | end | 10 | end |
11 | 11 | ||
12 | should 'display date with translation' do | 12 | should 'display date with translation' do |
13 | - expects(:_).with('%{month} %{day}, %{year}').returns('%{day} de %{month} de %{year}') | 13 | + expects(:_).with('%{month_name} %{day}, %{year}').returns('%{day} de %{month_name} de %{year}') |
14 | expects(:_).with('January').returns('Janeiro') | 14 | expects(:_).with('January').returns('Janeiro') |
15 | assert_equal '11 de Janeiro de 2008', show_date(Date.new(2008, 1, 11)) | 15 | assert_equal '11 de Janeiro de 2008', show_date(Date.new(2008, 1, 11)) |
16 | end | 16 | end |
17 | 17 | ||
18 | should 'generate period with two dates' do | 18 | should 'generate period with two dates' do |
19 | date1 = mock | 19 | date1 = mock |
20 | + date1.stubs(:year).returns('A') | ||
20 | expects(:show_date).with(date1, anything).returns('XXX') | 21 | expects(:show_date).with(date1, anything).returns('XXX') |
21 | date2 = mock | 22 | date2 = mock |
23 | + date2.stubs(:year).returns('B') | ||
22 | expects(:show_date).with(date2, anything).returns('YYY') | 24 | expects(:show_date).with(date2, anything).returns('YYY') |
23 | expects(:_).with('from %{date1} to %{date2}').returns('from %{date1} to %{date2}') | 25 | expects(:_).with('from %{date1} to %{date2}').returns('from %{date1} to %{date2}') |
24 | assert_equal 'from XXX to YYY', show_period(date1, date2) | 26 | assert_equal 'from XXX to YYY', show_period(date1, date2) |
25 | end | 27 | end |
26 | 28 | ||
29 | + should 'generate period with in two diferent years' do | ||
30 | + date1 = Date.new(1920, 1, 2) | ||
31 | + date2 = Date.new(1992, 4, 6) | ||
32 | + assert_equal 'from January 2, 1920 to April 6, 1992', show_period(date1, date2) | ||
33 | + end | ||
34 | + | ||
35 | + should 'generate period with in two diferent months of the same year' do | ||
36 | + date1 = Date.new(2013, 2, 1) | ||
37 | + date2 = Date.new(2013, 3, 1) | ||
38 | + assert_equal 'from February 1 to March 1, 2013', show_period(date1, date2) | ||
39 | + end | ||
40 | + | ||
41 | + should 'generate period with in two days of the same month' do | ||
42 | + date1 = Date.new(2013, 3, 27) | ||
43 | + date2 = Date.new(2013, 3, 28) | ||
44 | + assert_equal 'from March 27 to 28, 2013', show_period(date1, date2) | ||
45 | + end | ||
46 | + | ||
27 | should 'generate period with two equal dates' do | 47 | should 'generate period with two equal dates' do |
28 | date1 = mock | 48 | date1 = mock |
29 | expects(:show_date).with(date1, anything).returns('XXX') | 49 | expects(:show_date).with(date1, anything).returns('XXX') |