Commit 379c7653ce0811cd24764d036cb839bb76c61c5e

Authored by Leandro Santos
2 parents d555951e f5aeac9a

fix conflit with task_taggable branch

app/controllers/my_profile/tasks_controller.rb
1 class TasksController < MyProfileController 1 class TasksController < MyProfileController
2 2
3 - protect [:perform_task, :view_tasks], :profile, :only => [:index]  
4 - protect :perform_task, :profile, :except => [:index] 3 + protect [:perform_task, :view_tasks], :profile, :only => [:index, :save_tags, :search_tags]
  4 + protect :perform_task, :profile, :except => [:index, :save_tags, :search_tags]
5 5
6 def index 6 def index
7 @filter_type = params[:filter_type].presence 7 @filter_type = params[:filter_type].presence
8 @filter_text = params[:filter_text].presence 8 @filter_text = params[:filter_text].presence
9 @filter_responsible = params[:filter_responsible] 9 @filter_responsible = params[:filter_responsible]
  10 + @filter_tags = params[:filter_tags]
  11 +
10 @task_types = Task.pending_types_for(profile) 12 @task_types = Task.pending_types_for(profile)
  13 + @task_tags = [OpenStruct.new(:name => _('All'), :id => nil) ] + Task.all_tags
11 14
12 @tasks = Task.pending_all(profile, @filter_type, @filter_text).order_by('created_at', 'asc') 15 @tasks = Task.pending_all(profile, @filter_type, @filter_text).order_by('created_at', 'asc')
13 @tasks = @tasks.where(:responsible_id => @filter_responsible.to_i != -1 ? @filter_responsible : nil) if @filter_responsible.present? 16 @tasks = @tasks.where(:responsible_id => @filter_responsible.to_i != -1 ? @filter_responsible : nil) if @filter_responsible.present?
  17 + @tasks = @tasks.tagged_with(@filter_tags, any: true) if @filter_tags.present?
14 @tasks = @tasks.paginate(:per_page => Task.per_page, :page => params[:page]) 18 @tasks = @tasks.paginate(:per_page => Task.per_page, :page => params[:page])
15 19
16 @failed = params ? params[:failed] : {} 20 @failed = params ? params[:failed] : {}
@@ -112,4 +116,36 @@ class TasksController &lt; MyProfileController @@ -112,4 +116,36 @@ class TasksController &lt; MyProfileController
112 render :json => result.map { |task| {:label => task.data[:name], :value => task.data[:name]} } 116 render :json => result.map { |task| {:label => task.data[:name], :value => task.data[:name]} }
113 end 117 end
114 118
  119 + def save_tags
  120 +
  121 + if request.post? && params[:tag_list]
  122 + result = {
  123 + success: false,
  124 + message: _('Error to save tags. Please, contact the system admin')
  125 + }
  126 +
  127 + ActsAsTaggableOn.remove_unused_tags = true
  128 +
  129 + task = profile.tasks.find_by_id params[:task_id]
  130 + save = user.tag(task, with: params[:tag_list], on: :tags)
  131 +
  132 + if save
  133 + result[:success] = true
  134 + end
  135 + end
  136 +
  137 + render json: result
  138 + end
  139 +
  140 + #FIXME make this test
  141 + # Should not search for article tasks
  142 + # Should not search for other profile tags
  143 + # Should search only task tags
  144 + # Should check the permissions
  145 + def search_tags
  146 + arg = params[:term].downcase
  147 + result = ActsAsTaggableOn::Tag.find(:all, :conditions => ['LOWER(name) LIKE ?', "%#{arg}%"])
  148 + render :text => prepare_to_token_input_by_label(result).to_json, :content_type => 'application/json'
  149 + end
  150 +
115 end 151 end
app/models/person.rb
@@ -16,6 +16,8 @@ class Person &lt; Profile @@ -16,6 +16,8 @@ class Person &lt; Profile
16 acts_as_trackable :after_add => Proc.new {|p,t| notify_activity(t)} 16 acts_as_trackable :after_add => Proc.new {|p,t| notify_activity(t)}
17 acts_as_accessor 17 acts_as_accessor
18 18
  19 + acts_as_tagger
  20 +
