Commit abc8b42c4808ecfe30ace5a406c40602df6d38c2
1 parent
0c8dd1ff
Exists in
staging
and in
42 other branches
ActionItem4: tags management tested
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@109 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
6 changed files
with
139 additions
and
26 deletions
Show diff stats
app/controllers/manage_tags_controller.rb
| ... | ... | @@ -4,63 +4,65 @@ require 'extended_tag.rb' |
| 4 | 4 | class ManageTagsController < ApplicationController |
| 5 | 5 | # Index redirects to list action without modifing the url |
| 6 | 6 | def index |
| 7 | - list | |
| 8 | - render :action => 'list' | |
| 7 | + redirect_to :action => 'list' | |
| 9 | 8 | end |
| 10 | 9 | |
| 11 | - # Lists the tags strting with the top tags or with the chidren of @parent if its provided | |
| 10 | + # Lists the tags starting with the top tags or with the chidren of @parent if its provided | |
| 12 | 11 | def list |
| 13 | 12 | @parent = Tag.find(params[:parent]) if params[:parent] |
| 14 | - @tags = @parent ? @parent.children : Tag.find(:all).select{|t|!t.parent} | |
| 13 | + @tags = @parent ? @parent.children : Tag.roots | |
| 15 | 14 | @pending_tags = Tag.find_pendings |
| 16 | 15 | end |
| 17 | 16 | |
| 18 | - # Prompt to data for a new tag | |
| 17 | + # Prompt for data to a new tag | |
| 19 | 18 | def new |
| 20 | - @parent_tags = Tag.find_all | |
| 19 | + @parent_tags = Tag.find(:all) | |
| 21 | 20 | @tag = Tag.new |
| 22 | 21 | end |
| 23 | 22 | |
| 24 | 23 | # Collects the data and creates a new tag with it |
| 25 | 24 | def create |
| 26 | 25 | @tag = Tag.new(params[:tag]) |
| 27 | - | |
| 28 | 26 | if @tag.save |
| 29 | 27 | flash[:notice] = _('Tag was successfully created.') |
| 30 | 28 | redirect_to :action => 'list' |
| 31 | 29 | else |
| 30 | + @parent_tags = Tag.find(:all) | |
| 32 | 31 | render :action => 'new' |
| 33 | 32 | end |
| 34 | 33 | end |
| 35 | 34 | |
| 36 | 35 | # Prompt for modifications on the attributes of a tag |
| 37 | 36 | def edit |
| 38 | - @tag = Tag.original_find(params[:id]) | |
| 39 | - @parent_tags = Tag.find_all - @tag.descendents - [@tag] | |
| 37 | + @tag = Tag.find_with_pendings(params[:id]) | |
| 38 | + @parent_tags = @tag.parents_candidates | |
| 40 | 39 | end |
| 41 | 40 | |
| 42 | 41 | # Do the modifications collected by edit |
| 43 | 42 | def update |
| 44 | - @tag = Tag.original_find(params[:id]) | |
| 43 | + @tag = Tag.find_with_pendings(params[:id]) | |
| 45 | 44 | if @tag.update_attributes(params[:tag]) |
| 46 | 45 | flash[:notice] = _('Tag was successfully updated.') |
| 47 | 46 | redirect_to :action => 'list' |
| 48 | 47 | else |
| 48 | + @parent_tags = @tag.parents_candidates | |
| 49 | 49 | render :action => 'edit' |
| 50 | 50 | end |
| 51 | 51 | end |
| 52 | 52 | |
| 53 | - # Destroy a tag | |
| 53 | + # Destroy a tag and all its children | |
| 54 | 54 | def destroy |
| 55 | - @tag = Tag.original_find(params[:id]) | |
| 56 | - @tag.destroy | |
| 55 | + @tag = Tag.find_with_pendings(params[:id]) | |
| 56 | + if @tag.destroy | |
| 57 | + flash[:notice] = _('Tag was successfuly destroyed') | |
| 58 | + end | |
| 57 | 59 | redirect_to :action => 'list' |
| 58 | 60 | end |
| 59 | 61 | |
| 62 | + # Approve a pending tag so now ita can be used to tag things | |
| 60 | 63 | def approve |
| 61 | - @tag = Tag.original_find(params[:id]) | |
| 62 | - @tag.pending = false | |
| 63 | - if @tag.save | |
| 64 | + @tag = Tag.find_with_pendings(params[:id]) | |
| 65 | + if @tag.update_attribute(:pending, false) | |
| 64 | 66 | flash[:notice] = _('Tag was successfuly approved') |
| 65 | 67 | redirect_to :action => 'list' |
| 66 | 68 | end | ... | ... |
app/views/manage_tags/_form.rhtml
| 1 | 1 | Name: <%= text_field 'tag', 'name' %> <br> |
| 2 | -Parent tag: <%= select_tag 'tag[parent_id]', ['<option value="0"></option>'] + @parent_tags.map {|pt|"<option value=\"#{pt.id}\" #{'selected="selected"' if @tag.parent == pt} >" + pt.name + '</option>'} %> <br> | |
| 2 | +Parent tag: <%= select_tag 'tag[parent_id]', ['<option></option>'] + @parent_tags.map {|pt|"<option value=\"#{pt.id}\" #{'selected="selected"' if @tag.parent == pt} >" + pt.name + '</option>'} %> <br> | |
| 3 | 3 | Pending: <%= check_box 'tag', 'pending' %> <br> | ... | ... |
app/views/manage_tags/edit.rhtml
| 1 | 1 | <h2> <%= _('Editing Tag') %> </h2> |
| 2 | 2 | |
| 3 | -<%= start_form_tag :action => 'update', :id => @tag %> | |
| 3 | +<% form_tag :action => 'update', :id => @tag do %> | |
| 4 | 4 | <%= render :partial => 'form' %> |
| 5 | 5 | <%= submit_tag _('Update') %> |
| 6 | 6 | <%= link_to _('Cancel'), {:action => 'list'} %> |
| 7 | -<%= end_form_tag %> | |
| 7 | +<% end %> | ... | ... |
app/views/manage_tags/new.rhtml
lib/extended_tag.rb
| 1 | 1 | class Tag |
| 2 | - @@original_find = self.method(:find) | |
| 3 | - def self.original_find(*args) | |
| 2 | + @@original_find = self.method(:find) | |
| 3 | + # Rename the find method to find_with_pendings that includes all tags in the search regardless if its pending or not | |
| 4 | + def self.find_with_pendings(*args) | |
| 4 | 5 | @@original_find.call(*args) |
| 5 | 6 | end |
| 6 | - | |
| 7 | + # Redefine the find method to exclude the pending tags from the search not allowing to tag something with an unapproved tag | |
| 7 | 8 | def self.find(*args) |
| 8 | 9 | self.with_scope(:find => { :conditions => ['pending = ?', false] }) do |
| 9 | - return self.original_find(*args) | |
| 10 | + self.find_with_pendings(*args) | |
| 10 | 11 | end |
| 11 | 12 | end |
| 12 | 13 | |
| 14 | + # Return all the tags that were suggested but not yet approved | |
| 13 | 15 | def self.find_pendings |
| 14 | - self.original_find(:all, :conditions => ['pending = ?', true]) | |
| 16 | + self.find_with_pendings(:all, :conditions => ['pending = ?', true]) | |
| 15 | 17 | end |
| 16 | 18 | |
| 19 | + # All the tags that can be a new parent for this tag, that is all but itself and its descendents to avoid loops | |
| 20 | + def parents_candidates | |
| 21 | + Tag.find(:all) - descendents - [self] | |
| 22 | + end | |
| 23 | + | |
| 24 | + # All tags that have this tag as its one of its ancestors | |
| 17 | 25 | def descendents |
| 18 | 26 | children.to_a.sum([], &:descendents) + children |
| 19 | 27 | end |
| 20 | 28 | |
| 29 | + # Test if this tag has been approved already | |
| 21 | 30 | def aproved? |
| 22 | 31 | not pending? |
| 23 | 32 | end | ... | ... |
| ... | ... | @@ -0,0 +1,102 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | +require 'manage_tags_controller' | |
| 3 | + | |
| 4 | +# Re-raise errors caught by the controller. | |
| 5 | +class ManageTagsController; def rescue_action(e) raise e end; end | |
| 6 | + | |
| 7 | +class ManageTagsControllerTest < Test::Unit::TestCase | |
| 8 | + fixtures :tags, :users, :blocks, :profiles, :virtual_communities, :boxes, :domains | |
| 9 | + def setup | |
| 10 | + @controller = ManageTagsController.new | |
| 11 | + @request = ActionController::TestRequest.new | |
| 12 | + @response = ActionController::TestResponse.new | |
| 13 | + end | |
| 14 | + | |
| 15 | + # Replace this with your real tests. | |
| 16 | + def test_get_index | |
| 17 | + get :index | |
| 18 | + assert_response :redirect | |
| 19 | + assert_redirected_to :action => 'list' | |
| 20 | + end | |
| 21 | + | |
| 22 | + def test_list | |
| 23 | + get :list | |
| 24 | + assert_response :success | |
| 25 | + assert_template 'list' | |
| 26 | + assert_not_nil assigns(:tags) | |
| 27 | + assert_not_nil assigns(:pending_tags) | |
| 28 | + assert_nil assigns(:parent), 'the list should not scoped' | |
| 29 | + end | |
| 30 | + | |
| 31 | + def test_scoped_list | |
| 32 | + assert_nothing_raised { Tag.find(1) } | |
| 33 | + get :list, :parent => Tag.find(1) | |
| 34 | + assert_response :success | |
| 35 | + assert_template 'list' | |
| 36 | + assert_not_nil assigns(:parent), 'the list should be scoped' | |
| 37 | + assert_not_nil assigns(:tags) | |
| 38 | + assert_not_nil assigns(:pending_tags) | |
| 39 | + end | |
| 40 | + | |
| 41 | + def test_new | |
| 42 | + get :new | |
| 43 | + assert_response :success | |
| 44 | + assert_template 'new' | |
| 45 | + assert_not_nil assigns(:parent_tags) | |
| 46 | + assert_not_nil assigns(:tag) | |
| 47 | + end | |
| 48 | + | |
| 49 | + def test_create | |
| 50 | + post :create, :tag => {:name => 'test_tag'} | |
| 51 | + assert_response :redirect | |
| 52 | + assert_redirected_to :action => 'list' | |
| 53 | + assert_not_nil assigns(:tag) | |
| 54 | + end | |
| 55 | + | |
| 56 | + def test_create_wrong | |
| 57 | + post :create, :tag => {:name => ''} | |
| 58 | + assert_response :success | |
| 59 | + assert_template 'new' | |
| 60 | + end | |
| 61 | + | |
| 62 | + def test_edit | |
| 63 | + assert_nothing_raised { Tag.find(1) } | |
| 64 | + get :edit, :id => 1 | |
| 65 | + assert assigns(:tag) | |
| 66 | + assert assigns(:parent_tags) | |
| 67 | + end | |
| 68 | + | |
| 69 | + def test_update | |
| 70 | + assert_nothing_raised { Tag.find(1) } | |
| 71 | + post :update, :id => 1, :tag => {:name => 'altered_tag'} | |
| 72 | + assert_response :redirect | |
| 73 | + assert_redirected_to :action => 'list' | |
| 74 | + assert assigns(:tag) | |
| 75 | + end | |
| 76 | + | |
| 77 | + def test_update_wrong | |
| 78 | + assert_nothing_raised { Tag.find(1) } | |
| 79 | + post :update, :id => 1, :tag => {:name => ''} | |
| 80 | + assert_response :success | |
| 81 | + assert_template 'edit' | |
| 82 | + assert assigns(:parent_tags) | |
| 83 | + end | |
| 84 | + | |
| 85 | + def test_destroy | |
| 86 | + assert_nothing_raised { Tag.find(1) } | |
| 87 | + post :destroy, :id => 1 | |
| 88 | + assert_response :redirect | |
| 89 | + assert_redirected_to :action => 'list' | |
| 90 | + assert_not_nil flash[:notice] | |
| 91 | + assert_raise(ActiveRecord::RecordNotFound) { Tag.find(1) } | |
| 92 | + end | |
| 93 | + | |
| 94 | + def test_approve | |
| 95 | + assert_nothing_raised { Tag.find_with_pendings(4) } | |
| 96 | + assert Tag.find_with_pendings(4).pending? | |
| 97 | + post :approve, :id => 4 | |
| 98 | + assert_response :redirect | |
| 99 | + assert_redirected_to :action => 'list' | |
| 100 | + assert ( not Tag.find_with_pendings(4).pending? ) | |
| 101 | + end | |
| 102 | +end | ... | ... |