Commit 37e4ba3e6fe873d63a8fafe5ec528bd8111b4176
Committed by
Antonio Terceiro
1 parent
30e81255
Exists in
master
and in
28 other branches
Send e-mails through environment
* Environment admin can send e-mail to all environment users * Community admin can send e-mail to all community members * Added migrate to create mailing * Added job to send mailing (ActionItem1659)
Showing
30 changed files
with
769 additions
and
14 deletions
Show diff stats
app/controllers/admin/users_controller.rb
... | ... | @@ -19,4 +19,18 @@ class UsersController < AdminController |
19 | 19 | end |
20 | 20 | end |
21 | 21 | |
22 | + def send_mail | |
23 | + @mailing = environment.mailings.build(params[:mailing]) | |
24 | + if request.post? | |
25 | + @mailing.locale = locale | |
26 | + @mailing.person = user | |
27 | + if @mailing.save | |
28 | + session[:notice] = _('The e-mails are being sent') | |
29 | + redirect_to :action => 'index' | |
30 | + else | |
31 | + session[:notice] = _('Could not create the e-mail') | |
32 | + end | |
33 | + end | |
34 | + end | |
35 | + | |
22 | 36 | end | ... | ... |
app/controllers/my_profile/profile_members_controller.rb
... | ... | @@ -92,4 +92,18 @@ class ProfileMembersController < MyProfileController |
92 | 92 | render :layout => false |
93 | 93 | end |
94 | 94 | |
95 | + def send_mail | |
96 | + @mailing = profile.mailings.build(params[:mailing]) | |
97 | + if request.post? | |
98 | + @mailing.locale = locale | |
99 | + @mailing.person = user | |
100 | + if @mailing.save | |
101 | + session[:notice] = _('The e-mails are being sent') | |
102 | + redirect_to :action => 'index' | |
103 | + else | |
104 | + session[:notice] = _('Could not create the e-mail') | |
105 | + end | |
106 | + end | |
107 | + end | |
108 | + | |
95 | 109 | end | ... | ... |
app/models/environment.rb
... | ... | @@ -158,6 +158,8 @@ class Environment < ActiveRecord::Base |
158 | 158 | has_many :qualifiers |
159 | 159 | has_many :certifiers |
160 | 160 | |
161 | + has_many :mailings, :class_name => 'EnvironmentMailing', :foreign_key => :source_id, :as => 'source' | |
162 | + | |
161 | 163 | acts_as_accessible |
162 | 164 | |
163 | 165 | def superior_intances | ... | ... |
... | ... | @@ -0,0 +1,24 @@ |
1 | +class EnvironmentMailing < Mailing | |
2 | + | |
3 | + def recipient(offset=0) | |
4 | + Person.find(:first, :conditions => [ "environment_id = ?", source_id], :order => :id, :offset => offset) | |
5 | + end | |
6 | + | |
7 | + def each_recipient | |
8 | + offset = 0 | |
9 | + while person = recipient(offset) | |
10 | + unless self.already_sent_mailing_to?(person) | |
11 | + yield person | |
12 | + end | |
13 | + offset = offset + 1 | |
14 | + end | |
15 | + end | |
16 | + | |
17 | + def signature_message | |
18 | + _('Sent by Noosfero %s.') % source.name | |
19 | + end | |
20 | + | |
21 | + def url | |
22 | + source.top_url | |
23 | + end | |
24 | +end | ... | ... |
... | ... | @@ -0,0 +1,56 @@ |
1 | +class Mailing < ActiveRecord::Base | |
2 | + | |
3 | + validates_presence_of :source_id, :subject, :body | |
4 | + belongs_to :source, :foreign_key => :source_id, :polymorphic => true | |
5 | + belongs_to :person | |
6 | + | |
7 | + has_many :mailing_sents | |
8 | + | |
9 | + xss_terminate :only => [ :subject, :body ], :with => 'white_list', :on => 'validation' | |
10 | + | |
11 | + after_create do |mailing| | |
12 | + Delayed::Job.enqueue MailingJob.new(mailing.id) | |
13 | + end | |
14 | + | |
15 | + def generate_from | |
16 | + "#{source.name} <#{source.contact_email}>" | |
17 | + end | |
18 | + | |
19 | + def generate_subject | |
20 | + '[%s] %s' % [source.name, subject] | |
21 | + end | |
22 | + | |
23 | + def signature_message | |
24 | + _('Sent by Noosfero.') | |
25 | + end | |
26 | + | |
27 | + def url | |
28 | + '' | |
29 | + end | |
30 | + | |
31 | + def already_sent_mailing_to?(recipient) | |
32 | + self.mailing_sents.find_by_person_id(recipient.id) | |
33 | + end | |
34 | + | |
35 | + def deliver | |
36 | + offset = 0 | |
37 | + people = [] | |
38 | + each_recipient do |recipient| | |
39 | + Mailing::Sender.deliver_mail(self, recipient.email) | |
40 | + self.mailing_sents.create(:person => recipient) | |
41 | + end | |
42 | + end | |
43 | + | |
44 | + class Sender < ActionMailer::Base | |
45 | + def mail(mailing, recipient) | |
46 | + content_type 'text/html' | |
47 | + recipients recipient | |
48 | + from mailing.generate_from | |
49 | + reply_to mailing.person.email | |
50 | + subject mailing.generate_subject | |
51 | + body :message => mailing.body, | |
52 | + :signature_message => mailing.signature_message, | |
53 | + :url => mailing.url | |
54 | + end | |
55 | + end | |
56 | +end | ... | ... |
app/models/organization.rb
... | ... | @@ -19,6 +19,8 @@ class Organization < Profile |
19 | 19 | |
20 | 20 | has_many :validations, :class_name => 'CreateEnterprise', :foreign_key => :target_id |
21 | 21 | |
22 | + has_many :mailings, :class_name => 'OrganizationMailing', :foreign_key => :source_id, :as => 'source' | |
23 | + | |
22 | 24 | def validation_methodology |
23 | 25 | self.validation_info ? self.validation_info.validation_methodology : nil |
24 | 26 | end | ... | ... |
... | ... | @@ -0,0 +1,30 @@ |
1 | +class OrganizationMailing < Mailing | |
2 | + | |
3 | + def generate_from | |
4 | + "#{person.name} <#{source.environment.contact_email}>" | |
5 | + end | |
6 | + | |
7 | + def recipient(offset=0) | |
8 | + environment_id = source.environment_id | |
9 | + Person.find(:first, :conditions => ['environment_id = ? and role_assignments.resource_type = ? and role_assignments.resource_id = ?', environment_id, 'Profile', source.id], :include => :role_assignments, :order => "profiles.id", :offset => offset) | |
10 | + end | |
11 | + | |
12 | + def each_recipient | |
13 | + offset = 0 | |
14 | + while person = recipient(offset) | |
15 | + unless self.already_sent_mailing_to?(person) | |
16 | + yield person | |
17 | + end | |
18 | + offset = offset + 1 | |
19 | + end | |
20 | + end | |
21 | + | |
22 | + def signature_message | |
23 | + _('Sent by community %s.') % source.name | |
24 | + end | |
25 | + | |
26 | + include ActionController::UrlWriter | |
27 | + def url | |
28 | + url_for(source.url) | |
29 | + end | |
30 | +end | ... | ... |
app/models/person.rb
... | ... | @@ -14,6 +14,8 @@ class Person < Profile |
14 | 14 | |
15 | 15 | has_many :requested_tasks, :class_name => 'Task', :foreign_key => :requestor_id, :dependent => :destroy |
16 | 16 | |
17 | + has_many :mailings | |
18 | + | |
17 | 19 | named_scope :more_popular, |
18 | 20 | :select => "#{Profile.qualified_column_names}, count(friend_id) as total", |
19 | 21 | :group => Profile.qualified_column_names, | ... | ... |
app/models/profile.rb
... | ... | @@ -587,9 +587,9 @@ private :generate_url, :url_options |
587 | 587 | end |
588 | 588 | |
589 | 589 | include ActionView::Helpers::TextHelper |
590 | - def short_name | |
590 | + def short_name(chars = 15) | |
591 | 591 | if self[:nickname].blank? |
592 | - truncate self.name, 15, '...' | |
592 | + truncate self.name, chars, '...' | |
593 | 593 | else |
594 | 594 | self[:nickname] |
595 | 595 | end | ... | ... |
... | ... | @@ -0,0 +1,17 @@ |
1 | +<!DOCTYPE html> | |
2 | +<html> | |
3 | + <head> | |
4 | + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | |
5 | + </head> | |
6 | + <body> | |
7 | + <%= word_wrap(@message) %> | |
8 | + <p> | |
9 | + --<br/> | |
10 | + <%= @signature_message %><br/> | |
11 | + <%= @url %> | |
12 | + </p> | |
13 | + </body> | |
14 | +</html> | |
15 | + | |
16 | + | |
17 | + | ... | ... |
... | ... | @@ -0,0 +1,8 @@ |
1 | +<% button_bar do %> | |
2 | + <%= button :back, _('Back'), :controller => 'profile_editor' %> | |
3 | + <%= button :add, _('Add members'), :action => 'add_members' if profile.enterprise? %> | |
4 | + <% if profile.community? and user.has_permission?(:invite_members, profile) %> | |
5 | + <%= button :search, _('Invite your friends to join %s') % profile.short_name, :controller => 'invite', :action => 'select_address_book' %> | |
6 | + <% end %> | |
7 | + <%= button :send, _('Send e-mail to members'), :action => 'send_mail' %> | |
8 | +<% end %> | ... | ... |
app/views/profile_members/index.rhtml
1 | +<h1><%= h profile.short_name(50) %></h1> | |
2 | + | |
3 | +<%= render :partial => 'index_buttons' %> | |
4 | + | |
1 | 5 | <div id="members-list"> |
2 | 6 | <%= render :partial => 'members_list' %> |
3 | 7 | </div> |
4 | 8 | |
5 | -<% button_bar do %> | |
6 | - <%= button :back, _('Back'), :controller => 'profile_editor' %> | |
7 | - <%= button :add, _('Add members'), :action => 'add_members' if profile.enterprise? %> | |
8 | - <% if profile.community? and user.has_permission?(:invite_members, profile) %> | |
9 | - <%= button :search, _('Invite your friends to join %s') % profile.name, :controller => 'invite', :action => 'select_address_book' %> | |
10 | - <% end %> | |
11 | -<% end %> | |
9 | +<%= render :partial => 'index_buttons' %> | ... | ... |
... | ... | @@ -0,0 +1,14 @@ |
1 | +<h1><%= h profile.short_name(50) %></h1> | |
2 | + | |
3 | +<h2><%= _('Send e-mail to members') %></h2> | |
4 | + | |
5 | +<%= error_messages_for :mailing %> | |
6 | + | |
7 | +<%= render :file => 'shared/tiny_mce' %> | |
8 | + | |
9 | +<% form_for :mailing, :url => {:action => 'send_mail'}, :html => {:id => 'mailing-form'} do |f| %> | |
10 | + <%= labelled_form_field(_('Subject:'), f.text_field(:subject)) %> | |
11 | + <%= labelled_form_field(_('Body:'), f.text_area(:body)) %> | |
12 | + <%= submit_button(:send, _('Send')) %> | |
13 | + <%= button :cancel, _('Cancel e-mail'), :action => 'index' %> | |
14 | +<% end %> | ... | ... |
app/views/users/index.rhtml
... | ... | @@ -2,9 +2,12 @@ |
2 | 2 | |
3 | 3 | <ul> |
4 | 4 | <li> |
5 | - <%= _('Download users list') %>: | |
6 | - <%= link_to '[CSV]', :format => 'csv' %> | |
7 | - <%= link_to '[XML]', :format => 'xml' %> | |
5 | + <%= _('Download users list') %>: | |
6 | + <%= link_to '[CSV]', :format => 'csv' %> | |
7 | + <%= link_to '[XML]', :format => 'xml' %> | |
8 | + </li> | |
9 | + <li> | |
10 | + <%= link_to _('Send e-mail to users'), :action => 'send_mail' %> | |
8 | 11 | </li> |
9 | 12 | </ul> |
10 | 13 | ... | ... |
... | ... | @@ -0,0 +1,12 @@ |
1 | +<h1><%= _('Send e-mail to users') %></h1> | |
2 | + | |
3 | +<%= error_messages_for :mailing %> | |
4 | + | |
5 | +<%= render :file => 'shared/tiny_mce' %> | |
6 | + | |
7 | +<% form_for :mailing, :url => {:action => 'send_mail'} do |f| %> | |
8 | + <%= labelled_form_field(_('Subject:'), f.text_field(:subject)) %> | |
9 | + <%= labelled_form_field(_('Body:'), f.text_area(:body)) %> | |
10 | + <%= submit_button(:send, _('Send')) %> | |
11 | + <%= button :cancel, _('Cancel e-mail'), :controller => 'users' %> | |
12 | +<% end %> | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +class CreateMailings < ActiveRecord::Migration | |
2 | + def self.up | |
3 | + create_table :mailings do |t| | |
4 | + t.string :type | |
5 | + t.string :subject | |
6 | + t.text :body | |
7 | + t.integer :source_id | |
8 | + t.string :source_type | |
9 | + t.references :person | |
10 | + t.string :locale | |
11 | + t.timestamps | |
12 | + end | |
13 | + end | |
14 | + | |
15 | + def self.down | |
16 | + drop_table :mailings | |
17 | + end | |
18 | +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 => 20100901203836) do | |
12 | +ActiveRecord::Schema.define(:version => 20100909103951) do | |
13 | 13 | |
14 | 14 | create_table "article_versions", :force => true do |t| |
15 | 15 | t.integer "article_id" |
... | ... | @@ -261,6 +261,25 @@ ActiveRecord::Schema.define(:version => 20100901203836) do |
261 | 261 | t.boolean "is_from_solidarity_economy", :default => false |
262 | 262 | end |
263 | 263 | |
264 | + create_table "mailing_sents", :force => true do |t| | |
265 | + t.integer "mailing_id" | |
266 | + t.integer "person_id" | |
267 | + t.datetime "created_at" | |
268 | + t.datetime "updated_at" | |
269 | + end | |
270 | + | |
271 | + create_table "mailings", :force => true do |t| | |
272 | + t.string "type" | |
273 | + t.string "subject" | |
274 | + t.text "body" | |
275 | + t.integer "source_id" | |
276 | + t.string "source_type" | |
277 | + t.integer "person_id" | |
278 | + t.string "locale" | |
279 | + t.datetime "created_at" | |
280 | + t.datetime "updated_at" | |
281 | + end | |
282 | + | |
264 | 283 | create_table "product_categorizations", :force => true do |t| |
265 | 284 | t.integer "category_id" |
266 | 285 | t.integer "product_id" | ... | ... |
... | ... | @@ -0,0 +1,53 @@ |
1 | +Feature: send emails to environment members users | |
2 | + As an administrator | |
3 | + I want to send email to all users | |
4 | + | |
5 | + Scenario: Cant access if not logged in | |
6 | + Given I am not logged in | |
7 | + When I go to /admin/users/send_mail | |
8 | + Then I should see "Access denied" | |
9 | + | |
10 | + Scenario: Cant access as normal user | |
11 | + Given the following user | |
12 | + | login | | |
13 | + | ultraje | | |
14 | + And I am logged in as "ultraje" | |
15 | + When I go to /admin/users/send_mail | |
16 | + Then I should see "Access denied" | |
17 | + | |
18 | + Scenario: Send e-mail to members | |
19 | + Given I am logged in as admin | |
20 | + When I follow "Administration" | |
21 | + And I follow "Manage users" | |
22 | + And I follow "Send e-mail to users" | |
23 | + And I fill in "Subject" with "Hello, user!" | |
24 | + And I fill in "body" with "We have some news" | |
25 | + When I press "Send" | |
26 | + Then I should be on /admin/users | |
27 | + | |
28 | + Scenario: Not send e-mail to members if subject is blank | |
29 | + Given I am logged in as admin | |
30 | + When I follow "Administration" | |
31 | + And I follow "Manage users" | |
32 | + And I follow "Send e-mail to users" | |
33 | + And I fill in "body" with "We have some news" | |
34 | + When I press "Send" | |
35 | + Then I should be on /admin/users/send_mail | |
36 | + | |
37 | + Scenario: Not send e-mail to members if body is blank | |
38 | + Given I am logged in as admin | |
39 | + When I follow "Administration" | |
40 | + And I follow "Manage users" | |
41 | + And I follow "Send e-mail to users" | |
42 | + And I fill in "Subject" with "Hello, user!" | |
43 | + When I press "Send" | |
44 | + Then I should be on /admin/users/send_mail | |
45 | + | |
46 | + Scenario: Cancel creation of mailing | |
47 | + Given I am logged in as admin | |
48 | + When I follow "Administration" | |
49 | + And I follow "Manage users" | |
50 | + And I follow "Send e-mail to users" | |
51 | + Then I should be on /admin/users/send_mail | |
52 | + When I follow "Cancel e-mail" | |
53 | + Then I should be on /admin/users | ... | ... |
... | ... | @@ -0,0 +1,57 @@ |
1 | +Feature: send emails to organization members | |
2 | + As a organization administrator | |
3 | + I want to send email to all members | |
4 | + | |
5 | + Background: | |
6 | + Given the following users | |
7 | + | login | name | | |
8 | + | joaosilva | Joao Silva | | |
9 | + And the following communities | |
10 | + | identifier | name | | |
11 | + | sample-community | Sample Community | | |
12 | + And "Joao Silva" is admin of "Sample Community" | |
13 | + | |
14 | + Scenario: Cant access if not logged in | |
15 | + Given I am not logged in | |
16 | + When I go to /myprofile/sample-community/profile_members/send_mail | |
17 | + Then I should be on login page | |
18 | + | |
19 | + Scenario: Cant access as normal user | |
20 | + Given the following user | |
21 | + | login | | |
22 | + | josesilva | | |
23 | + And I am logged in as "josesilva" | |
24 | + When I go to /myprofile/sample-community/profile_members/send_mail | |
25 | + Then I should see "Access denied" | |
26 | + | |
27 | + Scenario: Send e-mail to members | |
28 | + Given I am logged in as "joaosilva" | |
29 | + And I go to Sample Community's members management | |
30 | + And I follow "Send e-mail to members" | |
31 | + And I fill in "Subject" with "Hello, member!" | |
32 | + And I fill in "body" with "We have some news" | |
33 | + When I press "Send" | |
34 | + Then I should be on Sample Community's members management | |
35 | + | |
36 | + Scenario: Not send e-mail to members if subject is blank | |
37 | + Given I am logged in as "joaosilva" | |
38 | + And I go to Sample Community's members management | |
39 | + And I follow "Send e-mail to members" | |
40 | + And I fill in "body" with "We have some news" | |
41 | + When I press "Send" | |
42 | + Then I should be on /myprofile/sample-community/profile_members/send_mail | |
43 | + | |
44 | + Scenario: Not send e-mail to members if body is blank | |
45 | + Given I am logged in as "joaosilva" | |
46 | + And I go to Sample Community's members management | |
47 | + And I follow "Send e-mail to members" | |
48 | + And I fill in "Subject" with "Hello, user!" | |
49 | + When I press "Send" | |
50 | + Then I should be on /myprofile/sample-community/profile_members/send_mail | |
51 | + | |
52 | + Scenario: Cancel creation of mailing | |
53 | + Given I am logged in as "joaosilva" | |
54 | + And I go to Sample Community's members management | |
55 | + And I follow "Send e-mail to members" | |
56 | + When I follow "Cancel e-mail" | |
57 | + Then I should be on Sample Community's members management | ... | ... |
public/stylesheets/application.css
... | ... | @@ -3640,6 +3640,11 @@ h1#agenda-title { |
3640 | 3640 | text-align: left; |
3641 | 3641 | } |
3642 | 3642 | |
3643 | +.controller-profile_members #mailing-form .formfield textarea, | |
3644 | +.controller-profile_members #mailing-form .type-text input { | |
3645 | + width: 100%; | |
3646 | +} | |
3647 | + | |
3643 | 3648 | /* ==> public/stylesheets/controller_search.css <== */ |
3644 | 3649 | /* @import url(pagination.css); ALREADY INCLUDED ABOVE */ |
3645 | 3650 | ... | ... |
test/functional/profile_members_controller_test.rb
... | ... | @@ -280,4 +280,31 @@ class ProfileMembersControllerTest < Test::Unit::TestCase |
280 | 280 | assert p_roles, [r] |
281 | 281 | end |
282 | 282 | |
283 | + should 'add locale on mailing' do | |
284 | + community = fast_create(Community) | |
285 | + admin_user = create_user_with_permission('profile_admin_user', 'manage_memberships', community) | |
286 | + login_as('profile_admin_user') | |
287 | + @controller.stubs(:locale).returns('pt') | |
288 | + post :send_mail, :profile => community.identifier, :mailing => {:subject => 'Hello', :body => 'We have some news'} | |
289 | + assert_equal 'pt', assigns(:mailing).locale | |
290 | + end | |
291 | + | |
292 | + should 'save mailing' do | |
293 | + community = fast_create(Community) | |
294 | + admin_user = create_user_with_permission('profile_admin_user', 'manage_memberships', community) | |
295 | + login_as('profile_admin_user') | |
296 | + @controller.stubs(:locale).returns('pt') | |
297 | + post :send_mail, :profile => community.identifier, :mailing => {:subject => 'Hello', :body => 'We have some news'} | |
298 | + assert_equal ['Hello', 'We have some news'], [assigns(:mailing).subject, assigns(:mailing).body] | |
299 | + assert_redirected_to :action => 'index' | |
300 | + end | |
301 | + | |
302 | + should 'add the user logged on mailing' do | |
303 | + community = fast_create(Community) | |
304 | + admin_user = create_user_with_permission('profile_admin_user', 'manage_memberships', community) | |
305 | + login_as('profile_admin_user') | |
306 | + post :send_mail, :profile => community.identifier, :mailing => {:subject => 'Hello', :body => 'We have some news'} | |
307 | + assert_equal Profile['profile_admin_user'], assigns(:mailing).person | |
308 | + end | |
309 | + | |
283 | 310 | end | ... | ... |
... | ... | @@ -0,0 +1,97 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class EnvironmentMailingTest < ActiveSupport::TestCase | |
4 | + | |
5 | + def setup | |
6 | + ActionMailer::Base.delivery_method = :test | |
7 | + ActionMailer::Base.perform_deliveries = true | |
8 | + ActionMailer::Base.deliveries = [] | |
9 | + @environment = fast_create(Environment, :name => 'Network') | |
10 | + create_user('user_one', :environment_id => @environment.id) | |
11 | + create_user('user_two', :environment_id => @environment.id) | |
12 | + end | |
13 | + attr_reader :environment | |
14 | + | |
15 | + | |
16 | + should 'require source_id' do | |
17 | + mailing = EnvironmentMailing.new | |
18 | + mailing.valid? | |
19 | + assert mailing.errors.invalid?(:source_id) | |
20 | + | |
21 | + mailing.source_id = environment.id | |
22 | + mailing.valid? | |
23 | + assert !mailing.errors.invalid?(:source_id) | |
24 | + end | |
25 | + | |
26 | + should 'return environment name' do | |
27 | + mailing = EnvironmentMailing.new(:source => environment) | |
28 | + assert_equal environment.name, mailing.source.name | |
29 | + end | |
30 | + | |
31 | + should 'return environment with source_id' do | |
32 | + mailing = EnvironmentMailing.new(:source => environment) | |
33 | + assert_equal environment, mailing.source | |
34 | + end | |
35 | + | |
36 | + should 'return signature message' do | |
37 | + mailing = EnvironmentMailing.new(:source => environment) | |
38 | + assert_equal 'Sent by Noosfero Network.', mailing.signature_message | |
39 | + end | |
40 | + | |
41 | + should 'return url for environment on url' do | |
42 | + mailing = EnvironmentMailing.new(:source => environment) | |
43 | + environment.domains << Domain.create(:name => 'noosfero.net', :is_default => true) | |
44 | + assert_equal 'http://noosfero.net', mailing.url | |
45 | + end | |
46 | + | |
47 | + should 'display name and email on generate_from' do | |
48 | + person = Person['user_one'] | |
49 | + mailing = EnvironmentMailing.new(:source => environment, :person => person) | |
50 | + assert_equal "#{environment.name} <#{environment.contact_email}>", mailing.generate_from | |
51 | + end | |
52 | + | |
53 | + should 'deliver mailing to each recipient after create' do | |
54 | + person = Person['user_one'] | |
55 | + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) | |
56 | + process_delayed_job_queue | |
57 | + assert_equal 2, ActionMailer::Base.deliveries.count | |
58 | + end | |
59 | + | |
60 | + should 'create mailing sent to each recipient after delivering mailing' do | |
61 | + person = Person['user_one'] | |
62 | + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) | |
63 | + assert_difference MailingSent, :count, 2 do | |
64 | + process_delayed_job_queue | |
65 | + end | |
66 | + end | |
67 | + | |
68 | + should 'change locale according to the mailing locale' do | |
69 | + person = Person['user_one'] | |
70 | + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person) | |
71 | + Noosfero.expects(:with_locale).with('pt') | |
72 | + process_delayed_job_queue | |
73 | + end | |
74 | + | |
75 | + should 'return recipient' do | |
76 | + mailing = EnvironmentMailing.new(:source => environment) | |
77 | + assert_equal Person['user_one'], mailing.recipient | |
78 | + end | |
79 | + | |
80 | + should 'return true if already sent mailing to a recipient' do | |
81 | + person = Person['user_one'] | |
82 | + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) | |
83 | + process_delayed_job_queue | |
84 | + | |
85 | + assert mailing.already_sent_mailing_to?(person) | |
86 | + end | |
87 | + | |
88 | + should 'return false if did not sent mailing to a recipient' do | |
89 | + recipient = fast_create(Person) | |
90 | + person = Person['user_one'] | |
91 | + mailing = EnvironmentMailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) | |
92 | + process_delayed_job_queue | |
93 | + | |
94 | + assert !mailing.already_sent_mailing_to?(recipient) | |
95 | + end | |
96 | + | |
97 | +end | ... | ... |
... | ... | @@ -0,0 +1,23 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class MailingJobTest < ActiveSupport::TestCase | |
4 | + | |
5 | + def setup | |
6 | + @environment = fast_create(Environment) | |
7 | + @person_1 = create_user('user_one', :environment_id => @environment.id).person | |
8 | + create_user('user_two', :environment_id => @environment.id) | |
9 | + end | |
10 | + attr_reader :environment | |
11 | + | |
12 | + should 'create delayed job' do | |
13 | + assert_difference Delayed::Job, :count, 1 do | |
14 | + mailing = EnvironmentMailing.create(:source_id => environment.id, :subject => 'Hello', :body => 'We have some news', :person => @person_1) | |
15 | + end | |
16 | + end | |
17 | + | |
18 | + should 'change locale according to the locale informed' do | |
19 | + mailing = EnvironmentMailing.create(:source_id => environment.id, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => @person_1) | |
20 | + Noosfero.expects(:with_locale).with('pt') | |
21 | + process_delayed_job_queue | |
22 | + end | |
23 | +end | ... | ... |
... | ... | @@ -0,0 +1,13 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class MailingSentTest < ActiveSupport::TestCase | |
4 | + | |
5 | + should 'return mailing and person' do | |
6 | + person = fast_create(Person) | |
7 | + mailing = Mailing.create(:source => Environment.default, :subject => 'Hello', :body => 'We have some news') | |
8 | + sent = MailingSent.create(:mailing => mailing, :person => person) | |
9 | + | |
10 | + mailing_sent = MailingSent.find(sent.id) | |
11 | + assert_equal [mailing, person], [mailing_sent.mailing, mailing_sent.person] | |
12 | + end | |
13 | +end | ... | ... |
... | ... | @@ -0,0 +1,102 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class MailingTest < ActiveSupport::TestCase | |
4 | + | |
5 | + def setup | |
6 | + ActionMailer::Base.deliveries = [] | |
7 | + @environment = fast_create(Environment, :name => 'Network') | |
8 | + create_user('user_one', :environment_id => @environment.id) | |
9 | + create_user('user_two', :environment_id => @environment.id) | |
10 | + end | |
11 | + attr_reader :environment | |
12 | + | |
13 | + should 'source be able to polymorphic relationship' do | |
14 | + m = Mailing.new | |
15 | + assert_nothing_raised do | |
16 | + m.source = Environment.new | |
17 | + end | |
18 | + assert_nothing_raised do | |
19 | + m.source = Profile.new | |
20 | + end | |
21 | + end | |
22 | + | |
23 | + should 'require source_id' do | |
24 | + mailing = Mailing.new | |
25 | + mailing.valid? | |
26 | + assert mailing.errors.invalid?(:source_id) | |
27 | + | |
28 | + mailing.source_id = Environment.default.id | |
29 | + mailing.valid? | |
30 | + assert !mailing.errors.invalid?(:source_id) | |
31 | + end | |
32 | + | |
33 | + should 'require subject' do | |
34 | + mailing = Mailing.new | |
35 | + mailing.valid? | |
36 | + assert mailing.errors.invalid?(:subject) | |
37 | + | |
38 | + mailing.subject = 'Hello :)' | |
39 | + mailing.valid? | |
40 | + assert !mailing.errors.invalid?(:subject) | |
41 | + end | |
42 | + | |
43 | + should 'require body' do | |
44 | + mailing = Mailing.new | |
45 | + mailing.valid? | |
46 | + assert mailing.errors.invalid?(:body) | |
47 | + | |
48 | + mailing.body = 'We have some news!' | |
49 | + mailing.valid? | |
50 | + assert !mailing.errors.invalid?(:body) | |
51 | + end | |
52 | + | |
53 | + should 'return source' do | |
54 | + mailing = Mailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news') | |
55 | + assert_equal environment, Mailing.find(mailing.id).source | |
56 | + end | |
57 | + | |
58 | + should 'return source name' do | |
59 | + mailing = Mailing.new(:source => environment) | |
60 | + assert_equal environment.name, mailing.source.name | |
61 | + end | |
62 | + | |
63 | + should 'return source with source_id' do | |
64 | + mailing = Mailing.new(:source => environment) | |
65 | + assert_equal environment, mailing.source | |
66 | + end | |
67 | + | |
68 | + should 'return person with person_id' do | |
69 | + person = Person['user_one'] | |
70 | + mailing = Mailing.new(:source => environment, :person => person) | |
71 | + assert_equal person, mailing.person | |
72 | + end | |
73 | + | |
74 | + should 'display name and email on generate_from' do | |
75 | + person = Person['user_one'] | |
76 | + mailing = Mailing.new(:source => environment, :person => person) | |
77 | + assert_equal "#{environment.name} <#{environment.contact_email}>", mailing.generate_from | |
78 | + end | |
79 | + | |
80 | + should 'generate subject' do | |
81 | + mailing = Mailing.new(:source => environment, :subject => 'Hello :)') | |
82 | + assert_equal "[#{environment.name}] #{mailing.subject}", mailing.generate_subject | |
83 | + end | |
84 | + | |
85 | + should 'return signature message' do | |
86 | + mailing = Mailing.new(:source => environment) | |
87 | + assert_equal 'Sent by Noosfero.', mailing.signature_message | |
88 | + end | |
89 | + | |
90 | + should 'return blank string on url' do | |
91 | + mailing = Mailing.new(:source => environment) | |
92 | + environment.domains << Domain.create(:name => 'noosfero.net', :is_default => true) | |
93 | + assert_equal '', mailing.url | |
94 | + end | |
95 | + | |
96 | + should 'deliver mailing to each recipient after create' do | |
97 | + person = Person['user_one'] | |
98 | + mailing = Mailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news', :person => person) | |
99 | + process_delayed_job_queue | |
100 | + assert_equal [], ActionMailer::Base.deliveries | |
101 | + end | |
102 | +end | ... | ... |
... | ... | @@ -0,0 +1,115 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class OrganizationMailingTest < ActiveSupport::TestCase | |
4 | + | |
5 | + def setup | |
6 | + ActionMailer::Base.delivery_method = :test | |
7 | + ActionMailer::Base.perform_deliveries = true | |
8 | + ActionMailer::Base.deliveries = [] | |
9 | + @community = fast_create(Community) | |
10 | + @person = create_user('john').person | |
11 | + member_1 = create_user('user_one').person | |
12 | + member_2 = create_user('user_two').person | |
13 | + @community.add_member(member_1) | |
14 | + @community.add_member(member_2) | |
15 | + end | |
16 | + attr_reader :community, :person | |
17 | + | |
18 | + should 'require source_id' do | |
19 | + mailing = OrganizationMailing.new | |
20 | + mailing.valid? | |
21 | + assert mailing.errors.invalid?(:source_id) | |
22 | + | |
23 | + mailing.source_id = community.id | |
24 | + mailing.valid? | |
25 | + assert !mailing.errors.invalid?(:source_id) | |
26 | + end | |
27 | + | |
28 | + should 'return community name' do | |
29 | + mailing = OrganizationMailing.new(:source => community) | |
30 | + assert_equal community.name, mailing.source.name | |
31 | + end | |
32 | + | |
33 | + should 'return community with source_id' do | |
34 | + mailing = OrganizationMailing.new(:source => community) | |
35 | + assert_equal community, mailing.source | |
36 | + end | |
37 | + | |
38 | + should 'return person with person_id' do | |
39 | + mailing = OrganizationMailing.new(:source => community, :person => person) | |
40 | + assert_equal person, mailing.person | |
41 | + end | |
42 | + | |
43 | + should 'display name and email on generate_from' do | |
44 | + mailing = OrganizationMailing.new(:source => community, :person => person) | |
45 | + assert_equal "#{person.name} <#{community.environment.contact_email}>", mailing.generate_from | |
46 | + end | |
47 | + | |
48 | + should 'generate subject' do | |
49 | + mailing = OrganizationMailing.new(:source => community, :subject => 'Hello :)') | |
50 | + assert_equal "[#{community.name}] #{mailing.subject}", mailing.generate_subject | |
51 | + end | |
52 | + | |
53 | + should 'return signature message' do | |
54 | + mailing = OrganizationMailing.new(:source => community) | |
55 | + assert_equal "Sent by community #{community.name}.", mailing.signature_message | |
56 | + end | |
57 | + | |
58 | + should 'return url for organization on url' do | |
59 | + mailing = OrganizationMailing.new(:source => community) | |
60 | + assert_equal "#{community.environment.top_url}/#{community.name.to_slug}", mailing.url | |
61 | + end | |
62 | + | |
63 | + should 'deliver mailing to each member after create' do | |
64 | + mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) | |
65 | + process_delayed_job_queue | |
66 | + assert_equal 2, ActionMailer::Base.deliveries.count | |
67 | + end | |
68 | + | |
69 | + should 'create mailing sent to each recipient after delivering mailing' do | |
70 | + mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) | |
71 | + assert_difference MailingSent, :count, 2 do | |
72 | + process_delayed_job_queue | |
73 | + end | |
74 | + end | |
75 | + | |
76 | + should 'change locale according to the mailing locale' do | |
77 | + mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person) | |
78 | + Noosfero.expects(:with_locale).with('pt') | |
79 | + process_delayed_job_queue | |
80 | + end | |
81 | + | |
82 | + should 'have community by source_id' do | |
83 | + mailing = community.mailings.build(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) | |
84 | + mailing.save! | |
85 | + | |
86 | + assert_equal community, Mailing.find(mailing.id).source | |
87 | + end | |
88 | + | |
89 | + should 'return recipient' do | |
90 | + mailing = OrganizationMailing.new(:source => community) | |
91 | + assert_equal Person['user_one'], mailing.recipient | |
92 | + end | |
93 | + | |
94 | + should 'return true if already sent mailing to a recipient' do | |
95 | + member = Person['user_one'] | |
96 | + mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) | |
97 | + process_delayed_job_queue | |
98 | + assert mailing.already_sent_mailing_to?(member) | |
99 | + end | |
100 | + | |
101 | + should 'return false if did not sent mailing to a recipient' do | |
102 | + recipient = fast_create(Person) | |
103 | + mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) | |
104 | + process_delayed_job_queue | |
105 | + | |
106 | + assert !mailing.already_sent_mailing_to?(recipient) | |
107 | + end | |
108 | + | |
109 | + protected | |
110 | + | |
111 | + def url_for(url) | |
112 | + url | |
113 | + end | |
114 | + | |
115 | +end | ... | ... |
test/unit/profile_test.rb
... | ... | @@ -823,11 +823,16 @@ class ProfileTest < Test::Unit::TestCase |
823 | 823 | assert_equal 'code', p.nickname |
824 | 824 | end |
825 | 825 | |
826 | - should 'return truncated name in short_name if nickname is blank' do | |
826 | + should 'return truncated name in short_name with 15 chars by default if nickname is blank' do | |
827 | 827 | p = Profile.new(:name => 'a123456789abcdefghij') |
828 | 828 | assert_equal 'a123456789ab...', p.short_name |
829 | 829 | end |
830 | 830 | |
831 | + should 'return truncated name in short_name with chars size if nickname is blank' do | |
832 | + p = Profile.new(:name => 'a123456789abcdefghij') | |
833 | + assert_equal 'a123456...', p.short_name(10) | |
834 | + end | |
835 | + | |
831 | 836 | should 'provide custom header' do |
832 | 837 | assert_equal 'my custom header', Profile.new(:custom_header => 'my custom header').custom_header |
833 | 838 | end | ... | ... |