19 scope :members_of, lambda { |resources| 21 scope :members_of, lambda { |resources|
20 resources = [resources] if !resources.kind_of?(Array) 22 resources = [resources] if !resources.kind_of?(Array)
21 conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ') 23 conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ')
app/views/tasks/_task.html.erb
@@ -64,7 +64,7 @@ @@ -64,7 +64,7 @@
64 64
65 <div class="formfieldline"> 65 <div class="formfieldline">
66 <div class="formfield tag-list-fields"> 66 <div class="formfield tag-list-fields">
67 - <%= labelled_text_field(_('Tags'),"tasks[#{task.id}][task][tag_list]", task.tag_list.to_s, :size => 36, :class => 'tag-list') %> 67 + <%= labelled_text_field(_('Tags'),"tasks[#{task.id}][task][tag_list]", task.tags_from(nil).to_s, :size => 36, :class => 'tag-list','data-submit-values'=>"{'task_id':'#{task.id}'}") %>
68 </div> 68 </div>
69 </div> 69 </div>
70 70
app/views/tasks/index.html.erb
@@ -35,6 +35,11 @@ @@ -35,6 +35,11 @@
35 </p> 35 </p>
36 <% end %> 36 <% end %>
37 <p> 37 <p>
  38 + <%= labelled_select(_('Tags')+': ', :filter_tags, :id, :name, @filter_tags, @task_tags, {:id => 'filter-add-tag'}) %>
  39 + <%= text_field_tag( :filter_tags, @filter_tags, :size => 36, :class => 'filter-tags' ) %>
  40 + </p>
  41 +
  42 + <p>
38 <%= submit_button(:search, _('Search')) %> 43 <%= submit_button(:search, _('Search')) %>
39 </p> 44 </p>
40 <% end %> 45 <% end %>
@@ -94,3 +99,55 @@ @@ -94,3 +99,55 @@
94 99
95 100
96 <%= javascript_include_tag 'tasks' %> 101 <%= javascript_include_tag 'tasks' %>
  102 +
  103 +<script type="text/javascript">
  104 +
  105 + jQuery('.filter-tags').inputosaurus({
  106 + hideInput: true
  107 + });
  108 +
  109 + $('#filter-add-tag').change(function(){
  110 +
  111 + if($(this).val() != ''){
  112 + jQuery('.filter-tags').inputosaurus('addTags',$(this).children(':selected').text());
  113 + }
  114 + });
  115 +
  116 + jQuery('.tag-list').inputosaurus({
  117 + autoCompleteSource: <%= "'/myprofile/#{profile.identifier}/tasks/search_tags'," %>
  118 + activateFinalResult: true,
  119 + submitTags: {
  120 + url: <%= "'/myprofile/#{profile.identifier}/tasks/save_tags'" %>,
  121 + beforeSend: function(){
  122 + this.element.parents('.task_box')
  123 + .prev('.fg-state-error')
  124 + .remove();
  125 + },
  126 + success: function(response){
  127 +
  128 + this.element.parents('.task_box')
  129 + .prev('.fg-state-error')
  130 + .remove();
  131 +
  132 + if(!response.success){
  133 +
  134 + var errorIcon = $('<span/>',{
  135 + 'class':'ui-icon ui-icon-alert',
  136 + style:'float: left; margin-right: .3em;'
  137 + });
  138 +
  139 + var content = $('<p/>',{
  140 + html:'<strong>'+response.message+'</strong>'
  141 + }).prepend(errorIcon);
  142 +
  143 + var div = $('<div/>',{
  144 + 'class':'alert fg-state-error ui-state-error'
  145 + }).append(content);
  146 +
  147 + this.element.parents('.task_box').before(div);
  148 + }
  149 +
  150 + }
  151 + }
  152 + })
  153 +</script>
public/javascripts/inputosaurus.js
1 /** 1 /**
2 - * Inputosaurus Text 2 + * Inputosaurus Text
3 * 3 *
4 * Must be instantiated on an <input> element 4 * Must be instantiated on an <input> element
5 * Allows multiple input items. Each item is represented with a removable tag that appears to be inside the input area. 5 * Allows multiple input items. Each item is represented with a removable tag that appears to be inside the input area.
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 // 30 //
31 // 'change' - triggered whenever a tag is added or removed (should be similar to binding the the change event of the instantiated input 31 // 'change' - triggered whenever a tag is added or removed (should be similar to binding the the change event of the instantiated input
32 // 'keyup' - keyup event on the newly created input 32 // 'keyup' - keyup event on the newly created input
33 - 33 +
34 // while typing, the user can separate values using these delimiters 34 // while typing, the user can separate values using these delimiters
35 // the value tags are created on the fly when an inputDelimiter is detected 35 // the value tags are created on the fly when an inputDelimiter is detected
36 inputDelimiters : [',', ';'], 36 inputDelimiters : [',', ';'],
@@ -56,12 +56,18 @@ @@ -56,12 +56,18 @@
56 // manipulate and return the input value after parseInput() parsing 56 // manipulate and return the input value after parseInput() parsing
57 // the array of tag names is passed and expected to be returned as an array after manipulation 57 // the array of tag names is passed and expected to be returned as an array after manipulation
58 parseHook : null, 58 parseHook : null,
59 - 59 +
60 // define a placeholder to display when the input is empty 60 // define a placeholder to display when the input is empty
61 placeholder: null, 61 placeholder: null,
62 - 62 +
63 // when you check for duplicates it check for the case 63 // when you check for duplicates it check for the case
64 - caseSensitiveDuplicates: false 64 + caseSensitiveDuplicates: false,
  65 +
  66 + //Hide input to inform tags. This is cool when you create tags from another way
  67 + hideInput: false,
  68 +
  69 + //Ajax options to send tags
  70 + submitTags: null
65 }, 71 },
66 72
67 _create: function() { 73 _create: function() {
@@ -69,7 +75,7 @@ @@ -69,7 +75,7 @@
69 els = {}, 75 els = {},
70 o = widget.options, 76 o = widget.options,
71 placeholder = o.placeholder || this.element.attr('placeholder') || null; 77 placeholder = o.placeholder || this.element.attr('placeholder') || null;
72 - 78 +
73 this._chosenValues = []; 79 this._chosenValues = [];
74 80
75 // Create the elements 81 // Create the elements
@@ -77,11 +83,11 @@ @@ -77,11 +83,11 @@
77 els.input = $('<input type="text" />'); 83 els.input = $('<input type="text" />');
78 els.inputCont = $('<li class="inputosaurus-input inputosaurus-required"></li>'); 84 els.inputCont = $('<li class="inputosaurus-input inputosaurus-required"></li>');
79 els.origInputCont = $('<li class="inputosaurus-input-hidden inputosaurus-required">'); 85 els.origInputCont = $('<li class="inputosaurus-input-hidden inputosaurus-required">');
80 - 86 +
81 // define starting placeholder 87 // define starting placeholder
82 - if (placeholder) { 88 + if (placeholder) {
83 o.placeholder = placeholder; 89 o.placeholder = placeholder;
84 - els.input.attr('placeholder', o.placeholder); 90 + els.input.attr('placeholder', o.placeholder);
85 if (o.width) { 91 if (o.width) {
86 els.input.css('min-width', o.width - 50); 92 els.input.css('min-width', o.width - 50);
87 } 93 }
@@ -90,11 +96,11 @@ @@ -90,11 +96,11 @@
90 o.wrapperElement && o.wrapperElement.append(els.ul); 96 o.wrapperElement && o.wrapperElement.append(els.ul);
91 this.element.replaceWith(o.wrapperElement || els.ul); 97 this.element.replaceWith(o.wrapperElement || els.ul);
92 els.origInputCont.append(this.element).hide(); 98 els.origInputCont.append(this.element).hide();
93 - 99 +
94 els.inputCont.append(els.input); 100 els.inputCont.append(els.input);
95 els.ul.append(els.inputCont); 101 els.ul.append(els.inputCont);
96 els.ul.append(els.origInputCont); 102 els.ul.append(els.origInputCont);
97 - 103 +
98 o.width && els.ul.css('width', o.width); 104 o.width && els.ul.css('width', o.width);
99 105
100 this.elements = els; 106 this.elements = els;
@@ -130,8 +136,8 @@ @@ -130,8 +136,8 @@
130 var auto = $(this).data('ui-autocomplete') || $(this).data('autocomplete'); 136 var auto = $(this).data('ui-autocomplete') || $(this).data('autocomplete');
131 var menu = auto.menu, 137 var menu = auto.menu,
132 $menuItems; 138 $menuItems;
133 -  
134 - 139 +
  140 +
135 // zIndex will force the element on top of anything (like a dialog it's in) 141 // zIndex will force the element on top of anything (like a dialog it's in)
136 menu.element.zIndex && menu.element.zIndex($(this).zIndex() + 1); 142 menu.element.zIndex && menu.element.zIndex($(this).zIndex() + 1);
137 menu.element.width(widget.elements.ul.outerWidth()); 143 menu.element.width(widget.elements.ul.outerWidth());
@@ -201,6 +207,31 @@ @@ -201,6 +207,31 @@
201 widget._resetPlaceholder(); 207 widget._resetPlaceholder();
202 }, 208 },
203 209
  210 + addTags: function(list){
  211 +
  212 + if(arguments.length == 1){
  213 + list = [list];
  214 + }
  215 +
  216 + if(arguments[1]){
  217 + list = Array.prototype.slice.call(arguments);
  218 + }
  219 +
  220 + if(!$.isArray(list)){
  221 + var msg = 'Tag list needs be an Array';
  222 +
  223 + if(console){
  224 + console.error(msg);
  225 +
  226 + return false;
  227 + }else{
  228 + throw new Error(msg);
  229 + }
  230 +
  231 + }
  232 + this._setChosen(list);
  233 + },
  234 +
204 _inputFocus : function(ev) { 235 _inputFocus : function(ev) {
205 var widget = ev.data.widget || this; 236 var widget = ev.data.widget || this;
206 237
@@ -241,7 +272,7 @@ @@ -241,7 +272,7 @@
241 272
242 widget.elements.input.width(txtWidth < maxWidth ? txtWidth : maxWidth); 273 widget.elements.input.width(txtWidth < maxWidth ? txtWidth : maxWidth);
243 }, 274 },
244 - 275 +
245 // resets placeholder on representative input 276 // resets placeholder on representative input
246 _resetPlaceholder: function () { 277 _resetPlaceholder: function () {
247 var placeholder = this.options.placeholder, 278 var placeholder = this.options.placeholder,
@@ -266,7 +297,7 @@ @@ -266,7 +297,7 @@
266 ev.preventDefault(); 297 ev.preventDefault();
267 lastTag.find('a').focus(); 298 lastTag.find('a').focus();
268 } 299 }
269 - 300 +
270 }, 301 },
271 302
272 _editTag : function(ev) { 303 _editTag : function(ev) {
@@ -285,6 +316,7 @@ @@ -285,6 +316,7 @@
285 v.key === tagKey && (tagName = v.value); 316 v.key === tagKey && (tagName = v.value);
286 }); 317 });
287 318
  319 + widget.beforeEditValue = widget.element.val();
288 widget.elements.input.val(tagName); 320 widget.elements.input.val(tagName);
289 321
290 widget._removeTag(ev); 322 widget._removeTag(ev);
@@ -295,7 +327,7 @@ @@ -295,7 +327,7 @@
295 var widget = ev.data.widget; 327 var widget = ev.data.widget;
296 switch(ev.which){ 328 switch(ev.which){
297 329
298 - case $.ui.keyCode.BACKSPACE: 330 + case $.ui.keyCode.BACKSPACE:
299 ev && ev.preventDefault(); 331 ev && ev.preventDefault();
300 ev && ev.stopPropagation(); 332 ev && ev.stopPropagation();
301 $(ev.currentTarget).trigger('click'); 333 $(ev.currentTarget).trigger('click');
@@ -395,6 +427,10 @@ @@ -395,6 +427,10 @@
395 } 427 }
396 }); 428 });
397 self._setValue(self._buildValue()); 429 self._setValue(self._buildValue());
  430 +
  431 + if(this.options.hideInput){
  432 + this.elements.input.parent().hide();
  433 + }
398 }, 434 },
399 435
400 _buildValue : function() { 436 _buildValue : function() {
@@ -409,11 +445,18 @@ @@ -409,11 +445,18 @@
409 }, 445 },
410 446
411 _setValue : function(value) { 447 _setValue : function(value) {
412 - var val = this.element.val(); 448 +
  449 + if(arguments[1] && (arguments[1].type == 'dblclick' && value == '')){
  450 + return false;
  451 + }
  452 + var val = this.element.val().replace(/,\s*/g,',');
