diff --git a/app/models/article.rb b/app/models/article.rb index 17f0e9c..e48a08f 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -55,7 +55,7 @@ class Article < ActiveRecord::Base xss_terminate :only => [ :name ], :on => 'validation', :with => 'white_list' named_scope :in_category, lambda { |category| - {:include => 'categories', :conditions => { 'categories.id' => category.id }} + {:include => 'categories_including_virtual', :conditions => { 'categories.id' => category.id }} } named_scope :by_range, lambda { |range| { @@ -599,6 +599,7 @@ class Article < ActiveRecord::Base def self.f_type_proc(klass) klass.constantize.type_name end + def self.f_profile_type_proc(klass) klass.constantize.type_name end @@ -612,12 +613,15 @@ class Article < ActiveRecord::Base self.class.name end end + def f_profile_type self.profile.class.name end + def f_published_at self.published_at end + def f_category self.categories.collect(&:name) end @@ -626,12 +630,15 @@ class Article < ActiveRecord::Base def name_sortable # give a different name for solr name end + def public self.public? end + def category_filter categories_including_virtual_ids end + public acts_as_faceted :fields => { diff --git a/app/models/product.rb b/app/models/product.rb index 96b388b..3279212 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -225,7 +225,7 @@ class Product < ActiveRecord::Base end end def self.f_qualifier_proc(ids) - array = ids.split ' ' + array = ids.split qualifier = Qualifier.find_by_id array[0] certifier = Certifier.find_by_id array[1] certifier ? [qualifier.name, _(' cert. ') + certifier.name] : qualifier.name diff --git a/app/models/textile_article.rb b/app/models/textile_article.rb index 9cd1349..f6773c5 100644 --- a/app/models/textile_article.rb +++ b/app/models/textile_article.rb @@ -1,9 +1,5 @@ class TextileArticle < TextArticle - def self.type_name - _('Article') - end - def self.short_description _('Text article with Textile markup language') end diff --git a/app/models/tiny_mce_article.rb b/app/models/tiny_mce_article.rb index b7830b1..2f83470 100644 --- a/app/models/tiny_mce_article.rb +++ b/app/models/tiny_mce_article.rb @@ -1,9 +1,5 @@ class TinyMceArticle < TextArticle - def self.type_name - _('Article') - end - def self.short_description _('Text article with visual editor.') end diff --git a/test/unit/article_test.rb b/test/unit/article_test.rb index cc4a24a..c3a0b67 100644 --- a/test/unit/article_test.rb +++ b/test/unit/article_test.rb @@ -157,7 +157,7 @@ class ArticleTest < ActiveSupport::TestCase fifth = fast_create(TextArticle, :profile_id => profile.id, :name => 'fifth') other_first = other_profile.articles.build(:name => 'first'); other_first.save! - + assert_equal [other_first, fifth, fourth], Article.recent(3) assert_equal [other_first, fifth, fourth, third, second, first], Article.recent(6) end @@ -290,7 +290,9 @@ class ArticleTest < ActiveSupport::TestCase should 'associate with categories' do env = Environment.default - c1 = env.categories.build(:name => "test category 1"); c1.save! + parent_cat = env.categories.build(:name => "parent category") + parent_cat.save! + c1 = env.categories.build(:name => "test category 1", :parent_id => parent_cat.id); c1.save! c2 = env.categories.build(:name => "test category 2"); c2.save! article = profile.articles.build(:name => 'withcategories') @@ -300,6 +302,7 @@ class ArticleTest < ActiveSupport::TestCase article.add_category c2 assert_equivalent [c1,c2], article.categories(true) + assert_equivalent [c1, parent_cat, c2], article.categories_including_virtual(true) end should 'remove comments when removing article' do @@ -408,6 +411,9 @@ class ArticleTest < ActiveSupport::TestCase assert_includes c3.articles(true), art assert_includes c2.articles(true), art assert_includes c1.articles(true), art + + assert_includes art.categories_including_virtual(true), c2 + assert_includes art.categories_including_virtual(true), c1 end should 'redefine the entire category set at once' do @@ -423,26 +429,31 @@ class ArticleTest < ActiveSupport::TestCase art.category_ids = [c2,c3].map(&:id) assert_equivalent [c2, c3], art.categories(true) + assert_includes art.categories_including_virtual(true), c1 + assert !art.categories_including_virtual(true).include?(c4) end should 'be able to create an article already with categories' do - c1 = fast_create(Category, :environment_id => Environment.default.id, :name => 'c1') + parent1 = fast_create(Category, :environment_id => Environment.default.id, :name => 'parent1') + c1 = fast_create(Category, :environment_id => Environment.default.id, :name => 'c1', :parent_id => parent1.id) c2 = fast_create(Category, :environment_id => Environment.default.id, :name => 'c2') p = create_user('testinguser').person a = p.articles.create!(:name => 'test', :category_ids => [c1.id, c2.id]) assert_equivalent [c1, c2], a.categories(true) + assert_includes a.categories_including_virtual(true), parent1 end should 'not add a category twice to article' do c1 = fast_create(Category, :environment_id => Environment.default.id, :name => 'c1') - c2 = c1.children.create!(:environment => Environment.default, :name => 'c2') - c3 = c1.children.create!(:environment => Environment.default, :name => 'c3') + c2 = c1.children.create!(:environment => Environment.default, :name => 'c2', :parent_id => c1.id) + c3 = c1.children.create!(:environment => Environment.default, :name => 'c3', :parent_id => c1.id) owner = create_user('testuser').person art = owner.articles.create!(:name => 'ytest') art.category_ids = [c2,c3,c3].map(&:id) assert_equal [c2, c3], art.categories(true) + assert_equal [c2, c1, c3], art.categories_including_virtual(true) end should 'not accept Product category as category' do @@ -459,8 +470,8 @@ class ArticleTest < ActiveSupport::TestCase article = fast_create(Article, :name => 'test article', :profile_id => profile.id, :published => false) assert !article.display_to?(nil) - end - + end + should 'say that not member of profile cannot see private article' do profile = fast_create(Profile, :name => 'test profile', :identifier => 'test_profile') article = fast_create(Article, :name => 'test article', :profile_id => profile.id, :published => false) @@ -468,7 +479,7 @@ class ArticleTest < ActiveSupport::TestCase assert !article.display_to?(person) end - + should 'say that member user can not see private article' do profile = fast_create(Profile, :name => 'test profile', :identifier => 'test_profile') article = fast_create(Article, :name => 'test article', :profile_id => profile.id, :published => false) @@ -553,7 +564,7 @@ class ArticleTest < ActiveSupport::TestCase person = create_user('test_user').person a = person.articles.create!(:name => 'test article', :body => 'some text') b = a.copy(:parent => a, :profile => a.profile) - + assert_includes a.children, b assert_equal 'some text', b.body end @@ -752,10 +763,12 @@ class ArticleTest < ActiveSupport::TestCase should 'ignore category with zero as id' do a = profile.articles.create!(:name => 'a test article') - c = fast_create(Category, :name => 'test category', :environment_id => profile.environment.id) + c = fast_create(Category, :name => 'test category', :environment_id => profile.environment.id, :parent_id => 0) a.category_ids = ['0', c.id, nil] assert a.save assert_equal [c], a.categories + # also ignore parent with id = 0 + assert_equal [c], a.categories_including_virtual a = profile.articles.find_by_name 'a test article' assert_equal [c], a.categories @@ -810,7 +823,8 @@ class ArticleTest < ActiveSupport::TestCase should 'find articles in a specific category' do env = Environment.default - category_with_articles = env.categories.create!(:name => "Category with articles") + parent_category = env.categories.create!(:name => "parent category") + category_with_articles = env.categories.create!(:name => "Category with articles", :parent_id => parent_category.id) category_without_articles = env.categories.create!(:name => "Category without articles") article_in_category = profile.articles.create!(:name => 'Article in category') @@ -818,6 +832,7 @@ class ArticleTest < ActiveSupport::TestCase article_in_category.add_category(category_with_articles) assert_includes profile.articles.in_category(category_with_articles), article_in_category + assert_includes profile.articles.in_category(parent_category), article_in_category assert_not_includes profile.articles.in_category(category_without_articles), article_in_category end @@ -954,7 +969,7 @@ class ArticleTest < ActiveSupport::TestCase should 'track action when a published article is created in a community' do community = fast_create(Community) - p1 = ActionTracker::Record.current_user_from_model + p1 = ActionTracker::Record.current_user_from_model p2 = fast_create(Person) p3 = fast_create(Person) community.add_member(p1) @@ -1064,7 +1079,7 @@ class ArticleTest < ActiveSupport::TestCase assert_equal false, a.notifiable? assert_equal true, a.advertise? assert_equal false, a.is_trackable? - + a.published=false assert_equal false, a.published? assert_equal false, a.is_trackable? @@ -1643,4 +1658,67 @@ class ArticleTest < ActiveSupport::TestCase assert_equal [c1,c2,c5], Article.text_articles end + should 'act as faceted' do + person = fast_create(Person) + a = Article.new(:profile_id => person.id) + assert_equal Article.type_name, Article.facet_by_id(:f_type)[:proc].call(a.send(:f_type)) + assert_equal Person.type_name, Article.facet_by_id(:f_profile_type)[:proc].call(a.send(:f_profile_type)) + assert_equal a.published_at, a.send(:f_published_at) + end + + should 'act as searchable' do + person = fast_create(Person, :name => "Hiro", :address => 'U-Stor-It @ Inglewood, California', + :nickname => 'Protagonist') + person2 = fast_create(Person, :name => "Raven") + category = fast_create(Category, :name => "science fiction", :acronym => "sf", :abbreviation => "sci-fi") + a = Article.create!(:name => 'a searchable article about bananas', :profile_id => person.id, + :body => 'the body talks about mosquitos', :abstract => 'and the abstract is about beer', + :filename => 'not_a_virus.exe') + a.add_category(category) + c = a.comments.build(:title => 'snow crash', :author => person2, :body => 'wanna try some?') + c.save! + + # fields + assert_includes Article.find_by_contents('bananas')[:results].docs, a + assert_includes Article.find_by_contents('mosquitos')[:results].docs, a + assert_includes Article.find_by_contents('beer')[:results].docs, a + assert_includes Article.find_by_contents('not_a_virus.exe')[:results].docs, a + # filters + assert_includes Article.find_by_contents('bananas', {}, { + :filter_queries => ["public:true"]})[:results].docs, a + assert_not_includes Article.find_by_contents('bananas', {}, { + :filter_queries => ["public:false"]})[:results].docs, a + assert_includes Article.find_by_contents('bananas', {}, { + :filter_queries => ["environment_id:\"#{Environment.default.id}\""]})[:results].docs, a + assert_includes Article.find_by_contents('bananas', {}, { + :filter_queries => ["profile_id:\"#{person.id}\""]})[:results].docs, a + # includes + assert_includes Article.find_by_contents('Hiro')[:results].docs, a + assert_includes Article.find_by_contents("person-#{person.id}")[:results].docs, a + assert_includes Article.find_by_contents("California")[:results].docs, a + assert_includes Article.find_by_contents("Protagonist")[:results].docs, a + assert_includes Article.find_by_contents("snow")[:results].docs, a + assert_includes Article.find_by_contents("try some")[:results].docs, a + assert_includes Article.find_by_contents("Raven")[:results].docs, a + assert_includes Article.find_by_contents("science")[:results].docs, a + assert_includes Article.find_by_contents(category.slug)[:results].docs, a + assert_includes Article.find_by_contents("sf")[:results].docs, a + assert_includes Article.find_by_contents("sci-fi")[:results].docs, a + end + + should 'boost name matches' do + person = fast_create(Person) + in_body = Article.create!(:name => 'something', :profile_id => person.id, :body => 'bananas in the body!') + in_name = Article.create!(:name => 'bananas in the name!', :profile_id => person.id) + assert_equal [in_name, in_body], Article.find_by_contents('bananas')[:results].docs + end + + should 'boost if profile is enabled' do + person2 = fast_create(Person, :enabled => false) + art_profile_disabled = Article.create!(:name => 'profile disabled', :profile_id => person2.id) + person1 = fast_create(Person, :enabled => true) + art_profile_enabled = Article.create!(:name => 'profile enabled', :profile_id => person1.id) + assert_equal [art_profile_enabled, art_profile_disabled], Article.find_by_contents('profile')[:results].docs + end + end diff --git a/test/unit/category_test.rb b/test/unit/category_test.rb index 26f5711..f512ba8 100644 --- a/test/unit/category_test.rb +++ b/test/unit/category_test.rb @@ -492,4 +492,30 @@ class CategoryTest < ActiveSupport::TestCase assert_not_includes Category.top_level_for(Environment.default).from_types(['ProductCategory']), toplevel_category end + should 'act as searchable' do + parent = fast_create(Category, :name => 'books') + c = Category.create!(:name => "science fiction", :acronym => "sf", :abbreviation => "sci-fi", + :environment_id => Environment.default.id, :parent_id => parent.id) + + # fields + assert_includes Category.find_by_contents('fiction')[:results].docs, c + assert_includes Category.find_by_contents('sf')[:results].docs, c + assert_includes Category.find_by_contents('sci-fi')[:results].docs, c + # filters + assert_includes Category.find_by_contents('science', {}, { + :filter_queries => ["parent_id:#{parent.id}"]})[:results].docs, c + end + + should 'boost name matches' do + c_abbr = Category.create!(:name => "something else", :abbreviation => "science", :environment_id => Environment.default.id) + c_name = Category.create!(:name => "science fiction", :environment_id => Environment.default.id) + assert_equal [c_name, c_abbr], Category.find_by_contents("science")[:results].docs + end + + should 'solr save' do + c = @env.categories.build(:name => 'my category'); + c.expects(:solr_save) + c.save! + end + end diff --git a/test/unit/product_test.rb b/test/unit/product_test.rb index 407668d..267d5e1 100644 --- a/test/unit/product_test.rb +++ b/test/unit/product_test.rb @@ -20,14 +20,14 @@ class ProductTest < ActiveSupport::TestCase assert_difference Product, :count do p = Product.new(:name => 'test product1', :product_category => @product_category, :enterprise_id => @profile.id) assert p.save - end + end end should 'destroy product' do p = fast_create(Product, :name => 'test product2', :product_category_id => @product_category.id) assert_difference Product, :count, -1 do p.destroy - end + end end should 'display category name if name is nil' do @@ -69,7 +69,7 @@ class ProductTest < ActiveSupport::TestCase p1 = enterprise.products.create!(:name => 'product 1', :product_category => @product_category) p2 = enterprise.products.create!(:name => 'product 2', :product_category => @product_category) p3 = enterprise.products.create!(:name => 'product 3', :product_category => @product_category) - + assert_equal [p3, p2], Product.recent(2) end @@ -79,7 +79,7 @@ class ProductTest < ActiveSupport::TestCase :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png') }, :enterprise_id => @profile.id) assert_equal p.image(true).filename, 'rails.png' - end + end end should 'calculate catagory full name' do @@ -125,7 +125,7 @@ class ProductTest < ActiveSupport::TestCase ent.lat = 45.0; ent.lng = 45.0; ent.save! process_delayed_job_queue prod.reload - + assert_in_delta 45.0, prod.lat, 0.0001 assert_in_delta 45.0, prod.lng, 0.0001 end @@ -501,4 +501,71 @@ class ProductTest < ActiveSupport::TestCase assert_equal 0, product.price_description_percentage end + should 'act as faceted' do + s = fast_create(State, :acronym => 'XZ') + c = fast_create(City, :name => 'Tabajara', :parent_id => s.id) + ent = fast_create(Enterprise, :region_id => c.id) + p = fast_create(Product, :enterprise_id => ent.id) + pq = p.product_qualifiers.create!(:qualifier => fast_create(Qualifier, :name => 'qualifier'), + :certifier => fast_create(Certifier, :name => 'certifier')) + assert_equal 'Related products', Product.facet_by_id(:f_category)[:label] + assert_equal ['Tabajara', ', XZ'], Product.facet_by_id(:f_region)[:proc].call(p.send(:f_region)) + assert_equal ['qualifier', ' cert. certifier'], Product.facet_by_id(:f_qualifier)[:proc].call(p.send(:f_qualifier).last) + end + + should 'act as searchable' do + s = fast_create(State, :acronym => 'XZ') + c = fast_create(City, :name => 'Tabajara', :parent_id => s.id) + ent = fast_create(Enterprise, :region_id => c.id, :name => "Black Sun") + category = fast_create(ProductCategory, :name => "homemade", :acronym => "hm", :abbreviation => "homey") + p = Product.create!(:name => 'bananas syrup', :description => 'surrounded by mosquitos', :enterprise_id => ent.id, + :product_category_id => category.id) + qual = Qualifier.create!(:name => 'qualificador', :environment_id => Environment.default.id) + cert = Certifier.create!(:name => 'certificador', :environment_id => Environment.default.id) + pq = p.product_qualifiers.create!(:qualifier => qual, :certifier => cert) + # fields + assert_includes Product.find_by_contents('bananas')[:results].docs, p + assert_includes Product.find_by_contents('mosquitos')[:results].docs, p + assert_includes Product.find_by_contents('homemade')[:results].docs, p + # filters + assert_includes Product.find_by_contents('bananas', {}, { + :filter_queries => ["public:true"]})[:results].docs, p + assert_not_includes Product.find_by_contents('bananas', {}, { + :filter_queries => ["public:false"]})[:results].docs, p + assert_includes Product.find_by_contents('bananas', {}, { + :filter_queries => ["environment_id:\"#{Environment.default.id}\""]})[:results].docs, p + # includes + assert_includes Product.find_by_contents("homemade")[:results].docs, p + assert_includes Product.find_by_contents(category.slug)[:results].docs, p + assert_includes Product.find_by_contents("hm")[:results].docs, p + assert_includes Product.find_by_contents("homey")[:results].docs, p + assert_includes Product.find_by_contents("Tabajara")[:results].docs, p + assert_includes Product.find_by_contents("Black Sun")[:results].docs, p + end + + should 'boost name matches' do + ent = fast_create(Enterprise) + cat = fast_create(ProductCategory) + in_desc = Product.create!(:name => 'something', :enterprise_id => ent.id, :description => 'bananas in the description!', + :product_category_id => cat.id) + in_name = Product.create!(:name => 'bananas in the name!', :enterprise_id => ent.id, :product_category_id => cat.id) + assert_equal [in_name, in_desc], Product.find_by_contents('bananas')[:results].docs + end + + should 'boost if profile is enabled' do + person2 = fast_create(Person, :enabled => false) + art_profile_disabled = Article.create!(:name => 'profile disabled', :profile_id => person2.id) + person1 = fast_create(Person, :enabled => true) + art_profile_enabled = Article.create!(:name => 'profile enabled', :profile_id => person1.id) + assert_equal [art_profile_enabled, art_profile_disabled], Article.find_by_contents('profile')[:results].docs + end + + should 'reindex enterprise after saving' do + ent = fast_create(Enterprise) + cat = fast_create(ProductCategory) + prod = Product.create!(:name => 'something', :enterprise_id => ent.id, :product_category_id => cat.id) + Product.expects(:solr_batch_add).with([ent]) + prod.save! + end + end diff --git a/test/unit/profile_test.rb b/test/unit/profile_test.rb index 866a351..8cbe525 100644 --- a/test/unit/profile_test.rb +++ b/test/unit/profile_test.rb @@ -1770,4 +1770,50 @@ class ProfileTest < ActiveSupport::TestCase assert !profile.valid? assert profile.errors.invalid?(:identifier) end + + should 'act as faceted' do + st = fast_create(State, :acronym => 'XZ') + city = fast_create(City, :name => 'Tabajara', :parent_id => st.id) + prof = fast_create(Person, :region_id => city.id) + assert_equal ['Tabajara', ', XZ'], Profile.facet_by_id(:f_region)[:proc].call(prof.send(:f_region)) + end + + should 'act as searchable' do + st = fast_create(State, :acronym => 'CA') + city = fast_create(City, :name => 'Inglewood', :parent_id => st.id) + p = create(Person, :name => "Hiro", :address => 'U-Stor-It', :nickname => 'Protagonist', + :user_id => fast_create(User).id, :region_id => city.id) + cat = fast_create(Category, :name => "Science Fiction", :acronym => "sf", :abbreviation => "sci-fi") + p.add_category cat + cat.save! + p.save! + + # fields + assert_includes Profile.find_by_contents('Hiro')[:results].docs, p + assert_includes Profile.find_by_contents('Stor')[:results].docs, p + assert_includes Profile.find_by_contents('Protagonist')[:results].docs, p + # filters + assert_includes Profile.find_by_contents('Hiro', {}, { + :filter_queries => ["public:true"]})[:results].docs, p + assert_not_includes Profile.find_by_contents('Hiro', {}, { + :filter_queries => ["public:false"]})[:results].docs, p + assert_includes Profile.find_by_contents('Hiro', {}, { + :filter_queries => ["environment_id:\"#{Environment.default.id}\""]})[:results].docs, p + # includes + assert_includes Profile.find_by_contents("Inglewood")[:results].docs, p + end + + should 'boost name matches' do + in_addr = create(Person, :name => 'something', :address => 'bananas in the address!', :user_id => fast_create(User).id) + in_name = create(Person, :name => 'bananas in the name!', :user_id => fast_create(User).id) + assert_equal [in_name, in_addr], Person.find_by_contents('bananas')[:results].docs + end + + should 'reindex articles after saving' do + profile = create(Person, :name => 'something', :user_id => fast_create(User).id) + art = profile.articles.build(:name => 'something') + Profile.expects(:solr_batch_add).with(includes(art)) + profile.save! + end + end diff --git a/test/unit/search_helper_test.rb b/test/unit/search_helper_test.rb index 656e6e3..559e744 100644 --- a/test/unit/search_helper_test.rb +++ b/test/unit/search_helper_test.rb @@ -4,8 +4,6 @@ class SearchHelperTest < ActiveSupport::TestCase include SearchHelper - - should 'display search page title' do title = 'page_title' assert_equal search_page_title(title), '

page_title

' diff --git a/test/unit/textile_article_test.rb b/test/unit/textile_article_test.rb index a927789..4f83673 100644 --- a/test/unit/textile_article_test.rb +++ b/test/unit/textile_article_test.rb @@ -190,4 +190,9 @@ class TextileArticleTest < ActiveSupport::TestCase article end + should 'define type facet' do + a = TextileArticle.new + assert_equal TextArticle.type_name, TextileArticle.send(:f_type_proc, a.send(:f_type)) + end + end diff --git a/test/unit/tiny_mce_article_test.rb b/test/unit/tiny_mce_article_test.rb index 3524e5e..065c8db 100644 --- a/test/unit/tiny_mce_article_test.rb +++ b/test/unit/tiny_mce_article_test.rb @@ -247,4 +247,9 @@ class TinyMceArticleTest < ActiveSupport::TestCase assert TinyMceArticle.new.tiny_mce? end + should 'define type facet' do + a = TinyMceArticle.new + assert_equal TextArticle.type_name, TinyMceArticle.send(:f_type_proc, a.send(:f_type)) + end + end -- libgit2 0.21.2