Commit cee67307d33e66302f2a489453f4f36bf93476d2
1 parent
f20379e1
Exists in
master
and in
29 other branches
ActionItem311: implementing the directory
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1743 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
17 changed files
with
450 additions
and
19 deletions
Show diff stats
app/controllers/public/search_controller.rb
... | ... | @@ -6,6 +6,7 @@ class SearchController < ApplicationController |
6 | 6 | before_filter :prepare_filter |
7 | 7 | before_filter :check_search_whole_site |
8 | 8 | before_filter :load_search_assets |
9 | + before_filter :check_valid_assets, :only => [ :assets, :directory ] | |
9 | 10 | |
10 | 11 | no_design_blocks |
11 | 12 | |
... | ... | @@ -33,6 +34,14 @@ class SearchController < ApplicationController |
33 | 34 | end |
34 | 35 | end |
35 | 36 | |
37 | + def check_valid_assets | |
38 | + @asset = params[:asset].to_sym | |
39 | + if !SEARCH_IN.map(&:first).include?(@asset) | |
40 | + render :text => 'go away', :status => 403 | |
41 | + return | |
42 | + end | |
43 | + end | |
44 | + | |
36 | 45 | public |
37 | 46 | |
38 | 47 | include SearchHelper |
... | ... | @@ -83,17 +92,20 @@ class SearchController < ApplicationController |
83 | 92 | attr_reader :category |
84 | 93 | |
85 | 94 | def assets |
86 | - asset = params[:asset].to_sym | |
87 | - if !SEARCH_IN.map(&:first).include?(asset) | |
88 | - render :text => 'go away', :status => 403 | |
89 | - return | |
90 | - end | |
95 | + @results = { @asset => @finder.recent(@asset, LIST_LIMIT) } | |
96 | + | |
97 | + @asset_name = gettext(SEARCH_IN.find { |entry| entry.first == @asset }[1]) | |
98 | + @names = { @asset => @asset_name } | |
99 | + end | |
91 | 100 | |
101 | + def directory | |
102 | + @results = { @asset => @finder.find_by_initial(@asset, params[:initial]) } | |
92 | 103 | |
93 | - @results = { asset => @finder.recent(asset, LIST_LIMIT) } | |
104 | + # FIXME remove this duplication with assets action | |
105 | + @asset_name = gettext(SEARCH_IN.find { |entry| entry.first == @asset }[1]) | |
106 | + @names = { @asset => @asset_name } | |
94 | 107 | |
95 | - @asset_name = gettext(SEARCH_IN.find { |entry| entry.first == asset }[1]) | |
96 | - @names = { asset => @asset_name } | |
108 | + render :action => 'assets' | |
97 | 109 | end |
98 | 110 | |
99 | 111 | def tags | ... | ... |
app/models/article.rb
... | ... | @@ -112,6 +112,10 @@ class Article < ActiveRecord::Base |
112 | 112 | true |
113 | 113 | end |
114 | 114 | |
115 | + def self.find_by_initial(initial) | |
116 | + self.find(:all, :order => 'articles.name', :conditions => [ 'articles.name like (?)', initial + '%']) | |
117 | + end | |
118 | + | |
115 | 119 | private |
116 | 120 | |
117 | 121 | def sanitize_tag_list | ... | ... |
app/models/category_finder.rb
... | ... | @@ -35,6 +35,10 @@ class CategoryFinder |
35 | 35 | asset_class(asset).find(:all, options_for_find(asset_class(asset), {:limit => limit, :order => "created_at desc, #{asset_table(asset)}.id desc"})) |
36 | 36 | end |
37 | 37 | |
38 | + def find_by_initial(asset, initial) | |
39 | + asset_class(asset).find(:all, options_for_find_by_initial(asset_class(asset), initial)) | |
40 | + end | |
41 | + | |
38 | 42 | def count(asset) |
39 | 43 | asset_class(asset).count(:all, options_for_find(asset_class(asset))) |
40 | 44 | end |
... | ... | @@ -62,6 +66,20 @@ class CategoryFinder |
62 | 66 | end |
63 | 67 | end |
64 | 68 | |
69 | + def options_for_find_by_initial(klass, initial) | |
70 | + # FIXME copy/pasted from options_for_find above !!! | |
71 | + case klass.name | |
72 | + when 'Comment' | |
73 | + {:select => 'distinct comments.*', :joins => 'inner join articles_categories on articles_categories.article_id = comments.article_id', :conditions => ['articles_categories.category_id in (?) and comments.title like (?)', category_ids, initial + '%']} | |
74 | + when 'Product' | |
75 | + {:select => 'distinct products.*', :joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id in (?) and products.name like (?)', category_ids, initial + '%']} | |
76 | + when 'Article', 'Person', 'Community', 'Enterprise' | |
77 | + {:include => 'categories', :conditions => ['categories.id IN (?) and %s.name like (?)' % klass.table_name, category_ids, initial + '%']} | |
78 | + else | |
79 | + raise "unreconized class #{klass.name}" | |
80 | + end | |
81 | + end | |
82 | + | |
65 | 83 | def asset_class(asset) |
66 | 84 | asset.to_s.singularize.camelize.constantize |
67 | 85 | end | ... | ... |
app/models/comment.rb
... | ... | @@ -41,4 +41,8 @@ class Comment < ActiveRecord::Base |
41 | 41 | self.find(:all, :order => 'created_at desc, id desc', :limit => limit) |
42 | 42 | end |
43 | 43 | |
44 | + def self.find_by_initial(initial) | |
45 | + self.find(:all, :order => 'comments.title', :conditions => ['comments.title like (?)', initial + '%']) | |
46 | + end | |
47 | + | |
44 | 48 | end | ... | ... |
app/models/environment_finder.rb
app/models/product.rb
... | ... | @@ -38,4 +38,8 @@ class Product < ActiveRecord::Base |
38 | 38 | self.find(:all, :order => 'id desc', :limit => limit) |
39 | 39 | end |
40 | 40 | |
41 | + def self.find_by_initial(initial) | |
42 | + self.find(:all, :order => 'products.name', :conditions => [ 'products.name like (?)', initial + '%']) | |
43 | + end | |
44 | + | |
41 | 45 | end | ... | ... |
app/models/profile.rb
... | ... | @@ -289,4 +289,8 @@ class Profile < ActiveRecord::Base |
289 | 289 | self.find(:all, :order => 'id desc', :limit => limit) |
290 | 290 | end |
291 | 291 | |
292 | + def self.find_by_initial(initial) | |
293 | + self.find(:all, :order => 'profiles.name', :conditions => [ 'profiles.name like (?)', (initial + '%') ]) | |
294 | + end | |
295 | + | |
292 | 296 | end | ... | ... |
app/views/search/assets.rhtml
1 | 1 | <h1><%= @category ? (_('%{asset_name} in %{category}') % { :asset_name => @asset_name, :category => @category.name}) : @asset_name %></h1> |
2 | 2 | |
3 | +<div style='text-align: center'> | |
4 | + <%= link_to_unless_current(_('Recent'), :action => 'assets') %> | |
5 | + | |
6 | + <%= (?a..?z).map { |initial| link_to_unless_current(('' << initial).upcase, :action => 'directory', :initial => ('' << initial)) }.join(' ') %> | |
7 | +</div> | |
8 | +<br style='clear:both'/> | |
9 | + | |
3 | 10 | <%= render :partial => 'display_results' %> | ... | ... |
config/routes.rb
... | ... | @@ -32,6 +32,7 @@ ActionController::Routing::Routes.draw do |map| |
32 | 32 | # categories index |
33 | 33 | map.category 'cat/*category_path', :controller => 'search', :action => 'category_index' |
34 | 34 | map.assets 'assets/:asset/*category_path', :controller => 'search', :action => 'assets' |
35 | + map.directory 'directory/:asset/:initial/*category_path', :controller => 'search', :action => 'directory' | |
35 | 36 | # search |
36 | 37 | map.connect 'search/:action/*category_path', :controller => 'search' |
37 | 38 | ... | ... |
test/functional/search_controller_test.rb
... | ... | @@ -16,7 +16,7 @@ class SearchControllerTest < Test::Unit::TestCase |
16 | 16 | def test_local_files_reference |
17 | 17 | assert_local_files_reference |
18 | 18 | end |
19 | - | |
19 | + | |
20 | 20 | def test_valid_xhtml |
21 | 21 | assert_valid_xhtml |
22 | 22 | end |
... | ... | @@ -77,7 +77,7 @@ class SearchControllerTest < Test::Unit::TestCase |
77 | 77 | assert_includes assigns(:results)[:articles], art1 |
78 | 78 | assert_not_includes assigns(:results)[:articles], art2 |
79 | 79 | end |
80 | - | |
80 | + | |
81 | 81 | # 'assets' outside any category |
82 | 82 | should 'list articles in general' do |
83 | 83 | person = create_user('testuser').person |
... | ... | @@ -92,7 +92,7 @@ class SearchControllerTest < Test::Unit::TestCase |
92 | 92 | assert_includes assigns(:results)[:articles], art1 |
93 | 93 | assert_includes assigns(:results)[:articles], art2 |
94 | 94 | end |
95 | - | |
95 | + | |
96 | 96 | # 'assets' inside a category |
97 | 97 | should 'list articles in a specific category' do |
98 | 98 | person = create_user('testuser').person |
... | ... | @@ -131,7 +131,7 @@ class SearchControllerTest < Test::Unit::TestCase |
131 | 131 | |
132 | 132 | # not in category |
133 | 133 | art2 = person.articles.build(:name => 'another article to be found') |
134 | - art2.save! | |
134 | + art2.save! | |
135 | 135 | comment2 = art2.comments.build(:title => 'comment to be found', :body => 'hfyfyh', :author => person); comment2.save! |
136 | 136 | get :index, :category_path => ['my-category'], :query => 'found', :find_in => [ 'comments' ] |
137 | 137 | |
... | ... | @@ -176,7 +176,7 @@ class SearchControllerTest < Test::Unit::TestCase |
176 | 176 | get 'index', :query => 'teste', :find_in => [ 'enterprises' ] |
177 | 177 | assert_includes assigns(:results)[:enterprises], ent |
178 | 178 | end |
179 | - | |
179 | + | |
180 | 180 | should 'find enterprises in a specified category' do |
181 | 181 | |
182 | 182 | # in category |
... | ... | @@ -235,7 +235,7 @@ class SearchControllerTest < Test::Unit::TestCase |
235 | 235 | p2 = create_user('test2').person |
236 | 236 | |
237 | 237 | get :assets, :asset => 'people' |
238 | - | |
238 | + | |
239 | 239 | assert_equal [p2,p1], assigns(:results)[:people].instance_variable_get('@results') |
240 | 240 | end |
241 | 241 | |
... | ... | @@ -350,9 +350,9 @@ class SearchControllerTest < Test::Unit::TestCase |
350 | 350 | article = person.articles.create!(:name => 'display article') |
351 | 351 | comment = article.comments.create!(:title => 'display comment', :body => '...', :author => person) |
352 | 352 | community = Community.create!(:name => 'display community', :identifier => 'an_bea_comm') |
353 | - | |
353 | + | |
354 | 354 | get :index, :query => 'display' |
355 | - | |
355 | + | |
356 | 356 | names = { |
357 | 357 | :articles => 'Articles', |
358 | 358 | :comments => 'Comments', |
... | ... | @@ -539,7 +539,7 @@ class SearchControllerTest < Test::Unit::TestCase |
539 | 539 | should 'search in categoty hierachy' do |
540 | 540 | parent = Category.create!(:name => 'Parent Category', :environment => Environment.default) |
541 | 541 | child = Category.create!(:name => 'Child Category', :environment => Environment.default, :parent => parent) |
542 | - | |
542 | + | |
543 | 543 | p = create_user('test_profile').person |
544 | 544 | p.categories << child |
545 | 545 | p.save! |
... | ... | @@ -558,5 +558,194 @@ class SearchControllerTest < Test::Unit::TestCase |
558 | 558 | assert_no_tag :tag => 'input', :attributes => { :name => 'find_in[]', :value => 'enterprises', :checked => 'checked' } |
559 | 559 | assert_no_tag :tag => 'input', :attributes => { :name => 'find_in[]', :value => 'products', :checked => 'checked' } |
560 | 560 | end |
561 | - | |
561 | + | |
562 | + ############## directory #################### | |
563 | + should 'link to people directory in index' do | |
564 | + get :assets, :asset => 'people' | |
565 | + assert_tag :tag => 'a', :attributes => { :href => '/directory/people/a'}, :content => 'A' | |
566 | + assert_tag :tag => 'a', :attributes => { :href => '/directory/people/b'}, :content => 'B' | |
567 | + end | |
568 | + | |
569 | + should 'display link in people directory to other initials but not to the same' do | |
570 | + get :directory, :asset => 'people', :initial => 'r' | |
571 | + assert_tag :tag => 'a', :attributes => { :href => '/directory/people/a' } | |
572 | + assert_no_tag :tag => 'a', :attributes => { :href => '/directory/people/r' } | |
573 | + end | |
574 | + | |
575 | + should 'display link to recent people while in directory' do | |
576 | + get :directory, :asset => 'people', :initial => 'a' | |
577 | + assert_tag :tag => 'a', :attributes => { :href => '/assets/people' }, :content => 'Recent' | |
578 | + end | |
579 | + | |
580 | + ############### directory for every kind of asset ################# | |
581 | + should 'display people with a given initial' do | |
582 | + included = create_user('fergunson').person | |
583 | + not_included = create_user('yanerson').person | |
584 | + | |
585 | + get :directory, :asset => 'people', :initial => 'f' | |
586 | + assert_includes assigns(:results)[:people], included | |
587 | + assert_not_includes assigns(:results)[:people], not_included | |
588 | + end | |
589 | + | |
590 | + should 'display communities with a given initial' do | |
591 | + c1 = Community.create!(:name => 'a beautiful community', :identifier => 'bea_comm', :environment => Environment.default) | |
592 | + c2 = Community.create!(:name => 'beautiful community (another)', :identifier => 'an_bea_comm', :environment => Environment.default) | |
593 | + | |
594 | + get :directory, :asset => 'communities', :initial => 'a' | |
595 | + | |
596 | + assert_includes assigns(:results)[:communities], c1 | |
597 | + assert_not_includes assigns(:results)[:communities], c2 | |
598 | + end | |
599 | + | |
600 | + should 'display enterprises with a given initial' do | |
601 | + ent1 = Enterprise.create!(:name => 'aaaaa', :identifier => 'teste1') | |
602 | + ent2 = Enterprise.create!(:name => 'bbbbb', :identifier => 'teste2') | |
603 | + | |
604 | + get :directory, :asset => 'enterprises', :initial => 'a' | |
605 | + | |
606 | + assert_includes assigns(:results)[:enterprises], ent1 | |
607 | + assert_not_includes assigns(:results)[:enterprises], ent2 | |
608 | + end | |
609 | + | |
610 | + should 'display products with a given initial' do | |
611 | + ent = Enterprise.create!(:name => 'teste', :identifier => 'teste') | |
612 | + prod1 = ent.products.create!(:name => 'a beautiful product') | |
613 | + prod2 = ent.products.create!(:name => 'beautiful product (another)') | |
614 | + | |
615 | + get :directory, :asset => 'products', :initial => 'a' | |
616 | + | |
617 | + assert_includes assigns(:results)[:products], prod1 | |
618 | + assert_not_includes assigns(:results)[:products], prod2 | |
619 | + end | |
620 | + | |
621 | + should 'display articles with a given initial' do | |
622 | + person = create_user('teste').person | |
623 | + art1 = person.articles.build(:name => 'an article to be found'); art1.save! | |
624 | + art2 = person.articles.build(:name => 'better article'); art2.save! | |
625 | + | |
626 | + get :directory, :asset => 'articles', :initial => 'a' | |
627 | + | |
628 | + assert_includes assigns(:results)[:articles], art1 | |
629 | + assert_not_includes assigns(:results)[:articles], art2 | |
630 | + end | |
631 | + | |
632 | + should 'display comments with a given initial' do | |
633 | + person = create_user('teste').person | |
634 | + art = person.articles.build(:name => 'an article to be found'); art.save! | |
635 | + | |
636 | + comment1 = art.comments.build(:title => 'a comment to be found', :body => 'hfyfyh', :author => person); comment1.save! | |
637 | + comment2 = art.comments.build(:title => 'better comment, but not found', :body => 'hfyfyh', :author => person); comment2.save! | |
638 | + | |
639 | + get :directory, :asset => 'comments', :initial => 'a' | |
640 | + | |
641 | + assert_includes assigns(:results)[:comments], comment1 | |
642 | + assert_not_includes assigns(:results)[:comments], comment2 | |
643 | + end | |
644 | + | |
645 | + | |
646 | + should 'display people with a given initial, under a specific category' do | |
647 | + | |
648 | + in_category_and_with_initial = create_user('fergunson').person | |
649 | + in_category_and_with_initial.categories << @category | |
650 | + | |
651 | + in_category_but_without_initial = create_user('yanerson').person | |
652 | + in_category_but_without_initial.categories << @category | |
653 | + | |
654 | + not_in_category_but_with_initial = create_user('fergy').person | |
655 | + not_in_category_and_without_initial = create_user('xalanxalan').person | |
656 | + | |
657 | + get :directory, :asset => 'people', :initial => 'f', :category_path => [ 'my-category' ] | |
658 | + | |
659 | + assert_includes assigns(:results)[:people], in_category_and_with_initial | |
660 | + assert_not_includes assigns(:results)[:people], in_category_but_without_initial | |
661 | + assert_not_includes assigns(:results)[:people], not_in_category_but_with_initial | |
662 | + assert_not_includes assigns(:results)[:people], not_in_category_and_without_initial | |
663 | + end | |
664 | + | |
665 | + should 'display communities with a given initial, under a specific category' do | |
666 | + c1 = Community.create!(:name => 'a beautiful community', :identifier => 'bea_comm', :environment => Environment.default); c1.categories << @category | |
667 | + c2 = Community.create!(:name => 'beautiful community (another)', :identifier => 'an_bea_comm', :environment => Environment.default); c2.categories << @category | |
668 | + | |
669 | + c3 = Community.create!(:name => 'another beautiful community', :identifier => 'lalala', :environment => Environment.default); | |
670 | + c4 = Community.create!(:name => 'damn beautiful community (another)', :identifier => 'lelele', :environment => Environment.default) | |
671 | + | |
672 | + get :directory, :asset => 'communities', :initial => 'a', :category_path => [ 'my-category' ] | |
673 | + | |
674 | + assert_includes assigns(:results)[:communities], c1 | |
675 | + assert_not_includes assigns(:results)[:communities], c2 | |
676 | + assert_not_includes assigns(:results)[:communities], c3 | |
677 | + assert_not_includes assigns(:results)[:communities], c4 | |
678 | + end | |
679 | + | |
680 | + should 'display enterprises with a given initial, under a specific category' do | |
681 | + ent1 = Enterprise.create!(:name => 'aaaaa', :identifier => 'teste1'); ent1.categories << @category | |
682 | + ent2 = Enterprise.create!(:name => 'bbbbb', :identifier => 'teste2'); ent1.categories << @category | |
683 | + ent3 = Enterprise.create!(:name => 'aaaa1111', :identifier => 'teste1111') | |
684 | + ent4 = Enterprise.create!(:name => 'ddddd', :identifier => 'teste2222') | |
685 | + | |
686 | + get :directory, :asset => 'enterprises', :initial => 'a', :category_path => [ 'my-category' ] | |
687 | + | |
688 | + assert_includes assigns(:results)[:enterprises], ent1 | |
689 | + assert_not_includes assigns(:results)[:enterprises], ent2 | |
690 | + assert_not_includes assigns(:results)[:enterprises], ent3 | |
691 | + assert_not_includes assigns(:results)[:enterprises], ent4 | |
692 | + end | |
693 | + | |
694 | + should 'display products with a given initial, under a specific category' do | |
695 | + ent = Enterprise.create!(:name => 'teste', :identifier => 'teste') | |
696 | + ent.categories << @category | |
697 | + prod1 = ent.products.create!(:name => 'a beautiful product') | |
698 | + prod2 = ent.products.create!(:name => 'beautiful product (another)') | |
699 | + | |
700 | + ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2') | |
701 | + prod3 = ent2.products.create!(:name => 'another product') | |
702 | + prod4 = ent2.products.create!(:name => 'damn product (another)') | |
703 | + | |
704 | + get :directory, :asset => 'products', :initial => 'a', :category_path => [ 'my-category' ] | |
705 | + | |
706 | + assert_includes assigns(:results)[:products], prod1 | |
707 | + assert_not_includes assigns(:results)[:products], prod2 | |
708 | + assert_not_includes assigns(:results)[:products], prod3 | |
709 | + assert_not_includes assigns(:results)[:products], prod4 | |
710 | + end | |
711 | + | |
712 | + should 'display articles with a given initial, under a specific category' do | |
713 | + person = create_user('teste').person | |
714 | + art1 = person.articles.build(:name => 'an article to be found'); art1.save! | |
715 | + art1.categories << @category | |
716 | + art2 = person.articles.build(:name => 'better article'); art2.save! | |
717 | + art2.categories << @category | |
718 | + | |
719 | + art3 = person.articles.build(:name => 'another article to be found'); art3.save! | |
720 | + art4 = person.articles.build(:name => 'damn article'); art4.save! | |
721 | + | |
722 | + | |
723 | + get :directory, :asset => 'articles', :initial => 'a', :category_path => [ 'my-category' ] | |
724 | + | |
725 | + assert_includes assigns(:results)[:articles], art1 | |
726 | + assert_not_includes assigns(:results)[:articles], art2 | |
727 | + assert_not_includes assigns(:results)[:articles], art3 | |
728 | + assert_not_includes assigns(:results)[:articles], art4 | |
729 | + end | |
730 | + | |
731 | + should 'display comments with a given initial, under a specific category' do | |
732 | + person = create_user('teste').person | |
733 | + art = person.articles.build(:name => 'an article to be found'); art.save! | |
734 | + art.categories << @category | |
735 | + comment1 = art.comments.build(:title => 'a comment to be found', :body => 'hfyfyh', :author => person); comment1.save! | |
736 | + comment2 = art.comments.build(:title => 'better comment, but not found', :body => 'hfyfyh', :author => person); comment2.save! | |
737 | + | |
738 | + art2 = person.articles.build(:name => 'another article to be found'); art2.save! | |
739 | + comment3 = art2.comments.build(:title => 'a comment to be found', :body => 'hfyfyh', :author => person); comment1.save! | |
740 | + comment4 = art2.comments.build(:title => 'better comment, but not found', :body => 'hfyfyh', :author => person); comment2.save! | |
741 | + | |
742 | + | |
743 | + get :directory, :asset => 'comments', :initial => 'a', :category_path => [ 'my-category' ] | |
744 | + | |
745 | + assert_includes assigns(:results)[:comments], comment1 | |
746 | + assert_not_includes assigns(:results)[:comments], comment2 | |
747 | + assert_not_includes assigns(:results)[:comments], comment3 | |
748 | + assert_not_includes assigns(:results)[:comments], comment4 | |
749 | + end | |
750 | + | |
562 | 751 | end | ... | ... |
test/integration/routing_test.rb
... | ... | @@ -102,4 +102,8 @@ class RoutingTest < ActionController::IntegrationTest |
102 | 102 | assert_routing('/assets/my-asset/a/b/c', :controller => 'search', :action => 'assets', :asset => 'my-asset', :category_path => ['a', 'b', 'c']) |
103 | 103 | end |
104 | 104 | |
105 | + def test_directory_routing | |
106 | + assert_routing('/directory/my-asset/f/a/b/c', :controller => 'search', :action => 'directory', :asset => 'my-asset', :initial => 'f', :category_path => [ 'a', 'b', 'c']) | |
107 | + end | |
108 | + | |
105 | 109 | end | ... | ... |
test/unit/article_test.rb
... | ... | @@ -217,4 +217,16 @@ class ArticleTest < Test::Unit::TestCase |
217 | 217 | assert_equal [articles[1], articles[0]], person.articles.most_commented(2) |
218 | 218 | end |
219 | 219 | |
220 | + should 'find by initial' do | |
221 | + person = create_user('testuser').person | |
222 | + | |
223 | + a1 = person.articles.create!(:name => 'An nice article') | |
224 | + a2 = person.articles.create!(:name => 'Better stay off here') | |
225 | + | |
226 | + list = Article.find_by_initial('a') | |
227 | + | |
228 | + assert_includes list, a1 | |
229 | + assert_not_includes list, a2 | |
230 | + end | |
231 | + | |
220 | 232 | end | ... | ... |
test/unit/category_finder_test.rb
... | ... | @@ -157,4 +157,72 @@ class CategoryFinderTest < ActiveSupport::TestCase |
157 | 157 | # should respect the order (more commented comes first) |
158 | 158 | assert_equal [articles[1], articles[0]], @finder.most_commented_articles(2) |
159 | 159 | end |
160 | + | |
161 | + should 'find people by initial' do | |
162 | + p1 = create_user('aaaa').person; p1.categories << @category | |
163 | + p2 = create_user('bbbb').person; p2.categories << @category | |
164 | + | |
165 | + list = CategoryFinder.new(@category).find_by_initial(:people, 'a') | |
166 | + | |
167 | + assert_includes list, p1 | |
168 | + assert_not_includes list, p2 | |
169 | + end | |
170 | + | |
171 | + should 'find enterprises by initial' do | |
172 | + ent1 = Enterprise.create!(:name => 'aaaa', :identifier => 'aaaa'); ent1.categories << @category | |
173 | + ent2 = Enterprise.create!(:name => 'bbbb', :identifier => 'bbbb'); ent2.categories << @category | |
174 | + | |
175 | + list = CategoryFinder.new(@category).find_by_initial(:enterprises, 'a') | |
176 | + | |
177 | + assert_includes list, ent1 | |
178 | + assert_not_includes list, ent2 | |
179 | + end | |
180 | + | |
181 | + should 'find communities by initial' do | |
182 | + comm1 = Community.create!(:name => 'aaaa', :identifier => 'aaaa'); comm1.categories << @category | |
183 | + comm2 = Community.create!(:name => 'bbbb', :identifier => 'bbbb'); comm2.categories << @category | |
184 | + | |
185 | + list = CategoryFinder.new(@category).find_by_initial(:communities, 'a') | |
186 | + | |
187 | + assert_includes list, comm1 | |
188 | + assert_not_includes list, comm2 | |
189 | + end | |
190 | + | |
191 | + should 'find products by initial' do | |
192 | + ent = Enterprise.create!(:name => 'my enterprise', :identifier => 'myent') | |
193 | + ent.categories << @category | |
194 | + | |
195 | + p1 = ent.products.create!(:name => 'A product') | |
196 | + p2 = ent.products.create!(:name => 'Better product') | |
197 | + | |
198 | + list = CategoryFinder.new(@category).find_by_initial(:products, 'a') | |
199 | + | |
200 | + assert_includes list, p1 | |
201 | + assert_not_includes list, p2 | |
202 | + end | |
203 | + | |
204 | + should 'find articles by initial' do | |
205 | + person = create_user('testuser').person | |
206 | + a1 = person.articles.create!(:name => 'aaaa', :body => '...', :categories => [@category]) | |
207 | + a2 = person.articles.create!(:name => 'bbbb', :body => '...', :categories => [@category]) | |
208 | + | |
209 | + list = CategoryFinder.new(@category).find_by_initial(:articles, 'a') | |
210 | + | |
211 | + assert_includes list, a1 | |
212 | + assert_not_includes list, a2 | |
213 | + end | |
214 | + | |
215 | + should 'find comments by initial' do | |
216 | + person = create_user('testuser').person | |
217 | + a1 = person.articles.create!(:name => 'aaaa', :body => '...', :categories => [@category]) | |
218 | + | |
219 | + c1 = a1.comments.create!(:title => 'aaaaa', :body => '...', :author => person) | |
220 | + c2 = a1.comments.create!(:title => 'bbbbb', :body => '...', :author => person) | |
221 | + | |
222 | + list = CategoryFinder.new(@category).find_by_initial(:comments, 'a') | |
223 | + | |
224 | + assert_includes list, c1 | |
225 | + assert_not_includes list, c2 | |
226 | + end | |
227 | + | |
160 | 228 | end | ... | ... |
test/unit/comment_test.rb
... | ... | @@ -143,4 +143,16 @@ class CommentTest < Test::Unit::TestCase |
143 | 143 | assert c.errors.invalid?(:email) |
144 | 144 | end |
145 | 145 | |
146 | + should 'find by initial' do | |
147 | + owner = create_user('testuser').person | |
148 | + article = owner.articles.create!(:name => 'test', :body => '...') | |
149 | + c1 = article.comments.create!(:title => "A comment", :body => '...', :author => owner) | |
150 | + c2 = article.comments.create!(:title => "Better one", :body => '...', :author => owner) | |
151 | + | |
152 | + list = Comment.find_by_initial('a') | |
153 | + | |
154 | + assert_includes list, c1 | |
155 | + assert_not_includes list, c2 | |
156 | + end | |
157 | + | |
146 | 158 | end | ... | ... |
test/unit/environment_finder_test.rb
... | ... | @@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../test_helper' |
3 | 3 | class EnvironmentFinderTest < ActiveSupport::TestCase |
4 | 4 | |
5 | 5 | all_fixtures |
6 | - | |
6 | + | |
7 | 7 | should 'find articles' do |
8 | 8 | person = create_user('teste').person |
9 | 9 | art = person.articles.build(:name => 'an article to be found'); art.save! |
... | ... | @@ -65,4 +65,70 @@ class EnvironmentFinderTest < ActiveSupport::TestCase |
65 | 65 | assert_equal count+1, finder.count('enterprises') |
66 | 66 | end |
67 | 67 | |
68 | + should 'find articles by initial' do | |
69 | + person = create_user('teste').person | |
70 | + art1 = person.articles.create!(:name => 'an article to be found') | |
71 | + art2 = person.articles.create!(:name => 'blah: an article that cannot be found') | |
72 | + found = EnvironmentFinder.new(Environment.default).find_by_initial(:articles, 'a') | |
73 | + | |
74 | + assert_includes found, art1 | |
75 | + assert_not_includes found, art2 | |
76 | + end | |
77 | + | |
78 | + should 'find people by initial' do | |
79 | + finder = EnvironmentFinder.new(Environment.default) | |
80 | + p1 = create_user('alalala').person | |
81 | + p2 = create_user('blablabla').person | |
82 | + | |
83 | + found = finder.find_by_initial(:people, 'a') | |
84 | + assert_includes found, p1 | |
85 | + assert_not_includes found, p2 | |
86 | + end | |
87 | + | |
88 | + should 'find communities by initial' do | |
89 | + c1 = Community.create!(:name => 'a beautiful community', :identifier => 'bea_comm', :environment => Environment.default) | |
90 | + c2 = Community.create!(:name => 'b: another beautiful community', :identifier => 'bbbbb', :environment => Environment.default) | |
91 | + | |
92 | + found = EnvironmentFinder.new(Environment.default).find_by_initial(:communities, 'a') | |
93 | + | |
94 | + assert_includes found, c1 | |
95 | + assert_not_includes found, c2 | |
96 | + end | |
97 | + | |
98 | + should 'find comments by initial' do | |
99 | + person = create_user('teste').person | |
100 | + art = person.articles.build(:name => 'an article to be found'); art.save! | |
101 | + | |
102 | + comment1 = art.comments.build(:title => 'a comment to be found', :body => 'some sample text', :author => person); comment1.save! | |
103 | + comment2 = art.comments.build(:title => 'b: a comment to be found', :body => 'some sample text', :author => person); comment2.save! | |
104 | + | |
105 | + found = EnvironmentFinder.new(Environment.default).find_by_initial(:comments, 'a') | |
106 | + | |
107 | + assert_includes found, comment1 | |
108 | + assert_not_includes found, comment2 | |
109 | + end | |
110 | + | |
111 | + should 'find products by initial' do | |
112 | + finder = EnvironmentFinder.new(Environment.default) | |
113 | + ent = Enterprise.create!(:name => 'teste', :identifier => 'teste') | |
114 | + prod1 = ent.products.create!(:name => 'a beautiful product') | |
115 | + prod2 = ent.products.create!(:name => 'b: a beautiful product') | |
116 | + | |
117 | + found = finder.find_by_initial(:products, 'a') | |
118 | + | |
119 | + assert_includes found, prod1 | |
120 | + assert_not_includes found, prod2 | |
121 | + end | |
122 | + | |
123 | + should 'find enterprises by initial' do | |
124 | + finder = EnvironmentFinder.new(Environment.default) | |
125 | + ent1 = Enterprise.create!(:name => 'aaaa', :identifier => 'aaaa') | |
126 | + ent2 = Enterprise.create!(:name => 'bbbb', :identifier => 'bbbb') | |
127 | + | |
128 | + found = finder.find_by_initial(:enterprises, 'a') | |
129 | + | |
130 | + assert_includes found, ent1 | |
131 | + assert_not_includes found, ent2 | |
132 | + end | |
133 | + | |
68 | 134 | end | ... | ... |
test/unit/product_test.rb
... | ... | @@ -55,4 +55,16 @@ class ProductTest < Test::Unit::TestCase |
55 | 55 | end |
56 | 56 | end |
57 | 57 | |
58 | + should 'find by initial' do | |
59 | + p1 = Product.create!(:name => 'a test product') | |
60 | + p2 = Product.create!(:name => 'A Capitalize Product') | |
61 | + p3 = Product.create!(:name => 'b-class test product') | |
62 | + | |
63 | + list = Product.find_by_initial('a') | |
64 | + | |
65 | + assert_includes list, p1 | |
66 | + assert_includes list, p2 | |
67 | + assert_not_includes list, p3 | |
68 | + end | |
69 | + | |
58 | 70 | end | ... | ... |
test/unit/profile_test.rb
... | ... | @@ -432,6 +432,16 @@ class ProfileTest < Test::Unit::TestCase |
432 | 432 | assert profile.articles.find_by_path('feed').advertise? |
433 | 433 | end |
434 | 434 | |
435 | + should 'find by initial' do | |
436 | + inside = Profile.create!(:name => 'A person', :identifier => 'aperson') | |
437 | + outside = Profile.create!(:name => 'B Movie', :identifier => 'bmovie') | |
438 | + | |
439 | + list = Profile.find_by_initial('a') | |
440 | + | |
441 | + assert_includes list, inside | |
442 | + assert_not_includes list, outside | |
443 | + end | |
444 | + | |
435 | 445 | private |
436 | 446 | |
437 | 447 | def assert_invalid_identifier(id) | ... | ... |