Commit a37f5e01e4b611dc0b44a43599aa75c730e97711

Authored by Rodrigo Souto
1 parent 20ed507f

[search-improvements] Improve test coverage

test/functional/application_controller_test.rb
... ... @@ -575,4 +575,16 @@ class ApplicationControllerTest < ActionController::TestCase
575 575 end
576 576 end
577 577  
  578 + should 'allow plugin to propose search terms suggestions' do
  579 + class SuggestionsPlugin < Noosfero::Plugin
  580 + def find_suggestions(query, context, asset, options={:limit => 5})
  581 + ['a', 'b', 'c']
  582 + end
  583 + end
  584 +
  585 + controller = ApplicationController.new
  586 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([SuggestionsPlugin.new])
  587 +
  588 + assert_equal ['a', 'b', 'c'], controller.send(:find_suggestions, 'random', Environment.default, 'random')
  589 + end
578 590 end
... ...
test/functional/search_controller_test.rb
... ... @@ -662,6 +662,14 @@ class SearchControllerTest &lt; ActionController::TestCase
662 662 assert_no_tag :tag => 'li', :attributes => { :class => 'search-product-item highlighted' }, :content => /Holier Than Thou/
663 663 end
664 664  
  665 + should 'get search suggestions on json' do
  666 + st1 = 'universe A'
  667 + st2 = 'universe B'
  668 + @controller.stubs(:find_suggestions).with('universe', Environment.default, 'communities').returns([st1, st2])
  669 + get :suggestions, :term => 'universe', :asset => 'communities'
  670 + assert_equal [st1,st2].to_json, response.body
  671 + end
  672 +
665 673 protected
666 674  
667 675 def create_event(profile, options)
... ...
test/unit/plugin_test.rb
... ... @@ -508,11 +508,56 @@ class PluginTest &lt; ActiveSupport::TestCase
508 508 assert_equal [], plugin.check_comment_actions(nil)
509 509 end
510 510  
511   -
512 511 should 'check_comment_actions be an empty array by default' do
513 512 class SomePlugin < Noosfero::Plugin; end
514 513 plugin = SomePlugin.new
515 514 assert_equal [], plugin.check_comment_actions(Comment.new)
516 515 end
517 516  
  517 + should 'have default search suggestions based on search terms' do
  518 + context = Environment.default
  519 + st1 = SearchTerm.new(:term => 'universe', :asset => 'science', :context => context)
  520 + st1.score = 3
  521 + st1.save!
  522 + st2 = SearchTerm.new(:term => 'unisound', :asset => 'science', :context => context)
  523 + st2.score = 5
  524 + st2.save!
  525 + st3 = SearchTerm.new(:term => 'unicrowd', :asset => 'science', :context => context)
  526 + st3.score = 2
  527 + st3.save!
  528 + st4 = SearchTerm.new(:term => 'univault', :asset => 'science', :context => context)
  529 + st4.score = 8
  530 + st4.save!
  531 + # Query not match
  532 + st5 = SearchTerm.create!(:term => 'destroyer', :asset => 'science', :context => context)
  533 + st5.score = 8
  534 + st5.save!
  535 + # Different asset
  536 + st6 = SearchTerm.create!(:term => 'unilight', :asset => 'pseudo-science', :context => context)
  537 + st6.score = 8
  538 + st6.save!
  539 + # Score not bigger than zero
  540 + st7 = SearchTerm.create!(:term => 'unicloud', :asset => 'science', :context => context)
  541 + st7.score = 0
  542 + st7.save!
  543 +
  544 + class SomePlugin < Noosfero::Plugin; end
  545 + plugin = SomePlugin.new
  546 +
  547 + suggestions = plugin.find_suggestions('uni', context, 'science')
  548 +
  549 + assert_includes suggestions, st1.term
  550 + assert_includes suggestions, st2.term
  551 + assert_includes suggestions, st3.term
  552 + assert_includes suggestions, st4.term
  553 + assert_not_includes suggestions, st5.term
  554 + assert_not_includes suggestions, st6.term
  555 + assert_not_includes suggestions, st7.term
  556 +
  557 + assert_order [st4.term, st2.term, st1.term, st3.term], suggestions
  558 +
  559 + limited_suggestions = plugin.find_suggestions('uni', context, 'science', {:limit => 2})
  560 + assert_equivalent [st4.term, st2.term], limited_suggestions
  561 + end
  562 +
518 563 end
... ...
test/unit/search_term_test.rb
... ... @@ -49,13 +49,22 @@ class SearchTermTest &lt; ActiveSupport::TestCase
49 49 should 'calculate score' do
50 50 search_term = SearchTerm.find_or_create('universe', Environment.default)
51 51 SearchTermOccurrence.create!(:search_term => search_term, :total => 10, :indexed => 3)
52   - # Search term must happens at least two times to be considered
53   - SearchTermOccurrence.create!(:search_term => search_term, :total => 10, :indexed => 3)
54 52 SearchTerm.calculate_scores
55 53 search_term.reload
56 54 assert search_term.score > 0, "Score was not calculated."
57 55 end
58 56  
  57 + should 'have different scores for the same term with different assets' do
  58 + st1 = SearchTerm.find_or_create('universe', Environment.default, 'a')
  59 + st2 = SearchTerm.find_or_create('universe', Environment.default, 'b')
  60 + SearchTermOccurrence.create!(:search_term => st1, :total => 10, :indexed => 3)
  61 + SearchTermOccurrence.create!(:search_term => st2, :total => 10, :indexed => 8)
  62 + SearchTerm.calculate_scores
  63 + st1.reload
  64 + st2.reload
  65 + assert st1.score != st2.score, "Same term with different assets can have different scores."
  66 + end
  67 +
59 68 should 'not consider expired occurrences to calculate the score' do
60 69 search_term = SearchTerm.find_or_create('universe', Environment.default)
61 70 occurrence = SearchTermOccurrence.create!(:search_term => search_term, :total => 10, :indexed => 3, :created_at => DateTime.now - (SearchTermOccurrence::EXPIRATION_TIME + 1.day))
... ... @@ -82,7 +91,7 @@ class SearchTermTest &lt; ActiveSupport::TestCase
82 91 assert st2.score > 0, "Did not calculate st2 score."
83 92 end
84 93  
85   - should 'the older the occurrence the less it should influence the score' do
  94 + should 'consider the older the occurrence less it should influence the score' do
86 95 st1 = SearchTerm.find_or_create('st1', Environment.default)
87 96 SearchTermOccurrence.create!(:search_term => st1, :total => 10, :indexed => 3, :created_at => 1.month.ago)
88 97 SearchTermOccurrence.create!(:search_term => st1, :total => 20, :indexed => 8, :created_at => 1.month.ago)
... ... @@ -97,4 +106,16 @@ class SearchTermTest &lt; ActiveSupport::TestCase
97 106 assert st1.score > st2.score, "Older occurrences are not influencing score less than newer ones."
98 107 end
99 108  
  109 + should 'consider higher relevance if the ratio results:total is smaller' do
  110 + st1 = SearchTerm.find_or_create('st1', Environment.default)
  111 + SearchTermOccurrence.create!(:search_term => st1, :total => 10, :indexed => 4)
  112 + st2 = SearchTerm.find_or_create('st2', Environment.default)
  113 + SearchTermOccurrence.create!(:search_term => st2, :total => 10, :indexed => 5)
  114 +
  115 + SearchTerm.calculate_scores
  116 + st1.reload
  117 + st2.reload
  118 +
  119 + assert st1.score > st2.score, "Less ratio results:total are not getting higher scores."
  120 + end
100 121 end
... ...