413 453
414 if(val !== value){ 454 if(val !== value){
415 this.element.val(value); 455 this.element.val(value);
416 this._trigger('change'); 456 this._trigger('change');
  457 + if($.isPlainObject(this.options.submitTags)){
  458 + this._sendTags();
  459 + }
417 } 460 }
418 }, 461 },
419 462
@@ -439,7 +482,7 @@ @@ -439,7 +482,7 @@
439 }, 482 },
440 483
441 _removeTag : function(ev) { 484 _removeTag : function(ev) {
442 - var $closest = $(ev.currentTarget).closest('li'), 485 + var $closest = $(ev.currentTarget).closest('li'),
443 key = $closest.data('ui-inputosaurus') || $closest.data('inputosaurus'), 486 key = $closest.data('ui-inputosaurus') || $closest.data('inputosaurus'),
444 indexFound = false, 487 indexFound = false,
445 widget = (ev && ev.data.widget) || this; 488 widget = (ev && ev.data.widget) || this;
@@ -453,7 +496,7 @@ @@ -453,7 +496,7 @@
453 496
454 indexFound !== false && widget._chosenValues.splice(indexFound, 1); 497 indexFound !== false && widget._chosenValues.splice(indexFound, 1);
455 498
456 - widget._setValue(widget._buildValue()); 499 + widget._setValue(widget._buildValue(),ev);
457 500
458 $(ev.currentTarget).closest('li').remove(); 501 $(ev.currentTarget).closest('li').remove();
459 widget.elements.input.focus(); 502 widget.elements.input.focus();
@@ -477,7 +520,7 @@ @@ -477,7 +520,7 @@
477 var delim = this.options.outputDelimiter, 520 var delim = this.options.outputDelimiter,
478 val = this.element.val(), 521 val = this.element.val(),
479 values = []; 522 values = [];
480 - 523 +
481 values.push(val); 524 values.push(val);
482 delim && (values = val.split(delim)); 525 delim && (values = val.split(delim));
483 526
@@ -515,9 +558,38 @@ @@ -515,9 +558,38 @@
515 558
516 this.elements.ul.replaceWith(this.element); 559 this.elements.ul.replaceWith(this.element);
517 560
  561 + },
  562 +
  563 + _sendTags: function(){
  564 +
  565 + var requestTags = this.options.submitTags;
  566 + if(this.element.val() != '' && this.beforeEditValue != this.element.val()) {
  567 +
  568 + opts = $.extend({
  569 + url: requestTags.url,
  570 + dataType: 'json',
  571 + data:{},
  572 + type:'POST',
  573 + context:this
  574 + },requestTags);
  575 +
  576 + var extraValues = this.element.data('submit-values');
  577 + if(typeof extraValues == 'string' && /\{*/.test(extraValues)){
  578 + extraValues = $.parseJSON(extraValues.replace(/\'/g,'\"'));
  579 + }
  580 +
  581 + if(!$.isEmptyObject(extraValues)){
  582 + for(v in extraValues){
  583 + opts.data[v] = extraValues[v];
  584 + }
  585 + }
  586 +
  587 + opts.data.tag_list = this.element.val();
  588 +
  589 + $.ajax(opts);
  590 + }
518 } 591 }
519 }; 592 };
520 593
521 $.widget("ui.inputosaurus", inputosaurustext); 594 $.widget("ui.inputosaurus", inputosaurustext);
522 -})(jQuery);  
523 - 595 +})($ || jQuery);
test/functional/tasks_controller_test.rb
@@ -12,14 +12,14 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -12,14 +12,14 @@ class TasksControllerTest &lt; ActionController::TestCase
12 @request = ActionController::TestRequest.new 12 @request = ActionController::TestRequest.new
13 @response = ActionController::TestResponse.new 13 @response = ActionController::TestResponse.new
14 14
15 - self.profile = create_user('testuser').person  
16 - @controller.stubs(:profile).returns(profile) 15 + @person = create_user('testuser').person
  16 + @controller.stubs(:profile).returns(@person)
