Commit 2d904cef0765a28161e2c6c0b8a4e239ace24845

Authored by Joenio Costa
1 parent dd777a43

ActionItem897: users must be approved before being able to use e-mail

app/controllers/my_profile/mailconf_controller.rb
... ... @@ -15,11 +15,27 @@ class MailconfController < MyProfileController
15 15 @user = profile.user
16 16 end
17 17  
18   - post_only :save
19   - def save
20   - profile.user.update_attributes(params[:user])
21   - flash[:notice] = _('e-Mail settings saved successfully.')
22   - redirect_to :action => 'index'
  18 + post_only :enable
  19 + def enable
  20 + @task = EmailActivation.new(:target => environment, :requestor => profile)
  21 + begin
  22 + @task.save!
  23 + flash[:notice] = _('Please fill your personal information below in order to get your mailbox approved by one of the administrators')
  24 + redirect_to :controller => 'profile_editor', :action => 'edit'
  25 + rescue Exception => ex
  26 + flash[:notice] = _('e-Mail was not enabled successfully.')
  27 + render :action => 'index'
  28 + end
  29 + end
  30 + post_only :disable
  31 + def disable
  32 + if profile.user.disable_email!
  33 + flash[:notice] = _('e-Mail disabled successfully.')
  34 + redirect_to :controller => 'profile_editor'
  35 + else
  36 + flash[:notice] = _('e-Mail was not disabled successfully.')
  37 + redirect_to :action => 'index'
  38 + end
23 39 end
24 40  
25 41 end
... ...
app/controllers/my_profile/profile_editor_controller.rb
... ... @@ -3,7 +3,7 @@ class ProfileEditorController < MyProfileController
3 3 protect 'edit_profile', :profile
4 4  
5 5 def index
6   - @pending_tasks = profile.tasks.pending.select{|i| user.has_permission?(i.permission, profile)}
  6 + @pending_tasks = profile.all_pending_tasks.select{|i| user.has_permission?(i.permission, profile)}
7 7 end
8 8  
9 9 helper :profile
... ...
app/controllers/my_profile/tasks_controller.rb
... ... @@ -3,11 +3,11 @@ class TasksController < MyProfileController
3 3 protect 'perform_task', :profile
4 4  
5 5 def index
6   - @tasks = profile.tasks.pending
  6 + @tasks = profile.all_pending_tasks
7 7 end
8 8  
9 9 def processed
10   - @tasks = profile.tasks.finished
  10 + @tasks = profile.all_finished_tasks
11 11 end
12 12  
13 13 VALID_DECISIONS = [ 'finish', 'cancel' ]
... ... @@ -15,7 +15,7 @@ class TasksController < MyProfileController
15 15 def close
16 16 decision = params[:decision]
17 17 if request.post? && VALID_DECISIONS.include?(decision) && params[:id]
18   - task = profile.tasks.find(params[:id])
  18 + task = profile.find_in_all_tasks(params[:id])
19 19 task.update_attributes!(params[:task])
20 20 task.send(decision)
21 21 end
... ...
app/controllers/public/enterprise_registration_controller.rb
... ... @@ -10,6 +10,9 @@ class EnterpriseRegistrationController < ApplicationController
10 10 # to the first step explicitly?
11 11 def index
12 12 @create_enterprise = CreateEnterprise.new(params[:create_enterprise])
  13 + if params[:create_enterprise] && params[:create_enterprise][:target_id]
  14 + @create_enterprise.target = Profile.find(params[:create_enterprise][:target_id])
  15 + end
13 16 @create_enterprise.requestor = current_user.person
14 17 the_action =
15 18 if request.post?
... ...
app/models/email_activation.rb 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +class EmailActivation < Task
  2 +
  3 + validates_presence_of :requestor_id, :target_id
  4 +
  5 + alias :environment :target
  6 + alias :person :requestor
  7 +
  8 + def validate_on_create
  9 + if !self.requestor.nil? && self.requestor.user.email_activation_pending?
  10 + self.errors.add_to_base(_('You have already requested activation of your mailbox.'))
  11 + end
  12 + end
  13 +
  14 + def description
  15 + _("'%{user} wants to activate email '%{email}'") % { :user => person.name, :email => person.email_addresses.join(', ') }
  16 + end
  17 +
  18 + def perform
  19 + person.user.enable_email!
  20 + end
  21 +
  22 + def sends_email?
  23 + false
  24 + end
  25 +
  26 +end
