Commit 97540ec02d5a6bdeb0a296a48480c3a2ba8d71e6
1 parent
667fc50c
Exists in
staging
and in
26 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) | ... | ... |