Commit f5922203e2dd09c952a7163baec39e98355bbca1
Exists in
master
and in
29 other branches
Merge branch 'stable'
Conflicts: app/models/qualifier.rb db/schema.rb test/unit/manage_products_helper_test.rb test/unit/qualifier_test.rb
Showing
46 changed files
with
461 additions
and
98 deletions
Show diff stats
app/controllers/my_profile/cms_controller.rb
... | ... | @@ -49,6 +49,9 @@ class CmsController < MyProfileController |
49 | 49 | if profile.enterprise? |
50 | 50 | articles << EnterpriseHomepage |
51 | 51 | end |
52 | + if @parent && @parent.blog? | |
53 | + articles -= Article.folder_types.map(&:constantize) | |
54 | + end | |
52 | 55 | articles |
53 | 56 | end |
54 | 57 | |
... | ... | @@ -109,6 +112,7 @@ class CmsController < MyProfileController |
109 | 112 | |
110 | 113 | # user must choose an article type first |
111 | 114 | |
115 | + @parent = profile.articles.find(params[:parent_id]) if params && params[:parent_id] | |
112 | 116 | record_coming |
113 | 117 | @type = params[:type] |
114 | 118 | if @type.blank? | ... | ... |
app/controllers/my_profile/tasks_controller.rb
... | ... | @@ -16,16 +16,18 @@ class TasksController < MyProfileController |
16 | 16 | def close |
17 | 17 | failed = {} |
18 | 18 | |
19 | - params[:tasks].each do |id, value| | |
20 | - decision = value[:decision] | |
21 | - if request.post? && VALID_DECISIONS.include?(decision) && id && decision != 'skip' | |
22 | - task = profile.find_in_all_tasks(id) | |
23 | - task.update_attributes!(value[:task]) | |
24 | - begin | |
25 | - task.send(decision) | |
26 | - rescue Exception => ex | |
27 | - message = "#{task.title} (#{task.requestor ? task.requestor.name : task.author_name})" | |
28 | - failed[ex.clean_message] ? failed[ex.clean_message] << message : failed[ex.clean_message] = [message] | |
19 | + if params[:tasks] | |
20 | + params[:tasks].each do |id, value| | |
21 | + decision = value[:decision] | |
22 | + if request.post? && VALID_DECISIONS.include?(decision) && id && decision != 'skip' | |
23 | + task = profile.find_in_all_tasks(id) | |
24 | + begin | |
25 | + task.update_attributes(value[:task]) | |
26 | + task.send(decision) | |
27 | + rescue Exception => ex | |
28 | + message = "#{task.title} (#{task.requestor ? task.requestor.name : task.author_name})" | |
29 | + failed[ex.clean_message] ? failed[ex.clean_message] << message : failed[ex.clean_message] = [message] | |
30 | + end | |
29 | 31 | end |
30 | 32 | end |
31 | 33 | end | ... | ... |
app/controllers/public/browse_controller.rb
... | ... | @@ -8,17 +8,20 @@ class BrowseController < PublicController |
8 | 8 | more_popular |
9 | 9 | ) |
10 | 10 | |
11 | + def per_page | |
12 | + 27 | |
13 | + end | |
14 | + | |
11 | 15 | def people |
12 | 16 | @filter = filter |
13 | 17 | @title = self.filter_description(params[:action] + '_' + @filter ) |
14 | 18 | |
15 | 19 | @results = @environment.people.visible.send(@filter) |
16 | 20 | |
17 | - if params[:query].blank? | |
18 | - @results = @results.paginate(:per_page => 27, :page => params[:page]) | |
19 | - else | |
20 | - @results = @results.find_by_contents(params[:query]).paginate(:per_page => 27, :page => params[:page]) | |
21 | + if !params[:query].blank? | |
22 | + @results = @results.find_by_contents(params[:query]) | |
21 | 23 | end |
24 | + @results = @results.compact.paginate(:per_page => per_page, :page => params[:page]) | |
22 | 25 | end |
23 | 26 | |
24 | 27 | def communities |
... | ... | @@ -27,11 +30,10 @@ class BrowseController < PublicController |
27 | 30 | |
28 | 31 | @results = @environment.communities.visible.send(@filter) |
29 | 32 | |
30 | - if params[:query].blank? | |
31 | - @results = @results.paginate(:per_page => 27, :page => params[:page]) | |
32 | - else | |
33 | - @results = @results.find_by_contents(params[:query]).paginate(:per_page => 27, :page => params[:page]) | |
33 | + if !params[:query].blank? | |
34 | + @results = @results.find_by_contents(params[:query]) | |
34 | 35 | end |
36 | + @results = @results.compact.paginate(:per_page => per_page, :page => params[:page]) | |
35 | 37 | end |
36 | 38 | |
37 | 39 | protected | ... | ... |
app/controllers/public/profile_controller.rb
app/helpers/search_helper.rb
... | ... | @@ -65,7 +65,7 @@ module SearchHelper |
65 | 65 | data << content_tag('strong', _('Address: ')) + profile.address + '<br/>' |
66 | 66 | end |
67 | 67 | unless profile.products.empty? |
68 | - data << content_tag('strong', _('Products/Services: ')) + profile.products.map{|i| link_to(i.name, :controller => 'catalog', :profile => profile.identifier, :action => 'show', :id => i)}.join(', ') + '<br/>' | |
68 | + data << content_tag('strong', _('Products/Services: ')) + profile.products.map{|i| link_to(i.name, :controller => 'catalog', :profile => profile.identifier, :action => 'show', :id => i.id)}.join(', ') + '<br/>' | |
69 | 69 | end |
70 | 70 | if profile.respond_to?(:distance) and !profile.distance.nil? |
71 | 71 | data << content_tag('strong', _('Distance: ')) + "%.2f%" % profile.distance + '<br/>' | ... | ... |
app/models/article.rb
... | ... | @@ -339,8 +339,13 @@ class Article < ActiveRecord::Base |
339 | 339 | end |
340 | 340 | end |
341 | 341 | |
342 | + def self.folder_types | |
343 | + ['Folder', 'Blog', 'Forum', 'Gallery'] | |
344 | + end | |
345 | + | |
342 | 346 | named_scope :published, :conditions => { :published => true } |
343 | - named_scope :folders, :conditions => { :type => ['Folder', 'Blog', 'Forum', 'Gallery'] } | |
347 | + named_scope :folders, :conditions => { :type => folder_types} | |
348 | + named_scope :no_folders, :conditions => ['type NOT IN (?)', folder_types] | |
344 | 349 | named_scope :galleries, :conditions => { :type => 'Gallery' } |
345 | 350 | named_scope :images, :conditions => { :is_image => true } |
346 | 351 | ... | ... |
app/models/blog.rb
... | ... | @@ -2,6 +2,13 @@ class Blog < Folder |
2 | 2 | |
3 | 3 | acts_as_having_posts |
4 | 4 | |
5 | + #FIXME This should be used until there is a migration to fix all blogs that | |
6 | + # already have folders inside them | |
7 | + def posts_with_no_folders | |
8 | + posts_without_no_folders.no_folders | |
9 | + end | |
10 | + alias_method_chain :posts, :no_folders | |
11 | + | |
5 | 12 | def self.short_description |
6 | 13 | _('Blog') |
7 | 14 | end | ... | ... |
app/models/blog_archives_block.rb
... | ... | @@ -17,7 +17,7 @@ class BlogArchivesBlock < Block |
17 | 17 | settings_items :blog_id, Integer |
18 | 18 | |
19 | 19 | def blog |
20 | - blog_id ? owner.blogs.find(blog_id) : owner.blog | |
20 | + blog_id && owner.blogs.exists?(blog_id) ? owner.blogs.find(blog_id) : owner.blog | |
21 | 21 | end |
22 | 22 | |
23 | 23 | def content | ... | ... |
app/models/change_password.rb
... | ... | @@ -68,6 +68,10 @@ class ChangePassword < Task |
68 | 68 | user.force_change_password!(self.password, self.password_confirmation) |
69 | 69 | end |
70 | 70 | |
71 | + def target_notification_description | |
72 | + _('%{requestor} wants to change its password.') % {:requestor => requestor.name} | |
73 | + end | |
74 | + | |
71 | 75 | # overriding messages |
72 | 76 | |
73 | 77 | def task_cancelled_message | ... | ... |
app/models/enterprise_activation.rb
... | ... | @@ -35,4 +35,8 @@ class EnterpriseActivation < Task |
35 | 35 | {:type => :profile_image, :profile => requestor, :url => requestor.url} |
36 | 36 | end |
37 | 37 | |
38 | + def target_notification_description | |
39 | + _('%{requestor} wants to activate enterprise %{enterprise}.') % {:requestor => requestor.name, :enterprise => enterprise.name} | |
40 | + end | |
41 | + | |
38 | 42 | end | ... | ... |
app/models/folder.rb
1 | 1 | class Folder < Article |
2 | 2 | |
3 | + validate :not_belong_to_blog | |
4 | + | |
5 | + def not_belong_to_blog | |
6 | + errors.add(:parent, "A folder should not belong to a blog.") if parent && parent.blog? | |
7 | + end | |
8 | + | |
3 | 9 | acts_as_having_settings :field => :setting |
4 | 10 | |
5 | 11 | xss_terminate :only => [ :body ], :with => 'white_list', :on => 'validation' | ... | ... |
app/models/invite_friend.rb
... | ... | @@ -23,6 +23,10 @@ class InviteFriend < Invitation |
23 | 23 | {:type => :profile_image, :profile => requestor, :url => requestor.url} |
24 | 24 | end |
25 | 25 | |
26 | + def target_notification_description | |
27 | + _('%{requestor} wants to be your friend.') % {:requestor => requestor.name} | |
28 | + end | |
29 | + | |
26 | 30 | def permission |
27 | 31 | :manage_friends |
28 | 32 | end | ... | ... |
app/models/invite_member.rb
... | ... | @@ -35,6 +35,10 @@ class InviteMember < Invitation |
35 | 35 | {:type => :profile_image, :profile => community, :url => community.url} |
36 | 36 | end |
37 | 37 | |
38 | + def target_notification_description | |
39 | + _('%{requestor} invited you to join %{community}.') % {:requestor => requestor.name, :community => community.name} | |
40 | + end | |
41 | + | |
38 | 42 | def expanded_message |
39 | 43 | super.gsub /<community>/, community.name |
40 | 44 | end | ... | ... |
app/models/qualifier.rb
... | ... | @@ -8,6 +8,8 @@ class Qualifier < ActiveRecord::Base |
8 | 8 | validates_presence_of :environment_id |
9 | 9 | validates_presence_of :name |
10 | 10 | |
11 | + has_many :product_qualifiers, :dependent => :destroy | |
12 | + | |
11 | 13 | def <=>(b) |
12 | 14 | self.name.downcase.transliterate <=> b.name.downcase.transliterate |
13 | 15 | end | ... | ... |
app/models/task_mailer.rb
... | ... | @@ -32,7 +32,7 @@ class TaskMailer < ActionMailer::Base |
32 | 32 | recipients task.friend_email |
33 | 33 | |
34 | 34 | from self.class.generate_from(task) |
35 | - subject '[%s] %s' % [ task.requestor.environment.name, task.information ] | |
35 | + subject '[%s] %s' % [ task.requestor.environment.name, task.target_notification_description ] | |
36 | 36 | body :message => msg |
37 | 37 | end |
38 | 38 | |
... | ... | @@ -52,7 +52,7 @@ class TaskMailer < ActionMailer::Base |
52 | 52 | |
53 | 53 | recipients task.requestor.notification_emails |
54 | 54 | from self.class.generate_from(task) |
55 | - subject '[%s] %s' % [task.requestor.environment.name, task.information] | |
55 | + subject '[%s] %s' % [task.requestor.environment.name, task.target_notification_description] | |
56 | 56 | body :requestor => task.requestor.name, |
57 | 57 | :message => text, |
58 | 58 | :environment => task.requestor.environment.name, | ... | ... |
app/views/profile_editor/header_footer.rhtml
... | ... | @@ -21,9 +21,9 @@ |
21 | 21 | </div> |
22 | 22 | <% end %> |
23 | 23 | <h2><%= _('Content for header ') %></h2> |
24 | - <%= text_area_tag(:custom_header, @header, :style => 'width: 100%; height: 150px;') %> | |
24 | + <%= text_area_tag(:custom_header, @header, :style => 'width: 100%; height: 150px;', :class => 'mceEditor') %> | |
25 | 25 | <h2><%= _('Content for footer') %></h2> |
26 | - <%= text_area_tag(:custom_footer, @footer, :style => 'width: 100%; height: 150px;') %> | |
26 | + <%= text_area_tag(:custom_footer, @footer, :style => 'width: 100%; height: 150px;', :class => 'mceEditor') %> | |
27 | 27 | <% button_bar do %> |
28 | 28 | <%= submit_button(:save, _('Save')) %> |
29 | 29 | <%= button(:cancel, _('Cancel'), :action => 'index') %> | ... | ... |
db/migrate/20110222211802_remove_action_tracker_records_with_nil_users.rb
0 → 100644
... | ... | @@ -0,0 +1,10 @@ |
1 | +class RemoveActionTrackerRecordsWithNilUsers < ActiveRecord::Migration | |
2 | + # This migration is a copy of 20110127174236_remove_action_tracker_record_with_nil_users.rb | |
3 | + def self.up | |
4 | + ActionTracker::Record.all.map {|record| record.destroy if record.user.nil?} | |
5 | + end | |
6 | + | |
7 | + def self.down | |
8 | + say "this migration can't be reverted" | |
9 | + end | |
10 | +end | ... | ... |
db/schema.rb
... | ... | @@ -9,7 +9,7 @@ |
9 | 9 | # |
10 | 10 | # It's strongly recommended to check this file into your version control system. |
11 | 11 | |
12 | -ActiveRecord::Schema.define(:version => 20110221195242) do | |
12 | +ActiveRecord::Schema.define(:version => 20110222211802) do | |
13 | 13 | |
14 | 14 | create_table "action_tracker", :force => true do |t| |
15 | 15 | t.integer "user_id" | ... | ... |
debian/changelog
1 | +noosfero (0.28.6) unstable; urgency=low | |
2 | + | |
3 | + * Bugfixes Version release. (Closes: AI#1874 AI#1890 AI#1893 AI#1871 AI#1884 AI#1892 AI#1882 AI#1883 AI#1896 AI#1875 AI#1895 AI#1879) | |
4 | + | |
5 | + -- Joenio Costa <joenio@perl.org.br> Sun, 27 Feb 2011 23:56:51 -0300 | |
6 | + | |
1 | 7 | noosfero (0.28.5) unstable; urgency=low |
2 | 8 | |
3 | 9 | * Bugfixes Version release. (Closes: AI#1867 AI#1866 AI#1870 AI#1854 AI#1851 AI#1810 AI#1889 AI#1868 AI#1855 AI#1887) | ... | ... |
lib/noosfero.rb
public/stylesheets/application.css
... | ... | @@ -1314,8 +1314,8 @@ a.comment-picture { |
1314 | 1314 | } |
1315 | 1315 | |
1316 | 1316 | .comment-replies .comment-picture img { |
1317 | - width: 32px; | |
1318 | - height: 32px; | |
1317 | + max-width: 32px; | |
1318 | + max-height: 32px; | |
1319 | 1319 | } |
1320 | 1320 | |
1321 | 1321 | .article-comment .comment-replies .button-bar { |
... | ... | @@ -2137,8 +2137,8 @@ input.disabled { |
2137 | 2137 | |
2138 | 2138 | .common-profile-list-block img { |
2139 | 2139 | border: none; |
2140 | - width: 50px; | |
2141 | - height: 50px; | |
2140 | + max-width: 50px; | |
2141 | + max-height: 50px; | |
2142 | 2142 | } |
2143 | 2143 | |
2144 | 2144 | .box-2 .common-profile-list-block span, |
... | ... | @@ -4400,11 +4400,20 @@ h1#agenda-title { |
4400 | 4400 | padding: 0px; |
4401 | 4401 | list-style: none; |
4402 | 4402 | } |
4403 | -.controller-search #content .search-results-type-article li, | |
4404 | 4403 | .controller-search #content .search-results-type-event li { |
4405 | 4404 | padding: 2px 0px 4px 0px; |
4406 | 4405 | } |
4407 | 4406 | |
4407 | +.controller-search #content .search-results-type-article li { | |
4408 | + padding: 0px 0px 4px 20px; | |
4409 | + background-repeat: no-repeat; | |
4410 | + border-color: transparent; | |
4411 | +} | |
4412 | + | |
4413 | +.controller-search #content .search-results-type-article li:hover { | |
4414 | + background-color: transparent; | |
4415 | +} | |
4416 | + | |
4408 | 4417 | .controller-search .search-results-type-article .item_meta, |
4409 | 4418 | .controller-search .search-results-type-event .item_meta { |
4410 | 4419 | font-size: 10px; |
... | ... | @@ -5596,8 +5605,8 @@ h1#agenda-title { |
5596 | 5605 | padding: 1px; |
5597 | 5606 | border: 1px solid #ccc; |
5598 | 5607 | margin: 4px 3px 0 0; |
5599 | - width: 20px; | |
5600 | - height: 20px; | |
5608 | + max-width: 20px; | |
5609 | + max-height: 20px; | |
5601 | 5610 | } |
5602 | 5611 | |
5603 | 5612 | .profile-wall-image { |
... | ... | @@ -5625,8 +5634,8 @@ h1#agenda-title { |
5625 | 5634 | |
5626 | 5635 | #profile-network .upload_image .profile-network-text span img, |
5627 | 5636 | #profile-activity .upload_image .profile-activity-text span img { |
5628 | - width: auto; | |
5629 | - height: auto; | |
5637 | + max-width: none; | |
5638 | + max-height: none; | |
5630 | 5639 | } |
5631 | 5640 | |
5632 | 5641 | #profile-network .upload_image .profile-network-text img, | ... | ... |
test/factories.rb
... | ... | @@ -310,6 +310,8 @@ module Noosfero::Factory |
310 | 310 | { } |
311 | 311 | end |
312 | 312 | |
313 | + alias :defaults_for_blog_archives_block :defaults_for_block | |
314 | + | |
313 | 315 | ############################################### |
314 | 316 | # Task |
315 | 317 | ############################################### |
... | ... | @@ -358,7 +360,9 @@ module Noosfero::Factory |
358 | 360 | # Certifier |
359 | 361 | ############################################### |
360 | 362 | |
361 | - alias :defaults_for_certifier :defaults_for_qualifier | |
363 | + def defaults_for_certifier | |
364 | + defaults_for_qualifier.merge({ :name => 'Certifier ' + factory_num_seq.to_s }) | |
365 | + end | |
362 | 366 | |
363 | 367 | ############################################### |
364 | 368 | # Scrap | ... | ... |
test/functional/browse_controller_test.rb
... | ... | @@ -65,6 +65,25 @@ class BrowseControllerTest < Test::Unit::TestCase |
65 | 65 | assert_tag :a, '', :attributes => {:class => 'next_page'} |
66 | 66 | end |
67 | 67 | |
68 | + should 'not return nil results in the more_active people list' do | |
69 | + Profile.delete_all | |
70 | + p1 = fast_create(Person) | |
71 | + p2 = fast_create(Person) | |
72 | + p3 = fast_create(Person) | |
73 | + fast_create(Article, :profile_id => p1, :created_at => 1.day.ago) | |
74 | + fast_create(Article, :profile_id => p2, :created_at => 1.day.ago) | |
75 | + fast_create(Article, :profile_id => p2, :created_at => 1.day.ago) | |
76 | + fast_create(Article, :profile_id => p2, :created_at => 1.day.ago) | |
77 | + fast_create(Article, :profile_id => p3, :created_at => 1.day.ago) | |
78 | + | |
79 | + per_page = 1 | |
80 | + @controller.stubs(:per_page).returns(per_page) | |
81 | + | |
82 | + get :people, :filter => 'more_active' | |
83 | + | |
84 | + assert_equal Person.count/per_page, assigns(:results).total_pages | |
85 | + end | |
86 | + | |
68 | 87 | should 'list all people filter by more active' do |
69 | 88 | Person.delete_all |
70 | 89 | p1 = create(Person, :name => 'Testing person 1', :user_id => 1) |
... | ... | @@ -160,6 +179,26 @@ class BrowseControllerTest < Test::Unit::TestCase |
160 | 179 | assert_tag :a, '', :attributes => {:class => 'next_page'} |
161 | 180 | end |
162 | 181 | |
182 | + should 'not return nil results in the more_active communities list' do | |
183 | + Profile.delete_all | |
184 | + c1 = fast_create(Community) | |
185 | + c2 = fast_create(Community) | |
186 | + c3 = fast_create(Community) | |
187 | + fast_create(Article, :profile_id => c1, :created_at => 1.day.ago) | |
188 | + fast_create(Article, :profile_id => c2, :created_at => 1.day.ago) | |
189 | + fast_create(Article, :profile_id => c2, :created_at => 1.day.ago) | |
190 | + fast_create(Article, :profile_id => c2, :created_at => 1.day.ago) | |
191 | + fast_create(Article, :profile_id => c3, :created_at => 1.day.ago) | |
192 | + | |
193 | + per_page = 1 | |
194 | + @controller.stubs(:per_page).returns(per_page) | |
195 | + | |
196 | + get :communities, :filter => 'more_active' | |
197 | + | |
198 | + assert_equal Community.count/per_page, assigns(:results).total_pages | |
199 | + end | |
200 | + | |
201 | + | |
163 | 202 | should 'list all communities filter by more active' do |
164 | 203 | c1 = create(Community, :name => 'Testing community 1') |
165 | 204 | c2 = create(Community, :name => 'Testing community 2') | ... | ... |
test/functional/cms_controller_test.rb
... | ... | @@ -818,6 +818,15 @@ class CmsControllerTest < Test::Unit::TestCase |
818 | 818 | assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/#{profile.identifier}/cms/new?type=Forum"} |
819 | 819 | end |
820 | 820 | |
821 | + should 'not offer folders if in a blog' do | |
822 | + blog = fast_create(Blog, :profile_id => profile.id) | |
823 | + get :new, :profile => profile.identifier, :parent_id => blog.id, :cms => true | |
824 | + types = assigns(:article_types).map {|t| t[:name]} | |
825 | + Article.folder_types.each do |type| | |
826 | + assert_not_includes types, type | |
827 | + end | |
828 | + end | |
829 | + | |
821 | 830 | should 'offer to edit a blog' do |
822 | 831 | profile.articles << Blog.new(:name => 'blog test', :profile => profile) |
823 | 832 | ... | ... |
test/functional/content_viewer_controller_test.rb
... | ... | @@ -714,8 +714,8 @@ class ContentViewerControllerTest < Test::Unit::TestCase |
714 | 714 | |
715 | 715 | should 'add meta tag to rss feed on view post blog' do |
716 | 716 | login_as(profile.identifier) |
717 | - profile.articles << Blog.new(:name => 'Blog', :profile => profile) | |
718 | - profile.blog.posts << TextileArticle.new(:name => 'first post', :parent => profile.blog, :profile => profile) | |
717 | + blog = Blog.create!(:name => 'Blog', :profile => profile) | |
718 | + TextileArticle.create!(:name => 'first post', :parent => blog, :profile => profile) | |
719 | 719 | get :view_page, :profile => profile.identifier, :page => ['blog', 'first-post'] |
720 | 720 | assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'Blog', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" } |
721 | 721 | end |
... | ... | @@ -1215,9 +1215,8 @@ class ContentViewerControllerTest < Test::Unit::TestCase |
1215 | 1215 | FastGettext.stubs(:locale).returns('es') |
1216 | 1216 | blog = fast_create(Blog, :profile_id => profile.id, :path => 'blog') |
1217 | 1217 | blog.stubs(:display_posts_in_current_language).returns(true) |
1218 | - en_article = fast_create(TextileArticle, :profile_id => @profile.id, :path => 'en_article', :language => 'en') | |
1219 | - es_article = fast_create(TextileArticle, :profile_id => @profile.id, :path => 'es_article', :language => 'es', :translation_of_id => en_article) | |
1220 | - blog.posts = [en_article, es_article] | |
1218 | + en_article = fast_create(TextileArticle, :profile_id => @profile.id, :path => 'en_article', :language => 'en', :parent_id => blog.id) | |
1219 | + es_article = fast_create(TextileArticle, :profile_id => @profile.id, :path => 'es_article', :language => 'es', :parent_id => blog.id, :translation_of_id => en_article) | |
1221 | 1220 | |
1222 | 1221 | get :view_page, :profile => @profile.identifier, :page => blog.explode_path |
1223 | 1222 | assert_tag :div, :attributes => { :id => "post-#{es_article.id}" } |
... | ... | @@ -1239,8 +1238,8 @@ class ContentViewerControllerTest < Test::Unit::TestCase |
1239 | 1238 | FastGettext.stubs(:locale).returns('es') |
1240 | 1239 | blog = fast_create(Blog, :profile_id => profile.id, :path => 'blog') |
1241 | 1240 | blog.stubs(:display_posts_in_current_language).returns(true) |
1242 | - en_article = fast_create(TextileArticle, :profile_id => @profile.id, :path => 'en_article', :language => 'en') | |
1243 | - es_article = fast_create(TextileArticle, :profile_id => @profile.id, :path => 'es_article', :language => 'es', :translation_of_id => en_article) | |
1241 | + en_article = fast_create(TextileArticle, :profile_id => @profile.id, :path => 'en_article', :language => 'en', :parent_id => blog.id) | |
1242 | + es_article = fast_create(TextileArticle, :profile_id => @profile.id, :path => 'es_article', :language => 'es', :parent_id => blog.id, :translation_of_id => en_article) | |
1244 | 1243 | blog.posts = [en_article, es_article] |
1245 | 1244 | |
1246 | 1245 | get :view_page, :profile => @profile.identifier, :page => blog.explode_path | ... | ... |
test/functional/profile_controller_test.rb
... | ... | @@ -482,9 +482,9 @@ class ProfileControllerTest < Test::Unit::TestCase |
482 | 482 | |
483 | 483 | should 'show number of published posts in index' do |
484 | 484 | profile.articles << blog = Blog.create(:name => 'Blog', :profile_id => profile.id) |
485 | - blog.posts << TextileArticle.new(:name => 'Published post', :parent => profile.blog, :profile => profile) | |
486 | - blog.posts << TextileArticle.new(:name => 'Other published post', :parent => profile.blog, :profile => profile) | |
487 | - blog.posts << TextileArticle.new(:name => 'Unpublished post', :parent => profile.blog, :profile => profile, :published => false) | |
485 | + fast_create(TextileArticle, :name => 'Published post', :parent_id => profile.blog.id, :profile_id => profile.id) | |
486 | + fast_create(TextileArticle, :name => 'Other published post', :parent_id => profile.blog.id, :profile_id => profile.id) | |
487 | + fast_create(TextileArticle, :name => 'Unpublished post', :parent_id => profile.blog.id, :profile_id => profile.id, :published => false) | |
488 | 488 | |
489 | 489 | get :index, :profile => profile.identifier |
490 | 490 | assert_tag :tag => 'a', :content => '2 posts', :attributes => { :href => /\/testuser\/blog/ } |
... | ... | @@ -1159,4 +1159,13 @@ class ProfileControllerTest < Test::Unit::TestCase |
1159 | 1159 | assert_tag :tag => 'div', :content => /#{plugin1_tab[:content]}/, :attributes => {:id => /#{plugin1_tab[:id]}/} |
1160 | 1160 | end |
1161 | 1161 | |
1162 | + should 'redirect to profile page when try to request join_not_logged via GET method' do | |
1163 | + community = Community.create!(:name => 'my test community') | |
1164 | + login_as(profile.identifier) | |
1165 | + get :join_not_logged, :profile => community.identifier | |
1166 | + assert_nothing_raised do | |
1167 | + assert_redirected_to community.url | |
1168 | + end | |
1169 | + end | |
1170 | + | |
1162 | 1171 | end | ... | ... |
test/functional/profile_editor_controller_test.rb
... | ... | @@ -498,6 +498,12 @@ class ProfileEditorControllerTest < Test::Unit::TestCase |
498 | 498 | assert_tag :tag => 'textarea', :content => 'my custom footer' |
499 | 499 | end |
500 | 500 | |
501 | + should 'render TinyMce Editor for header and footer' do | |
502 | + get :header_footer, :profile => profile.identifier | |
503 | + assert_tag :tag => 'textarea', :attributes => { :id => 'custom_header', :class => 'mceEditor' } | |
504 | + assert_tag :tag => 'textarea', :attributes => { :id => 'custom_footer', :class => 'mceEditor' } | |
505 | + end | |
506 | + | |
501 | 507 | should 'save footer and header' do |
502 | 508 | person = profile |
503 | 509 | post :header_footer, :profile => profile.identifier, :custom_header => 'new header', :custom_footer => 'new footer' | ... | ... |
test/functional/tasks_controller_test.rb
... | ... | @@ -217,16 +217,18 @@ class TasksControllerTest < Test::Unit::TestCase |
217 | 217 | assert_includes c_blog2.children(true), p_article |
218 | 218 | end |
219 | 219 | |
220 | - should 'raise error if there is an enterprise with the same identifier and keep the task active' do | |
220 | + should 'display error if there is an enterprise with the same identifier and keep the task active' do | |
221 | 221 | e = Environment.default |
222 | 222 | e.add_admin(profile) |
223 | 223 | task = CreateEnterprise.create!(:name => "My Enterprise", :identifier => "my-enterprise", :requestor => profile, :target => e) |
224 | 224 | enterprise = fast_create(Enterprise, :name => "My Enterprise", :identifier => "my-enterprise") |
225 | 225 | |
226 | - assert_raise ActiveRecord::RecordInvalid do | |
227 | - post :close, :tasks => {task.id => { :task => {:reject_explanation => "Bla bla"}, :decision => "cancel"}} | |
226 | + assert_nothing_raised do | |
227 | + post :close, :tasks => {task.id => {:decision => "finish"}} | |
228 | 228 | end |
229 | 229 | |
230 | + assert_match /Validation.failed/, @response.body | |
231 | + | |
230 | 232 | task.reload |
231 | 233 | assert_equal Task::Status::ACTIVE, task.status |
232 | 234 | end |
... | ... | @@ -280,4 +282,22 @@ class TasksControllerTest < Test::Unit::TestCase |
280 | 282 | assert_equal 'new source', TinyMceArticle.find(:first).source_name |
281 | 283 | end |
282 | 284 | |
285 | + should "not crash if accessing close without tasks parameter" do | |
286 | + assert_nothing_raised do | |
287 | + post :close | |
288 | + end | |
289 | + end | |
290 | + | |
291 | + should 'close create enterprise if trying to cancel even if there is already an existing identifier' do | |
292 | + identifier = "common-identifier" | |
293 | + task = CreateEnterprise.create!(:identifier => identifier, :name => identifier, :requestor => profile, :target => profile) | |
294 | + fast_create(Profile, :identifier => identifier) | |
295 | + | |
296 | + assert_nothing_raised do | |
297 | + post :close, :tasks => {task.id => {:task => {:reject_explanation => "Some explanation"}, :decision => 'cancel'}} | |
298 | + end | |
299 | + | |
300 | + task.reload | |
301 | + assert_equal Task::Status::CANCELLED, task.status | |
302 | + end | |
283 | 303 | end | ... | ... |
test/test_helper.rb
test/unit/approve_article_test.rb
... | ... | @@ -362,6 +362,14 @@ class ApproveArticleTest < ActiveSupport::TestCase |
362 | 362 | assert_match(/#{task.requestor.name} wants to publish the article: #{article.name}/, email.subject) |
363 | 363 | end |
364 | 364 | |
365 | + should 'deliver target finished message' do | |
366 | + task = ApproveArticle.new(:article => article, :target => community, :requestor => profile) | |
367 | + | |
368 | + email = TaskMailer.deliver_task_finished(task) | |
369 | + | |
370 | + assert_match(/#{task.requestor.name} wants to publish the article: #{article.name}/, email.subject) | |
371 | + end | |
372 | + | |
365 | 373 | should 'approve an event' do |
366 | 374 | event = fast_create(Event, :profile_id => profile.id, :name => 'Event test', :slug => 'event-test', :abstract => 'Lead of article', :body => 'This is my event') |
367 | 375 | task = ApproveArticle.create!(:name => 'Event test', :article => event, :target => community, :requestor => profile) | ... | ... |
test/unit/article_test.rb
... | ... | @@ -1444,4 +1444,34 @@ class ArticleTest < Test::Unit::TestCase |
1444 | 1444 | assert !Article.new.tiny_mce? |
1445 | 1445 | end |
1446 | 1446 | |
1447 | + should 'return only folders' do | |
1448 | + not_folders = [RssFeed, TinyMceArticle, Event, TextileArticle] | |
1449 | + folders = [Folder, Blog, Gallery, Forum] | |
1450 | + | |
1451 | + not_folders.each do |klass| | |
1452 | + item = fast_create(klass) | |
1453 | + assert_not_includes Article.folders, item | |
1454 | + end | |
1455 | + | |
1456 | + folders.each do |klass| | |
1457 | + item = fast_create(klass) | |
1458 | + assert_includes Article.folders, item | |
1459 | + end | |
1460 | + end | |
1461 | + | |
1462 | + should 'return no folders' do | |
1463 | + not_folders = [RssFeed, TinyMceArticle, Event, TextileArticle] | |
1464 | + folders = [Folder, Blog, Gallery, Forum] | |
1465 | + | |
1466 | + not_folders.each do |klass| | |
1467 | + item = fast_create(klass) | |
1468 | + assert_includes Article.no_folders, item | |
1469 | + end | |
1470 | + | |
1471 | + folders.each do |klass| | |
1472 | + item = fast_create(klass) | |
1473 | + assert_not_includes Article.no_folders, item | |
1474 | + end | |
1475 | + end | |
1476 | + | |
1447 | 1477 | end | ... | ... |
test/unit/blog_archives_block_test.rb
... | ... | @@ -134,4 +134,27 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase |
134 | 134 | assert_tag_in_string block.content, :tag => 'a', :content => 'January (2)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog-one\?month=01&year=2008$/ } |
135 | 135 | end |
136 | 136 | |
137 | + should 'not try to load a removed blog' do | |
138 | + block = fast_create(BlogArchivesBlock) | |
139 | + block.blog_id = profile.blog.id | |
140 | + block.save! | |
141 | + block.stubs(:owner).returns(profile) | |
142 | + profile.blog.destroy | |
143 | + assert_nothing_raised do | |
144 | + assert_nil block.blog | |
145 | + end | |
146 | + end | |
147 | + | |
148 | + should 'load next blog if configured blog was removed' do | |
149 | + other_blog = fast_create(Blog, :profile_id => profile.id) | |
150 | + block = fast_create(BlogArchivesBlock) | |
151 | + block.blog_id = profile.blog.id | |
152 | + block.save! | |
153 | + block.stubs(:owner).returns(profile) | |
154 | + profile.blog.destroy | |
155 | + assert_nothing_raised do | |
156 | + assert_equal other_blog, block.blog | |
157 | + end | |
158 | + end | |
159 | + | |
137 | 160 | end | ... | ... |
test/unit/blog_test.rb
... | ... | @@ -195,4 +195,15 @@ class BlogTest < ActiveSupport::TestCase |
195 | 195 | assert !blog.reload.display_posts_in_current_language? |
196 | 196 | end |
197 | 197 | |
198 | + #FIXME This should be used until there is a migration to fix all blogs that | |
199 | + # already have folders inside them | |
200 | + should 'not list folders in posts' do | |
201 | + blog = fast_create(Blog) | |
202 | + folder = fast_create(Folder, :parent_id => blog.id) | |
203 | + article = fast_create(TextileArticle, :parent_id => blog.id) | |
204 | + | |
205 | + assert_not_includes blog.posts, folder | |
206 | + assert_includes blog.posts, article | |
207 | + end | |
208 | + | |
198 | 209 | end | ... | ... |
test/unit/change_password_test.rb
... | ... | @@ -132,4 +132,21 @@ class ChangePasswordTest < Test::Unit::TestCase |
132 | 132 | assert_equal c2.requestor, p2 |
133 | 133 | end |
134 | 134 | |
135 | + should 'have target notification description' do | |
136 | + person = fast_create(Person, :identifier => 'testuser') | |
137 | + | |
138 | + change = ChangePassword.create(:login => 'testuser', :email => 'test@example.com', :environment_id => Environment.default.id) | |
139 | + | |
140 | + assert_match(/#{change.requestor.name} wants to change its password/, change.target_notification_description) | |
141 | + end | |
142 | + | |
143 | + should 'deliver task created message' do | |
144 | + person = fast_create(Person, :identifier => 'testuser') | |
145 | + | |
146 | + task = ChangePassword.create(:login => 'testuser', :email => 'test@example.com', :environment_id => Environment.default.id) | |
147 | + | |
148 | + email = TaskMailer.deliver_task_created(task) | |
149 | + assert_match(/#{task.requestor.name} wants to change its password/, email.subject) | |
150 | + end | |
151 | + | |
135 | 152 | end | ... | ... |
test/unit/email_activation_test.rb
... | ... | @@ -49,4 +49,13 @@ class EmailActivationTest < Test::Unit::TestCase |
49 | 49 | assert !anothertask.save |
50 | 50 | end |
51 | 51 | |
52 | + should 'deliver activation email notification' do | |
53 | + user = create_user('testuser', :environment_id => Environment.default.id) | |
54 | + | |
55 | + task = EmailActivation.new(:requestor => user.person, :target => Environment.default) | |
56 | + | |
57 | + email = User::Mailer.deliver_activation_email_notify(user) | |
58 | + assert_match(/Welcome to #{task.requestor.environment.name} mail!/, email.subject) | |
59 | + end | |
60 | + | |
52 | 61 | end | ... | ... |
test/unit/enterprise_activation_test.rb
... | ... | @@ -64,5 +64,12 @@ class EnterpriseActivationTest < ActiveSupport::TestCase |
64 | 64 | t.finish |
65 | 65 | end |
66 | 66 | |
67 | + should 'have target notification description' do | |
68 | + ent = fast_create(Enterprise, :enabled => false) | |
69 | + task = EnterpriseActivation.create!(:enterprise => ent, :requestor => profiles(:ze)) | |
70 | + | |
71 | + assert_match(/#{task.requestor.name} wants to activate enterprise #{ent.name}/, task.target_notification_description) | |
72 | + end | |
73 | + | |
67 | 74 | end |
68 | 75 | ... | ... |
test/unit/folder_test.rb
... | ... | @@ -132,4 +132,12 @@ class FolderTest < ActiveSupport::TestCase |
132 | 132 | assert_no_match /[<>]/, folder.body |
133 | 133 | end |
134 | 134 | |
135 | + should 'not have a blog as parent' do | |
136 | + folder = Folder.new | |
137 | + folder.parent = Blog.new | |
138 | + folder.valid? | |
139 | + | |
140 | + assert folder.errors.on(:parent) | |
141 | + end | |
142 | + | |
135 | 143 | end | ... | ... |
test/unit/invite_friend_test.rb
... | ... | @@ -120,4 +120,22 @@ class InviteFriendTest < ActiveSupport::TestCase |
120 | 120 | assert !task2.save |
121 | 121 | end |
122 | 122 | |
123 | + should 'have target notification description' do | |
124 | + person = create_user('testuser1').person | |
125 | + | |
126 | + task = InviteFriend.create!(:person => person, :friend_email => 'test@test.com', :message => '<url>') | |
127 | + | |
128 | + assert_match(/#{task.requestor.name} wants to be your friend./, task.target_notification_description) | |
129 | + end | |
130 | + | |
131 | + should 'deliver invitation notification' do | |
132 | + person = create_user('testuser1').person | |
133 | + | |
134 | + task = InviteFriend.create!(:person => person, :friend_email => 'test@test.com', :message => '<url>') | |
135 | + | |
136 | + email = TaskMailer.deliver_invitation_notification(task) | |
137 | + | |
138 | + assert_match(/#{task.requestor.name} wants to be your friend./, email.subject) | |
139 | + end | |
140 | + | |
123 | 141 | end | ... | ... |
test/unit/invite_member_test.rb
... | ... | @@ -95,5 +95,25 @@ class InviteMemberTest < ActiveSupport::TestCase |
95 | 95 | assert !task2.save |
96 | 96 | end |
97 | 97 | |
98 | + should 'have target notification description' do | |
99 | + p = create_user('testuser1').person | |
100 | + community = fast_create(Community) | |
101 | + | |
102 | + task = InviteMember.create!(:person => p, :friend_email => 'test@test.com', :message => '<url>', :community_id => community.id) | |
103 | + | |
104 | + assert_match(/#{task.requestor.name} invited you to join #{community.name}/, task.target_notification_description) | |
105 | + end | |
106 | + | |
107 | + should 'deliver invitation notification' do | |
108 | + person = create_user('testuser1').person | |
109 | + community = fast_create(Community) | |
110 | + | |
111 | + task = InviteMember.create!(:person => person, :friend_email => 'test@test.com', :message => '<url>', :community_id => community.id) | |
112 | + | |
113 | + email = TaskMailer.deliver_invitation_notification(task) | |
114 | + | |
115 | + assert_match(/#{task.requestor.name} invited you to join #{community.name}/, email.subject) | |
116 | + end | |
117 | + | |
98 | 118 | end |
99 | 119 | ... | ... |
test/unit/manage_products_helper_test.rb
... | ... | @@ -167,6 +167,38 @@ class ManageProductsHelperTest < Test::Unit::TestCase |
167 | 167 | assert_equal ["Self declared", "Colivre", "FBES"], result.map{|i| i[0]} |
168 | 168 | end |
169 | 169 | |
170 | + should 'list qualifiers and certifiers of a product' do | |
171 | + product = fast_create(Product) | |
172 | + qualifier = fast_create(Qualifier) | |
173 | + certifier = fast_create(Certifier) | |
174 | + ProductQualifier.create!(:product => product, :qualifier => qualifier, :certifier => certifier) | |
175 | + assert_match /✔ Qualifier \d+ certified by Certifier \d+/, display_qualifiers(product) | |
176 | + end | |
177 | + | |
178 | + should 'product survive to a Qualifier deletation' do | |
179 | + product = fast_create(Product) | |
180 | + qualifier = fast_create(Qualifier) | |
181 | + certifier = fast_create(Certifier) | |
182 | + ProductQualifier.create!(:product => product, :qualifier => qualifier, :certifier => certifier) | |
183 | + qualifier.destroy | |
184 | + assert_nothing_raised do | |
185 | + assert_no_match /✔ Qualifier \d+ certified by Certifier \d+/, display_qualifiers(product) | |
186 | + end | |
187 | + end | |
188 | + | |
189 | + should 'product consider its Qualifier self-declared when Certifier is deleted' do | |
190 | + product = fast_create(Product) | |
191 | + qualifier = fast_create(Qualifier) | |
192 | + certifier = fast_create(Certifier) | |
193 | + ProductQualifier.create!(:product => product, :qualifier => qualifier, :certifier => certifier) | |
194 | + certifier.destroy | |
195 | + assert_nothing_raised do | |
196 | + result = display_qualifiers(product) | |
197 | + assert_match /✔ Qualifier \d+ \(Self declared\)/, result | |
198 | + assert_no_match /certified by Certifier \d+/, result | |
199 | + end | |
200 | + end | |
201 | + | |
170 | 202 | protected |
171 | 203 | include NoosferoTestHelper |
172 | 204 | include ActionView::Helpers::TextHelper | ... | ... |
test/unit/qualifier_test.rb
... | ... | @@ -49,4 +49,16 @@ class QualifierTest < Test::Unit::TestCase |
49 | 49 | assert_equal [first, last], Qualifier.all.sort |
50 | 50 | end |
51 | 51 | |
52 | + should 'clean all ProductQualifier when destroy a Qualifier' do | |
53 | + product1 = fast_create(Product) | |
54 | + product2 = fast_create(Product) | |
55 | + qualifier = fast_create(Qualifier, :name => 'Free Software') | |
56 | + certifier = fast_create(Certifier, :name => 'FSF') | |
57 | + ProductQualifier.create!(:product => product1, :qualifier => qualifier, :certifier => certifier) | |
58 | + ProductQualifier.create!(:product => product2, :qualifier => qualifier, :certifier => certifier) | |
59 | + assert_equal [['Free Software', 'FSF']], product1.product_qualifiers.map{|i| [i.qualifier.name, i.certifier.name]} | |
60 | + Qualifier.destroy_all | |
61 | + assert_equal [], product1.product_qualifiers(true) | |
62 | + end | |
63 | + | |
52 | 64 | end | ... | ... |
test/unit/rss_feed_test.rb
... | ... | @@ -212,7 +212,10 @@ class RssFeedTest < Test::Unit::TestCase |
212 | 212 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => fast_create(Person)) |
213 | 213 | a.finish |
214 | 214 | |
215 | - blog.posts << published_article = article.class.last | |
215 | + published_article = article.class.last | |
216 | + published_article.parent = blog | |
217 | + published_article.save | |
218 | + | |
216 | 219 | feed = RssFeed.new(:parent => blog, :profile => profile) |
217 | 220 | |
218 | 221 | assert_match "This is the content of the Sample Article", feed.data | ... | ... |
test/unit/search_helper_test.rb
... | ... | @@ -10,25 +10,20 @@ class SearchHelperTest < Test::Unit::TestCase |
10 | 10 | |
11 | 11 | def setup |
12 | 12 | @profile = mock |
13 | + self.stubs(:profile_image).returns('profileimage.png') | |
14 | + self.stubs(:url_for).returns('link to profile') | |
15 | + profile.stubs(:name).returns('Name of Profile') | |
16 | + profile.stubs(:url).returns('') | |
17 | + profile.stubs(:products).returns([Product.new(:name => 'product test')]) | |
18 | + profile.stubs(:identifier).returns('name-of-profile') | |
19 | + profile.stubs(:region).returns(Region.new(:name => 'Brazil')) | |
13 | 20 | end |
14 | 21 | attr_reader :profile |
15 | 22 | |
16 | - include ActionView::Helpers::FormOptionsHelper | |
17 | - include ActionView::Helpers::FormTagHelper | |
18 | - include ActionView::Helpers::TagHelper | |
19 | 23 | should 'display profile info' do |
20 | - profile.stubs(:name).returns('Name of Profile') | |
21 | 24 | profile.stubs(:address).returns('Address of Profile') |
22 | 25 | profile.stubs(:contact_email).returns('Email of Profile') |
23 | 26 | profile.stubs(:contact_phone).returns('Phone of Profile') |
24 | - profile.stubs(:url).returns('') | |
25 | - profile.stubs(:products).returns([Product.new(:name => 'product test')]) | |
26 | - profile.stubs(:identifier).returns('name-of-profile') | |
27 | - profile.stubs(:region).returns(Region.new(:name => 'Brazil')) | |
28 | - | |
29 | - self.stubs(:profile_image).returns('profileimage.png') | |
30 | - self.stubs(:url_for).returns('merda') | |
31 | - self.stubs(:link_to).returns('link to profile') | |
32 | 27 | |
33 | 28 | result = self.display_profile_info(profile) |
34 | 29 | assert_match /profileimage.png/, result |
... | ... | @@ -39,18 +34,9 @@ class SearchHelperTest < Test::Unit::TestCase |
39 | 34 | end |
40 | 35 | |
41 | 36 | should 'not display field if nil in profile info' do |
42 | - profile.stubs(:name).returns('Name of Profile') | |
43 | 37 | profile.stubs(:address).returns('nil') |
44 | 38 | profile.stubs(:contact_email).returns('nil') |
45 | 39 | profile.stubs(:contact_phone).returns('nil') |
46 | - profile.stubs(:url).returns('') | |
47 | - profile.stubs(:products).returns([Product.new(:name => 'product test')]) | |
48 | - profile.stubs(:identifier).returns('name-of-profile') | |
49 | - profile.stubs(:region).returns(Region.new(:name => 'Brazil')) | |
50 | - | |
51 | - self.stubs(:profile_image).returns('profileimage.png') | |
52 | - self.stubs(:url_for).returns('merda') | |
53 | - self.stubs(:link_to).returns('link to profile') | |
54 | 40 | |
55 | 41 | result = self.display_profile_info(profile) |
56 | 42 | assert_match /profileimage.png/, result |
... | ... | @@ -60,4 +46,16 @@ class SearchHelperTest < Test::Unit::TestCase |
60 | 46 | assert_no_match /Address of Profile/, result |
61 | 47 | end |
62 | 48 | |
49 | + should 'link to products and services of an profile' do | |
50 | + enterprise = fast_create(Enterprise) | |
51 | + product1 = fast_create(Product, :enterprise_id => enterprise.id) | |
52 | + product2 = fast_create(Product, :enterprise_id => enterprise.id) | |
53 | + result = display_profile_info(enterprise) | |
54 | + assert_tag_in_string result, :tag => 'a', :attributes => {:href => /:id=>#{product1.id}/}, :content => product1.name | |
55 | + assert_tag_in_string result, :tag => 'a', :attributes => {:href => /:id=>#{product2.id}/}, :content => product2.name | |
56 | + end | |
57 | + | |
58 | + protected | |
59 | + include NoosferoTestHelper | |
60 | + | |
63 | 61 | end | ... | ... |
test/unit/task_mailer_test.rb
... | ... | @@ -17,7 +17,7 @@ class TaskMailerTest < Test::Unit::TestCase |
17 | 17 | |
18 | 18 | task = Task.new |
19 | 19 | task.expects(:task_finished_message).returns('the message') |
20 | - task.expects(:information).returns('the task') | |
20 | + task.expects(:target_notification_description).returns('the task') | |
21 | 21 | |
22 | 22 | requestor = mock() |
23 | 23 | requestor.expects(:notification_emails).returns(['requestor@example.com']) |
... | ... | @@ -40,7 +40,7 @@ class TaskMailerTest < Test::Unit::TestCase |
40 | 40 | |
41 | 41 | task = Task.new |
42 | 42 | task.expects(:task_cancelled_message).returns('the message') |
43 | - task.expects(:information).returns('the task') | |
43 | + task.expects(:target_notification_description).returns('the task') | |
44 | 44 | |
45 | 45 | requestor = mock() |
46 | 46 | requestor.expects(:notification_emails).returns(['requestor@example.com']) |
... | ... | @@ -64,7 +64,7 @@ class TaskMailerTest < Test::Unit::TestCase |
64 | 64 | task = Task.new |
65 | 65 | |
66 | 66 | task.expects(:task_created_message).returns('the message') |
67 | - task.expects(:information).returns('the task') | |
67 | + task.expects(:target_notification_description).returns('the task') | |
68 | 68 | |
69 | 69 | requestor = mock() |
70 | 70 | requestor.expects(:notification_emails).returns(['requestor@example.com']) |
... | ... | @@ -129,6 +129,8 @@ class TaskMailerTest < Test::Unit::TestCase |
129 | 129 | |
130 | 130 | mail = TaskMailer.create_invitation_notification(task) |
131 | 131 | |
132 | + assert_match(/#{task.target_notification_description}/, mail.subject) | |
133 | + | |
132 | 134 | assert_equal "Hello friend name, my name invite you, please follow this link: http://example.com/account/signup?invitation_code=123456", mail.body |
133 | 135 | |
134 | 136 | TaskMailer.deliver(mail) | ... | ... |
vendor/plugins/action_tracker/lib/action_tracker_model.rb
... | ... | @@ -12,6 +12,11 @@ module ActionTracker |
12 | 12 | |
13 | 13 | validates_presence_of :verb |
14 | 14 | validates_presence_of :user |
15 | + validate :user_existence | |
16 | + | |
17 | + def user_existence | |
18 | + errors.add(:user, "user doesn't exists") if user && !user.class.exists?(user) | |
19 | + end | |
15 | 20 | |
16 | 21 | alias_method :subject, :user |
17 | 22 | ... | ... |
vendor/plugins/action_tracker/test/action_tracker_model_test.rb
... | ... | @@ -67,9 +67,32 @@ class ActionTrackerModelTest < ActiveSupport::TestCase |
67 | 67 | end |
68 | 68 | end |
69 | 69 | |
70 | + def test_user_is_mandatory | |
71 | + ta = ActionTracker::Record.new :user_type => 'SomeModel', :verb => :some_verb | |
72 | + ta.valid? | |
73 | + assert ta.errors.on(:user) | |
74 | + assert_raise ActiveRecord::RecordInvalid do | |
75 | + ta.save! | |
76 | + end | |
77 | + | |
78 | + ta = ActionTracker::Record.new :user_id => 2, :verb => :some_verb | |
79 | + ta.valid? | |
80 | + assert ta.errors.on(:user) | |
81 | + assert_raise ActiveRecord::RecordInvalid do | |
82 | + ta.save! | |
83 | + end | |
84 | + end | |
85 | + | |
70 | 86 | def test_user_exists_indeed |
71 | - ta = ActionTracker::Record.new(:user_id => -1, :user_type => "SomeModel", :verb => :some_verb) | |
72 | - assert !ta.valid? | |
87 | + ta = ActionTracker::Record.new(:verb => :some_verb) | |
88 | + ta.valid? | |
89 | + assert ta.errors.on(:user) | |
90 | + user = SomeModel.create! | |
91 | + ta.user = user | |
92 | + assert ta.valid? | |
93 | + user.destroy | |
94 | + ta.valid? | |
95 | + assert ta.errors.on(:user) | |
73 | 96 | end |
74 | 97 | |
75 | 98 | def test_verb_must_be_declared_previously |
... | ... | @@ -333,24 +356,4 @@ class ActionTrackerModelTest < ActiveSupport::TestCase |
333 | 356 | assert_equal(["foo 1", "bar 2"], t.collect_group_with_index(:test){|x, i| "#{x} #{i+1}" }) |
334 | 357 | end |
335 | 358 | |
336 | - def test_user_id_is_mandatory | |
337 | - ActionTrackerConfig.verbs = { :some => { :description => "Some" } } | |
338 | - ta = ActionTracker::Record.new :user_type => 'SomeModel', :verb => :some | |
339 | - ta.valid? | |
340 | - assert ta.errors.on(:user_id) | |
341 | - assert_raise ActiveRecord::RecordInvalid do | |
342 | - ta.save! | |
343 | - end | |
344 | - end | |
345 | - | |
346 | - def test_user_type_is_mandatory | |
347 | - ActionTrackerConfig.verbs = { :some => { :description => "Some" } } | |
348 | - ta = ActionTracker::Record.new :user_id => 2, :verb => :some | |
349 | - ta.valid? | |
350 | - assert ta.errors.on(:user_type) | |
351 | - assert_raise ActiveRecord::RecordInvalid do | |
352 | - ta.save! | |
353 | - end | |
354 | - end | |
355 | - | |
356 | 359 | end | ... | ... |