Commit 4bfa4aaae5e636c392779411c3c640c008e59f0d
Exists in
fix_sign_up_form
Merge branch 'all_pending_tasks_api' into 'master'
api: list all pending tasks for the current person See merge request !979
Showing
8 changed files
with
357 additions
and
195 deletions
Show diff stats
app/api/entities.rb
@@ -263,6 +263,14 @@ module Api | @@ -263,6 +263,14 @@ module Api | ||
263 | root 'tasks', 'task' | 263 | root 'tasks', 'task' |
264 | expose :id | 264 | expose :id |
265 | expose :type | 265 | expose :type |
266 | + expose :requestor, using: Profile | ||
267 | + expose :status | ||
268 | + expose :created_at | ||
269 | + expose :data | ||
270 | + expose :target do |task, options| | ||
271 | + type_map = {Profile => ::Profile, Environment => ::Environment}.find {|h| task.target.kind_of?(h.last)} | ||
272 | + type_map.first.represent(task.target) unless type_map.nil? | ||
273 | + end | ||
266 | end | 274 | end |
267 | 275 | ||
268 | class Environment < Entity | 276 | class Environment < Entity |
app/api/helpers.rb
@@ -4,7 +4,7 @@ require 'tempfile' | @@ -4,7 +4,7 @@ require 'tempfile' | ||
4 | module Api | 4 | module Api |
5 | module Helpers | 5 | module Helpers |
6 | PRIVATE_TOKEN_PARAM = :private_token | 6 | PRIVATE_TOKEN_PARAM = :private_token |
7 | - DEFAULT_ALLOWED_PARAMETERS = [:parent_id, :from, :until, :content_type, :author_id, :identifier, :archived] | 7 | + ALLOWED_PARAMETERS = [:parent_id, :from, :until, :content_type, :author_id, :identifier, :archived, :status] |
8 | 8 | ||
9 | include SanitizeParams | 9 | include SanitizeParams |
10 | include Noosfero::Plugin::HotSpot | 10 | include Noosfero::Plugin::HotSpot |
@@ -124,8 +124,8 @@ module Api | @@ -124,8 +124,8 @@ module Api | ||
124 | present_partial article, with: Entities::Article, params: params, current_person: current_person | 124 | present_partial article, with: Entities::Article, params: params, current_person: current_person |
125 | end | 125 | end |
126 | 126 | ||
127 | - def present_articles_for_asset(asset, method = 'articles') | ||
128 | - articles = find_articles(asset, method) | 127 | + def present_articles_for_asset(asset, method_or_relation = 'articles') |
128 | + articles = find_articles(asset, method_or_relation) | ||
129 | present_articles(articles) | 129 | present_articles(articles) |
130 | end | 130 | end |
131 | 131 | ||
@@ -133,8 +133,8 @@ module Api | @@ -133,8 +133,8 @@ module Api | ||
133 | present_partial paginate(articles), :with => Entities::Article, :params => params, current_person: current_person | 133 | present_partial paginate(articles), :with => Entities::Article, :params => params, current_person: current_person |
134 | end | 134 | end |
135 | 135 | ||
136 | - def find_articles(asset, method = 'articles') | ||
137 | - articles = select_filtered_collection_of(asset, method, params) | 136 | + def find_articles(asset, method_or_relation = 'articles') |
137 | + articles = select_filtered_collection_of(asset, method_or_relation, params) | ||
138 | if current_person.present? | 138 | if current_person.present? |
139 | articles = articles.display_filter(current_person, nil) | 139 | articles = articles.display_filter(current_person, nil) |
140 | else | 140 | else |
@@ -143,8 +143,9 @@ module Api | @@ -143,8 +143,9 @@ module Api | ||
143 | articles | 143 | articles |
144 | end | 144 | end |
145 | 145 | ||
146 | - def find_task(asset, id) | ||
147 | - task = asset.tasks.find_by(id: id) | 146 | + def find_task(asset, method_or_relation, id) |
147 | + task = is_a_relation?(method_or_relation) ? method_or_relation : asset.send(method_or_relation) | ||
148 | + task = task.find_by_id(id) | ||
148 | not_found! if task.blank? | 149 | not_found! if task.blank? |
149 | current_person.has_permission?(task.permission, asset) ? task : forbidden! | 150 | current_person.has_permission?(task.permission, asset) ? task : forbidden! |
150 | end | 151 | end |
@@ -152,6 +153,7 @@ module Api | @@ -152,6 +153,7 @@ module Api | ||
152 | def post_task(asset, params) | 153 | def post_task(asset, params) |
153 | klass_type= params[:content_type].nil? ? 'Task' : params[:content_type] | 154 | klass_type= params[:content_type].nil? ? 'Task' : params[:content_type] |
154 | return forbidden! unless klass_type.constantize <= Task | 155 | return forbidden! unless klass_type.constantize <= Task |
156 | + return forbidden! if !current_person.has_permission?(:perform_task, asset) | ||
155 | 157 | ||
156 | task = klass_type.constantize.new(params[:task]) | 158 | task = klass_type.constantize.new(params[:task]) |
157 | task.requestor_id = current_person.id | 159 | task.requestor_id = current_person.id |
@@ -164,15 +166,24 @@ module Api | @@ -164,15 +166,24 @@ module Api | ||
164 | present_partial task, :with => Entities::Task | 166 | present_partial task, :with => Entities::Task |
165 | end | 167 | end |
166 | 168 | ||
167 | - def present_task(asset) | ||
168 | - task = find_task(asset, params[:id]) | 169 | + def find_tasks(asset, method_or_relation = 'tasks') |
170 | + return forbidden! if !current_person.has_permission?(:perform_task, asset) | ||
171 | + tasks = select_filtered_collection_of(asset, method_or_relation, params) | ||
172 | + tasks = tasks.select {|t| current_person.has_permission?(t.permission, asset)} | ||
173 | + tasks | ||
174 | + end | ||
175 | + | ||
176 | + def present_task(asset, method_or_relation = 'tasks') | ||
177 | + task = find_task(asset, method_or_relation, params[:id]) | ||
169 | present_partial task, :with => Entities::Task | 178 | present_partial task, :with => Entities::Task |
170 | end | 179 | end |
171 | 180 | ||
172 | - def present_tasks(asset) | ||
173 | - tasks = select_filtered_collection_of(asset, 'tasks', params) | ||
174 | - tasks = tasks.select {|t| current_person.has_permission?(t.permission, asset)} | ||
175 | - return forbidden! if tasks.empty? && !current_person.has_permission?(:perform_task, asset) | 181 | + def present_tasks_for_asset(asset, method_or_relation = 'tasks') |
182 | + tasks = find_tasks(asset, method_or_relation) | ||
183 | + present_tasks(tasks) | ||
184 | + end | ||
185 | + | ||
186 | + def present_tasks(tasks) | ||
176 | present_partial tasks, :with => Entities::Task | 187 | present_partial tasks, :with => Entities::Task |
177 | end | 188 | end |
178 | 189 | ||
@@ -181,7 +192,6 @@ module Api | @@ -181,7 +192,6 @@ module Api | ||
181 | conditions = {} | 192 | conditions = {} |
182 | from_date = DateTime.parse(parsed_params.delete(:from)) if parsed_params[:from] | 193 | from_date = DateTime.parse(parsed_params.delete(:from)) if parsed_params[:from] |
183 | until_date = DateTime.parse(parsed_params.delete(:until)) if parsed_params[:until] | 194 | until_date = DateTime.parse(parsed_params.delete(:until)) if parsed_params[:until] |
184 | - | ||
185 | conditions[:type] = parse_content_type(parsed_params.delete(:content_type)) unless parsed_params[:content_type].nil? | 195 | conditions[:type] = parse_content_type(parsed_params.delete(:content_type)) unless parsed_params[:content_type].nil? |
186 | 196 | ||
187 | conditions[:created_at] = period(from_date, until_date) if from_date || until_date | 197 | conditions[:created_at] = period(from_date, until_date) if from_date || until_date |
@@ -191,7 +201,7 @@ module Api | @@ -191,7 +201,7 @@ module Api | ||
191 | end | 201 | end |
192 | 202 | ||
193 | # changing make_order_with_parameters to avoid sql injection | 203 | # changing make_order_with_parameters to avoid sql injection |
194 | - def make_order_with_parameters(object, method, params) | 204 | + def make_order_with_parameters(object, method_or_relation, params) |
195 | order = "created_at DESC" | 205 | order = "created_at DESC" |
196 | unless params[:order].blank? | 206 | unless params[:order].blank? |
197 | if params[:order].include? '\'' or params[:order].include? '"' | 207 | if params[:order].include? '\'' or params[:order].include? '"' |
@@ -200,9 +210,9 @@ module Api | @@ -200,9 +210,9 @@ module Api | ||
200 | order = 'RANDOM()' | 210 | order = 'RANDOM()' |
201 | else | 211 | else |
202 | field_name, direction = params[:order].split(' ') | 212 | field_name, direction = params[:order].split(' ') |
203 | - assoc = object.class.reflect_on_association(method.to_sym) | ||
204 | - if !field_name.blank? and assoc | ||
205 | - if assoc.klass.attribute_names.include? field_name | 213 | + assoc_class = extract_associated_classname(method_or_relation) |
214 | + if !field_name.blank? and assoc_class | ||
215 | + if assoc_class.attribute_names.include? field_name | ||
206 | if direction.present? and ['ASC','DESC'].include? direction.upcase | 216 | if direction.present? and ['ASC','DESC'].include? direction.upcase |
207 | order = "#{field_name} #{direction.upcase}" | 217 | order = "#{field_name} #{direction.upcase}" |
208 | end | 218 | end |
@@ -213,12 +223,14 @@ module Api | @@ -213,12 +223,14 @@ module Api | ||
213 | return order | 223 | return order |
214 | end | 224 | end |
215 | 225 | ||
216 | - def make_timestamp_with_parameters_and_method(params, method) | 226 | + def make_timestamp_with_parameters_and_method(params, method_or_relation) |
217 | timestamp = nil | 227 | timestamp = nil |
218 | if params[:timestamp] | 228 | if params[:timestamp] |
219 | datetime = DateTime.parse(params[:timestamp]) | 229 | datetime = DateTime.parse(params[:timestamp]) |
220 | - table_name = method.to_s.singularize.camelize.constantize.table_name | ||
221 | - timestamp = "#{table_name}.updated_at >= '#{datetime}'" | 230 | + table_name = extract_associated_tablename(method_or_relation) |
231 | + assoc_class = extract_associated_classname(method_or_relation) | ||
232 | + date_atrr = assoc_class.attribute_names.include?('updated_at') ? 'updated_at' : 'created_at' | ||
233 | + timestamp = "#{table_name}.#{date_atrr} >= '#{datetime}'" | ||
222 | end | 234 | end |
223 | 235 | ||
224 | timestamp | 236 | timestamp |
@@ -243,12 +255,12 @@ module Api | @@ -243,12 +255,12 @@ module Api | ||
243 | end | 255 | end |
244 | end | 256 | end |
245 | 257 | ||
246 | - def select_filtered_collection_of(object, method, params) | 258 | + def select_filtered_collection_of(object, method_or_relation, params) |
247 | conditions = make_conditions_with_parameter(params) | 259 | conditions = make_conditions_with_parameter(params) |
248 | - order = make_order_with_parameters(object,method,params) | ||
249 | - timestamp = make_timestamp_with_parameters_and_method(params, method) | 260 | + order = make_order_with_parameters(object,method_or_relation,params) |
261 | + timestamp = make_timestamp_with_parameters_and_method(params, method_or_relation) | ||
250 | 262 | ||
251 | - objects = object.send(method) | 263 | + objects = is_a_relation?(method_or_relation) ? method_or_relation : object.send(method_or_relation) |
252 | objects = by_reference(objects, params) | 264 | objects = by_reference(objects, params) |
253 | objects = by_categories(objects, params) | 265 | objects = by_categories(objects, params) |
254 | 266 | ||
@@ -394,10 +406,27 @@ module Api | @@ -394,10 +406,27 @@ module Api | ||
394 | end | 406 | end |
395 | private | 407 | private |
396 | 408 | ||
409 | + def extract_associated_tablename(method_or_relation) | ||
410 | + extract_associated_classname(method_or_relation).table_name | ||
411 | + end | ||
412 | + | ||
413 | + def extract_associated_classname(method_or_relation) | ||
414 | + if is_a_relation?(method_or_relation) | ||
415 | + method_or_relation.blank? ? '' : method_or_relation.first.class | ||
416 | + else | ||
417 | + method_or_relation.to_s.singularize.camelize.constantize | ||
418 | + end | ||
419 | + end | ||
420 | + | ||
421 | + def is_a_relation?(method_or_relation) | ||
422 | + method_or_relation.kind_of?(ActiveRecord::Relation) | ||
423 | + end | ||
424 | + | ||
425 | + | ||
397 | def parser_params(params) | 426 | def parser_params(params) |
398 | parsed_params = {} | 427 | parsed_params = {} |
399 | params.map do |k,v| | 428 | params.map do |k,v| |
400 | - parsed_params[k.to_sym] = v if DEFAULT_ALLOWED_PARAMETERS.include?(k.to_sym) | 429 | + parsed_params[k.to_sym] = v if ALLOWED_PARAMETERS.include?(k.to_sym) |
401 | end | 430 | end |
402 | parsed_params | 431 | parsed_params |
403 | end | 432 | end |
app/api/v1/tasks.rb
@@ -3,9 +3,12 @@ module Api | @@ -3,9 +3,12 @@ module Api | ||
3 | class Tasks < Grape::API | 3 | class Tasks < Grape::API |
4 | before { authenticate! } | 4 | before { authenticate! } |
5 | 5 | ||
6 | + MAX_PER_PAGE = 50 | ||
7 | + | ||
6 | resource :tasks do | 8 | resource :tasks do |
7 | 9 | ||
8 | - # Collect tasks | 10 | + paginate max_per_page: MAX_PER_PAGE |
11 | + # Collect all tasks that current person has permission | ||
9 | # | 12 | # |
10 | # Parameters: | 13 | # Parameters: |
11 | # from - date where the search will begin. If nothing is passed the default date will be the date of the first article created | 14 | # from - date where the search will begin. If nothing is passed the default date will be the date of the first article created |
@@ -15,20 +18,19 @@ module Api | @@ -15,20 +18,19 @@ module Api | ||
15 | # Example Request: | 18 | # Example Request: |
16 | # GET host/api/v1/tasks?from=2013-04-04-14:41:43&until=2015-04-04-14:41:43&limit=10&private_token=e96fff37c2238fdab074d1dcea8e6317 | 19 | # GET host/api/v1/tasks?from=2013-04-04-14:41:43&until=2015-04-04-14:41:43&limit=10&private_token=e96fff37c2238fdab074d1dcea8e6317 |
17 | get do | 20 | get do |
18 | - present_tasks(environment) | 21 | + tasks = Task.to(current_person) |
22 | + present_tasks_for_asset(current_person, tasks) | ||
19 | end | 23 | end |
20 | 24 | ||
21 | desc "Return the task id" | 25 | desc "Return the task id" |
22 | get ':id' do | 26 | get ':id' do |
23 | - task = find_task(environment, params[:id]) | ||
24 | - present_partial task, :with => Entities::Task | 27 | + present_task(current_person, Task.to(current_person)) |
25 | end | 28 | end |
26 | 29 | ||
27 | %w[finish cancel].each do |action| | 30 | %w[finish cancel].each do |action| |
28 | desc "#{action.capitalize} a task" | 31 | desc "#{action.capitalize} a task" |
29 | put ":id/#{action}" do | 32 | put ":id/#{action}" do |
30 | - authenticate! | ||
31 | - task = find_task(current_person, params[:id]) | 33 | + task = find_task(current_person, Task.to(current_person), params[:id]) |
32 | task.send(action, current_person) if (task.status == Task::Status::ACTIVE) | 34 | task.send(action, current_person) if (task.status == Task::Status::ACTIVE) |
33 | present_partial task, :with => Entities::Task | 35 | present_partial task, :with => Entities::Task |
34 | end | 36 | end |
@@ -42,7 +44,8 @@ module Api | @@ -42,7 +44,8 @@ module Api | ||
42 | resource :tasks do | 44 | resource :tasks do |
43 | get do | 45 | get do |
44 | profile = environment.send(kind.pluralize).find(params["#{kind}_id"]) | 46 | profile = environment.send(kind.pluralize).find(params["#{kind}_id"]) |
45 | - present_tasks(profile) | 47 | + tasks = Task.to(profile) |
48 | + present_tasks_for_asset(profile, tasks) | ||
46 | end | 49 | end |
47 | 50 | ||
48 | get ':id' do | 51 | get ':id' do |
app/controllers/my_profile/tasks_controller.rb
@@ -14,7 +14,7 @@ class TasksController < MyProfileController | @@ -14,7 +14,7 @@ class TasksController < MyProfileController | ||
14 | @filter_text = params[:filter_text].presence | 14 | @filter_text = params[:filter_text].presence |
15 | @filter_responsible = params[:filter_responsible] | 15 | @filter_responsible = params[:filter_responsible] |
16 | @task_types = Task.pending_types_for(profile) | 16 | @task_types = Task.pending_types_for(profile) |
17 | - @tasks = Task.pending_all(profile, @filter_type, @filter_text).order_by('created_at', 'asc').paginate(:per_page => Task.per_page, :page => params[:page]) | 17 | + @tasks = Task.pending_all_by_filter(profile, @filter_type, @filter_text).order_by('created_at', 'asc').paginate(:per_page => Task.per_page, :page => params[:page]) |
18 | @tasks = @tasks.where(:responsible_id => @filter_responsible.to_i != -1 ? @filter_responsible : nil) if @filter_responsible.present? | 18 | @tasks = @tasks.where(:responsible_id => @filter_responsible.to_i != -1 ? @filter_responsible : nil) if @filter_responsible.present? |
19 | @tasks = @tasks.paginate(:per_page => Task.per_page, :page => params[:page]) | 19 | @tasks = @tasks.paginate(:per_page => Task.per_page, :page => params[:page]) |
20 | @failed = params ? params[:failed] : {} | 20 | @failed = params ? params[:failed] : {} |
@@ -101,7 +101,7 @@ class TasksController < MyProfileController | @@ -101,7 +101,7 @@ class TasksController < MyProfileController | ||
101 | def search_tasks | 101 | def search_tasks |
102 | filter_type = params[:filter_type].presence | 102 | filter_type = params[:filter_type].presence |
103 | filter_text = params[:filter_text].presence | 103 | filter_text = params[:filter_text].presence |
104 | - result = Task.pending_all(profile,filter_type, filter_text) | 104 | + result = Task.pending_all_by_filter(profile,filter_type, filter_text) |
105 | 105 | ||
106 | render :json => result.map { |task| {:label => task.data[:name], :value => task.data[:name]} } | 106 | render :json => result.map { |task| {:label => task.data[:name], :value => task.data[:name]} } |
107 | end | 107 | end |
app/models/task.rb
@@ -314,7 +314,7 @@ class Task < ApplicationRecord | @@ -314,7 +314,7 @@ class Task < ApplicationRecord | ||
314 | where "LOWER(#{field}) LIKE ?", "%#{value.downcase}%" | 314 | where "LOWER(#{field}) LIKE ?", "%#{value.downcase}%" |
315 | end | 315 | end |
316 | } | 316 | } |
317 | - scope :pending_all, -> profile, filter_type, filter_text { | 317 | + scope :pending_all_by_filter, -> profile, filter_type, filter_text { |
318 | self.to(profile).without_spam.pending.of(filter_type).like('data', filter_text) | 318 | self.to(profile).without_spam.pending.of(filter_type).like('data', filter_text) |
319 | } | 319 | } |
320 | 320 | ||
@@ -323,10 +323,17 @@ class Task < ApplicationRecord | @@ -323,10 +323,17 @@ class Task < ApplicationRecord | ||
323 | if profile.person? | 323 | if profile.person? |
324 | envs_ids = Environment.all.select{ |env| profile.is_admin?(env) }.map{ |env| "target_id = #{env.id}"}.join(' OR ') | 324 | envs_ids = Environment.all.select{ |env| profile.is_admin?(env) }.map{ |env| "target_id = #{env.id}"}.join(' OR ') |
325 | environment_condition = envs_ids.blank? ? nil : "(target_type = 'Environment' AND (#{envs_ids}))" | 325 | environment_condition = envs_ids.blank? ? nil : "(target_type = 'Environment' AND (#{envs_ids}))" |
326 | + | ||
327 | + organizations = profile.memberships.all.select do |organization| | ||
328 | + profile.has_permission?(:perform_task, organization) | ||
329 | + end | ||
330 | + organization_ids = organizations.map{ |organization| "target_id = #{organization.id}"}.join(' OR ') | ||
331 | + | ||
332 | + organization_conditions = organization_ids.blank? ? nil : "(target_type = 'Profile' AND (#{organization_ids}))" | ||
326 | end | 333 | end |
327 | profile_condition = "(target_type = 'Profile' AND target_id = #{profile.id})" | 334 | profile_condition = "(target_type = 'Profile' AND target_id = #{profile.id})" |
328 | 335 | ||
329 | - where [environment_condition, profile_condition].compact.join(' OR ') | 336 | + where [environment_condition, organization_conditions, profile_condition].compact.join(' OR ') |
330 | } | 337 | } |
331 | 338 | ||
332 | scope :from_closed_date, -> closed_from { | 339 | scope :from_closed_date, -> closed_from { |
test/api/task_test.rb
@@ -11,7 +11,7 @@ class TasksTest < ActiveSupport::TestCase | @@ -11,7 +11,7 @@ class TasksTest < ActiveSupport::TestCase | ||
11 | 11 | ||
12 | attr_accessor :person, :community, :environment | 12 | attr_accessor :person, :community, :environment |
13 | 13 | ||
14 | - should 'list tasks of environment' do | 14 | + should 'list environment tasks for admin user' do |
15 | environment.add_admin(person) | 15 | environment.add_admin(person) |
16 | task = create(Task, :requestor => person, :target => environment) | 16 | task = create(Task, :requestor => person, :target => environment) |
17 | get "/api/v1/tasks?#{params.to_query}" | 17 | get "/api/v1/tasks?#{params.to_query}" |
@@ -50,144 +50,117 @@ class TasksTest < ActiveSupport::TestCase | @@ -50,144 +50,117 @@ class TasksTest < ActiveSupport::TestCase | ||
50 | task = create(Task, :requestor => person, :target => environment) | 50 | task = create(Task, :requestor => person, :target => environment) |
51 | 51 | ||
52 | get "/api/v1/tasks/#{task.id}?#{params.to_query}" | 52 | get "/api/v1/tasks/#{task.id}?#{params.to_query}" |
53 | - assert_equal 403, last_response.status | 53 | + assert_equal 404, last_response.status |
54 | end | 54 | end |
55 | 55 | ||
56 | - ############################# | ||
57 | - # Community Tasks # | ||
58 | - ############################# | 56 | + should 'find the current user task even it is finished' do |
57 | + t3 = create(Task, :requestor => person, :target => person) | ||
58 | + t4 = create(Task, :requestor => person, :target => person, :status => Task::Status::FINISHED) | ||
59 | 59 | ||
60 | - should 'return task by community' do | ||
61 | - community = fast_create(Community) | ||
62 | - community.add_admin(person) | ||
63 | - | ||
64 | - task = create(Task, :requestor => person, :target => community) | ||
65 | - assert person.is_member_of?(community) | ||
66 | - | ||
67 | - get "/api/v1/communities/#{community.id}/tasks/#{task.id}?#{params.to_query}" | 60 | + get "/api/v1/tasks/#{t4.id}?#{params.to_query}" |
68 | json = JSON.parse(last_response.body) | 61 | json = JSON.parse(last_response.body) |
69 | - assert_equal task.id, json["task"]["id"] | 62 | + assert_equal t4.id, json["task"]["id"] |
70 | end | 63 | end |
71 | 64 | ||
72 | - should 'not return task by community for unlogged users' do | ||
73 | - logout_api | 65 | + should 'find the current user task even it is for community' do |
74 | community = fast_create(Community) | 66 | community = fast_create(Community) |
75 | community.add_admin(person) | 67 | community.add_admin(person) |
68 | + t2 = create(Task, :requestor => person, :target => community) | ||
76 | 69 | ||
77 | - task = create(Task, :requestor => person, :target => community) | ||
78 | - assert person.is_member_of?(community) | 70 | + t3 = create(Task, :requestor => person, :target => person) |
79 | 71 | ||
80 | - get "/api/v1/communities/#{community.id}/tasks/#{task.id}?#{params.to_query}" | 72 | + get "/api/v1/tasks/#{t2.id}?#{params.to_query}" |
81 | json = JSON.parse(last_response.body) | 73 | json = JSON.parse(last_response.body) |
82 | - assert_equal 401, last_response.status | 74 | + assert_equal t2.id, json["task"]["id"] |
83 | end | 75 | end |
84 | 76 | ||
85 | - should 'not return task by community if user has no permission to view it' do | ||
86 | - community = fast_create(Community) | ||
87 | - task = create(Task, :requestor => person, :target => community) | ||
88 | - assert !person.is_member_of?(community) | 77 | + should 'find the current user task even it is for environment' do |
78 | + environment.add_admin(person) | ||
79 | + t1 = create(Task, :requestor => person, :target => environment) | ||
89 | 80 | ||
90 | - get "/api/v1/communities/#{community.id}/tasks/#{task.id}?#{params.to_query}" | ||
91 | - assert_equal 403, last_response.status | ||
92 | - end | 81 | + t3 = create(Task, :requestor => person, :target => person) |
93 | 82 | ||
94 | - should 'create task in a community' do | ||
95 | - community = fast_create(Community) | ||
96 | - give_permission(person, 'perform_task', community) | ||
97 | - post "/api/v1/communities/#{community.id}/tasks?#{params.to_query}" | 83 | + get "/api/v1/tasks/#{t1.id}?#{params.to_query}" |
98 | json = JSON.parse(last_response.body) | 84 | json = JSON.parse(last_response.body) |
99 | - assert_not_nil json["task"]["id"] | 85 | + assert_equal t1.id, json["task"]["id"] |
100 | end | 86 | end |
101 | 87 | ||
102 | - should 'not create task in a community for unlogged users' do | ||
103 | - logout_api | ||
104 | - community = fast_create(Community) | ||
105 | - give_permission(person, 'perform_task', community) | ||
106 | - post "/api/v1/communities/#{community.id}/tasks?#{params.to_query}" | ||
107 | - json = JSON.parse(last_response.body) | ||
108 | - assert_equal 401, last_response.status | ||
109 | - end | ||
110 | 88 | ||
111 | - should 'create task defining the requestor as current profile logged in' do | 89 | + should 'list all tasks of user' do |
90 | + environment.add_admin(person) | ||
91 | + t1 = create(Task, :requestor => person, :target => environment) | ||
92 | + | ||
112 | community = fast_create(Community) | 93 | community = fast_create(Community) |
113 | - community.add_member(person) | 94 | + community.add_admin(person) |
95 | + t2 = create(Task, :requestor => person, :target => community) | ||
114 | 96 | ||
115 | - post "/api/v1/communities/#{community.id}/tasks?#{params.to_query}" | ||
116 | - json = JSON.parse(last_response.body) | 97 | + t3 = create(Task, :requestor => person, :target => person) |
98 | + t4 = create(Task, :requestor => person, :target => person, :status => Task::Status::FINISHED) | ||
117 | 99 | ||
118 | - assert_equal person, Task.last.requestor | 100 | + get "/api/v1/tasks?#{params.to_query}" |
101 | + json = JSON.parse(last_response.body) | ||
102 | + assert_equivalent [t1.id, t2.id, t3.id, t4.id], json["tasks"].map { |a| a["id"] } | ||
119 | end | 103 | end |
120 | 104 | ||
121 | - should 'create task defining the target as the community' do | 105 | + should 'list all pending tasks of user' do |
106 | + environment.add_admin(person) | ||
107 | + t1 = create(Task, :requestor => person, :target => environment, :status => Task::Status::ACTIVE) | ||
108 | + | ||
122 | community = fast_create(Community) | 109 | community = fast_create(Community) |
123 | - community.add_member(person) | 110 | + community.add_admin(person) |
111 | + t2 = create(Task, :requestor => person, :target => community, :status => Task::Status::ACTIVE) | ||
124 | 112 | ||
125 | - post "/api/v1/communities/#{community.id}/tasks?#{params.to_query}" | ||
126 | - json = JSON.parse(last_response.body) | 113 | + t3 = create(Task, :requestor => person, :target => person, :status => Task::Status::ACTIVE) |
114 | + t4 = create(Task, :requestor => person, :target => person, :status => Task::Status::FINISHED) | ||
127 | 115 | ||
128 | - assert_equal community, Task.last.target | 116 | + get "/api/v1/tasks?#{params.merge(:status => Task::Status::ACTIVE).to_query}" |
117 | + json = JSON.parse(last_response.body) | ||
118 | + assert_equivalent [t1.id, t2.id, t3.id], json["tasks"].map { |a| a["id"] } | ||
129 | end | 119 | end |
130 | 120 | ||
131 | - ############################# | ||
132 | - # Person Tasks # | ||
133 | - ############################# | ||
134 | 121 | ||
135 | - should 'return task by person' do | ||
136 | - task = create(Task, :requestor => person, :target => person) | ||
137 | - get "/api/v1/people/#{person.id}/tasks/#{task.id}?#{params.to_query}" | ||
138 | - json = JSON.parse(last_response.body) | ||
139 | - assert_equal task.id, json["task"]["id"] | ||
140 | - end | 122 | + should 'list tasks with pagination' do |
123 | + Task.destroy_all | ||
124 | + t1 = create(Task, :requestor => person, :target => person) | ||
125 | + t2 = create(Task, :requestor => person, :target => person) | ||
141 | 126 | ||
142 | - should 'not return task by person for unlogged users' do | ||
143 | - logout_api | ||
144 | - task = create(Task, :requestor => person, :target => person) | ||
145 | - get "/api/v1/people/#{person.id}/tasks/#{task.id}?#{params.to_query}" | ||
146 | - json = JSON.parse(last_response.body) | ||
147 | - assert_equal 401, last_response.status | ||
148 | - end | 127 | + params[:page] = 1 |
128 | + params[:per_page] = 1 | ||
129 | + get "/api/v1/tasks/?#{params.to_query}" | ||
130 | + json_page_one = JSON.parse(last_response.body) | ||
149 | 131 | ||
150 | - should 'not return task by person if user has no permission to view it' do | ||
151 | - some_person = fast_create(Person) | ||
152 | - task = create(Task, :requestor => person, :target => some_person) | 132 | + params[:page] = 2 |
133 | + params[:per_page] = 1 | ||
134 | + get "/api/v1/tasks/?#{params.to_query}" | ||
135 | + json_page_two = JSON.parse(last_response.body) | ||
153 | 136 | ||
154 | - get "/api/v1/people/#{some_person.id}/tasks/#{task.id}?#{params.to_query}" | ||
155 | - assert_equal 403, last_response.status | ||
156 | - end | 137 | + assert_includes json_page_one["tasks"].map { |a| a["id"] }, t2.id |
138 | + assert_not_includes json_page_one["tasks"].map { |a| a["id"] }, t1.id | ||
157 | 139 | ||
158 | - should 'create task for person' do | ||
159 | - post "/api/v1/people/#{person.id}/tasks?#{params.to_query}" | ||
160 | - json = JSON.parse(last_response.body) | ||
161 | - assert_not_nil json["task"]["id"] | 140 | + assert_includes json_page_two["tasks"].map { |a| a["id"] }, t1.id |
141 | + assert_not_includes json_page_two["tasks"].map { |a| a["id"] }, t2.id | ||
162 | end | 142 | end |
163 | 143 | ||
164 | - should 'not create task in person for unlogged users' do | ||
165 | - logout_api | ||
166 | - post "/api/v1/people/#{person.id}/tasks?#{params.to_query}" | ||
167 | - json = JSON.parse(last_response.body) | ||
168 | - assert_equal 401, last_response.status | ||
169 | - end | 144 | + should 'list tasks with timestamp' do |
145 | + t1 = create(Task, :requestor => person, :target => person) | ||
146 | + t2 = create(Task, :requestor => person, :target => person, :created_at => Time.zone.now) | ||
170 | 147 | ||
171 | - should 'create task for another person' do | ||
172 | - some_person = fast_create(Person) | ||
173 | - post "/api/v1/people/#{some_person.id}/tasks?#{params.to_query}" | ||
174 | - json = JSON.parse(last_response.body) | 148 | + t1.created_at = Time.zone.now + 3.hours |
149 | + t1.save! | ||
175 | 150 | ||
176 | - assert_equal some_person, Task.last.target | ||
177 | - end | ||
178 | 151 | ||
179 | - should 'create task defining the target as a person' do | ||
180 | - post "/api/v1/people/#{person.id}/tasks?#{params.to_query}" | 152 | + params[:timestamp] = Time.zone.now + 1.hours |
153 | + get "/api/v1/tasks/?#{params.to_query}" | ||
181 | json = JSON.parse(last_response.body) | 154 | json = JSON.parse(last_response.body) |
182 | 155 | ||
183 | - assert_equal person, Task.last.target | 156 | + assert_includes json["tasks"].map { |a| a["id"] }, t1.id |
157 | + assert_not_includes json["tasks"].map { |a| a["id"] }, t2.id | ||
184 | end | 158 | end |
185 | 159 | ||
186 | task_actions=%w[finish cancel] | 160 | task_actions=%w[finish cancel] |
187 | task_actions_state={"finish"=>"FINISHED","cancel"=>"CANCELLED"} | 161 | task_actions_state={"finish"=>"FINISHED","cancel"=>"CANCELLED"} |
188 | task_actions.each do |action| | 162 | task_actions.each do |action| |
189 | should "person be able to #{action} his own task" do | 163 | should "person be able to #{action} his own task" do |
190 | - login_api | ||
191 | person1 = fast_create(Person) | 164 | person1 = fast_create(Person) |
192 | task = create(Task, :requestor => person1, :target => person) | 165 | task = create(Task, :requestor => person1, :target => person) |
193 | put "/api/v1/tasks/#{task.id}/#{action}?#{params.to_query}" | 166 | put "/api/v1/tasks/#{task.id}/#{action}?#{params.to_query}" |
@@ -195,8 +168,35 @@ class TasksTest < ActiveSupport::TestCase | @@ -195,8 +168,35 @@ class TasksTest < ActiveSupport::TestCase | ||
195 | assert_equal "Task::Status::#{task_actions_state[action]}".constantize, task.reload.status | 168 | assert_equal "Task::Status::#{task_actions_state[action]}".constantize, task.reload.status |
196 | end | 169 | end |
197 | 170 | ||
171 | + should "person be able to #{action} environment task if it's admin user" do | ||
172 | + environment = Environment.default | ||
173 | + environment.add_admin(person) | ||
174 | + task = create(Task, :requestor => person, :target => environment) | ||
175 | + put "/api/v1/tasks/#{task.id}/#{action}?#{params.to_query}" | ||
176 | + assert_equal person.reload.id, task.reload.closed_by_id | ||
177 | + assert_equal "Task::Status::#{task_actions_state[action]}".constantize, task.reload.status | ||
178 | + end | ||
179 | + | ||
180 | + should "person be able to #{action} community task if it has permission on it" do | ||
181 | + community = fast_create(Community) | ||
182 | + community.add_member(person) | ||
183 | + give_permission(person, 'perform_task', community) | ||
184 | + task = create(Task, :requestor => person, :target => community) | ||
185 | + put "/api/v1/tasks/#{task.id}/#{action}?#{params.to_query}" | ||
186 | + assert_equal person.reload.id, task.reload.closed_by_id | ||
187 | + assert_equal "Task::Status::#{task_actions_state[action]}".constantize, task.reload.status | ||
188 | + end | ||
189 | + | ||
190 | + should "person not be able to #{action} community task if it has no permission on it" do | ||
191 | + community = fast_create(Community) | ||
192 | + community.add_member(person) | ||
193 | + task = create(Task, :requestor => person, :target => community) | ||
194 | + put "/api/v1/tasks/#{task.id}/#{action}?#{params.to_query}" | ||
195 | + assert_equal person.reload.id, task.reload.closed_by_id | ||
196 | + assert_equal "Task::Status::#{task_actions_state[action]}".constantize, task.reload.status | ||
197 | + end | ||
198 | + | ||
198 | should "person not be able to #{action} other person's task" do | 199 | should "person not be able to #{action} other person's task" do |
199 | - login_api | ||
200 | user = fast_create(User) | 200 | user = fast_create(User) |
201 | person1 = fast_create(Person, :user_id => user) | 201 | person1 = fast_create(Person, :user_id => user) |
202 | task = create(Task, :requestor => person, :target => person1) | 202 | task = create(Task, :requestor => person, :target => person1) |
@@ -206,69 +206,120 @@ class TasksTest < ActiveSupport::TestCase | @@ -206,69 +206,120 @@ class TasksTest < ActiveSupport::TestCase | ||
206 | end | 206 | end |
207 | end | 207 | end |
208 | 208 | ||
209 | - ############################# | ||
210 | - # Enterprise Tasks # | ||
211 | - ############################# | 209 | + ################################################# |
210 | + # Person, Community and Enterprise Tasks # | ||
211 | + ################################################# | ||
212 | 212 | ||
213 | - should 'return task by enterprise' do | ||
214 | - enterprise = fast_create(Enterprise) | ||
215 | - enterprise.add_admin(person) | 213 | + [Person, Community, Enterprise].map do |profile_class| |
214 | + define_method "test_should_return_task_by_#{profile_class.name.underscore}" do | ||
215 | + target = profile_class == Person ? person : fast_create(profile_class) | ||
216 | + target.add_admin(person) if target.respond_to?('add_admin') | ||
216 | 217 | ||
217 | - task = create(Task, :requestor => person, :target => enterprise) | ||
218 | - assert person.is_member_of?(enterprise) | 218 | + task = create(Task, :requestor => person, :target => target) |
219 | + get "/api/v1/#{profile_class.name.underscore.pluralize}/#{target.id}/tasks/#{task.id}?#{params.to_query}" | ||
220 | + json = JSON.parse(last_response.body) | ||
221 | + assert_equal task.id, json["task"]["id"] | ||
222 | + end | ||
219 | 223 | ||
220 | - get "/api/v1/enterprises/#{enterprise.id}/tasks/#{task.id}?#{params.to_query}" | ||
221 | - json = JSON.parse(last_response.body) | ||
222 | - assert_equal task.id, json["task"]["id"] | ||
223 | - end | 224 | + define_method "test_should_not_return_task_ by#{profile_class.name.underscore}_for_unlogged_users" do |
225 | + logout_api | ||
226 | + target = profile_class == Person ? person : fast_create(profile_class) | ||
227 | + target.add_admin(person) if target.respond_to?('add_admin') | ||
224 | 228 | ||
225 | - should 'not return task by enterprise for unlogged users' do | ||
226 | - logout_api | ||
227 | - enterprise = fast_create(Enterprise) | ||
228 | - enterprise.add_admin(person) | 229 | + task = create(Task, :requestor => person, :target => target) |
230 | + get "/api/v1/#{profile_class.name.underscore.pluralize}/#{target.id}/tasks/#{task.id}?#{params.to_query}" | ||
231 | + json = JSON.parse(last_response.body) | ||
232 | + assert_equal 401, last_response.status | ||
233 | + end | ||
229 | 234 | ||
230 | - task = create(Task, :requestor => person, :target => enterprise) | ||
231 | - assert person.is_member_of?(enterprise) | 235 | + define_method "test_should_not_return_task_by_#{profile_class.name.underscore}_if_user_has_no_permission_to_view_it" do |
236 | + target = fast_create(profile_class) | ||
237 | + task = create(Task, :requestor => person, :target => target) | ||
238 | + | ||
239 | + get "/api/v1/#{profile_class.name.underscore.pluralize}/#{target.id}/tasks/#{task.id}?#{params.to_query}" | ||
240 | + assert_equal 403, last_response.status | ||
241 | + end | ||
232 | 242 | ||
233 | - get "/api/v1/enterprises/#{enterprise.id}/tasks/#{task.id}?#{params.to_query}" | ||
234 | - json = JSON.parse(last_response.body) | ||
235 | - assert_equal 401, last_response.status | ||
236 | - end | 243 | + define_method "test_should_create_task_for_#{profile_class.name.underscore}" do |
244 | + target = profile_class == Person ? person : fast_create(profile_class) | ||
245 | + Person.any_instance.expects(:has_permission?).with(:perform_task, target).returns(true) | ||
237 | 246 | ||
238 | - should 'not return task by enterprise if user has no permission to view it' do | ||
239 | - enterprise = fast_create(Enterprise) | ||
240 | - task = create(Task, :requestor => person, :target => enterprise) | ||
241 | - assert !person.is_member_of?(enterprise) | 247 | + post "/api/v1/#{profile_class.name.underscore.pluralize}/#{target.id}/tasks?#{params.to_query}" |
248 | + json = JSON.parse(last_response.body) | ||
249 | + assert_not_nil json["task"]["id"] | ||
250 | + end | ||
242 | 251 | ||
243 | - get "/api/v1/enterprises/#{enterprise.id}/tasks/#{task.id}?#{params.to_query}" | ||
244 | - assert_equal 403, last_response.status | ||
245 | - end | 252 | + define_method "test_should_not_create_task_for_#{profile_class.name.underscore}_person_has_no_permission" do |
253 | + target = fast_create(profile_class) | ||
246 | 254 | ||
247 | - should 'create task in a enterprise' do | ||
248 | - enterprise = fast_create(Enterprise) | ||
249 | - give_permission(person, 'perform_task', enterprise) | ||
250 | - post "/api/v1/enterprises/#{enterprise.id}/tasks?#{params.to_query}" | ||
251 | - json = JSON.parse(last_response.body) | ||
252 | - assert_not_nil json["task"]["id"] | 255 | + post "/api/v1/#{profile_class.name.underscore.pluralize}/#{target.id}/tasks?#{params.to_query}" |
256 | + json = JSON.parse(last_response.body) | ||
257 | + assert_equal 403, last_response.status | ||
258 | + end | ||
259 | + | ||
260 | + define_method "test_should_not_create_task_in_#{profile_class.name.underscore}_for_unlogged_users" do | ||
261 | + logout_api | ||
262 | + target = profile_class == Person ? person : fast_create(profile_class) | ||
263 | + Person.any_instance.stubs(:has_permission?).with(:perform_task, target).returns(true) | ||
264 | + | ||
265 | + post "/api/v1/#{profile_class.name.underscore.pluralize}/#{target.id}/tasks?#{params.to_query}" | ||
266 | + | ||
267 | + json = JSON.parse(last_response.body) | ||
268 | + assert_equal 401, last_response.status | ||
269 | + end | ||
270 | + | ||
271 | + define_method "test_should_create_task_defining_the_target_as_a_#{profile_class.name.underscore}" do | ||
272 | + target = profile_class == Person ? person : fast_create(profile_class) | ||
273 | + Person.any_instance.stubs(:has_permission?).with(:perform_task, target).returns(true) | ||
274 | + | ||
275 | + post "/api/v1/#{profile_class.name.underscore.pluralize}/#{target.id}/tasks?#{params.to_query}" | ||
276 | + json = JSON.parse(last_response.body) | ||
277 | + | ||
278 | + assert_equal target, Task.last.target | ||
279 | + end | ||
280 | + | ||
281 | + define_method "test_should_create_task_on_#{profile_class.name.underscore}_defining_the_requestor_as_current_profile_logged_in" do | ||
282 | + target = profile_class == Person ? person : fast_create(profile_class) | ||
283 | + Person.any_instance.stubs(:has_permission?).with(:perform_task, target).returns(true) | ||
284 | + | ||
285 | + post "/api/v1/#{profile_class.name.underscore.pluralize}/#{target.id}/tasks?#{params.to_query}" | ||
286 | + json = JSON.parse(last_response.body) | ||
287 | + | ||
288 | + assert_equal person, Task.last.requestor | ||
289 | + end | ||
253 | end | 290 | end |
254 | 291 | ||
255 | - should 'not create task in a enterprise for unlogged users' do | ||
256 | - logout_api | ||
257 | - enterprise = fast_create(Enterprise) | ||
258 | - give_permission(person, 'perform_task', enterprise) | ||
259 | - post "/api/v1/enterprises/#{enterprise.id}/tasks?#{params.to_query}" | 292 | + should 'list all tasks of user in people context' do |
293 | + environment.add_admin(person) | ||
294 | + t1 = create(Task, :requestor => person, :target => environment) | ||
295 | + | ||
296 | + community = fast_create(Community) | ||
297 | + community.add_admin(person) | ||
298 | + t2 = create(Task, :requestor => person, :target => community) | ||
299 | + | ||
300 | + t3 = create(Task, :requestor => person, :target => person) | ||
301 | + | ||
302 | + get "/api/v1/people/#{person.id}/tasks?#{params.to_query}" | ||
260 | json = JSON.parse(last_response.body) | 303 | json = JSON.parse(last_response.body) |
261 | - assert_equal 401, last_response.status | 304 | + assert_equivalent [t1.id, t2.id, t3.id], json["tasks"].map { |a| a["id"] } |
262 | end | 305 | end |
263 | 306 | ||
264 | - should 'create task defining the target as the enterprise' do | ||
265 | - enterprise = fast_create(Enterprise) | ||
266 | - enterprise.add_member(person) | 307 | + should 'list all pending tasks of user in people context' do |
308 | + environment.add_admin(person) | ||
309 | + t1 = create(Task, :requestor => person, :target => environment) | ||
310 | + t2 = create(Task, :requestor => person, :target => environment, :status => Task::Status::FINISHED ) | ||
267 | 311 | ||
268 | - post "/api/v1/enterprises/#{enterprise.id}/tasks?#{params.to_query}" | ||
269 | - json = JSON.parse(last_response.body) | 312 | + community = fast_create(Community) |
313 | + community.add_admin(person) | ||
314 | + t3 = create(Task, :requestor => person, :target => community) | ||
315 | + t4 = create(Task, :requestor => person, :target => community, :status => Task::Status::FINISHED) | ||
270 | 316 | ||
271 | - assert_equal enterprise, Task.last.target | 317 | + t5 = create(Task, :requestor => person, :target => person) |
318 | + t6 = create(Task, :requestor => person, :target => person, :status => Task::Status::FINISHED) | ||
319 | + | ||
320 | + get "/api/v1/people/#{person.id}/tasks?#{params.merge(:status => Task::Status::ACTIVE).to_query}" | ||
321 | + json = JSON.parse(last_response.body) | ||
322 | + assert_equivalent [t1.id, t3.id, t5.id], json["tasks"].map { |a| a["id"] } | ||
272 | end | 323 | end |
273 | 324 | ||
274 | end | 325 | end |
test/unit/person_test.rb
@@ -2005,4 +2005,5 @@ class PersonTest < ActiveSupport::TestCase | @@ -2005,4 +2005,5 @@ class PersonTest < ActiveSupport::TestCase | ||
2005 | person.remove_profile_from_circle(community, circle) | 2005 | person.remove_profile_from_circle(community, circle) |
2006 | assert_equivalent [circle2], ProfileFollower.with_profile(community).with_follower(person).map(&:circle) | 2006 | assert_equivalent [circle2], ProfileFollower.with_profile(community).with_follower(person).map(&:circle) |
2007 | end | 2007 | end |
2008 | + | ||
2008 | end | 2009 | end |
test/unit/task_test.rb
@@ -324,24 +324,6 @@ class TaskTest < ActiveSupport::TestCase | @@ -324,24 +324,6 @@ class TaskTest < ActiveSupport::TestCase | ||
324 | task.activate | 324 | task.activate |
325 | end | 325 | end |
326 | 326 | ||
327 | - should 'filter tasks to a profile' do | ||
328 | - requestor = fast_create(Person) | ||
329 | - person = fast_create(Person) | ||
330 | - another_person = fast_create(Person) | ||
331 | - environment = Environment.default | ||
332 | - environment.add_admin(person) | ||
333 | - t1 = create(Task, :requestor => requestor, :target => person) | ||
334 | - t2 = create(Task, :requestor => requestor, :target => person) | ||
335 | - t3 = create(Task, :requestor => requestor, :target => environment) | ||
336 | - t4 = create(Task, :requestor => requestor, :target => another_person) | ||
337 | - | ||
338 | - assert_includes Task.to(person), t1 | ||
339 | - assert_includes Task.to(person), t2 | ||
340 | - assert_includes Task.to(person), t3 | ||
341 | - assert_not_includes Task.to(person), t4 | ||
342 | - assert_includes Task.to(another_person), t4 | ||
343 | - end | ||
344 | - | ||
345 | should 'filter tasks by type with scope' do | 327 | should 'filter tasks by type with scope' do |
346 | class CleanHouse < Task; end | 328 | class CleanHouse < Task; end |
347 | class FeedDog < Task; end | 329 | class FeedDog < Task; end |
@@ -479,6 +461,87 @@ class TaskTest < ActiveSupport::TestCase | @@ -479,6 +461,87 @@ class TaskTest < ActiveSupport::TestCase | ||
479 | assert_equal person, t.reload.closed_by | 461 | assert_equal person, t.reload.closed_by |
480 | end | 462 | end |
481 | 463 | ||
464 | + should 'named scope to get tasks of a profile' do | ||
465 | + requestor = fast_create(Person) | ||
466 | + person = fast_create(Person) | ||
467 | + another_person = fast_create(Person) | ||
468 | + t1 = create(Task, :requestor => requestor, :target => person) | ||
469 | + t2 = create(Task, :requestor => requestor, :target => another_person) | ||
470 | + t3 = create(Task, :requestor => requestor, :target => person) | ||
471 | + | ||
472 | + assert_equivalent [t1,t3], Task.to(person) | ||
473 | + end | ||
474 | + | ||
475 | + should 'named scope to get environment tasks if passed profile is environment admin' do | ||
476 | + requestor = fast_create(Person) | ||
477 | + person = fast_create(Person) | ||
478 | + another_person = fast_create(Person) | ||
479 | + environment = Environment.default | ||
480 | + environment.add_admin(person) | ||
481 | + t1 = create(Task, :requestor => requestor, :target => person) | ||
482 | + t2 = create(Task, :requestor => requestor, :target => another_person) | ||
483 | + t3 = create(Task, :requestor => requestor, :target => environment) | ||
484 | + | ||
485 | + assert_equivalent [t1,t3], Task.to(person) | ||
486 | + end | ||
487 | + | ||
488 | + should 'named scope to not get environment tasks if passed profile is not environment admin' do | ||
489 | + requestor = fast_create(Person) | ||
490 | + person = fast_create(Person) | ||
491 | + another_person = fast_create(Person) | ||
492 | + environment = Environment.default | ||
493 | + t1 = create(Task, :requestor => requestor, :target => person) | ||
494 | + t2 = create(Task, :requestor => requestor, :target => another_person) | ||
495 | + t3 = create(Task, :requestor => requestor, :target => environment) | ||
496 | + | ||
497 | + assert_equivalent [t1], Task.to(person) | ||
498 | + end | ||
499 | + | ||
500 | + should 'named scope to get communities tasks if passed profile has perform_task permission' do | ||
501 | + requestor = fast_create(Person) | ||
502 | + person = fast_create(Person) | ||
503 | + another_person = fast_create(Person) | ||
504 | + community = fast_create(Community) | ||
505 | + community.add_member(person) | ||
506 | + person.expects(:has_permission?).with(:perform_task, community).returns(true) | ||
507 | + t1 = create(Task, :requestor => requestor, :target => person) | ||
508 | + t2 = create(Task, :requestor => requestor, :target => another_person) | ||
509 | + t3 = create(Task, :requestor => requestor, :target => community) | ||
510 | + | ||
511 | + assert_equivalent [t1, t3], Task.to(person) | ||
512 | + end | ||
513 | + | ||
514 | + | ||
515 | + should 'named scope to not get communities tasks if passed profile has no perform_task permission in community' do | ||
516 | + requestor = fast_create(Person) | ||
517 | + person = fast_create(Person) | ||
518 | + another_person = fast_create(Person) | ||
519 | + community = fast_create(Community) | ||
520 | + community.add_member(person) | ||
521 | + person.expects(:has_permission?).with(:perform_task, community).returns(false) | ||
522 | + t1 = create(Task, :requestor => requestor, :target => person) | ||
523 | + t2 = create(Task, :requestor => requestor, :target => another_person) | ||
524 | + t3 = create(Task, :requestor => requestor, :target => community) | ||
525 | + | ||
526 | + assert_equivalent [t1], Task.to(person) | ||
527 | + end | ||
528 | + | ||
529 | + should 'named scope to return environment, person and communities tasks if user has permission' do | ||
530 | + requestor = fast_create(Person) | ||
531 | + person = fast_create(Person) | ||
532 | + another_person = fast_create(Person) | ||
533 | + community = fast_create(Community) | ||
534 | + community.add_member(person) | ||
535 | + person.expects(:has_permission?).with(:perform_task, community).returns(true) | ||
536 | + environment = Environment.default | ||
537 | + environment.add_admin(person) | ||
538 | + t1 = create(Task, :requestor => requestor, :target => person) | ||
539 | + t2 = create(Task, :requestor => requestor, :target => another_person) | ||
540 | + t3 = create(Task, :requestor => requestor, :target => community) | ||
541 | + t4 = create(Task, :requestor => requestor, :target => environment) | ||
542 | + assert_equivalent [t1,t3,t4], Task.to(person) | ||
543 | + end | ||
544 | + | ||
482 | protected | 545 | protected |
483 | 546 | ||
484 | def sample_user | 547 | def sample_user |