17 login_as 'testuser' 17 login_as 'testuser'
18 end 18 end
19 - attr_accessor :profile 19 + attr_accessor :person
20 20
21 def assert_redirected_to(options) 21 def assert_redirected_to(options)
22 - super({ :controller => 'tasks', :profile => profile.identifier }.merge(options)) 22 + super({ :controller => 'tasks', :profile => person.identifier }.merge(options))
23 end 23 end
24 24
25 should 'list pending tasks' do 25 should 'list pending tasks' do
@@ -63,8 +63,8 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -63,8 +63,8 @@ class TasksControllerTest &lt; ActionController::TestCase
63 63
64 should 'list pending tasks without spam' do 64 should 'list pending tasks without spam' do
65 requestor = fast_create(Person) 65 requestor = fast_create(Person)
66 - task_spam = Task.create!(:requestor => requestor, :target => profile, :spam => true)  
67 - task_ham = Task.create!(:requestor => requestor, :target => profile, :spam => false) 66 + task_spam = Task.create!(:requestor => requestor, :target => person, :spam => true)
  67 + task_ham = Task.create!(:requestor => requestor, :target => person, :spam => false)
68 68
69 get :index 69 get :index
70 assert_response :success 70 assert_response :success
@@ -81,15 +81,15 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -81,15 +81,15 @@ class TasksControllerTest &lt; ActionController::TestCase
81 end 81 end
82 82
83 should 'display task created_at' do 83 should 'display task created_at' do
84 - Task.create!(:requestor => fast_create(Person), :target => profile, :spam => false) 84 + Task.create!(:requestor => fast_create(Person), :target => person, :spam => false)
85 get :index 85 get :index
86 assert_select '.task_date' 86 assert_select '.task_date'
87 end 87 end
88 88
89 should 'list processed tasks without spam' do 89 should 'list processed tasks without spam' do
90 requestor = fast_create(Person) 90 requestor = fast_create(Person)
91 - task_spam = create(Task, :status => Task::Status::FINISHED, :requestor => requestor, :target => profile, :spam => true)  
92 - task_ham = create(Task, :status => Task::Status::FINISHED, :requestor => requestor, :target => profile, :spam => false) 91 + task_spam = create(Task, :status => Task::Status::FINISHED, :requestor => requestor, :target => person, :spam => true)
  92 + task_ham = create(Task, :status => Task::Status::FINISHED, :requestor => requestor, :target => person, :spam => false)
93 93
94 get :processed 94 get :processed
95 assert_response :success 95 assert_response :success
@@ -98,7 +98,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -98,7 +98,7 @@ class TasksControllerTest &lt; ActionController::TestCase
98 end 98 end
99 99
100 should 'be able to finish a task' do 100 should 'be able to finish a task' do
101 - t = profile.tasks.build; t.save! 101 + t = person.tasks.build; t.save!
102 102
103 post :close, :tasks => {t.id => {:decision => 'finish', :task => {}}} 103 post :close, :tasks => {t.id => {:decision => 'finish', :task => {}}}
104 assert_redirected_to :action => 'index' 104 assert_redirected_to :action => 'index'
@@ -108,7 +108,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -108,7 +108,7 @@ class TasksControllerTest &lt; ActionController::TestCase
108 end 108 end
109 109
110 should 'be able to cancel a task' do 110 should 'be able to cancel a task' do
111 - t = profile.tasks.build; t.save! 111 + t = person.tasks.build; t.save!
112 112
113 post :close, :tasks => {t.id => {:decision => 'cancel', :task => {}}} 113 post :close, :tasks => {t.id => {:decision => 'cancel', :task => {}}}
114 assert_redirected_to :action => 'index' 114 assert_redirected_to :action => 'index'
@@ -118,7 +118,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -118,7 +118,7 @@ class TasksControllerTest &lt; ActionController::TestCase
118 end 118 end
119 119
120 should 'be able to skip a task' do 120 should 'be able to skip a task' do
121 - t = profile.tasks.build; t.save! 121 + t = person.tasks.build; t.save!
122 122
123 post :close, :tasks => {t.id => {:decision => 'skip', :task => {}}} 123 post :close, :tasks => {t.id => {:decision => 'skip', :task => {}}}
124 assert_redirected_to :action => 'index' 124 assert_redirected_to :action => 'index'
@@ -128,9 +128,9 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -128,9 +128,9 @@ class TasksControllerTest &lt; ActionController::TestCase
128 end 128 end
129 129
130 should 'be able to apply different decisions to multiples tasks at the same time' do 130 should 'be able to apply different decisions to multiples tasks at the same time' do
131 - t1 = profile.tasks.build; t1.save!  
132 - t2 = profile.tasks.build; t2.save!  
133 - t3 = profile.tasks.build; t3.save! 131 + t1 = person.tasks.build; t1.save!
  132 + t2 = person.tasks.build; t2.save!
  133 + t3 = person.tasks.build; t3.save!
134 134
135 post :close, :tasks => {t1.id => {:decision => 'finish', :task => {}}, t2.id => {:decision => 'cancel', :task => {}}, t3.id => {:decision => 'skip', :task => {}}} 135 post :close, :tasks => {t1.id => {:decision => 'finish', :task => {}}, t2.id => {:decision => 'cancel', :task => {}}, t3.id => {:decision => 'skip', :task => {}}}
136 assert_redirected_to :action => 'index' 136 assert_redirected_to :action => 'index'
@@ -145,56 +145,60 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -145,56 +145,60 @@ class TasksControllerTest &lt; ActionController::TestCase
145 end 145 end
146 146
147 should 'affiliate roles to user after finish add member task' do 147 should 'affiliate roles to user after finish add member task' do
148 - t = AddMember.create!(:person => profile, :organization => profile)  
149 - count = profile.members.size 148 + community = fast_create(Community)
  149 + community.add_member(person)
  150 + another_person = fast_create(Person)
  151 + t = AddMember.create!(:person => another_person, :organization => community)
  152 + count = community.members.size
  153 + @controller.stubs(:profile).returns(community)
150 post :close, :tasks => {t.id => {:decision => 'finish', :task => {}}} 154 post :close, :tasks => {t.id => {:decision => 'finish', :task => {}}}
151 - profile = Profile.find(@profile.id)  
152 - assert_equal count + 1, profile.members.size 155 + community = Profile.find(community.id)
  156 + assert_equal count + 1, community.members.size