... ...
app/models/environment.rb
... ... @@ -3,6 +3,8 @@
3 3 # domains.
4 4 class Environment < ActiveRecord::Base
5 5  
  6 + has_many :tasks, :dependent => :destroy, :as => 'target'
  7 +
6 8 PERMISSIONS['Environment'] = {
7 9 'view_environment_admin_panel' => N_('View environment admin panel'),
8 10 'edit_environment_features' => N_('Edit environment features'),
... ...
app/models/profile.rb
... ... @@ -103,7 +103,32 @@ class Profile &lt; ActiveRecord::Base
103 103 has_many :consumptions
104 104 has_many :consumed_product_categories, :through => :consumptions, :source => :product_category
105 105  
106   - has_many :tasks, :foreign_key => :target_id, :dependent => :destroy
  106 + has_many :tasks, :dependent => :destroy, :as => 'target'
  107 +
  108 + %w[ pending finished ].each do |status|
  109 + class_eval <<-CODE
  110 + def all_#{status}_tasks
  111 + env_tasks = []
  112 + if self.person?
  113 + env_tasks = Environment.find(:all).select{ |env| self.is_admin?(env) }.map{ |env| env.tasks.#{status} }.flatten
  114 + end
  115 + tasks.#{status} + env_tasks
  116 + end
  117 + CODE
  118 + end
  119 +
  120 + def find_in_all_tasks(task_id)
  121 + if tasks.exists?(task_id)
  122 + return tasks.find(task_id)
  123 + else
  124 + if self.person?
  125 + environments_admin = Environment.find(:all).select{ |env| self.is_admin?(env) }
  126 + task = environments_admin.select{ |env| env.tasks.exists?(task_id) }.map{ |i| i.tasks.find(task_id) }
  127 + return task.first unless task.empty?
  128 + end
  129 + end
  130 + return nil
  131 + end
107 132  
108 133 has_many :profile_categorizations, :conditions => [ 'categories_profiles.virtual = ?', false ]
109 134 has_many :categories, :through => :profile_categorizations
... ...
app/models/task.rb
... ... @@ -28,7 +28,7 @@ class Task &lt; ActiveRecord::Base
28 28 end
29 29  
30 30 belongs_to :requestor, :class_name => 'Person', :foreign_key => :requestor_id
31   - belongs_to :target, :class_name => 'Profile', :foreign_key => :target_id
  31 + belongs_to :target, :foreign_key => :target_id, :polymorphic => true
32 32  
33 33 validates_uniqueness_of :code, :on => :create
34 34 validates_presence_of :code
... ...
app/models/user.rb
... ... @@ -185,6 +185,22 @@ class User &lt; ActiveRecord::Base
185 185 person.name
186 186 end
187 187  
  188 + def enable_email!
  189 + self.update_attribute(:enable_email, true)
  190 + end
  191 +
  192 + def disable_email!
  193 + self.update_attribute(:enable_email, false)
  194 + end
  195 +
  196 + def email_activation_pending?
  197 + if self.environment.nil?
  198 + return false
  199 + else
  200 + return EmailActivation.exists?(:requestor_id => self.person.id, :target_id => self.environment.id, :status => Task::Status::ACTIVE)
  201 + end
  202 + end
  203 +
188 204 protected
189 205 # before filter
190 206 def encrypt_password
... ...
app/views/mailconf/index.rhtml
1 1 <h1><%= _('e-Mail configuration') %></h1>
2 2  
3   -<% form_tag(:action => 'save') do %>
  3 +<%= error_messages_for :task %>
4 4  
5   - <div>
6   - <%= check_box :user, :enable_email %>
7   - <label for='user_enable_email'><%= _('Enable e-mail %s') % profile.email_addresses.join(', ') %></label>
8   - <blockquote>
9   - <%= _("Marking this option gives you an e-mail account with the address above. You'll be able to access a webmail from your user menu.") %>
10   - </blockquote>
11   - </div>
  5 +<% if profile.user.email_activation_pending? %>
  6 +
  7 + <p><%= _('You already request activation of your mailbox. Please wait until an administrator approves your request.') %></p>
12 8  
13 9 <% button_bar do %>
14   - <%= submit_button :save, _('Save') %>
15 10 <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
16 11 <% end %>
  12 +
  13 +<% else %>
  14 +
  15 +
  16 + <% if profile.user.enable_email %>
  17 +
  18 + <p><%= _("Disable e-Mail account below:") %></p>
  19 + <ul><%= profile.email_addresses.map{|i| content_tag('li', i)}.join("\n") %></ul>
  20 + <% button_bar do %>
  21 + <%= button(:cancel, _('Disable e-Mail'), { :action => 'disable' }, :method => 'post') %>
  22 + <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
  23 + <% end %>
  24 +
  25 + <% else %>
  26 +
  27 + <p><%= _("Enable e-Mail account below:") %></p>
  28 + <ul><%= profile.email_addresses.map{|i| content_tag('li', i)}.join("\n") %></ul>
  29 + <blockquote><%= _("You'll be able to access a webmail from your user menu.") %></blockquote>
  30 + <% button_bar do %>
  31 + <%= button(:ok, _('Enable e-Mail'), { :action => 'enable' }, :method => 'post') %>
  32 + <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
  33 + <% end %>
  34 +
  35 + <% end %>
  36 +
17 37 <% end %>
... ...
app/views/tasks/new.rhtml
... ... @@ -7,6 +7,7 @@
7 7 <% else %>
8 8 <%= display_form_field( _('To: '), f.select(:target_id, profile.friends.map{|p|[p.name, p.id]})) %>
9 9 <% end %>
  10 + <%= hidden_field_tag 'ticket[target_type]', 'Profile' %>
10 11 <%= f.text_field :title, :style => 'width:80%;' %>
11 12 <%= f.text_area :description, :style => 'height:200px; width:80%;' %>
12 13  
... ...
config/mail.yml.dist 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +enabled: true
  2 +webmail_url: "http://mail.yourdomain.net/"
... ...
db/migrate/061_add_target_type_column_for_task.rb 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +class AddTargetTypeColumnForTask < ActiveRecord::Migration
  2 + def self.up
  3 + add_column :tasks, :target_type, :string
  4 + execute "update tasks set target_type = 'Profile'"
  5 + end
  6 +
  7 + def self.down
  8 + remove_column :tasks, :target_type
  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 => 60) do
  12 +ActiveRecord::Schema.define(:version => 61) do
13 13  
14 14 create_table "article_versions", :force => true do |t|
15 15 t.integer "article_id"
... ... @@ -288,6 +288,7 @@ ActiveRecord::Schema.define(:version =&gt; 60) do
288 288 t.string "code", :limit => 40
289 289 t.string "type"
290 290 t.datetime "created_at"
  291 + t.string "target_type"
291 292 end
292 293  
293 294 create_table "thumbnails", :force => true do |t|
... ...
po/pt_BR/noosfero.po
... ... @@ -12,8 +12,13 @@
12 12 msgid ""
13 13 msgstr ""
14 14 "Project-Id-Version: noosfero 0.13.0\n"
  15 +<<<<<<< HEAD:po/pt_BR/noosfero.po
15 16 "POT-Creation-Date: 2009-01-30 15:19-0300\n"
16   -"PO-Revision-Date: 2009-02-02 19:06-0300\n"
  17 +"PO-Revision-Date: 2009-02-03 18:38-0300\n"
  18 +=======
  19 +"POT-Creation-Date: 2009-01-06 16:46-0300\n"
  20 +"PO-Revision-Date: 2009-01-28 18:24-0300\n"
  21 +>>>>>>> ActionItem897-novo:po/pt_BR/noosfero.po
17 22 "Last-Translator: Joenio Costa <joenio@colivre.coop.br>\n"
18 23 "Language-Team: LANGUAGE <LL@li.org>\n"
19 24 "MIME-Version: 1.0\n"
... ... @@ -4542,6 +4547,10 @@ msgstr &quot;%s quer publicar conteúdo: %s.&quot;
4542 4547 msgid "Name for publishing"
4543 4548 msgstr "Nome para publicação"
4544 4549  
  4550 +#: app/views/mailconf/index.rhtml:1
  4551 +msgid "e-Mail configuration"
  4552 +msgstr "Configuração de e-Mail"
  4553 +
4545 4554 #: app/views/tasks/_approve_article.rhtml:24
4546 4555 msgid "Comment for author"
4547 4556 msgstr "Comentário para o autor"
... ...
test/fixtures/roles.yml
... ... @@ -55,3 +55,10 @@ profile_moderator:
55 55 system: true
56 56 permissions:
57 57 - moderate_comments
  58 +environment_administrator:
  59 + id: 8
  60 + key: 'environment_administrator'
  61 + name: 'Environment administrator'
  62 + system: true
  63 + permissions:
  64 + - perform_task
... ...
test/functional/mailconf_controller_test.rb
... ... @@ -51,28 +51,18 @@ class MailconfControllerTest &lt; Test::Unit::TestCase
51 51 login_as('ze')
52 52 get :index, :profile => 'ze'
53 53 assert_tag(
54   - :tag => 'form',
55   - :attributes => { :action => '/myprofile/ze/mailconf/save'},
56   - :descendant => {
57   - :tag => 'input',
58   - :attributes => { :name => 'user[enable_email]', :type => 'checkbox' }
59   - }
  54 + :tag => 'a',
  55 + :content => 'Enable e-Mail',
  56 + :attributes => {:href => '/myprofile/ze/mailconf/enable'}
60 57 )
61 58 end
62 59  
63   - should 'display correctly the state true of e-mail enable/disable' do
64   - login_as('ze')
65   - users(:ze).update_attributes!(:enable_email => true)
66   - get :index, :profile => 'ze'
67   - assert_tag :tag => 'input', :attributes => { :name => 'user[enable_email]', :type => 'checkbox', :value => '1', :checked => 'checked' }
68   - end
69   -
70 60 should 'display correctly the state false of e-mail enable/disable' do
71 61 login_as('ze')
72 62 users(:ze).update_attributes!(:enable_email => false)
73 63 get :index, :profile => 'ze'
74   - assert_no_tag :tag => 'input', :attributes => { :name => 'user[enable_email]', :type => 'checkbox', :value => '1', :checked => 'checked' }
75   - assert_tag :tag => 'input', :attributes => { :name => 'user[enable_email]', :type => 'hidden', :value => '0' }
  64 + assert_tag :tag => 'a', :content => 'Enable e-Mail'
  65 + assert_no_tag :tag => 'a', :content => 'Disable e-Mail', :attributes => { :href => '/myprofile/ze/mailconf/disable' }
76 66 end
77 67  
78 68 should 'not display www in email address when force_www=true' do
... ... @@ -81,7 +71,7 @@ class MailconfControllerTest &lt; Test::Unit::TestCase
81 71 env.force_www = true
82 72 env.save!
83 73 get :index, :profile => 'ze'
84   - assert_tag :tag => 'label', :attributes => { :for => 'user_enable_email' }, :content => /ze@colivre.net/
  74 + assert_tag :tag => 'li', :content => /ze@colivre.net/
85 75 end
86 76  
87 77 should 'not display www in email address when force_www=false' do
... ... @@ -90,30 +80,38 @@ class MailconfControllerTest &lt; Test::Unit::TestCase
90 80 env.force_www = false
91 81 env.save!
92 82 get :index, :profile => 'ze'
93   - assert_tag :tag => 'label', :attributes => { :for => 'user_enable_email' }, :content => /ze@colivre.net/
  83 + assert_tag :tag => 'li', :content => /ze@colivre.net/
94 84 end
95 85  
96   - should 'save mail enable/disable as true' do
  86 + should 'create task to environment admin when enable email' do
97 87 login_as('ze')
98   - post :save, :profile => 'ze', :user => { :enable_email => '1' }
99   - assert Profile['ze'].user.enable_email
  88 + assert_difference EmailActivation, :count do
  89 + post :enable, :profile => 'ze'
  90 + end
100 91 end
101 92  
102 93 should 'save mail enable/disable as false' do
103 94 login_as('ze')
104   - post :save, :profile => 'ze', :user => { :enable_email => '0' }
  95 + assert users(:ze).enable_email!
  96 + post :disable, :profile => 'ze'
105 97 assert !Profile['ze'].user.enable_email
106 98 end
107 99  
108 100 should 'go back on save' do
109 101 login_as('ze')
110   - post :save, :profile => 'ze'
111   - assert_redirected_to :action => 'index'
  102 + post :enable, :profile => 'ze'
  103 + assert_redirected_to :controller => 'profile_editor'
  104 + end
  105 +
  106 + should 'go to profile editor after enable email' do
  107 + login_as('ze')
  108 + post :enable, :profile => 'ze'
  109 + assert_redirected_to :controller => 'profile_editor', :action => 'edit'
112 110 end
113 111  
114 112 should 'display notice after saving' do
115 113 login_as('ze')
116   - post :save, :profile => 'ze'
  114 + post :enable, :profile => 'ze'
117 115 assert_kind_of String, flash[:notice]
118 116 end
119 117  
... ... @@ -123,4 +121,12 @@ class MailconfControllerTest &lt; Test::Unit::TestCase
123 121 assert_tag :tag => 'div', :attributes => { :id => 'content'}, :descendant => { :tag => 'a', :attributes => { :href => '/myprofile/ze' } }
124 122 end
125 123  
  124 + should 'not display input for enable/disable e-mail when has pending_enable_email' do
  125 + login_as('ze')
  126 + users(:ze).update_attribute(:environment_id, Environment.default.id)
  127 + EmailActivation.create!(:requestor => users(:ze).person, :target => Environment.default)
  128 + get :index, :profile => 'ze'
  129 + assert_no_tag :tag => 'input', :attributes => {:name => 'user[enable_email]', :type => 'checkbox'}
  130 + end
  131 +
126 132 end
... ...
test/functional/profile_editor_controller_test.rb
... ... @@ -46,8 +46,7 @@ class ProfileEditorControllerTest &lt; Test::Unit::TestCase
46 46 pending = []
47 47 pending.expects(:select).returns(pending)
48 48 pending.expects(:empty?).returns(false) # force the display of the pending tasks list
49   - tasks.expects(:pending).returns(pending)
50   - ze.expects(:tasks).returns(tasks)
  49 + ze.expects(:all_pending_tasks).returns(pending)
51 50 get :index, :profile => ze.identifier
52 51 assert_same pending, assigns(:pending_tasks)
53 52 assert_tag :tag => 'div', :attributes => { :class => 'pending-tasks' }, :descendant => { :tag => 'a', :attributes => { :href => '/myprofile/ze/tasks' } }
... ...
test/functional/tasks_controller_test.rb
... ... @@ -147,7 +147,8 @@ class TasksControllerTest &lt; Test::Unit::TestCase
147 147 f = create_user('friend').person
148 148 profile.add_friend f
149 149  
150   - post :new, :profile => profile.identifier, :ticket => {:title => 'test ticket', :target_id => f.id}
  150 + post :new, :profile => profile.identifier, :ticket => {:title => 'test ticket', :target_id => f.id, :target_type => 'Profile'}
  151 + assert_response :redirect
151 152  
152 153 assert_equal f, assigns(:ticket).target
153 154 end
... ...
test/integration/enterprise_registration_test.rb
... ... @@ -39,6 +39,7 @@ class EnterpriseRegistrationTest &lt; ActionController::IntegrationTest
39 39 post '/enterprise_registration', :create_enterprise => data.merge(:target_id => org.id)
40 40 end
41 41  
  42 + assert_template 'confirmation'
42 43 assert_tag :tag => 'a', :attributes => { :href => '/' }
43 44  
44 45 code = CreateEnterprise.find(:first, :order => 'id desc').code
... ...
test/unit/create_enterprise_test.rb
... ... @@ -109,8 +109,8 @@ class CreateEnterpriseTest &lt; Test::Unit::TestCase
109 109 :legal_form => 'cooperative',
110 110 :economic_activity => 'free software',
111 111 :region_id => region.id,
112   - :requestor_id => person.id,
113   - :target_id => validator.id,
  112 + :requestor => person,
  113 + :target => validator,
114 114 })
115 115  
116 116 enterprise = Enterprise.new
... ... @@ -143,8 +143,8 @@ class CreateEnterpriseTest &lt; Test::Unit::TestCase
143 143 :legal_form => 'cooperative',
144 144 :economic_activity => 'free software',
145 145 :region_id => region.id,
146   - :requestor_id => person.id,
147   - :target_id => validator.id,
  146 + :requestor => person,
  147 + :target => validator,
