Commit 97540ec02d5a6bdeb0a296a48480c3a2ba8d71e6
1 parent
667fc50c
Exists in
master
and in
29 other branches
ActionItem129: added georeference criteria to searches
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1846 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
19 changed files
with
258 additions
and
82 deletions
Show diff stats
app/controllers/admin/edit_template_controller.rb
app/controllers/admin/environment_design_controller.rb
... | ... | @@ -3,7 +3,7 @@ class EnvironmentDesignController < BoxOrganizerController |
3 | 3 | protect 'edit_environment_design', :environment |
4 | 4 | |
5 | 5 | def available_blocks |
6 | - @available_blocks ||= [ LoginBlock, EnvironmentStatisticsBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, PeopleBlock ] | |
6 | + @available_blocks ||= [ LoginBlock, EnvironmentStatisticsBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, PeopleBlock, SellersSearchBlock ] | |
7 | 7 | end |
8 | 8 | |
9 | 9 | end | ... | ... |
app/controllers/public/search_controller.rb
... | ... | @@ -60,14 +60,24 @@ class SearchController < ApplicationController |
60 | 60 | # TODO don't hardcode like this >:-( |
61 | 61 | LIST_LIMIT = 20 |
62 | 62 | |
63 | + def complete_region | |
64 | + @regions = Region.find(:all, :conditions => [ 'name like ? and lat is not null and lng is not null', '%' + params[:region][:name] + '%' ]) | |
65 | + render :action => 'complete_region', :layout => false | |
66 | + end | |
67 | + | |
63 | 68 | def index |
64 | 69 | @query = params[:query] || '' |
65 | 70 | @filtered_query = remove_stop_words(@query) |
71 | + @region = Region.find_by_name(params[:region][:name]) if params[:region] | |
66 | 72 | |
67 | 73 | @results = {} |
68 | 74 | @names = {} |
69 | 75 | SEARCH_IN.each do |key, description| |
70 | - @results[key] = @finder.find(key, @filtered_query) if @searching[key] | |
76 | + if [:enterprises, :people].include?(key) && @region | |
77 | + @results[key] = @finder.find(key, @filtered_query, :within => params[:radius], :region => @region.id) if @searching[key] | |
78 | + else | |
79 | + @results[key] = @finder.find(key, @filtered_query) if @searching[key] | |
80 | + end | |
71 | 81 | @names[key] = gettext(description) |
72 | 82 | end |
73 | 83 | end |
... | ... | @@ -122,16 +132,20 @@ class SearchController < ApplicationController |
122 | 132 | end |
123 | 133 | |
124 | 134 | def sellers |
135 | + # FIXME use a better select for category | |
125 | 136 | @categories = ProductCategory.find(:all) |
126 | 137 | @regions = Region.find(:all).select{|r|r.lat && r.lng} |
127 | 138 | @product_category = ProductCategory.find(params[:category]) if params[:category] |
128 | 139 | @region = Region.find(params[:region]) if params[:region] |
140 | + | |
129 | 141 | options = {} |
130 | - options.merge! :include => :products, :conditions => ['products.product_category_id = ?', @product_category.id] if @product_category | |
131 | - | |
132 | 142 | options.merge! :origin => [params[:lat].to_f, params[:long].to_f], :within => params[:radius] if !params[:lat].blank? && !params[:long].blank? && !params[:radius].blank? |
133 | - | |
134 | 143 | options.merge! :origin => [@region.lat, @region.lng], :within => params[:radius] if !params[:region].blank? && !params[:radius].blank? |
144 | + if @product_category | |
145 | + finder = CategoryFinder.new(@product_category) | |
146 | + product_ids = finder.find('products',nil) | |
147 | + options.merge! :include => :products, :conditions => ['products.id IN ?', product_ids ] | |
148 | + end | |
135 | 149 | |
136 | 150 | @enterprises = Enterprise.find(:all, options) |
137 | 151 | end |
... | ... | @@ -139,6 +153,7 @@ class SearchController < ApplicationController |
139 | 153 | ####################################################### |
140 | 154 | |
141 | 155 | def popup |
156 | + @regions = Region.find(:all).select{|r|r.lat && r.lng} | |
142 | 157 | render :action => 'popup', :layout => false |
143 | 158 | end |
144 | 159 | ... | ... |
app/models/category_finder.rb
... | ... | @@ -7,8 +7,8 @@ class CategoryFinder |
7 | 7 | |
8 | 8 | attr_reader :category_ids |
9 | 9 | |
10 | - def find(asset, query) | |
11 | - find_in_categorized(asset.to_s.singularize.camelize.constantize, query) | |
10 | + def find(asset, query, options={}) | |
11 | + find_in_categorized(asset.to_s.singularize.camelize.constantize, query, options) | |
12 | 12 | end |
13 | 13 | |
14 | 14 | def recent(asset, limit = 10) |
... | ... | @@ -30,6 +30,13 @@ class CategoryFinder |
30 | 30 | protected |
31 | 31 | |
32 | 32 | def find_in_categorized(klass, query, options={}) |
33 | + @region = Region.find_by_id(options.delete(:region)) if options.has_key?(:region) | |
34 | + if @region && options[:within] | |
35 | + options[:origin] = [@region.lat, @region.lng] | |
36 | + else | |
37 | + options.delete(:within) | |
38 | + end | |
39 | + | |
33 | 40 | if query.nil? |
34 | 41 | klass.find(:all, options_for_find(klass, options)) |
35 | 42 | else | ... | ... |
app/models/enterprise.rb
app/models/environment_finder.rb
... | ... | @@ -4,8 +4,14 @@ class EnvironmentFinder |
4 | 4 | @environment = env |
5 | 5 | end |
6 | 6 | |
7 | - def find(asset, query) | |
8 | - @environment.send(asset).find_by_contents(query) | |
7 | + def find(asset, query, options={}) | |
8 | + @region = Region.find_by_id(options.delete(:region)) if options.has_key?(:region) | |
9 | + if @region && options[:within] | |
10 | + options[:origin] = [@region.lat, @region.lng] | |
11 | + else | |
12 | + options.delete(:within) | |
13 | + end | |
14 | + @environment.send(asset).find_by_contents(query, {}, options) | |
9 | 15 | end |
10 | 16 | |
11 | 17 | def recent(asset, limit = 10) | ... | ... |
app/models/product.rb
... | ... | @@ -8,6 +8,14 @@ class Product < ActiveRecord::Base |
8 | 8 | |
9 | 9 | after_update :save_image |
10 | 10 | |
11 | + after_create do |p| | |
12 | + p.enterprise.save if p.enterprise | |
13 | + end | |
14 | + | |
15 | + after_update do |p| | |
16 | + p.enterprise.save if p.enterprise | |
17 | + end | |
18 | + | |
11 | 19 | acts_as_searchable :fields => [ :name, :description, :category_full_name ] |
12 | 20 | |
13 | 21 | xss_terminate :only => [ :name, :description ] | ... | ... |
app/models/profile.rb
... | ... | @@ -31,7 +31,19 @@ class Profile < ActiveRecord::Base |
31 | 31 | |
32 | 32 | acts_as_having_boxes |
33 | 33 | |
34 | - acts_as_searchable :fields => [ :name, :identifier ] | |
34 | + acts_as_searchable :fields => [ :name, :identifier, :extra_data_for_index ] | |
35 | + | |
36 | + class_inheritable_accessor :extra_index_methods | |
37 | + self.extra_index_methods = [] | |
38 | + | |
39 | + def extra_data_for_index | |
40 | + self.class.extra_index_methods.map { |meth| meth.to_proc.call(self) } | |
41 | + end | |
42 | + | |
43 | + def self.extra_data_for_index(sym = nil, &block) | |
44 | + self.extra_index_methods.push(sym) if sym | |
45 | + self.extra_index_methods.push(block) if block_given? | |
46 | + end | |
35 | 47 | |
36 | 48 | acts_as_having_settings :field => :data |
37 | 49 | ... | ... |
... | ... | @@ -0,0 +1,14 @@ |
1 | +class SellersSearchBlock < Block | |
2 | + | |
3 | + def self.description | |
4 | + _('A search for enterprises by products selled and local') | |
5 | + end | |
6 | + | |
7 | + def content | |
8 | + lambda do | |
9 | + @categories = ProductCategory.find(:all) | |
10 | + @regions = Region.find(:all).select{|r|r.lat && r.lng} | |
11 | + render :file => 'search/_sellers_form' | |
12 | + end | |
13 | + end | |
14 | +end | ... | ... |
... | ... | @@ -0,0 +1,9 @@ |
1 | +<% form_tag({:controller => 'search', :action => 'index'}, {:method => 'get'}) do %> | |
2 | + <%= _('Category: ') %> <%= select_tag 'query', options_from_collection_for_select(@categories, :name, :name, @product_category), :width => 15 %><br/> | |
3 | + <%= _('Distance: ') %> <%= text_field_tag 'radius' %><br/> | |
4 | + <%= _('From: ') %> <%= text_field :region, :name, :id => 'search_region_block' %> | |
5 | + <div id='search_region_block_auto_complete' class='auto-complete'></div> | |
6 | + <%= auto_complete_field('search_region_block', :url => {:controller => 'search', :action => 'complete_region'}) %> | |
7 | + <br/> | |
8 | + <%= submit_tag _('Search') %> | |
9 | +<% end %> | ... | ... |
app/views/search/sellers.rhtml
... | ... | @@ -14,12 +14,7 @@ |
14 | 14 | <% end %> |
15 | 15 | </h2> |
16 | 16 | |
17 | -<% form_tag({}, {:method => 'get'}) do %> | |
18 | - <%= _('Category: ') %> <%= select_tag 'category', options_from_collection_for_select(@categories, :id, :name, @product_category) %><br/> | |
19 | - <%= _('Distance from point: ') %> <%= text_field_tag 'radius' %><br/> | |
20 | - <%= _('Region') %> <%= select_tag 'region', options_from_collection_for_select(@regions, :id, :name, @region) %><br/> | |
21 | - <%= submit_tag _('Search') %> | |
22 | -<% end %> | |
17 | +<%= render :partial => 'sellers_form' %> | |
23 | 18 | |
24 | 19 | <div class="search-results-innerbox search-results-type-profile common-profile-list-block %>"> |
25 | 20 | <ul> <%= render :partial => 'profile', :collection => @enterprises %> </ul> | ... | ... |
public/stylesheets/common.css
test/functional/search_controller_test.rb
... | ... | @@ -397,6 +397,13 @@ class SearchControllerTest < Test::Unit::TestCase |
397 | 397 | assert_tag :tag => 'input', :attributes => { :type => 'submit', :name => 'search_whole_site_no' } |
398 | 398 | end |
399 | 399 | |
400 | + should 'display option to search within a given point and distance' do | |
401 | + get :popup | |
402 | + | |
403 | + assert_tag :tag => 'input', :attributes => {:type => 'text', :name => 'radius'} | |
404 | + assert_tag :tag => 'input', :attributes => {:type => 'text', :name => 'region[name]'} | |
405 | + end | |
406 | + | |
400 | 407 | should 'search in whole site when told so' do |
401 | 408 | parent = Category.create!(:name => 'randomcat', :environment => Environment.default) |
402 | 409 | Category.create!(:name => 'randomchild', :environment => Environment.default, :parent => parent) |
... | ... | @@ -547,7 +554,7 @@ class SearchControllerTest < Test::Unit::TestCase |
547 | 554 | assert_tag :tag => 'h1', :content => /Search results for "a sample search" in "Child Category"/ |
548 | 555 | end |
549 | 556 | |
550 | - should 'search in categoty hierachy' do | |
557 | + should 'search in category hierachy' do | |
551 | 558 | parent = Category.create!(:name => 'Parent Category', :environment => Environment.default) |
552 | 559 | child = Category.create!(:name => 'Child Category', :environment => Environment.default, :parent => parent) |
553 | 560 | |
... | ... | @@ -760,78 +767,34 @@ class SearchControllerTest < Test::Unit::TestCase |
760 | 767 | assert_not_includes assigns(:results)[:comments], comment4 |
761 | 768 | end |
762 | 769 | |
763 | - should 'list all sellers' do | |
764 | - ent1 = Enterprise.create!(:name => 'test1', :identifier => 'test1') | |
765 | - ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2') | |
766 | - | |
767 | - get :sellers | |
768 | - | |
769 | - assert_includes assigns('enterprises'), ent1 | |
770 | - assert_includes assigns('enterprises'), ent2 | |
771 | - end | |
772 | - | |
773 | 770 | should 'find enterprise by product category' do |
774 | 771 | ent1 = Enterprise.create!(:name => 'test1', :identifier => 'test1') |
775 | - prod_cat = ProductCategory.create!(:name => 'pc-test', :environment => Environment.default) | |
772 | + prod_cat = ProductCategory.create!(:name => 'pctest', :environment => Environment.default) | |
776 | 773 | prod = ent1.products.create!(:name => 'teste', :product_category => prod_cat) |
777 | 774 | |
778 | 775 | ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2') |
779 | 776 | |
780 | - get :sellers, :category => prod_cat.id | |
781 | - | |
782 | - assert_includes assigns('enterprises'), ent1 | |
783 | - assert_not_includes assigns('enterprises'), ent2 | |
784 | - end | |
785 | - | |
786 | - should 'find enterprise by origin and radius' do | |
787 | - ent1 = Enterprise.create!(:name => 'test1', :identifier => 'test1', :lat => 45.0, :lng => 45.0) | |
788 | - ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2', :lat => 30.0, :lng => 30.0) | |
789 | - | |
790 | - get :sellers, :lat => 45.0, :long => 45.0, :radius => 10 | |
777 | + get :index, :query => prod_cat.name | |
791 | 778 | |
792 | - assert_includes assigns('enterprises'), ent1 | |
793 | - assert_not_includes assigns('enterprises'), ent2 | |
779 | + assert_includes assigns('results')[:enterprises], ent1 | |
780 | + assert_not_includes assigns('results')[:enterprises], ent2 | |
794 | 781 | end |
795 | 782 | |
796 | - should 'find enterprise by an region with georeference' do | |
783 | + should 'find profiles by radius and region' do | |
797 | 784 | region = Region.create!(:name => 'r-test', :environment => Environment.default, :lat => 45.0, :lng => 45.0) |
798 | - ent1 = Enterprise.create!(:name => 'test1', :identifier => 'test1', :lat => 45.0, :lng => 45.0) | |
799 | - ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2', :lat => 30.0, :lng => 30.0) | |
785 | + ent1 = Enterprise.create!(:name => 'test 1', :identifier => 'test1', :lat => 45.0, :lng => 45.0) | |
786 | + p1 = create_user('test2').person | |
787 | + p1.name = 'test 2'; p1.lat = 45.0; p1.lng = 45.0; p1.save! | |
788 | + ent2 = Enterprise.create!(:name => 'test 3', :identifier => 'test3', :lat => 30.0, :lng => 30.0) | |
789 | + p2 = create_user('test4').person | |
790 | + p2.name = 'test 4'; p2.lat = 30.0; p2.lng = 30.0; p2.save! | |
800 | 791 | |
801 | - get :sellers, :region => region.id, :radius => 10 | |
792 | + get :index, :region => { :name => region.name }, :radius => 10, :query => 'test' | |
802 | 793 | |
803 | - assert_includes assigns('enterprises'), ent1 | |
804 | - assert_not_includes assigns('enterprises'), ent2 | |
805 | - end | |
806 | - | |
807 | - should 'find enterprise by region and product category' do | |
808 | - region = Region.create!(:name => 'r-test', :environment => Environment.default, :lat => 45.0, :lng => 45.0) | |
809 | - ent1 = Enterprise.create!(:name => 'test1', :identifier => 'test1', :lat => 45.0, :lng => 45.0) | |
810 | - prod_cat = ProductCategory.create!(:name => 'pc-test', :environment => Environment.default) | |
811 | - prod = ent1.products.create!(:name => 'teste', :product_category => prod_cat) | |
812 | - | |
813 | - ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2', :lat => 30.0, :lng => 30.0) | |
814 | - | |
815 | - get :sellers, :region => region.id, :radius => 10, :category => prod_cat.id | |
816 | - | |
817 | - assert_includes assigns('enterprises'), ent1 | |
818 | - assert_not_includes assigns('enterprises'), ent2 | |
819 | - end | |
820 | - | |
821 | - should 'find enterprise by region and product category in brazilian portuguese' do | |
822 | - region = Region.create!(:name => 'r-test', :environment => Environment.default, :lat => 45.0, :lng => 45.0) | |
823 | - ent1 = Enterprise.create!(:name => 'test1', :identifier => 'test1', :lat => 45.0, :lng => 45.0) | |
824 | - prod_cat = ProductCategory.create!(:name => 'pc-test', :environment => Environment.default) | |
825 | - prod = ent1.products.create!(:name => 'teste', :product_category => prod_cat) | |
826 | - | |
827 | - ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2', :lat => 30.0, :lng => 30.0) | |
828 | - | |
829 | - assert_nothing_raised do | |
830 | - get :sellers, :region => region.id, :radius => 10, :category => prod_cat.id, :lang => 'pt_BR' | |
831 | - end | |
832 | - | |
833 | - assert_includes assigns('enterprises'), ent1 | |
834 | - assert_not_includes assigns('enterprises'), ent2 | |
794 | + assert_includes assigns('results')[:enterprises], ent1 | |
795 | + assert_not_includes assigns('results')[:enterprises], ent2 | |
796 | + assert_includes assigns('results')[:people], p1 | |
797 | + assert_not_includes assigns('results')[:people], p2 | |
835 | 798 | end |
836 | 799 | |
837 | 800 | should 'not show term "Category:" before product category' do |
... | ... | @@ -852,4 +815,29 @@ class SearchControllerTest < Test::Unit::TestCase |
852 | 815 | assert_tag :tag => 'img', :attributes => { :src => /rails_thumb\.png/ } |
853 | 816 | end |
854 | 817 | |
818 | + should 'complete region name' do | |
819 | + r1 = Region.create!(:name => 'One region', :environment => Environment.default, :lat => 111.07, :lng => '88.9') | |
820 | + r2 = Region.create!(:name => 'Another region', :environment => Environment.default, :lat => 111.07, :lng => '88.9') | |
821 | + | |
822 | + get :complete_region, :region => { :name => 'one' } | |
823 | + assert_includes assigns(:regions), r1 | |
824 | + assert_tag :tag => 'ul', :descendant => { :tag => 'li', :content => 'One region' } | |
825 | + end | |
826 | + | |
827 | + should 'render completion results without layout' do | |
828 | + get :complete_region, :region => { :name => 'test' } | |
829 | + assert_no_tag :tag => 'body' | |
830 | + end | |
831 | + | |
832 | + should 'complete only georeferenced regions' do | |
833 | + r1 = Region.create!(:name => 'One region', :environment => Environment.default, :lat => 111.07, :lng => '88.9') | |
834 | + r2 = Region.create!(:name => 'Another region', :environment => Environment.default) | |
835 | + | |
836 | + get :complete_region, :region => { :name => 'region' } | |
837 | + assert_includes assigns(:regions), r1 | |
838 | + assert_tag :tag => 'ul', :descendant => { :tag => 'li', :content => r1.name } | |
839 | + assert_not_includes assigns(:regions), r2 | |
840 | + assert_no_tag :tag => 'ul', :descendant => { :tag => 'li', :content => r2.name } | |
841 | + end | |
842 | + | |
855 | 843 | end | ... | ... |
test/unit/category_finder_test.rb
... | ... | @@ -252,4 +252,24 @@ class CategoryFinderTest < ActiveSupport::TestCase |
252 | 252 | assert_not_includes list, c2 |
253 | 253 | end |
254 | 254 | |
255 | + should 'find person and enterprise by radius and region' do | |
256 | + finder = CategoryFinder.new(@category) | |
257 | + | |
258 | + region = Region.create!(:name => 'r-test', :environment => Environment.default, :lat => 45.0, :lng => 45.0) | |
259 | + ent1 = Enterprise.create!(:name => 'test 1', :identifier => 'test1', :lat => 45.0, :lng => 45.0, :categories => [@category]) | |
260 | + p1 = create_user('test2').person | |
261 | + p1.name = 'test 2'; p1.lat = 45.0; p1.lng = 45.0; p1.categories = [@category]; p1.save! | |
262 | + ent2 = Enterprise.create!(:name => 'test 3', :identifier => 'test3', :lat => 30.0, :lng => 30.0, :categories => [@category]) | |
263 | + p2 = create_user('test4').person | |
264 | + p2.name = 'test 4'; p2.lat = 30.0; p2.lng = 30.0; p2.categories = [@category]; p2.save! | |
265 | + | |
266 | + ents = finder.find(:enterprises, 'test', :within => 10, :region => region.id) | |
267 | + people = finder.find(:people, 'test', :within => 10, :region => region.id) | |
268 | + | |
269 | + assert_includes ents, ent1 | |
270 | + assert_not_includes ents, ent2 | |
271 | + assert_includes people, p1 | |
272 | + assert_not_includes people, p2 | |
273 | + end | |
274 | + | |
255 | 275 | end | ... | ... |
test/unit/enterprise_test.rb
... | ... | @@ -76,6 +76,33 @@ class EnterpriseTest < Test::Unit::TestCase |
76 | 76 | assert_equal 5, e.blocks.size |
77 | 77 | end |
78 | 78 | |
79 | + should 'be found in search for its product categories' do | |
80 | + ent1 = Enterprise.create!(:name => 'test1', :identifier => 'test1') | |
81 | + prod_cat = ProductCategory.create!(:name => 'pctest', :environment => Environment.default) | |
82 | + prod = ent1.products.create!(:name => 'teste', :product_category => prod_cat) | |
83 | + | |
84 | + ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2') | |
85 | + | |
86 | + result = Enterprise.find_by_contents(prod_cat.name) | |
87 | + | |
88 | + assert_includes result, ent1 | |
89 | + assert_not_includes result, ent2 | |
90 | + end | |
91 | + | |
92 | + should 'be found in search for its product categories hierarchy' do | |
93 | + ent1 = Enterprise.create!(:name => 'test1', :identifier => 'test1') | |
94 | + prod_cat = ProductCategory.create!(:name => 'pctest', :environment => Environment.default) | |
95 | + prod_child = ProductCategory.create!(:name => 'pchild', :environment => Environment.default, :parent => prod_cat) | |
96 | + prod = ent1.products.create!(:name => 'teste', :product_category => prod_child) | |
97 | + | |
98 | + ent2 = Enterprise.create!(:name => 'test2', :identifier => 'test2') | |
99 | + | |
100 | + result = Enterprise.find_by_contents(prod_cat.name) | |
101 | + | |
102 | + assert_includes result, ent1 | |
103 | + assert_not_includes result, ent2 | |
104 | + end | |
105 | + | |
79 | 106 | should 'allow to add new members' do |
80 | 107 | o = Enterprise.create!(:name => 'my test profile', :identifier => 'mytestprofile') |
81 | 108 | p = create_user('mytestuser').person | ... | ... |
test/unit/environment_finder_test.rb
... | ... | @@ -131,4 +131,24 @@ class EnvironmentFinderTest < ActiveSupport::TestCase |
131 | 131 | assert_not_includes found, ent2 |
132 | 132 | end |
133 | 133 | |
134 | + should 'find person and enterprise by radius and region' do | |
135 | + finder = EnvironmentFinder.new(Environment.default) | |
136 | + | |
137 | + region = Region.create!(:name => 'r-test', :environment => Environment.default, :lat => 45.0, :lng => 45.0) | |
138 | + ent1 = Enterprise.create!(:name => 'test 1', :identifier => 'test1', :lat => 45.0, :lng => 45.0) | |
139 | + p1 = create_user('test2').person | |
140 | + p1.name = 'test 2'; p1.lat = 45.0; p1.lng = 45.0; p1.save! | |
141 | + ent2 = Enterprise.create!(:name => 'test 3', :identifier => 'test3', :lat => 30.0, :lng => 30.0) | |
142 | + p2 = create_user('test4').person | |
143 | + p2.name = 'test 4'; p2.lat = 30.0; p2.lng = 30.0; p2.save! | |
144 | + | |
145 | + ents = finder.find(:enterprises, 'test', :within => 10, :region => region.id) | |
146 | + people = finder.find(:people, 'test', :within => 10, :region => region.id) | |
147 | + | |
148 | + assert_includes ents, ent1 | |
149 | + assert_not_includes ents, ent2 | |
150 | + assert_includes people, p1 | |
151 | + assert_not_includes people, p2 | |
152 | + end | |
153 | + | |
134 | 154 | end | ... | ... |
test/unit/profile_test.rb
... | ... | @@ -69,7 +69,7 @@ class ProfileTest < Test::Unit::TestCase |
69 | 69 | p.identifier = 'other_profile' |
70 | 70 | end |
71 | 71 | end |
72 | - | |
72 | + | |
73 | 73 | should 'provide access to home page' do |
74 | 74 | profile = Profile.create!(:identifier => 'newprofile', :name => 'New Profile') |
75 | 75 | assert_kind_of Article, profile.home_page |
... | ... | @@ -87,7 +87,7 @@ class ProfileTest < Test::Unit::TestCase |
87 | 87 | def test_can_have_affiliated_people |
88 | 88 | pr = Profile.create(:name => 'composite_profile', :identifier => 'composite') |
89 | 89 | pe = User.create(:login => 'aff', :email => 'aff@pr.coop', :password => 'blih', :password_confirmation => 'blih').person |
90 | - | |
90 | + | |
91 | 91 | member_role = Role.new(:name => 'new_member_role') |
92 | 92 | assert member_role.save |
93 | 93 | assert pr.affiliate(pe, member_role) |
... | ... | @@ -164,7 +164,7 @@ class ProfileTest < Test::Unit::TestCase |
164 | 164 | assert_raise ActiveRecord::AssociationTypeMismatch do |
165 | 165 | profile.articles << 1 |
166 | 166 | end |
167 | - | |
167 | + | |
168 | 168 | assert_nothing_raised do |
169 | 169 | profile.articles << Article.new(:name => 'testing article') |
170 | 170 | end |
... | ... | @@ -206,7 +206,7 @@ class ProfileTest < Test::Unit::TestCase |
206 | 206 | |
207 | 207 | assert Profile.find_by_contents('small').include?(small) |
208 | 208 | assert Profile.find_by_contents('big').include?(big) |
209 | - | |
209 | + | |
210 | 210 | both = Profile.find_by_contents('profile testing') |
211 | 211 | assert both.include?(small) |
212 | 212 | assert both.include?(big) |
... | ... | @@ -229,7 +229,7 @@ class ProfileTest < Test::Unit::TestCase |
229 | 229 | |
230 | 230 | profile_boxes = profile.boxes.size |
231 | 231 | profile_blocks = profile.blocks.size |
232 | - | |
232 | + | |
233 | 233 | assert profile_boxes > 0, 'profile should have some boxes' |
234 | 234 | assert profile_blocks > 0, 'profile should have some blocks' |
235 | 235 | |
... | ... | @@ -488,6 +488,37 @@ class ProfileTest < Test::Unit::TestCase |
488 | 488 | assert c.display_info_to?(p) |
489 | 489 | end |
490 | 490 | |
491 | + should 'be able to add extra data for index' do | |
492 | + klass = Class.new(Profile) | |
493 | + klass.any_instance.expects(:random_method) | |
494 | + klass.extra_data_for_index :random_method | |
495 | + | |
496 | + klass.new.extra_data_for_index | |
497 | + end | |
498 | + | |
499 | + should 'be able to add a block as extra data for index' do | |
500 | + klass = Class.new(Profile) | |
501 | + result = mock | |
502 | + klass.extra_data_for_index do |obj| | |
503 | + result | |
504 | + end | |
505 | + | |
506 | + assert_includes klass.new.extra_data_for_index, result | |
507 | + end | |
508 | + | |
509 | + should 'actually index by results of extra_data_for_index' do | |
510 | + | |
511 | + class ::TestingExtraDataForIndex < Profile | |
512 | + extra_data_for_index do |obj| | |
513 | + 'sample indexed text' | |
514 | + end | |
515 | + end | |
516 | + | |
517 | + profile = TestingExtraDataForIndex.create!(:name => 'testprofile', :identifier => 'testprofile') | |
518 | + | |
519 | + assert_includes TestingExtraDataForIndex.find_by_contents('sample'), profile | |
520 | + end | |
521 | + | |
491 | 522 | private |
492 | 523 | |
493 | 524 | def assert_invalid_identifier(id) | ... | ... |