153 end 157 end
154 158
155 should 'display a create ticket form' do 159 should 'display a create ticket form' do
156 - get :new, :profile => profile.identifier 160 + get :new, :profile => person.identifier
157 161
158 assert_template 'new' 162 assert_template 'new'
159 end 163 end
160 164
161 should 'add a hidden field with target_id when informed in the URL' do 165 should 'add a hidden field with target_id when informed in the URL' do
162 friend = create_user('myfriend').person 166 friend = create_user('myfriend').person
163 - profile.add_friend(friend) 167 + person.add_friend(friend)
164 168
165 - get :new, :profile => profile.identifier, :target_id => friend.id.to_s 169 + get :new, :profile => person.identifier, :target_id => friend.id.to_s
166 170
167 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'ticket[target_id]', :value => friend.id } 171 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'ticket[target_id]', :value => friend.id }
168 end 172 end
169 173
170 should 'select friend from list when not already informed' do 174 should 'select friend from list when not already informed' do
171 - get :new, :profile => profile.identifier 175 + get :new, :profile => person.identifier
172 assert_tag :tag => 'select', :attributes => { :name => 'ticket[target_id]' } 176 assert_tag :tag => 'select', :attributes => { :name => 'ticket[target_id]' }
173 end 177 end
174 178
175 should 'create a ticket' do 179 should 'create a ticket' do
176 assert_difference 'Ticket.count' do 180 assert_difference 'Ticket.count' do
177 - post :new, :profile => profile.identifier, :ticket => {:name => 'test ticket'} 181 + post :new, :profile => person.identifier, :ticket => {:name => 'test ticket'}
178 end 182 end
179 end 183 end
180 184
181 should 'create a ticket with profile requestor' do 185 should 'create a ticket with profile requestor' do
182 - post :new, :profile => profile.identifier, :ticket => {:name => 'new task'}  
183 -  
184 - assert_equal profile, assigns(:ticket).requestor 186 + post :new, :profile => person.identifier, :ticket => {:name => 'new task'}
  187 +
  188 + assert_equal person, assigns(:ticket).requestor
185 end 189 end
186 190
187 should 'list tasks that this profile created' do 191 should 'list tasks that this profile created' do
188 - task = Ticket.create!(:name => 'test', :requestor => profile)  
189 - get :list_requested, :profile => profile.identifier 192 + task = Ticket.create!(:name => 'test', :requestor => person)
  193 + get :list_requested, :profile => person.identifier
190 194
191 assert_includes assigns(:tasks), task 195 assert_includes assigns(:tasks), task
192 end 196 end
193 197
194 should 'list tasks that this profile created without spam' do 198 should 'list tasks that this profile created without spam' do
195 - task_spam = Ticket.create!(:name => 'test', :requestor => profile, :spam => true)  
196 - task_ham = Ticket.create!(:name => 'test', :requestor => profile, :spam => false)  
197 - get :list_requested, :profile => profile.identifier 199 + task_spam = Ticket.create!(:name => 'test', :requestor => person, :spam => true)
  200 + task_ham = Ticket.create!(:name => 'test', :requestor => person, :spam => false)
  201 + get :list_requested, :profile => person.identifier
198 202
199 assert_includes assigns(:tasks), task_ham 203 assert_includes assigns(:tasks), task_ham
200 assert_not_includes assigns(:tasks), task_spam 204 assert_not_includes assigns(:tasks), task_spam
@@ -202,9 +206,9 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -202,9 +206,9 @@ class TasksControllerTest &lt; ActionController::TestCase
202 206
203 should 'set target of ticket when creating it' do 207 should 'set target of ticket when creating it' do
204 f = create_user('friend').person 208 f = create_user('friend').person
205 - profile.add_friend f 209 + person.add_friend f
206 210
207 - post :new, :profile => profile.identifier, :ticket => {:name => 'test ticket', :target_id => f.id, :target_type => 'Profile'} 211 + post :new, :profile => person.identifier, :ticket => {:name => 'test ticket', :target_id => f.id, :target_type => 'Profile'}
208 assert_response :redirect 212 assert_response :redirect
209 213
210 assert_equal f, assigns(:ticket).target 214 assert_equal f, assigns(:ticket).target
@@ -214,9 +218,9 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -214,9 +218,9 @@ class TasksControllerTest &lt; ActionController::TestCase
214 c = fast_create(Community) 218 c = fast_create(Community)
215 c.update_attributes(:moderated_articles => false) 219 c.update_attributes(:moderated_articles => false)
216 @controller.stubs(:profile).returns(c) 220 @controller.stubs(:profile).returns(c)
217 - c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id))  
218 - article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails')  
219 - t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => profile) 221 + c.affiliate(person, Profile::Roles.all_roles(person.environment.id))
  222 + article = person.articles.create!(:name => 'something interesting', :body => 'ruby on rails')
  223 + t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => person)
220 224
221 post :close, :tasks => {t.id => {:decision => 'finish', :task => {:name => 'new_name'}}} 225 post :close, :tasks => {t.id => {:decision => 'finish', :task => {:name => 'new_name'}}}
222 assert_equal article, c.articles.find_by_name('new_name').reference_article 226 assert_equal article, c.articles.find_by_name('new_name').reference_article
@@ -227,9 +231,9 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -227,9 +231,9 @@ class TasksControllerTest &lt; ActionController::TestCase
227 c.update_attributes(:moderated_articles => false) 231 c.update_attributes(:moderated_articles => false)
228 @controller.stubs(:profile).returns(c) 232 @controller.stubs(:profile).returns(c)
229 folder = create(Folder, :profile => c, :name => 'test folder') 233 folder = create(Folder, :profile => c, :name => 'test folder')
230 - c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id))  
231 - article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails')  
232 - t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => profile) 234 + c.affiliate(person, Profile::Roles.all_roles(person.environment.id))
  235 + article = person.articles.create!(:name => 'something interesting', :body => 'ruby on rails')
  236 + t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => person)
233 237
234 post :close, :tasks => {t.id => {:decision => 'finish', :task => {:name => 'new_name', :article_parent_id => folder.id}}} 238 post :close, :tasks => {t.id => {:decision => 'finish', :task => {:name => 'new_name', :article_parent_id => folder.id}}}
235 assert_equal folder, c.articles.find_by_name('new_name').parent 239 assert_equal folder, c.articles.find_by_name('new_name').parent
@@ -240,9 +244,9 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -240,9 +244,9 @@ class TasksControllerTest &lt; ActionController::TestCase
240 c.update_attributes(:moderated_articles => false) 244 c.update_attributes(:moderated_articles => false)
241 @controller.stubs(:profile).returns(c) 245 @controller.stubs(:profile).returns(c)
242 folder = create(Article, :profile => c, :name => 'test folder', :type => 'Folder') 246 folder = create(Article, :profile => c, :name => 'test folder', :type => 'Folder')
243 - c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id))  
244 - article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails')  
245 - t = ApproveArticle.create!(:article => article, :target => c, :requestor => profile) 247 + c.affiliate(person, Profile::Roles.all_roles(person.environment.id))
  248 + article = person.articles.create!(:name => 'something interesting', :body => 'ruby on rails')
  249 + t = ApproveArticle.create!(:article => article, :target => c, :requestor => person)