148 148 })
149 149  
150 150 enterprise = Enterprise.new
... ...
test/unit/email_activation_test.rb 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class EmailActivationTest < Test::Unit::TestCase
  4 +
  5 + should 'require a requestor' do
  6 + task = EmailActivation.new
  7 + task.valid?
  8 +
  9 + assert task.errors.invalid?(:requestor_id)
  10 + end
  11 +
  12 + should 'require a target (environment)' do
  13 + task = EmailActivation.new
  14 + task.valid?
  15 +
  16 + assert task.errors.invalid?(:target_id)
  17 + end
  18 +
  19 + should 'enable user email when finish' do
  20 + ze = create_user('zezinho', :environment_id => Environment.default.id)
  21 + assert !ze.enable_email
  22 + task = EmailActivation.create!(:requestor => ze.person, :target => Environment.default)
  23 + task.finish
  24 + ze.reload
  25 + assert ze.enable_email
  26 + end
  27 +
  28 + should 'create only once pending task by user' do
  29 + ze = create_user('zezinho', :environment_id => Environment.default.id)
  30 + task = EmailActivation.new(:requestor => ze.person, :target => Environment.default)
  31 + assert task.save!
  32 +
  33 + anothertask = EmailActivation.new(:requestor => ze.person, :target => Environment.default)
  34 + assert !anothertask.save
  35 + end
  36 +
  37 + should 'display email address on description of task' do
  38 + ze = create_user('zezinho', :environment_id => Environment.default.id)
  39 + Environment.default.domains = [Domain.create!(:name => 'env_test.invalid')]
  40 + task = EmailActivation.new(:requestor => ze.person, :target => Environment.default)
  41 + assert_match /zezinho@env_test.invalid/, task.description
  42 + end
  43 +
  44 +end
