search_term_test.rb
5.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
require 'test_helper'
class SearchTermTest < ActiveSupport::TestCase
should 'have term' do
search_term = SearchTerm.new
refute search_term.valid?
assert search_term.errors.has_key?(:term)
end
should 'have context' do
search_term = SearchTerm.new
refute search_term.valid?
assert search_term.errors.has_key?(:context)
end
should 'have unique term within specific context and asset' do
SearchTerm.create!(:term => 'galaxy', :context => Environment.default, :asset => 'universe')
search_term = SearchTerm.new(:term => 'galaxy', :context => Environment.default, :asset => 'universe')
search_term.valid?
assert search_term.errors.has_key?(:term)
search_term.asset = 'alternate_universe'
search_term.valid?
refute search_term.errors.has_key?(:term)
search_term.asset = 'universe'
search_term.context = fast_create(Profile)
search_term.valid?
refute search_term.errors.has_key?(:term)
end
should 'create a search term' do
assert_nothing_raised do
SearchTerm.create!(:term => 'universe', :context => Environment.default)
end
end
should 'find or create by term' do
assert_difference 'SearchTerm.count', 1 do
SearchTerm.find_or_create('universe', Environment.default)
search_term = SearchTerm.find_or_create('universe', Environment.default)
assert_equal 'universe', search_term.term
end
end
should 'have occurrences' do
search_term = SearchTerm.find_or_create('universe', Environment.default)
o1 = SearchTermOccurrence.create!(:search_term => search_term)
o2 = SearchTermOccurrence.create!(:search_term => search_term)
assert_equivalent [o1,o2], search_term.occurrences
end
should 'calculate score' do
search_term = SearchTerm.find_or_create('universe', Environment.default)
SearchTermOccurrence.create!(:search_term => search_term, :total => 10, :indexed => 3)
SearchTerm.calculate_scores
search_term.reload
assert search_term.score > 0, "Score was not calculated."
end
should 'have different scores for the same term with different assets' do
st1 = SearchTerm.find_or_create('universe', Environment.default, 'a')
st2 = SearchTerm.find_or_create('universe', Environment.default, 'b')
SearchTermOccurrence.create!(:search_term => st1, :total => 10, :indexed => 3)
SearchTermOccurrence.create!(:search_term => st2, :total => 10, :indexed => 8)
SearchTerm.calculate_scores
st1.reload
st2.reload
assert st1.score != st2.score, "Same term with different assets can have different scores."
end
should 'not consider expired occurrences to calculate the score' do
search_term = SearchTerm.find_or_create('universe', Environment.default)
occurrence = SearchTermOccurrence.create!(:search_term => search_term, :total => 10, :indexed => 3, :created_at => DateTime.now - (SearchTermOccurrence::EXPIRATION_TIME + 1.day))
SearchTerm.calculate_scores
search_term.reload
assert search_term.score == 0, "Considered expired occurrence to calculate the score."
end
should 'calculate search_terms scores' do
st1 = SearchTerm.find_or_create('st1', Environment.default)
SearchTermOccurrence.create!(:search_term => st1, :total => 10, :indexed => 3)
SearchTermOccurrence.create!(:search_term => st1, :total => 20, :indexed => 8)
SearchTermOccurrence.create!(:search_term => st1, :total => 30, :indexed => 9)
st2 = SearchTerm.find_or_create('st2', Environment.default)
SearchTermOccurrence.create!(:search_term => st2, :total => 10, :indexed => 7)
SearchTermOccurrence.create!(:search_term => st2, :total => 20, :indexed => 16)
SearchTermOccurrence.create!(:search_term => st2, :total => 30, :indexed => 21)
SearchTerm.calculate_scores
st1.reload
st2.reload
assert st1.score > 0, "Did not calculate st1 score."
assert st2.score > 0, "Did not calculate st2 score."
end
should 'consider the older the occurrence less it should influence the score' do
st1 = SearchTerm.find_or_create('st1', Environment.default)
SearchTermOccurrence.create!(:search_term => st1, :total => 10, :indexed => 3, :created_at => 1.month.ago)
SearchTermOccurrence.create!(:search_term => st1, :total => 20, :indexed => 8, :created_at => 1.month.ago)
st2 = SearchTerm.find_or_create('st2', Environment.default)
SearchTermOccurrence.create!(:search_term => st2, :total => 10, :indexed => 3, :created_at => 2.months.ago)
SearchTermOccurrence.create!(:search_term => st2, :total => 20, :indexed => 8, :created_at => 2.months.ago)
SearchTerm.calculate_scores
st1.reload
st2.reload
assert st1.score > st2.score, "Older occurrences are not influencing score less than newer ones."
end
should 'consider higher relevance if the ratio results:total is smaller' do
st1 = SearchTerm.find_or_create('st1', Environment.default)
SearchTermOccurrence.create!(:search_term => st1, :total => 10, :indexed => 4)
st2 = SearchTerm.find_or_create('st2', Environment.default)
SearchTermOccurrence.create!(:search_term => st2, :total => 10, :indexed => 5)
SearchTerm.calculate_scores
st1.reload
st2.reload
assert st1.score > st2.score, "Less ratio results:total are not getting higher scores."
end
should 'consider relevance zero if no results indexed' do
st = SearchTerm.find_or_create('st', Environment.default)
SearchTermOccurrence.create!(:search_term => st, :total => 10, :indexed => 0)
SearchTerm.calculate_scores
st.reload
assert_equal 0, st.score
end
end