246 250
247 post :close, :tasks => {t.id => {:decision => 'finish', :task => {:name => 'new_name', :article_parent_id => folder.id, :highlighted => true}}} 251 post :close, :tasks => {t.id => {:decision => 'finish', :task => {:name => 'new_name', :article_parent_id => folder.id, :highlighted => true}}}
248 assert_equal true, c.articles.find_by_name('new_name').highlighted 252 assert_equal true, c.articles.find_by_name('new_name').highlighted
@@ -252,9 +256,9 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -252,9 +256,9 @@ class TasksControllerTest &lt; ActionController::TestCase
252 c = fast_create(Community) 256 c = fast_create(Community)
253 c.update_attributes(:moderated_articles => false) 257 c.update_attributes(:moderated_articles => false)
254 @controller.stubs(:profile).returns(c) 258 @controller.stubs(:profile).returns(c)
255 - c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id))  
256 - article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails')  
257 - t = ApproveArticle.create!(:article => article, :target => c, :requestor => profile) 259 + c.affiliate(person, Profile::Roles.all_roles(person.environment.id))
  260 + article = person.articles.create!(:name => 'something interesting', :body => 'ruby on rails')
  261 + t = ApproveArticle.create!(:article => article, :target => c, :requestor => person)
258 262
259 post :close, :tasks => {t.id => {:decision => 'finish', :task => {:name => 'new_name', :article_parent_id => ""}}} 263 post :close, :tasks => {t.id => {:decision => 'finish', :task => {:name => 'new_name', :article_parent_id => ""}}}
260 assert_not_nil c.articles.find_by_name('new_name') 264 assert_not_nil c.articles.find_by_name('new_name')
@@ -263,7 +267,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -263,7 +267,7 @@ class TasksControllerTest &lt; ActionController::TestCase
263 should 'handle blank names for published articles' do 267 should 'handle blank names for published articles' do
264 c = fast_create(Community) 268 c = fast_create(Community)
265 @controller.stubs(:profile).returns(c) 269 @controller.stubs(:profile).returns(c)
266 - c.affiliate(profile, Profile::Roles.all_roles(c.environment)) 270 + c.affiliate(person, Profile::Roles.all_roles(c.environment))
267 person = create_user('test_user').person 271 person = create_user('test_user').person
268 p_blog = Blog.create!(:profile => person, :name => 'Blog') 272 p_blog = Blog.create!(:profile => person, :name => 'Blog')
269 c_blog1 = Blog.create!(:profile => c, :name => 'Blog') 273 c_blog1 = Blog.create!(:profile => c, :name => 'Blog')
@@ -282,8 +286,8 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -282,8 +286,8 @@ class TasksControllerTest &lt; ActionController::TestCase
282 286
283 should 'display error if there is an enterprise with the same identifier and keep the task active' do 287 should 'display error if there is an enterprise with the same identifier and keep the task active' do
284 e = Environment.default 288 e = Environment.default
285 - e.add_admin(profile)  
286 - task = CreateEnterprise.create!(:name => "My Enterprise", :identifier => "my-enterprise", :requestor => profile, :target => e) 289 + e.add_admin(person)
  290 + task = CreateEnterprise.create!(:name => "My Enterprise", :identifier => "my-enterprise", :requestor => person, :target => e)
287 enterprise = fast_create(Enterprise, :name => "My Enterprise", :identifier => "my-enterprise") 291 enterprise = fast_create(Enterprise, :name => "My Enterprise", :identifier => "my-enterprise")
288 292
289 assert_nothing_raised do 293 assert_nothing_raised do
@@ -299,7 +303,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -299,7 +303,7 @@ class TasksControllerTest &lt; ActionController::TestCase
299 should 'render TinyMce Editor when approving suggested article task' do 303 should 'render TinyMce Editor when approving suggested article task' do
300 Task.destroy_all 304 Task.destroy_all
301 c = fast_create(Community) 305 c = fast_create(Community)
302 - c.add_admin profile 306 + c.add_admin person
303 @controller.stubs(:profile).returns(c) 307 @controller.stubs(:profile).returns(c)
304 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body'}, :name => 'some name', :email => 'test@localhost.com', :target => c) 308 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body'}, :name => 'some name', :email => 'test@localhost.com', :target => c)
305 309
@@ -311,7 +315,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -311,7 +315,7 @@ class TasksControllerTest &lt; ActionController::TestCase
311 should 'create TinyMceArticle article after finish approve suggested article task' do 315 should 'create TinyMceArticle article after finish approve suggested article task' do
312 TinyMceArticle.destroy_all 316 TinyMceArticle.destroy_all
313 c = fast_create(Community) 317 c = fast_create(Community)
314 - c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id)) 318 + c.affiliate(person, Profile::Roles.all_roles(person.environment.id))
315 @controller.stubs(:profile).returns(c) 319 @controller.stubs(:profile).returns(c)
316 t = SuggestArticle.create!(:article => {:name => 'test name', :body => 'test body'}, :name => 'some name', :email => 'test@localhost.com', :target => c) 320 t = SuggestArticle.create!(:article => {:name => 'test name', :body => 'test body'}, :name => 'some name', :email => 'test@localhost.com', :target => c)
317 321
@@ -322,7 +326,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -322,7 +326,7 @@ class TasksControllerTest &lt; ActionController::TestCase
322 should "change the article's attributes on suggested article task approval" do 326 should "change the article's attributes on suggested article task approval" do
323 TinyMceArticle.destroy_all 327 TinyMceArticle.destroy_all
324 c = fast_create(Community) 328 c = fast_create(Community)
325 - c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id)) 329 + c.affiliate(person, Profile::Roles.all_roles(person.environment.id))
326 @controller.stubs(:profile).returns(c) 330 @controller.stubs(:profile).returns(c)
327 t = SuggestArticle.new 331 t = SuggestArticle.new
328 t.article = {:name => 'test name', :body => 'test body', :source => 'http://test.com', :source_name => 'some source name'} 332 t.article = {:name => 'test name', :body => 'test body', :source => 'http://test.com', :source_name => 'some source name'}
@@ -342,7 +346,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -342,7 +346,7 @@ class TasksControllerTest &lt; ActionController::TestCase
342 should "display name from article suggestion when requestor was not setted" do 346 should "display name from article suggestion when requestor was not setted" do
343 Task.destroy_all 347 Task.destroy_all
344 c = fast_create(Community) 348 c = fast_create(Community)
345 - c.add_admin profile 349 + c.add_admin person
346 @controller.stubs(:profile).returns(c) 350 @controller.stubs(:profile).returns(c)
347 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body'}, :name => 'some name', :email => 'test@localhost.com', :target => c) 351 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body'}, :name => 'some name', :email => 'test@localhost.com', :target => c)
348 352
@@ -353,7 +357,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -353,7 +357,7 @@ class TasksControllerTest &lt; ActionController::TestCase
353 should "append hidden tag with type value from article suggestion" do 357 should "append hidden tag with type value from article suggestion" do
354 Task.destroy_all 358 Task.destroy_all
355 c = fast_create(Community) 359 c = fast_create(Community)
356 - c.add_admin profile 360 + c.add_admin person
357 @controller.stubs(:profile).returns(c) 361 @controller.stubs(:profile).returns(c)
358 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body', :type => 'TextArticle'}, :name => 'some name', :email => 'test@localhost.com', :target => c) 362 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body', :type => 'TextArticle'}, :name => 'some name', :email => 'test@localhost.com', :target => c)
359 363
@@ -364,7 +368,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -364,7 +368,7 @@ class TasksControllerTest &lt; ActionController::TestCase
364 should "display parent_id selection from article suggestion with predefined value" do 368 should "display parent_id selection from article suggestion with predefined value" do
365 Task.destroy_all 369 Task.destroy_all
366 c = fast_create(Community) 370 c = fast_create(Community)
367 - c.add_admin profile 371 + c.add_admin person
368 @controller.stubs(:profile).returns(c) 372 @controller.stubs(:profile).returns(c)
369 parent = fast_create(Folder, :profile_id => c.id) 373 parent = fast_create(Folder, :profile_id => c.id)
370 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body', :parent_id => parent.id}, :name => 'some name', :email => 'test@localhost.com', :target => c) 374 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body', :parent_id => parent.id}, :name => 'some name', :email => 'test@localhost.com', :target => c)
@@ -376,7 +380,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -376,7 +380,7 @@ class TasksControllerTest &lt; ActionController::TestCase
376 should "not display name from article suggestion when requestor was setted" do 380 should "not display name from article suggestion when requestor was setted" do
377 Task.destroy_all 381 Task.destroy_all
378 c = fast_create(Community) 382 c = fast_create(Community)
379 - c.add_admin profile 383 + c.add_admin person
380 @controller.stubs(:profile).returns(c) 384 @controller.stubs(:profile).returns(c)
381 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body'}, :requestor => fast_create(Person), :target => c) 385 t = SuggestArticle.create!(:article => {:name => 'test name', :abstract => 'test abstract', :body => 'test body'}, :requestor => fast_create(Person), :target => c)
382 386
@@ -392,7 +396,7 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -392,7 +396,7 @@ class TasksControllerTest &lt; ActionController::TestCase
392 396
393 should 'close create enterprise if trying to cancel even if there is already an existing identifier' do 397 should 'close create enterprise if trying to cancel even if there is already an existing identifier' do
394 identifier = "common-identifier" 398 identifier = "common-identifier"
395 - task = CreateEnterprise.create!(:identifier => identifier, :name => identifier, :requestor => profile, :target => profile) 399 + task = CreateEnterprise.create!(:identifier => identifier, :name => identifier, :requestor => person, :target => person)
396 fast_create(Profile, :identifier => identifier) 400 fast_create(Profile, :identifier => identifier)
397 401
398 assert_nothing_raised do 402 assert_nothing_raised do
@@ -408,17 +412,17 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -408,17 +412,17 @@ class TasksControllerTest &lt; ActionController::TestCase
408 class FeedDog < Task; end 412 class FeedDog < Task; end
409 Task.stubs(:per_page).returns(3) 413 Task.stubs(:per_page).returns(3)
410 requestor = fast_create(Person) 414 requestor = fast_create(Person)
411 - t1 = CleanHouse.create!(:requestor => requestor, :target => profile)  
412 - t2 = CleanHouse.create!(:requestor => requestor, :target => profile)  
413 - t3 = FeedDog.create!(:requestor => requestor, :target => profile) 415 + t1 = CleanHouse.create!(:requestor => requestor, :target => person)
  416 + t2 = CleanHouse.create!(:requestor => requestor, :target => person)
  417 + t3 = FeedDog.create!(:requestor => requestor, :target => person)