... ...
test/unit/environment_test.rb
... ... @@ -681,4 +681,11 @@ class EnvironmentTest &lt; Test::Unit::TestCase
681 681 assert_equal ['Category'], Environment.new.category_types
682 682 end
683 683  
  684 + should 'has tasks' do
  685 + e = Environment.default
  686 + assert_nothing_raised do
  687 + e.tasks
  688 + end
  689 + end
  690 +
684 691 end
... ...
test/unit/profile_test.rb
... ... @@ -1198,6 +1198,56 @@ class ProfileTest &lt; Test::Unit::TestCase
1198 1198 assert community.enable_contact?
1199 1199 end
1200 1200  
  1201 + should 'include pending tasks from environment if is admin' do
  1202 + env = Environment.default
  1203 + person = create_user('molly').person
  1204 + task = Task.create!(:requestor => person, :target => env)
  1205 +
  1206 + Person.any_instance.stubs(:is_admin?).returns(true)
  1207 + assert_equal [task], person.all_pending_tasks
  1208 + end
  1209 +
  1210 + should 'find task from environment if is admin' do
  1211 + env = Environment.default
  1212 + person = create_user('molly').person
  1213 + task = Task.create!(:requestor => person, :target => env)
  1214 +
  1215 + Person.any_instance.stubs(:is_admin?).returns(true)
  1216 + assert_equal task, person.find_in_all_tasks(task.id)
  1217 + end
  1218 +
  1219 + should 'find task from all environment if is admin' do
  1220 + env = Environment.default
  1221 + another = Environment.create!(:name => 'another_env')
  1222 + person = Person['ze']
  1223 + task1 = Task.create!(:requestor => person, :target => env)
  1224 + task2 = Task.create!(:requestor => person, :target => another)
  1225 +
  1226 + another.affiliate(person, Environment::Roles.admin)
  1227 + env.affiliate(person, Environment::Roles.admin)
  1228 +
  1229 + Person.any_instance.stubs(:is_admin?).returns(true)
  1230 +
  1231 + assert_equal [task1, task2], person.all_pending_tasks
  1232 + end
  1233 +
  1234 + should 'find task by id on all environments' do
  1235 + env = Environment.create!(:name => 'other_env')
  1236 + another = Environment.create!(:name => 'another_env')
  1237 + person = Person['ze']
  1238 +
  1239 + task1 = Task.create!(:requestor => person, :target => env)
  1240 + task2 = Task.create!(:requestor => person, :target => another)
  1241 +
  1242 + person.stubs(:is_admin?).with(env).returns(true)
  1243 + Environment.find(:all).select{|i| i.name != 'other_env'}.each do |env|
  1244 + person.stubs(:is_admin?).with(env).returns(false)
  1245 + end
  1246 +
  1247 + assert_not_nil person.find_in_all_tasks(task1.id)
  1248 + assert_nil person.find_in_all_tasks(task2.id)
  1249 + end
  1250 +
