Commit 6cdc409cefb859ae3f893cda12dd1f535972e52e
1 parent
68b5c1da
Exists in
master
and in
28 other branches
ActionItem26: displaying as calendar
and several other things git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1886 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
14 changed files
with
373 additions
and
68 deletions
Show diff stats
app/controllers/public/search_controller.rb
| ... | ... | @@ -16,7 +16,7 @@ class SearchController < ApplicationController |
| 16 | 16 | @search_in = SEARCH_IN |
| 17 | 17 | @searching = {} |
| 18 | 18 | @search_in.each do |key, name| |
| 19 | - @searching[key] = params[:find_in].nil? || params[:find_in].empty? || params[:find_in].include?(key.to_s) | |
| 19 | + @searching[key] = (params[:asset].blank? && (params[:find_in].nil? || params[:find_in].empty? || params[:find_in].include?(key.to_s))) || (params[:asset] == key.to_s) | |
| 20 | 20 | end |
| 21 | 21 | end |
| 22 | 22 | |
| ... | ... | @@ -91,6 +91,33 @@ class SearchController < ApplicationController |
| 91 | 91 | end |
| 92 | 92 | end |
| 93 | 93 | |
| 94 | + def events | |
| 95 | + @events = @results[:events] | |
| 96 | + @calendar = Event.date_range(params[:year], params[:month]).map do |date| | |
| 97 | + [ | |
| 98 | + # the day itself | |
| 99 | + date, | |
| 100 | + # list of events of that day | |
| 101 | + @events.select do |event| | |
| 102 | + event.date_range.include?(date) | |
| 103 | + end, | |
| 104 | + # is this date in the current month? | |
| 105 | + true | |
| 106 | + ] | |
| 107 | + end | |
| 108 | + | |
| 109 | + # pad with days before | |
| 110 | + while @calendar.first.first.wday != 0 | |
| 111 | + @calendar.unshift([@calendar.first.first - 1.day, [], false]) | |
| 112 | + end | |
| 113 | + | |
| 114 | + # pad with days after (until Saturday) | |
| 115 | + while @calendar.last.first.wday != 6 | |
| 116 | + @calendar << [@calendar.last.first + 1.day, [], false] | |
| 117 | + end | |
| 118 | + | |
| 119 | + end | |
| 120 | + | |
| 94 | 121 | ####################################################### |
| 95 | 122 | |
| 96 | 123 | # view the summary of one category |
| ... | ... | @@ -104,7 +131,7 @@ class SearchController < ApplicationController |
| 104 | 131 | [ :comments, _('Recent comments'), @finder.recent('comments') ], |
| 105 | 132 | [ :most_commented_articles, _('Most commented articles'), @finder.most_commented_articles ], |
| 106 | 133 | [ :enterprises, _('Recently created enterprises'), @finder.recent('enterprises') ], |
| 107 | - [ :events, _('Recently added events'), @finder.recent('events') ] | |
| 134 | + [ :events, _('Recently added events'), @finder.current_events(params[:year], params[:month]) ] | |
| 108 | 135 | ].each do |key, name, list| |
| 109 | 136 | @results[key] = list |
| 110 | 137 | @names[key] = name |
| ... | ... | @@ -112,12 +139,12 @@ class SearchController < ApplicationController |
| 112 | 139 | end |
| 113 | 140 | attr_reader :category |
| 114 | 141 | |
| 115 | - def assets | |
| 116 | - @results = { @asset => @finder.recent(@asset, LIST_LIMIT) } | |
| 142 | + #def assets | |
| 143 | + #@results = { @asset => @finder.recent(@asset, LIST_LIMIT) } | |
| 117 | 144 | |
| 118 | - @asset_name = gettext(SEARCH_IN.find { |entry| entry.first == @asset }[1]) | |
| 119 | - @names = { @asset => @asset_name } | |
| 120 | - end | |
| 145 | + #@asset_name = gettext(SEARCH_IN.find { |entry| entry.first == @asset }[1]) | |
| 146 | + #@names = { @asset => @asset_name } | |
| 147 | + #end | |
| 121 | 148 | |
| 122 | 149 | def directory |
| 123 | 150 | @results = { @asset => @finder.find_by_initial(@asset, params[:initial]) } | ... | ... |
app/helpers/application_helper.rb
| ... | ... | @@ -13,6 +13,8 @@ module ApplicationHelper |
| 13 | 13 | include AssetsHelper |
| 14 | 14 | |
| 15 | 15 | include BlockHelper |
| 16 | + | |
| 17 | + include DatesHelper | |
| 16 | 18 | |
| 17 | 19 | # Displays context help. You can pass the content of the help message as the |
| 18 | 20 | # first parameter or using template code inside a block passed to this |
| ... | ... | @@ -457,32 +459,6 @@ module ApplicationHelper |
| 457 | 459 | |
| 458 | 460 | end |
| 459 | 461 | |
| 460 | - # formats a date for displaying. | |
| 461 | - def show_date(date) | |
| 462 | - if date | |
| 463 | - date.strftime(_('%d %B %Y')) | |
| 464 | - else | |
| 465 | - '' | |
| 466 | - end | |
| 467 | - end | |
| 468 | - | |
| 469 | - # formats a datetime for displaying. | |
| 470 | - def show_time(time) | |
| 471 | - if time | |
| 472 | - time.strftime(_('%d %B %Y, %H:%m')) | |
| 473 | - else | |
| 474 | - '' | |
| 475 | - end | |
| 476 | - end | |
| 477 | - | |
| 478 | - def show_period(date1, date2 = nil) | |
| 479 | - if (date1 == date2) || (date2.nil?) | |
| 480 | - show_date(date1) | |
| 481 | - else | |
| 482 | - _('from %s to %s') % [show_date(date1), show_date(date2)] | |
| 483 | - end | |
| 484 | - end | |
| 485 | - | |
| 486 | 462 | def gravatar_url_for(email, options = {}) |
| 487 | 463 | # Ta dando erro de roteamento |
| 488 | 464 | url_for( { :gravatar_id => Digest::MD5.hexdigest(email), | ... | ... |
| ... | ... | @@ -0,0 +1,89 @@ |
| 1 | +module DatesHelper | |
| 2 | + | |
| 3 | + include GetText | |
| 4 | + | |
| 5 | + # formats a date for displaying. | |
| 6 | + def show_date(date) | |
| 7 | + if date | |
| 8 | + date.strftime(_('%d %B %Y')) | |
| 9 | + else | |
| 10 | + '' | |
| 11 | + end | |
| 12 | + end | |
| 13 | + | |
| 14 | + # formats a datetime for displaying. | |
| 15 | + def show_time(time) | |
| 16 | + if time | |
| 17 | + time.strftime(_('%d %B %Y, %H:%m')) | |
| 18 | + else | |
| 19 | + '' | |
| 20 | + end | |
| 21 | + end | |
| 22 | + | |
| 23 | + def show_period(date1, date2 = nil) | |
| 24 | + if (date1 == date2) || (date2.nil?) | |
| 25 | + show_date(date1) | |
| 26 | + else | |
| 27 | + _('from %s to %s') % [show_date(date1), show_date(date2)] | |
| 28 | + end | |
| 29 | + end | |
| 30 | + | |
| 31 | + def show_day_of_week(date) | |
| 32 | + # FIXME Date#strftime should translate this for us !!!! | |
| 33 | + _([ | |
| 34 | + N_('Sunday'), | |
| 35 | + N_('Monday'), | |
| 36 | + N_('Tuesday'), | |
| 37 | + N_('Wednesday'), | |
| 38 | + N_('Thursday'), | |
| 39 | + N_('Friday'), | |
| 40 | + N_('Saturday'), | |
| 41 | + ][date.wday]) | |
| 42 | + end | |
| 43 | + | |
| 44 | + def show_month(year, month) | |
| 45 | + # FIXME Date#strftime should translate this for us !!! | |
| 46 | + monthname = _([ | |
| 47 | + N_('January'), | |
| 48 | + N_('February'), | |
| 49 | + N_('March'), | |
| 50 | + N_('April'), | |
| 51 | + N_('May'), | |
| 52 | + N_('June'), | |
| 53 | + N_('July'), | |
| 54 | + N_('August'), | |
| 55 | + N_('September'), | |
| 56 | + N_('October'), | |
| 57 | + N_('November'), | |
| 58 | + N_('December') | |
| 59 | + ][month.to_i - 1]) | |
| 60 | + | |
| 61 | + _('%{month} %{year}') % { :year => year, :month => monthname } | |
| 62 | + end | |
| 63 | + | |
| 64 | + def link_to_previous_month(year, month) | |
| 65 | + year = year.to_i | |
| 66 | + month = month.to_i | |
| 67 | + if month == 1 | |
| 68 | + year -= 1 | |
| 69 | + month = 12 | |
| 70 | + else | |
| 71 | + month -= 1 | |
| 72 | + end | |
| 73 | + | |
| 74 | + link_to '← ' + show_month(year, month), :year => year, :month => month | |
| 75 | + end | |
| 76 | + | |
| 77 | + def link_to_next_month(year, month) | |
| 78 | + year = year.to_i | |
| 79 | + month = month.to_i | |
| 80 | + if month == 12 | |
| 81 | + year += 1 | |
| 82 | + month = 1 | |
| 83 | + else | |
| 84 | + month += 1 | |
| 85 | + end | |
| 86 | + | |
| 87 | + link_to show_month(year, month) + ' →', :year => year, :month => month | |
| 88 | + end | |
| 89 | +end | ... | ... |
app/models/category.rb
| ... | ... | @@ -25,6 +25,8 @@ class Category < ActiveRecord::Base |
| 25 | 25 | has_many :articles, :through => :article_categorizations |
| 26 | 26 | has_many :comments, :through => :articles |
| 27 | 27 | |
| 28 | + has_many :events, :through => :article_categorizations, :class_name => 'Event', :source => :article | |
| 29 | + | |
| 28 | 30 | has_many :profile_categorizations |
| 29 | 31 | has_many :enterprises, :through => :profile_categorizations, :source => :profile, :class_name => 'Enterprise' |
| 30 | 32 | has_many :people, :through => :profile_categorizations, :source => :profile, :class_name => 'Person' | ... | ... |
app/models/category_finder.rb
| ... | ... | @@ -31,6 +31,12 @@ class CategoryFinder |
| 31 | 31 | Article.find(:all, options_for_find(Article, :limit => limit, :order => 'comments_count DESC')) |
| 32 | 32 | end |
| 33 | 33 | |
| 34 | + def current_events(year, month) | |
| 35 | + range = Event.date_range(year, month) | |
| 36 | + | |
| 37 | + Event.find(:all, :include => :categories, :conditions => { 'categories.id' => category_ids, :start_date => range }) | |
| 38 | + end | |
| 39 | + | |
| 34 | 40 | protected |
| 35 | 41 | |
| 36 | 42 | def find_in_categorized(klass, query, options={}) | ... | ... |
app/models/event.rb
| ... | ... | @@ -26,4 +26,61 @@ class Event < Article |
| 26 | 26 | 'event' |
| 27 | 27 | end |
| 28 | 28 | |
| 29 | + def self.by_month(year = nil, month = nil) | |
| 30 | + self.find(:all, :conditions => { :start_date => date_range(year, month) }) | |
| 31 | + end | |
| 32 | + | |
| 33 | + def self.date_range(year, month) | |
| 34 | + if year.nil? || month.nil? | |
| 35 | + today = Date.today | |
| 36 | + year = today.year | |
| 37 | + month = today.month | |
| 38 | + else | |
| 39 | + year = year.to_i | |
| 40 | + month = month.to_i | |
| 41 | + end | |
| 42 | + | |
| 43 | + first_day = Date.new(year, month, 1) | |
| 44 | + last_day = Date.new(year, month, 1) + 1.month - 1.day | |
| 45 | + | |
| 46 | + first_day..last_day | |
| 47 | + end | |
| 48 | + | |
| 49 | + def date_range | |
| 50 | + start_date..(end_date||start_date) | |
| 51 | + end | |
| 52 | + | |
| 53 | + # FIXME this shouldn't be needed | |
| 54 | + include ActionView::Helpers::TagHelper | |
| 55 | + include ActionView::Helpers::UrlHelper | |
| 56 | + include ActionController::UrlWriter | |
| 57 | + include DatesHelper | |
| 58 | + | |
| 59 | + def to_html | |
| 60 | + | |
| 61 | + result = '' | |
| 62 | + html = Builder::XmlMarkup.new(:target => result) | |
| 63 | + | |
| 64 | + html.div { | |
| 65 | + html.ul { | |
| 66 | + html.li { | |
| 67 | + html.strong _('URL:') | |
| 68 | + html.a(self.link || "", 'href' => self.link || "") | |
| 69 | + } | |
| 70 | + html.li { | |
| 71 | + html.strong _('Address:') | |
| 72 | + html.text! self.address || "" | |
| 73 | + } | |
| 74 | + html.li { | |
| 75 | + html.strong _('When:') | |
| 76 | + html.text! show_period(start_date, end_date) | |
| 77 | + } | |
| 78 | + } | |
| 79 | + | |
| 80 | + html.div self.description | |
| 81 | + } | |
| 82 | + | |
| 83 | + result | |
| 84 | + end | |
| 85 | + | |
| 29 | 86 | end | ... | ... |
app/views/search/assets.rhtml
| ... | ... | @@ -1,10 +0,0 @@ |
| 1 | -<h1><%= @category ? (_('%{asset_name} in %{category}') % { :asset_name => @asset_name, :category => @category.name}) : @asset_name %></h1> | |
| 2 | - | |
| 3 | -<div style='text-align: center'> | |
| 4 | - <%= link_to_unless_current(_('Recent'), :action => 'assets') %> | |
| 5 | - | |
| 6 | - <%= (?a..?z).map { |initial| link_to_unless_current(('' << initial).upcase, :action => 'directory', :initial => ('' << initial)) }.join(' ') %> | |
| 7 | -</div> | |
| 8 | -<br style='clear:both'/> | |
| 9 | - | |
| 10 | -<%= render :partial => 'display_results' %> |
| ... | ... | @@ -0,0 +1,35 @@ |
| 1 | +<h1><%= show_month(params[:year], params[:month]) %></h1> | |
| 2 | + | |
| 3 | +<div style='text-align: center; margin: 1em;'> | |
| 4 | + <%= link_to_previous_month(params[:year], params[:month]) %> | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + <%= link_to_next_month(params[:year], params[:month]) %> | |
| 9 | +</div> | |
| 10 | + | |
| 11 | +<table align='center'> | |
| 12 | + <tr> | |
| 13 | + <% @calendar.first(7).each do |day,event| %> | |
| 14 | + <th style='width: 10%;'><%= show_day_of_week(day) %></th> | |
| 15 | + <% end %> | |
| 16 | + </tr> | |
| 17 | + <% @calendar.in_groups_of(7).each do |week| %> | |
| 18 | + <tr style='height: 80px;'> | |
| 19 | + <% week.each do |date, events, this_month| %> | |
| 20 | + <td style='vertical-align: top; <%= ("background-color: gray;" unless this_month) %> <%= ("background-color: #ff9" if date == Date.today) %>'> | |
| 21 | + <div style='text-align: center;'> | |
| 22 | + <strong><%= date.day %></strong> | |
| 23 | + </div> | |
| 24 | + | |
| 25 | + <% events.each do |event| %> | |
| 26 | + <div style='border: 1px solid gray; margin: 0.25em;'> | |
| 27 | + <%= link_to event.name, event.url, :style => 'display: block;' %> | |
| 28 | + </div> | |
| 29 | + <% end %> | |
| 30 | + | |
| 31 | + </td> | |
| 32 | + <% end %> | |
| 33 | + </tr> | |
| 34 | + <% end %> | |
| 35 | +</table> | ... | ... |
config/routes.rb
| ... | ... | @@ -31,7 +31,7 @@ ActionController::Routing::Routes.draw do |map| |
| 31 | 31 | map.tag 'tag/:tag', :controller => 'search', :action => 'tag' |
| 32 | 32 | # categories index |
| 33 | 33 | map.category 'cat/*category_path', :controller => 'search', :action => 'category_index' |
| 34 | - map.assets 'assets/:asset/*category_path', :controller => 'search', :action => 'assets' | |
| 34 | + map.assets 'assets/:asset/*category_path', :controller => 'search', :action => 'index' | |
| 35 | 35 | map.directory 'directory/:asset/:initial/*category_path', :controller => 'search', :action => 'directory' |
| 36 | 36 | # search |
| 37 | 37 | map.connect 'search/:action/*category_path', :controller => 'search' | ... | ... |
test/functional/search_controller_test.rb
| ... | ... | @@ -901,14 +901,14 @@ class SearchControllerTest < Test::Unit::TestCase |
| 901 | 901 | end |
| 902 | 902 | |
| 903 | 903 | %w[ people enterprises articles events communities products comments ].each do |asset| |
| 904 | - | |
| 905 | 904 | should "render asset-specific template when searching for #{asset}" do |
| 906 | 905 | get :index, :find_in => [ asset ] |
| 907 | 906 | assert_template asset |
| 908 | 907 | end |
| 909 | - | |
| 910 | 908 | end |
| 911 | 909 | |
| 910 | + should 'test somehow the display of events as calendar' | |
| 911 | + | |
| 912 | 912 | ################################################################## |
| 913 | 913 | ################################################################## |
| 914 | 914 | ... | ... |
test/unit/application_helper_test.rb
| ... | ... | @@ -100,28 +100,6 @@ class ApplicationHelperTest < Test::Unit::TestCase |
| 100 | 100 | assert_not_nil theme_javascript |
| 101 | 101 | end |
| 102 | 102 | |
| 103 | - should 'generate period with two dates' do | |
| 104 | - date1 = mock | |
| 105 | - expects(:show_date).with(date1).returns('XXX') | |
| 106 | - date2 = mock | |
| 107 | - expects(:show_date).with(date2).returns('YYY') | |
| 108 | - expects(:_).with('from %s to %s').returns('from %s to %s') | |
| 109 | - assert_equal 'from XXX to YYY', show_period(date1, date2) | |
| 110 | - end | |
| 111 | - | |
| 112 | - should 'generate period with two equal dates' do | |
| 113 | - date1 = mock | |
| 114 | - expects(:show_date).with(date1).returns('XXX') | |
| 115 | - assert_equal 'XXX', show_period(date1, date1) | |
| 116 | - end | |
| 117 | - | |
| 118 | - should 'generate period with one date only' do | |
| 119 | - date1 = mock | |
| 120 | - expects(:show_date).with(date1).returns('XXX') | |
| 121 | - assert_equal 'XXX', show_period(date1) | |
| 122 | - end | |
| 123 | - | |
| 124 | - | |
| 125 | 103 | protected |
| 126 | 104 | |
| 127 | 105 | def content_tag(tag, content, options) | ... | ... |
test/unit/category_finder_test.rb
| ... | ... | @@ -272,4 +272,18 @@ class CategoryFinderTest < ActiveSupport::TestCase |
| 272 | 272 | assert_not_includes people, p2 |
| 273 | 273 | end |
| 274 | 274 | |
| 275 | + should 'find current events' do | |
| 276 | + finder = CategoryFinder.new(@category) | |
| 277 | + person = create_user('testuser').person | |
| 278 | + | |
| 279 | + e1 = Event.create!(:name => 'e1', :profile => person, :start_date => Date.new(2008,1,1), :categories => [@category]) | |
| 280 | + | |
| 281 | + # not in category | |
| 282 | + e2 = Event.create!(:name => 'e2', :profile => person, :start_date => Date.new(2008,1,15)) | |
| 283 | + | |
| 284 | + events = finder.current_events(2008, 1) | |
| 285 | + assert_includes events, e1 | |
| 286 | + assert_not_includes events, e2 | |
| 287 | + end | |
| 288 | + | |
| 275 | 289 | end | ... | ... |
| ... | ... | @@ -0,0 +1,61 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | + | |
| 3 | +class DatesHelperTest < Test::Unit::TestCase | |
| 4 | + | |
| 5 | + include DatesHelper | |
| 6 | + | |
| 7 | + should 'generate period with two dates' do | |
| 8 | + date1 = mock | |
| 9 | + expects(:show_date).with(date1).returns('XXX') | |
| 10 | + date2 = mock | |
| 11 | + expects(:show_date).with(date2).returns('YYY') | |
| 12 | + expects(:_).with('from %s to %s').returns('from %s to %s') | |
| 13 | + assert_equal 'from XXX to YYY', show_period(date1, date2) | |
| 14 | + end | |
| 15 | + | |
| 16 | + should 'generate period with two equal dates' do | |
| 17 | + date1 = mock | |
| 18 | + expects(:show_date).with(date1).returns('XXX') | |
| 19 | + assert_equal 'XXX', show_period(date1, date1) | |
| 20 | + end | |
| 21 | + | |
| 22 | + should 'generate period with one date only' do | |
| 23 | + date1 = mock | |
| 24 | + expects(:show_date).with(date1).returns('XXX') | |
| 25 | + assert_equal 'XXX', show_period(date1) | |
| 26 | + end | |
| 27 | + | |
| 28 | + should 'show day of week' do | |
| 29 | + expects(:_).with("Sunday").returns("Domingo") | |
| 30 | + date = mock | |
| 31 | + date.expects(:wday).returns(0) | |
| 32 | + assert_equal "Domingo", show_day_of_week(date) | |
| 33 | + end | |
| 34 | + | |
| 35 | + should 'show month' do | |
| 36 | + expects(:_).with('January').returns('January') | |
| 37 | + expects(:_).with('%{month} %{year}').returns('%{month} %{year}') | |
| 38 | + assert_equal 'January 2008', show_month(2008, 1) | |
| 39 | + end | |
| 40 | + | |
| 41 | + should 'provide link to previous month' do | |
| 42 | + expects(:link_to).with('← January 2008', { :year => 2008, :month => 1}) | |
| 43 | + link_to_previous_month('2008', '2') | |
| 44 | + end | |
| 45 | + | |
| 46 | + should 'support last year in link to previous month' do | |
| 47 | + expects(:link_to).with('← December 2007', { :year => 2007, :month => 12}) | |
| 48 | + link_to_previous_month('2008', '1') | |
| 49 | + end | |
| 50 | + | |
| 51 | + should 'provide link to next month' do | |
| 52 | + expects(:link_to).with('March 2008 →', { :year => 2008, :month => 3}) | |
| 53 | + link_to_next_month('2008', '2') | |
| 54 | + end | |
| 55 | + | |
| 56 | + should 'support next year in link to next month' do | |
| 57 | + expects(:link_to).with('January 2009 →', { :year => 2009, :month => 1}) | |
| 58 | + link_to_next_month('2008', '12') | |
| 59 | + end | |
| 60 | + | |
| 61 | +end | ... | ... |
test/unit/event_test.rb
| ... | ... | @@ -76,4 +76,74 @@ class EventTest < ActiveSupport::TestCase |
| 76 | 76 | assert !e.errors.invalid?(:start_date) |
| 77 | 77 | end |
| 78 | 78 | |
| 79 | + should 'find by year and month' do | |
| 80 | + profile = create_user('testuser').person | |
| 81 | + e1 = Event.create!(:name => 'e1', :start_date => Date.new(2008,1,1), :profile => profile) | |
| 82 | + e2 = Event.create!(:name => 'e2', :start_date => Date.new(2008,2,1), :profile => profile) | |
| 83 | + e3 = Event.create!(:name => 'e3', :start_date => Date.new(2008,3,1), :profile => profile) | |
| 84 | + | |
| 85 | + found = Event.by_month(2008, 2) | |
| 86 | + assert_includes found, e2 | |
| 87 | + assert_not_includes found, e1 | |
| 88 | + assert_not_includes found, e3 | |
| 89 | + end | |
| 90 | + | |
| 91 | + should 'find when in first day of month' do | |
| 92 | + profile = create_user('testuser').person | |
| 93 | + e1 = Event.create!(:name => 'e1', :start_date => Date.new(2008,1,1), :profile => profile) | |
| 94 | + assert_includes Event.by_month(2008, 1), e1 | |
| 95 | + end | |
| 96 | + | |
| 97 | + should 'find when in last day of month' do | |
| 98 | + profile = create_user('testuser').person | |
| 99 | + e1 = Event.create!(:name => 'e1', :start_date => Date.new(2008,1,31), :profile => profile) | |
| 100 | + assert_includes Event.by_month(2008, 1), e1 | |
| 101 | + end | |
| 102 | + | |
| 103 | + should 'use current month by default' do | |
| 104 | + profile = create_user('testuser').person | |
| 105 | + e1 = Event.create!(:name => 'e1', :start_date => Date.new(2008,1,31), :profile => profile) | |
| 106 | + Date.expects(:today).returns(Date.new(2008, 1, 15)) | |
| 107 | + assert_includes Event.by_month, e1 | |
| 108 | + end | |
| 109 | + | |
| 110 | + should 'provide period for searching in month' do | |
| 111 | + assert_equal Date.new(2008, 1, 1)..Date.new(2008,1,31), Event.date_range(2008, 1) | |
| 112 | + assert_equal Date.new(2008, 2, 1)..Date.new(2008,2,29), Event.date_range(2008, 2) | |
| 113 | + assert_equal Date.new(2007, 2, 1)..Date.new(2007,2,28), Event.date_range(2007, 2) | |
| 114 | + end | |
| 115 | + | |
| 116 | + should 'support string arguments to Event#date_range' do | |
| 117 | + assert_equal Date.new(2008,1,1)..Date.new(2008,1,31), Event.date_range('2008', '1') | |
| 118 | + end | |
| 119 | + | |
| 120 | + should 'provide range of dates for event with both dates filled' do | |
| 121 | + e = Event.new(:start_date => Date.new(2008, 1, 1), :end_date => Date.new(2008, 1, 5)) | |
| 122 | + | |
| 123 | + assert_equal (Date.new(2008,1,1)..Date.new(2008,1,5)), e.date_range | |
| 124 | + end | |
| 125 | + | |
| 126 | + should 'provide range of dates for event with only start date' do | |
| 127 | + e = Event.new(:start_date => Date.new(2008, 1, 1)) | |
| 128 | + | |
| 129 | + assert_equal (Date.new(2008,1,1)..Date.new(2008,1,1)), e.date_range | |
| 130 | + end | |
| 131 | + | |
| 132 | + should 'provide nice display format' do | |
| 133 | + e = Event.new(:start_date => Date.new(2008,1,1), :end_date => Date.new(2008,1,1), :link => 'http://www.myevent.org', :description => 'my somewhat short description') | |
| 134 | + | |
| 135 | + assert_tag_in_string e.to_html, :content => Regexp.new("1 January 2008") | |
| 136 | + assert_tag_in_string e.to_html, :content => 'my somewhat short description' | |
| 137 | + assert_tag_in_string e.to_html, :tag => 'a', :attributes => { :href => 'http://www.myevent.org' }, :content => 'http://www.myevent.org' | |
| 138 | + | |
| 139 | + end | |
| 140 | + | |
| 141 | + protected | |
| 142 | + | |
| 143 | + def assert_tag_in_string(text, options) | |
| 144 | + doc = HTML::Document.new(text, false, false) | |
| 145 | + tag = doc.find(options) | |
| 146 | + assert tag, "expected tag #{options.inspect}, but not found in #{text.inspect}" | |
| 147 | + end | |
| 148 | + | |
| 79 | 149 | end | ... | ... |