414 418
415 - post :index, :filter_type => t1.type 419 + get :index, :filter_type => t1.type
416 420
417 assert_includes assigns(:tasks), t1 421 assert_includes assigns(:tasks), t1
418 assert_includes assigns(:tasks), t2 422 assert_includes assigns(:tasks), t2
419 assert_not_includes assigns(:tasks), t3 423 assert_not_includes assigns(:tasks), t3
420 424
421 - post :index 425 + get :index
422 426
423 assert_includes assigns(:tasks), t1 427 assert_includes assigns(:tasks), t1
424 assert_includes assigns(:tasks), t2 428 assert_includes assigns(:tasks), t2
@@ -430,9 +434,9 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -430,9 +434,9 @@ class TasksControllerTest &lt; ActionController::TestCase
430 class FeedDog < Task; end 434 class FeedDog < Task; end
431 Task.stubs(:per_page).returns(3) 435 Task.stubs(:per_page).returns(3)
432 requestor = fast_create(Person) 436 requestor = fast_create(Person)
433 - t1 = CleanHouse.create!(:requestor => requestor, :target => profile, :data => {:name => 'Task Test'})  
434 - t2 = CleanHouse.create!(:requestor => requestor, :target => profile)  
435 - t3 = FeedDog.create!(:requestor => requestor, :target => profile) 437 + t1 = CleanHouse.create!(:requestor => requestor, :target => person, :data => {:name => 'Task Test'})
  438 + t2 = CleanHouse.create!(:requestor => requestor, :target => person)
  439 + t3 = FeedDog.create!(:requestor => requestor, :target => person)
436 440
437 get :index, :filter_type => t1.type, :filter_text => 'test' 441 get :index, :filter_type => t1.type, :filter_text => 'test'
438 442
@@ -447,13 +451,29 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -447,13 +451,29 @@ class TasksControllerTest &lt; ActionController::TestCase
447 assert_includes assigns(:tasks), t3 451 assert_includes assigns(:tasks), t3
448 end 452 end
449 453
  454 + should 'filter tasks by tags' do
  455 +
  456 + requestor = fast_create(Person)
  457 +
  458 + task_one = Task.create!(:requestor => requestor, :target => person, :data => {:name => 'Task Test'})
  459 + task_two = Task.create!(:requestor => requestor, :target => person, :data => {:name => 'Another Task'})
  460 +
  461 + person.tag(task_one, with: 'noosfero,test', on: :tags)
  462 + person.tag(task_two, with: 'test', on: :tags)
  463 +
  464 + get :index, :filter_tags => 'noosfero'
  465 +
  466 + assert_includes assigns(:tasks), task_one
  467 + assert_not_includes assigns(:tasks), task_two
  468 + end
  469 +
450 should 'return tasks ordered accordingly and limited by pages' do 470 should 'return tasks ordered accordingly and limited by pages' do
451 time = Time.now 471 time = Time.now
452 - person = fast_create(Person)  
453 - t1 = create(Task, :status => Task::Status::ACTIVE, :target => profile, :requestor => person, :created_at => time)  
454 - t2 = create(Task, :status => Task::Status::ACTIVE, :target => profile, :requestor => person, :created_at => time + 1.second)  
455 - t3 = create(Task, :status => Task::Status::ACTIVE, :target => profile, :requestor => person, :created_at => time + 2.seconds)  
456 - t4 = create(Task, :status => Task::Status::ACTIVE, :target => profile, :requestor => person, :created_at => time + 3.seconds) 472 + requestor = fast_create(Person)
  473 + t1 = create(Task, :status => Task::Status::ACTIVE, :target => person, :requestor => requestor, :created_at => time)
  474 + t2 = create(Task, :status => Task::Status::ACTIVE, :target => person, :requestor => requestor, :created_at => time + 1.second)
  475 + t3 = create(Task, :status => Task::Status::ACTIVE, :target => person, :requestor => requestor, :created_at => time + 2.seconds)
  476 + t4 = create(Task, :status => Task::Status::ACTIVE, :target => person, :requestor => requestor, :created_at => time + 3.seconds)