1201 1251 private
1202 1252  
1203 1253 def assert_invalid_identifier(id)
... ...
test/unit/task_test.rb
... ... @@ -20,10 +20,10 @@ class TaskTest &lt; Test::Unit::TestCase
20 20 end
21 21 end
22 22  
23   - def test_relationship_with_target
  23 + should 'target be able to polymorphic relationship' do
24 24 t = Task.create
25   - assert_raise ActiveRecord::AssociationTypeMismatch do
26   - t.target = 1
  25 + assert_nothing_raised do
  26 + t.target = Environment.new
27 27 end
28 28 assert_nothing_raised do
29 29 t.target = Profile.new
... ...
test/unit/user_test.rb
... ... @@ -262,6 +262,27 @@ class UserTest &lt; Test::Unit::TestCase
262 262 assert_equal false, User.new.enable_email
263 263 end
264 264  
  265 + should 'enable email' do
  266 + user = create_user('cooler')
  267 + assert !user.enable_email
  268 + assert user.enable_email!
  269 + assert user.enable_email
  270 + end
  271 +
  272 + should 'has email activation pending' do
  273 + user = create_user('cooler')
  274 + user.update_attribute(:environment_id, Environment.default.id)
  275 + EmailActivation.create!(:requestor => user.person, :target => Environment.default)
  276 + assert user.email_activation_pending?
  277 + end
  278 +
  279 + should 'not has email activation pending if not have environment' do
  280 + user = create_user('cooler')
  281 + user.expects(:environment).returns(nil)
  282 + EmailActivation.create!(:requestor => user.person, :target => Environment.default)
  283 + assert !user.email_activation_pending?
  284 + end
  285 +
265 286 protected
266 287 def new_user(options = {})
267 288 user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options))
... ...