profile_test.rb
6.68 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
require "#{File.dirname(__FILE__)}/../test_helper"
class ProfileTest < ActiveSupport::TestCase
def setup
@environment = Environment.default
@environment.enable_plugin(SolrPlugin)
end
attr_accessor :environment
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
should 'act as faceted' do
st = fast_create(State, :acronym => 'XZ')
city = fast_create(City, :name => 'Tabajara', :parent_id => st.id)
cat = fast_create(Category)
prof = fast_create(Person, :region_id => city.id)
prof.add_category(cat, true)
assert_equal ['Tabajara', ', XZ'], Profile.facet_by_id(:solr_plugin_f_region)[:proc].call(prof.send(:solr_plugin_f_region))
assert_equal "solr_plugin_category_filter:#{cat.id}", Person.facet_category_query.call(cat)
end
should 'act as searchable' do
TestSolr.enable
st = create(State, :name => 'California', :acronym => 'CA', :environment_id => Environment.default.id)
city = create(City, :name => 'Inglewood', :parent_id => st.id, :environment_id => Environment.default.id)
p = create(Person, :name => "Hiro", :address => 'U-Stor-It', :nickname => 'Protagonist',
:user_id => fast_create(User).id, :region_id => city.id)
cat = create(Category, :name => "Science Fiction", :acronym => "sf", :abbreviation => "sci-fi")
p.add_category cat
# fields
assert_includes Profile.find_by_contents('Hiro')[:results].docs, p
assert_includes Profile.find_by_contents('Protagonist')[:results].docs, p
# filters
assert_includes Profile.find_by_contents('Hiro', {}, { :filter_queries => ["solr_plugin_public:true"]})[:results].docs, p
assert_not_includes Profile.find_by_contents('Hiro', {}, { :filter_queries => ["solr_plugin_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
assert_includes Profile.find_by_contents("California")[:results].docs, p
assert_includes Profile.find_by_contents("Science")[:results].docs, p
# not includes
assert_not_includes Profile.find_by_contents('Stor')[:results].docs, p
end
should 'boost name matches' do
TestSolr.enable
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], Person.find_by_contents('bananas')[:results].docs
end
should 'be able to add extra data for index' do
klass = Class.new(Profile)
klass.any_instance.expects(:random_method)
klass.solr_plugin_extra_data_for_index :random_method
klass.new.solr_plugin_extra_data_for_index
end
should 'be able to add a block as extra data for index' do
klass = Class.new(Profile)
result = Object.new
klass.solr_plugin_extra_data_for_index do |obj|
result
end
assert_includes klass.new.solr_plugin_extra_data_for_index, result
end
should 'actually index by results of solr_plugin_extra_data_for_index' do
TestSolr.enable
class ExtraDataForIndex < Profile
solr_plugin_extra_data_for_index do |obj|
'sample indexed text'
end
end
profile = ExtraDataForIndex.create!(:name => 'testprofile', :identifier => 'testprofile')
assert_includes ExtraDataForIndex.find_by_contents('sample')[:results], profile
end
should 'find_by_contents' do
TestSolr.enable
p = create(Profile, :name => 'wanted')
assert Profile.find_by_contents('wanted')[:results].include?(p)
refute Profile.find_by_contents('not_wanted')[:results].include?(p)
end
# This problem should be solved; talk to Bráulio if it fails
should 'be able to find profiles by their names' do
TestSolr.enable
small = create(Profile, :name => 'A small profile for testing')
big = create(Profile, :name => 'A big profile for testing')
assert Profile.find_by_contents('small')[:results].include?(small)
assert Profile.find_by_contents('big')[:results].include?(big)
both = Profile.find_by_contents('profile testing')[:results]
assert both.include?(small)
assert both.include?(big)
end
should 'search with latitude and longitude' do
TestSolr.enable
e = fast_create(Enterprise, {:lat => 45, :lng => 45}, :search => true)
assert_includes Enterprise.find_by_contents('', {}, {:radius => 2, :latitude => 45, :longitude => 45})[:results].docs, e
end
should 'index profile identifier for searching' do
TestSolr.enable
Profile.destroy_all
p = create(Profile, :identifier => 'lalala')
assert_includes Profile.find_by_contents('lalala')[:results], p
end
should 'index profile name for searching' do
TestSolr.enable
p = create(Profile, :name => 'Interesting Profile')
assert_includes Profile.find_by_contents('interesting')[:results], p
end
should 'index comments title together with article' do
TestSolr.enable
owner = create_user('testuser').person
art = fast_create(TinyMceArticle, :profile_id => owner.id, :name => 'ytest')
c1 = Comment.create(:title => 'a nice comment', :body => 'anything', :author => owner, :source => art ); c1.save!
assert_includes Article.find_by_contents('nice')[:results], art
end
should 'index by schema name when database is postgresql' do
TestSolr.enable
uses_postgresql 'schema_one'
p1 = Profile.create!(:name => 'some thing', :identifier => 'some-thing')
assert_equal [p1], Profile.find_by_contents('thing')[:results].docs
uses_postgresql 'schema_two'
p2 = Profile.create!(:name => 'another thing', :identifier => 'another-thing')
assert_not_includes Profile.find_by_contents('thing')[:results], p1
assert_includes Profile.find_by_contents('thing')[:results], p2
uses_postgresql 'schema_one'
assert_includes Profile.find_by_contents('thing')[:results], p1
assert_not_includes Profile.find_by_contents('thing')[:results], p2
uses_sqlite
end
should 'not index by schema name when database is not postgresql' do
TestSolr.enable
uses_sqlite
p1 = Profile.create!(:name => 'some thing', :identifier => 'some-thing')
assert_equal [p1], Profile.find_by_contents('thing')[:results].docs
p2 = Profile.create!(:name => 'another thing', :identifier => 'another-thing')
assert_includes Profile.find_by_contents('thing')[:results], p1
assert_includes Profile.find_by_contents('thing')[:results], p2
end
end