457 477
458 Task.stubs(:per_page).returns(2) 478 Task.stubs(:per_page).returns(2)
459 479
@@ -469,9 +489,9 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -469,9 +489,9 @@ class TasksControllerTest &lt; ActionController::TestCase
469 Task.stubs(:per_page).returns(3) 489 Task.stubs(:per_page).returns(3)
470 requestor = fast_create(Person) 490 requestor = fast_create(Person)
471 responsible = fast_create(Person) 491 responsible = fast_create(Person)
472 - t1 = Task.create!(:requestor => requestor, :target => profile, :responsible => responsible)  
473 - t2 = Task.create!(:requestor => requestor, :target => profile, :responsible => responsible)  
474 - t3 = Task.create!(:requestor => requestor, :target => profile) 492 + t1 = Task.create!(:requestor => requestor, :target => person, :responsible => responsible)
  493 + t2 = Task.create!(:requestor => requestor, :target => person, :responsible => responsible)
  494 + t3 = Task.create!(:requestor => requestor, :target => person)
475 495
476 get :index, :filter_responsible => responsible.id 496 get :index, :filter_responsible => responsible.id
477 497
@@ -661,4 +681,50 @@ class TasksControllerTest &lt; ActionController::TestCase @@ -661,4 +681,50 @@ class TasksControllerTest &lt; ActionController::TestCase
661 assert_select ".task_responsible .value" 681 assert_select ".task_responsible .value"
662 end 682 end
663 683
  684 + should 'save task tags' do
  685 + requestor = fast_create(Person)
  686 +
  687 + task_one = Task.create!(:requestor => requestor, :target => person, :data => {:name => 'Task Test'})
  688 + post :save_tags, :task_id => task_one.id, :tag_list => 'test'
  689 +
  690 + assert_includes task_one.tags_from(nil), 'test'
  691 + end
  692 +
  693 + should 'tag attribution in one task not affect another' do
  694 + requestor = fast_create(Person)
  695 +
  696 + task_one = Task.create!(:requestor => requestor, :target => person, :data => {:name => 'Task Test'})
  697 + task_two = Task.create!(:requestor => requestor, :target => person, :data => {:name => 'Another Task'})
  698 +
  699 + post :save_tags, :task_id => task_one.id, :tag_list => 'noosfero,test'
  700 + post :save_tags, :task_id => task_two.id, :tag_list => 'test'
  701 +
  702 + assert_not_includes task_two.tags_from(nil), 'noosfero'
  703 + end
  704 +
  705 + should 'not tag task without permission' do
  706 + Role.delete_all
  707 + requestor = fast_create(Person)
  708 + community = fast_create(Community)
  709 + community.add_member(person)
  710 +
  711 + @controller.stubs(:profile).returns(community)
  712 + task_one = Task.create!(:requestor => requestor, :target => community, :data => {:name => 'Task Test'})
  713 +
  714 + post :save_tags, :task_id => task_one.id, :tag_list => 'test'
  715 +
  716 + assert_not_includes task_one.tags_from(nil), 'test'
  717 + end
  718 +
  719 + should 'not tag task with permission but another user' do
  720 + requestor = fast_create(Person)
  721 + target = fast_create(Person)
  722 +
  723 + task_one = Task.create!(:requestor => requestor, :target => target, :data => {:name => 'Task Test'})
  724 +
  725 + post :save_tags, :task_id => task_one.id, :tag_list => 'test'
  726 +
  727 + assert_not_includes task_one.tags_from(nil), 'test'
  728 + end
  729 +
664 end 730 end
test/unit/task_test.rb
@@ -329,7 +329,7 @@ class TaskTest &lt; ActiveSupport::TestCase @@ -329,7 +329,7 @@ class TaskTest &lt; ActiveSupport::TestCase
329 assert_includes Task.to(another_person), t4 329 assert_includes Task.to(another_person), t4
330 end 330 end
331 331
332 - should 'filter tasks by type with named_scope' do 332 + should 'filter tasks by type with named scope' do
333 class CleanHouse < Task; end 333 class CleanHouse < Task; end
334 class FeedDog < Task; end 334 class FeedDog < Task; end
335 requestor = fast_create(Person) 335 requestor = fast_create(Person)
@@ -345,6 +345,25 @@ class TaskTest &lt; ActiveSupport::TestCase @@ -345,6 +345,25 @@ class TaskTest &lt; ActiveSupport::TestCase
345 assert_includes Task.of(nil), t3 345 assert_includes Task.of(nil), t3
346 end 346 end
347 347
  348 + should 'filter tasks by tags with named scope' do
  349 +
  350 + requestor = fast_create(Person)
  351 + target = fast_create(Person)
  352 + profile = sample_user
  353 +
  354 + task_one = Task.create!(:requestor => requestor, :target => target, :data => {:name => 'Task Test'})
  355 + task_two = Task.create!(:requestor => requestor, :target => target, :data => {:name => 'Another Task'})
  356 +
  357 + profile.tag(task_one, with: 'noosfero,test', on: :tags)
  358 + profile.tag(task_two, with: 'test', on: :tags)
  359 +
  360 + data = Task.tagged_with('noosfero', any: true)
  361 +
  362 + assert_includes data, task_one
  363 + assert_not_includes data, task_two
  364 +
  365 + end
  366 +
348 should 'order tasks by some attribute correctly' do 367 should 'order tasks by some attribute correctly' do
349 Task.destroy_all 368 Task.destroy_all
350 t1 = fast_create(Task, :status => 4, :created_at => Time.now + 1.hour) 369 t1 = fast_create(Task, :status => 4, :created_at => Time.now + 1.hour)
@@ -452,6 +471,23 @@ class TaskTest &lt; ActiveSupport::TestCase @@ -452,6 +471,23 @@ class TaskTest &lt; ActiveSupport::TestCase
452 assert_equal person, task.responsible 471 assert_equal person, task.responsible
453 end 472 end
454 473
  474 + should 'save tasks tags' do
  475 +
  476 + requestor = fast_create(Person)
  477 + target = fast_create(Person)
  478 + profile = sample_user
  479 +
  480 + task_one = Task.create!(:requestor => requestor, :target => target, :data => {:name => 'Task Test'})
  481 + task_two = Task.create!(:requestor => requestor, :target => target, :data => {:name => 'Another Task'})
  482 +
  483 + profile.tag(task_one, with: 'noosfero,test', on: :tags)
  484 + profile.tag(task_two, with: 'test', on: :tags)
  485 +
  486 + assert_includes task_one.tags_from(nil), 'test'
  487 + assert_not_includes task_two.tags_from(nil), 'noosfero'
  488 +
  489 + end
  490 +
455 protected 491 protected
456 492
457 def sample_user 493 def sample_user