airblade-Sphincter 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,39 @@
1
+ require 'test/sphincter_test_case'
2
+ require 'sphincter/association_searcher'
3
+
4
+ class TestSphincterAssociationSearcher < SphincterTestCase
5
+
6
+ class Proxy
7
+ include Sphincter::AssociationSearcher
8
+
9
+ attr_accessor :reflection
10
+
11
+ def initialize
12
+ @reflection = SphincterTestCase::BelongsTo.reflections.last
13
+ klass = Object.new
14
+ def klass.search_args() @search_args end
15
+ def klass.search(*args) @search_args = args; :searched end
16
+ @reflection.klass = klass
17
+ end
18
+
19
+ def proxy_reflection()
20
+ @reflection
21
+ end
22
+
23
+ def proxy_owner()
24
+ SphincterTestCase::BelongsTo.new
25
+ end
26
+ end
27
+
28
+ def test_search
29
+ proxy = Proxy.new
30
+
31
+ results = proxy.search 'words'
32
+
33
+ assert_equal :searched, results
34
+ assert_equal ['words', { :conditions => { 'models_id' => 42 } } ],
35
+ proxy.proxy_reflection.klass.search_args
36
+ end
37
+
38
+ end
39
+
@@ -0,0 +1,386 @@
1
+ require 'test/sphincter_test_case'
2
+ require 'sphincter/configure'
3
+
4
+ class TestSphincterConfigure < SphincterTestCase
5
+
6
+ DEFAULT_GET_CONF_EXPECTED = {
7
+ "mysql" => {
8
+ "sql_query_pre" => [
9
+ "SET NAMES utf8",
10
+ ]
11
+ },
12
+ "sphincter" => {
13
+ "address" => "127.0.0.1",
14
+ "path" => "sphinx/RAILS_ENV",
15
+ "per_page" => 10,
16
+ "port" => 3312,
17
+ },
18
+ "index" => {
19
+ "charset_type" => "utf-8",
20
+ "docinfo" => "extern",
21
+ "min_word_len" => 1,
22
+ "morphology" => "stem_en",
23
+ "stopwords" => "",
24
+ },
25
+ "source" => {
26
+ "index_html_attrs" => "",
27
+ "sql_query_post" => "",
28
+ "sql_range_step" => 20000,
29
+ "strip_html" => 0,
30
+ },
31
+ "indexer" => {
32
+ "mem_limit" => "32M",
33
+ },
34
+ "searchd" => {
35
+ "address" => "127.0.0.1",
36
+ "log" => "log/sphinx/searchd.RAILS_ENV.log",
37
+ "max_children" => 30,
38
+ "max_matches" => 1000,
39
+ "pid_file" => "sphinx/RAILS_ENV/searchd.pid",
40
+ "port" => 3312,
41
+ "query_log" => "log/sphinx/query.RAILS_ENV.log",
42
+ "read_timeout" => 5,
43
+ }
44
+ }
45
+
46
+ def test_self_configure
47
+ expected = <<-EOF
48
+ indexer
49
+ {
50
+ mem_limit = 32M
51
+ }
52
+
53
+ searchd
54
+ {
55
+ address = 127.0.0.1
56
+ log = log/sphinx/searchd.RAILS_ENV.log
57
+ max_children = 30
58
+ max_matches = 1000
59
+ pid_file = sphinx/RAILS_ENV/searchd.pid
60
+ port = 3312
61
+ query_log = log/sphinx/query.RAILS_ENV.log
62
+ read_timeout = 5
63
+ }
64
+ EOF
65
+
66
+ Sphincter::Configure.configure
67
+
68
+ assert_equal expected, File.read(Sphincter::Configure.sphinx_conf)
69
+ end
70
+
71
+ def test_self_deep_merge
72
+ h1 = { 'x' => { 'm' => 0 },
73
+ 'y' => { 'a' => 1, 'b' => 2 } }
74
+ h2 = { 'y' => { 'b' => -2, 'c' => -3 },
75
+ 'z' => { 'm' => 0 } }
76
+ result = Sphincter::Configure.deep_merge h1, h2
77
+
78
+ expected = {
79
+ 'x' => { 'm' => 0 },
80
+ 'y' => { 'a' => 1, 'b' => -2, 'c' => -3 },
81
+ 'z' => { 'm' => 0 },
82
+ }
83
+
84
+ assert_equal expected, result
85
+ end
86
+
87
+ def test_self_get_conf
88
+ expected = DEFAULT_GET_CONF_EXPECTED
89
+
90
+ assert_equal expected, Sphincter::Configure.get_conf
91
+ end
92
+
93
+ def test_self_get_conf_app_conf
94
+ FileUtils.mkdir_p 'config'
95
+ File.open 'config/sphincter.yml', 'w' do |fp|
96
+ fp.puts "sphincter:\n port: 3313"
97
+ end
98
+
99
+ expected = util_deep_clone DEFAULT_GET_CONF_EXPECTED
100
+ expected['sphincter']['port'] = 3313
101
+ expected['searchd']['port'] = 3313
102
+
103
+ assert_equal expected, Sphincter::Configure.get_conf
104
+ end
105
+
106
+ def test_self_get_conf_env_conf
107
+ FileUtils.mkdir_p 'config/environments'
108
+ File.open 'config/sphincter.yml', 'w' do |fp|
109
+ fp.puts "sphincter:\n port: 3313"
110
+ end
111
+ File.open "config/environments/sphincter.#{RAILS_ENV}.yml", 'w' do |fp|
112
+ fp.puts "sphincter:\n port: 3314"
113
+ end
114
+
115
+ expected = util_deep_clone DEFAULT_GET_CONF_EXPECTED
116
+ expected['sphincter']['port'] = 3314
117
+ expected['searchd']['port'] = 3314
118
+
119
+ assert_equal expected, Sphincter::Configure.get_conf
120
+ end
121
+
122
+ def test_self_get_conf_from
123
+ assert_equal Hash.new, Sphincter::Configure.get_conf_from('/nonexistent')
124
+
125
+ File.open 'foo.yml', 'w' do |fp| fp.puts "foo:\n bar" end
126
+
127
+ assert_equal({'foo' => 'bar'}, Sphincter::Configure.get_conf_from('foo.yml'))
128
+ end
129
+
130
+ def test_self_get_sources
131
+ Sphincter::Search.indexes[Model] << {
132
+ :fields => %w[text belongs_to.string]
133
+ }
134
+
135
+ expected = {
136
+ "models" => {
137
+ "strip_html" => 0,
138
+ "sql_group_column" => ["sphincter_index_id"],
139
+ "sql_query_range" => "SELECT MIN(`id`), MAX(`id`) FROM models",
140
+ "sql_query_info" =>
141
+ "SELECT * FROM models WHERE models.`id` = (($id - 0) / 1)",
142
+ "sql_date_column" => [],
143
+ "sql_query" =>
144
+ "SELECT (models.`id` * 1 + 0) AS `id`, " \
145
+ "0 AS sphincter_index_id, " \
146
+ "'Model' AS sphincter_klass, "\
147
+ "models.`text` AS `text`, " \
148
+ "belongs_tos.`string` AS `belongs_tos_string` "\
149
+ "FROM models LEFT JOIN belongs_tos ON " \
150
+ "models.`belongs_to_id` = belongs_tos.`id` " \
151
+ "WHERE models.`id` >= $start AND models.`id` <= $end"
152
+ }
153
+ }
154
+
155
+ assert_equal expected, Sphincter::Configure.get_sources
156
+ end
157
+
158
+ def test_self_get_db_conf
159
+ expected = {
160
+ 'type' => 'mysql',
161
+ 'sql_host' => 'host',
162
+ 'sql_pass' => 'password',
163
+ 'sql_db' => 'database',
164
+ 'sql_user' => 'username',
165
+ 'sql_sock' => 'socket',
166
+ }
167
+
168
+ assert_equal expected, Sphincter::Configure.get_db_conf
169
+ end
170
+
171
+ def test_self_index_count
172
+ Sphincter::Search.indexes[Object] << { :fields => %w[title body] }
173
+ Sphincter::Search.indexes[Object] << {
174
+ :fields => %w[title body], :name => 'foo'
175
+ }
176
+
177
+ assert_equal 2, Sphincter::Configure.index_count
178
+
179
+ expected = {
180
+ Object => [
181
+ { :index_id => 0, :fields => %w[title body] },
182
+ { :index_id => 1, :fields => %w[title body], :name => 'foo' },
183
+ ],
184
+ }
185
+
186
+ assert_equal expected, Sphincter::Search.indexes
187
+ end
188
+
189
+ def test_self_section
190
+ heading = 'searchd'
191
+ data = {
192
+ 'array' => %w[value1 value2],
193
+ 'empty' => '',
194
+ 'nil' => nil,
195
+ 'string' => 'value',
196
+ }
197
+
198
+ expected = <<-EOF.strip
199
+ searchd
200
+ {
201
+ array = value1
202
+ array = value2
203
+ empty =
204
+ nil =
205
+ string = value
206
+ }
207
+ EOF
208
+
209
+ assert_equal expected, Sphincter::Configure.section(heading, data)
210
+ end
211
+
212
+ def test_self_sphinx_conf
213
+ assert_equal File.join(RAILS_ROOT, 'sphinx/RAILS_ENV/sphinx.conf'),
214
+ Sphincter::Configure.sphinx_conf
215
+ end
216
+
217
+ def test_self_sphinx_dir
218
+ assert_equal File.join(RAILS_ROOT, 'sphinx/RAILS_ENV'),
219
+ Sphincter::Configure.sphinx_dir
220
+ end
221
+
222
+ def test_self_write_configuration
223
+ conf = Hash.new { |h,k| h[k] = {} }
224
+ sources = Hash.new { |h,k| h[k] = {} }
225
+
226
+ conf['sphincter']['path'] = 'sphinx/development'
227
+ conf['source']['key1'] = 'value1'
228
+ conf['index']['key1'] = 'value1'
229
+
230
+ sources['source_1']['key2'] = 'value2'
231
+
232
+ sources['source_2']['key1'] = 'value3'
233
+ sources['source_2']['key2'] = 'value4'
234
+
235
+ expected = <<-EOF
236
+ indexer
237
+ {
238
+ }
239
+
240
+ searchd
241
+ {
242
+ }
243
+
244
+ source source_1
245
+ {
246
+ key1 = value1
247
+ key2 = value2
248
+ }
249
+
250
+ index source_1
251
+ {
252
+ key1 = value1
253
+ path = #{Sphincter::Configure.sphinx_dir}/source_1
254
+ source = source_1
255
+ }
256
+
257
+ source source_2
258
+ {
259
+ key1 = value3
260
+ key2 = value4
261
+ }
262
+
263
+ index source_2
264
+ {
265
+ key1 = value1
266
+ path = #{Sphincter::Configure.sphinx_dir}/source_2
267
+ source = source_2
268
+ }
269
+ EOF
270
+
271
+ Sphincter::Configure.write_configuration conf, sources
272
+
273
+ assert_equal expected, File.read(Sphincter::Configure.sphinx_conf)
274
+ end
275
+
276
+ def util_deep_clone(obj)
277
+ Marshal.load Marshal.dump(obj)
278
+ end
279
+
280
+ end
281
+
282
+ class Sphincter::Configure::Index
283
+ attr_reader :fields, :where, :tables, :group
284
+ end
285
+
286
+ class TestSphincterConfigureIndex < SphincterTestCase
287
+
288
+ def setup
289
+ super
290
+
291
+ @index = Sphincter::Configure::Index.new Model, {}
292
+ end
293
+
294
+ def test_self_add_field
295
+ fields = []
296
+ fields << @index.add_field('date')
297
+ fields << @index.add_field('datetime')
298
+ fields << @index.add_field('boolean')
299
+ fields << @index.add_field('integer')
300
+ fields << @index.add_field('string')
301
+ fields << @index.add_field('time')
302
+ fields << @index.add_field('timestamp')
303
+ fields << @index.add_field('text')
304
+
305
+ expected_fields = [
306
+ "UNIX_TIMESTAMP(models.`date`) AS `date`",
307
+ "UNIX_TIMESTAMP(models.`datetime`) AS `datetime`",
308
+ "models.`boolean` AS `boolean`",
309
+ "models.`integer` AS `integer`",
310
+ "models.`string` AS `string`",
311
+ "UNIX_TIMESTAMP(models.`time`) AS `time`",
312
+ "UNIX_TIMESTAMP(models.`timestamp`) AS `timestamp`",
313
+ "models.`text` AS `text`"
314
+ ]
315
+
316
+ assert_equal expected_fields, fields
317
+
318
+ assert_equal %w[sphincter_index_id boolean integer],
319
+ @index.source_conf['sql_group_column']
320
+ assert_equal %w[date datetime time timestamp],
321
+ @index.source_conf['sql_date_column']
322
+ end
323
+
324
+ def test_self_add_field_unknown
325
+ e = assert_raise Sphincter::Error do
326
+ @index.add_field 'float'
327
+ end
328
+
329
+ assert_equal 'unknown column type float', e.message
330
+ end
331
+
332
+ def test_add_include_belongs_to
333
+ @index.add_include 'belongs_to', 'string'
334
+
335
+ assert_equal ["belongs_tos.`string` AS `belongs_tos_string`"], @index.fields
336
+
337
+ tables = "models LEFT JOIN belongs_tos ON " \
338
+ "models.`belongs_to_id` = belongs_tos.`id`"
339
+ assert_equal tables, @index.tables
340
+
341
+ assert_equal [], @index.where
342
+
343
+ assert_equal false, @index.group
344
+ end
345
+
346
+ def test_add_include_has_many
347
+ @index.add_include 'manys', 'string'
348
+
349
+ fields = [
350
+ "GROUP_CONCAT(has_manys.`string` SEPARATOR ' ') AS `has_manys_string`"
351
+ ]
352
+ assert_equal fields, @index.fields
353
+
354
+ tables = "models LEFT JOIN has_manys ON models.`id` = has_manys.`manys_id`"
355
+ assert_equal tables, @index.tables
356
+
357
+ assert_equal [], @index.where
358
+ assert_equal true, @index.group
359
+ end
360
+
361
+ def test_add_include_has_many_polymorphic
362
+ @index.add_include 'polys', 'string'
363
+
364
+ fields = ["GROUP_CONCAT(polys.`string` SEPARATOR ' ') AS `polys_string`"]
365
+ assert_equal fields, @index.fields
366
+
367
+ tables = "models LEFT JOIN polys ON " \
368
+ "models.`id` = polys.`polyable_id` AND " \
369
+ "'Model' = polys.`polyable_type`"
370
+ assert_equal tables, @index.tables
371
+
372
+ assert_equal [], @index.where
373
+ assert_equal true, @index.group
374
+ end
375
+
376
+ def test_add_include_nonexistent_association
377
+ e = assert_raise Sphincter::Error do
378
+ @index.add_include 'nonexistent', 'string'
379
+ end
380
+
381
+ assert_equal "could not find association \"nonexistent\" in Model",
382
+ e.message
383
+ end
384
+
385
+ end
386
+
@@ -0,0 +1,100 @@
1
+ require 'test/sphincter_test_case'
2
+ require 'sphincter/search'
3
+
4
+ SphincterTestCase::Model.extend Sphincter::Search
5
+
6
+ class TestSphincterSearch < SphincterTestCase
7
+
8
+ def test_self_indexes
9
+ assert_equal [], Sphincter::Search.indexes[Model]
10
+ end
11
+
12
+ def test_add_index
13
+ Model.add_index :fields => %w[text]
14
+
15
+ assert_equal [{ :fields => %w[text belongs_to_id] }],
16
+ Sphincter::Search.indexes[Model]
17
+
18
+ belongs_to_belongs_to = BelongsTo.reflections.first
19
+ belongs_to_has_many = BelongsTo.reflections.last
20
+
21
+ assert_equal({}, belongs_to_belongs_to.options, 'BelongsTo belongs_to')
22
+ assert_equal({ :extend => [Sphincter::AssociationSearcher] },
23
+ belongs_to_has_many.options, 'BelongsTo has_many')
24
+ end
25
+
26
+ def test_sphincter_convert_values
27
+ assert_equal [0, 1], Model.sphincter_convert_values([false, true])
28
+
29
+ now = Time.at 999_932_400
30
+ expected = [999_932_400]
31
+
32
+ assert_equal expected,
33
+ Model.sphincter_convert_values([999_932_400])
34
+ assert_equal expected,
35
+ Model.sphincter_convert_values([now])
36
+ assert_equal expected,
37
+ Model.sphincter_convert_values([Date.parse(now.to_s)])
38
+ assert_equal expected,
39
+ Model.sphincter_convert_values([DateTime.parse(now.to_s)])
40
+ end
41
+
42
+ def test_search
43
+ Model.add_index :fields => %w[text]
44
+ Sphincter::Configure.get_conf['sphincter']['host'] = 'localhost'
45
+ Sphincter::Configure.get_conf['sphincter']['port'] = 3312
46
+
47
+ results = Model.search 'words'
48
+
49
+ assert_equal [11, 13, 12], results.records
50
+ assert_equal 3, results.total
51
+ assert_equal 10, results.per_page
52
+
53
+ assert_equal 'localhost', Sphinx::Client.last_client.host
54
+ assert_equal 3312, Sphinx::Client.last_client.port
55
+ assert_equal 'words', Sphinx::Client.last_client.query
56
+ assert_equal 'models', Sphinx::Client.last_client.index
57
+ end
58
+
59
+ def test_search_between
60
+ Model.add_index :fields => %w[text]
61
+
62
+ now = Time.now
63
+ ago = now - 3600
64
+ between = {
65
+ :created_at => [ago, now]
66
+ }
67
+
68
+ Model.search 'words', :between => between
69
+
70
+ expected = { 'created_at' => [:range, ago.to_i, now.to_i] }
71
+
72
+ assert_equal expected, Sphinx::Client.last_client.filters
73
+ end
74
+
75
+ def test_search_conditions
76
+ Model.add_index :fields => %w[text]
77
+
78
+ now = Time.now
79
+ conditions = {
80
+ :some_id => 1,
81
+ :other_id => [1, 2],
82
+ :boolean => [true, false],
83
+ }
84
+
85
+ Model.search 'words', :conditions => conditions
86
+
87
+ expected = { 'some_id' => [1], 'other_id' => [1, 2], 'boolean' => [1, 0] }
88
+
89
+ assert_equal expected, Sphinx::Client.last_client.filters
90
+ end
91
+
92
+ def test_search_index
93
+ Model.add_index :fields => %w[text]
94
+
95
+ Model.search 'words', :index => 'other'
96
+
97
+ assert_equal 'other', Sphinx::Client.last_client.index
98
+ end
99
+
100
+ end