meta_search_hub 1.1.3

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,447 @@
1
+ require 'helper'
2
+ require 'action_controller'
3
+ require 'action_view/test_case'
4
+
5
+ class TestViewHelpers < ActionView::TestCase
6
+ tests MetaSearch::Helpers::FormHelper
7
+ include MetaSearch::Helpers::UrlHelper
8
+
9
+ def self.router
10
+ @router ||= begin
11
+ router = ActionDispatch::Routing::RouteSet.new
12
+ router.draw do
13
+ resources :developers
14
+ resources :companies
15
+ resources :projects
16
+ resources :notes
17
+ match ':controller(/:action(/:id(.:format)))'
18
+ end
19
+ router
20
+ end
21
+ end
22
+
23
+ include router.url_helpers
24
+
25
+ # FIXME: figure out a cleaner way to get this behavior
26
+ def setup
27
+ router = self.class.router
28
+ @controller = ActionView::TestCase::TestController.new
29
+ @controller.instance_variable_set(:@_routes, router)
30
+ @controller.class_eval do
31
+ include router.url_helpers
32
+ end
33
+
34
+ @controller.view_context_class.class_eval do
35
+ include router.url_helpers
36
+ end
37
+ end
38
+
39
+ context "A search against Company and a search against Developer" do
40
+ setup do
41
+ @s1 = Company.search
42
+ @s2 = Developer.search
43
+ form_for @s1 do |f|
44
+ @f1 = f
45
+ end
46
+
47
+ form_for @s2 do |f|
48
+ @f2 = f
49
+ end
50
+ end
51
+
52
+ should "use the default localization for predicates" do
53
+ assert_match /Name isn't null/, @f1.label(:name_is_not_null)
54
+ end
55
+
56
+ context "in the Flanders locale" do
57
+ setup do
58
+ I18n.locale = :flanders
59
+ end
60
+
61
+ teardown do
62
+ I18n.locale = nil
63
+ end
64
+
65
+ should "localize according to their bases" do
66
+ assert_match /Company name-diddly contains-diddly/, @f1.label(:name_contains)
67
+ assert_match /Company reverse name-diddly/, @f1.label(:reverse_name)
68
+ assert_match /Developer name-diddly contains-aroonie/, @f2.label(:name_like)
69
+ end
70
+
71
+ should "localize more than one attribute when joined with or" do
72
+ assert_match /Developer name-diddly or-diddly Developer salary-doodly equals-diddly/, @f2.label(:name_or_salary_eq)
73
+ end
74
+ end
75
+ end
76
+
77
+ context "A previously-filled search form" do
78
+ setup do
79
+ @s = Company.search
80
+ @s.created_at_gte = [2001, 2, 3, 4, 5]
81
+ @s.name_contains = "bacon"
82
+ form_for @s do |f|
83
+ @f = f
84
+ end
85
+ end
86
+
87
+ should "retain previous search terms" do
88
+ html = @f.datetime_select(:created_at_gte)
89
+ ['2001', '3', '04', '05'].each do |v|
90
+ assert_match /<option selected="selected" value="#{v}">#{v}<\/option>/,
91
+ html
92
+ end
93
+ assert_match /<option selected="selected" value="2">February<\/option>/, html
94
+ assert_dom_equal '<input id="search_name_contains" name="search[name_contains]" ' +
95
+ 'size="30" type="text" value="bacon" />',
96
+ @f.text_field(:name_contains)
97
+ end
98
+ end
99
+
100
+ context "A form using mutiparameter_field with default size option" do
101
+ setup do
102
+ @s = Developer.search
103
+ form_for @s do |f|
104
+ @f = f
105
+ end
106
+ end
107
+
108
+ should "apply proper cast and default size attribute to text fields" do
109
+ html = @f.multiparameter_field :salary_in,
110
+ {:field_type => :text_field, :type_cast => 'i'},
111
+ {:field_type => :text_field, :type_cast => 'i'}, :size => 10
112
+ assert_dom_equal '<input id="search_salary_in(1i)" name="search[salary_in(1i)]" ' +
113
+ 'size="10" type="text" />' +
114
+ '<input id="search_salary_in(2i)" name="search[salary_in(2i)]" ' +
115
+ 'size="10" type="text" />',
116
+ html
117
+ end
118
+ end
119
+
120
+ context "A form using checks with three choices" do
121
+ setup do
122
+ @s = Company.search
123
+ form_for @s do |f|
124
+ @f = f
125
+ end
126
+ end
127
+
128
+ should "return an array of check boxes without a block" do
129
+ assert @f.checks(:id_in, [['One', 1], ['Two', 2], ['Three', 3]]).all?{|c| c.is_a?(MetaSearch::Check)}
130
+ end
131
+
132
+ should "generate the expected HTML with a block" do
133
+ expected = <<-EXPECTED
134
+ <p>
135
+ <label for="search_id_in_1">One</label>
136
+ <input id="search_id_in_1" name="search[id_in][]" type="checkbox" value="1" />
137
+ </p>
138
+ <p>
139
+ <label for="search_id_in_2">Two</label>
140
+ <input id="search_id_in_2" name="search[id_in][]" type="checkbox" value="2" />
141
+ </p>
142
+ <p>
143
+ <label for="search_id_in_3">Three</label>
144
+ <input id="search_id_in_3" name="search[id_in][]" type="checkbox" value="3" />
145
+ </p>
146
+ EXPECTED
147
+ assert_dom_equal expected,
148
+ render(:to => :string, :inline => <<-ERB)
149
+ <%= @f.checks(:id_in, [['One', 1], ['Two', 2], ['Three', 3]]) do |c| -%>
150
+ <p>
151
+ <%= c.label %>
152
+ <%= c.box %>
153
+ </p>
154
+ <% end -%>
155
+ ERB
156
+ end
157
+ end
158
+
159
+ context "A form using checks with three choices and a previous selection" do
160
+ setup do
161
+ @s = Company.search
162
+ @s.id_in = [1, 3]
163
+ form_for @s do |f|
164
+ @f = f
165
+ end
166
+ end
167
+
168
+ should "return an array of check boxes without a block" do
169
+ assert @f.checks(:id_in, [['One', 1], ['Two', 2], ['Three', 3]]).all?{|c| c.is_a?(MetaSearch::Check)}
170
+ end
171
+
172
+ should "generate the expected HTML with a block" do
173
+ expected = <<-EXPECTED
174
+ <p>
175
+ <label for="search_id_in_1">One</label>
176
+ <input id="search_id_in_1" name="search[id_in][]" type="checkbox" value="1" checked="checked" />
177
+ </p>
178
+ <p>
179
+ <label for="search_id_in_2">Two</label>
180
+ <input id="search_id_in_2" name="search[id_in][]" type="checkbox" value="2" />
181
+ </p>
182
+ <p>
183
+ <label for="search_id_in_3">Three</label>
184
+ <input id="search_id_in_3" name="search[id_in][]" type="checkbox" value="3" checked="checked" />
185
+ </p>
186
+ EXPECTED
187
+ assert_dom_equal expected,
188
+ render(:to => :string, :inline => <<-ERB)
189
+ <%= @f.checks(:id_in, [['One', 1], ['Two', 2], ['Three', 3]]) do |c| -%>
190
+ <p>
191
+ <%= c.label %>
192
+ <%= c.box %>
193
+ </p>
194
+ <% end -%>
195
+ ERB
196
+ end
197
+ end
198
+
199
+ context "A form using collection_checks with companies" do
200
+ setup do
201
+ @s = Company.search
202
+ form_for @s do |f|
203
+ @f = f
204
+ end
205
+ end
206
+
207
+ should "return an array of check boxes without a block" do
208
+ assert @f.collection_checks(:id_in, Company.all, :id, :name).all?{|c| c.is_a?(MetaSearch::Check)}
209
+ end
210
+
211
+ should "generate the expected HTML with a block" do
212
+ @f.collection_checks(:id_in, Company.all, :id, :name) do |c|
213
+ concat render :to => :string, :inline => "<p><%= c.label %> <%= c.box %></p>", :locals => {:c => c}
214
+ end
215
+ assert_dom_equal output_buffer,
216
+ '<p><label for="search_id_in_1">Initech</label> ' +
217
+ '<input id="search_id_in_1" name="search[id_in][]" type="checkbox" value="1" /></p>' +
218
+ '<p><label for="search_id_in_2">Advanced Optical Solutions</label> ' +
219
+ '<input id="search_id_in_2" name="search[id_in][]" type="checkbox" value="2" /></p>' +
220
+ '<p><label for="search_id_in_3">Mission Data</label> ' +
221
+ '<input id="search_id_in_3" name="search[id_in][]" type="checkbox" value="3" /></p>'
222
+ end
223
+ end
224
+
225
+ context "A company search form sorted by name ascending" do
226
+ setup do
227
+ @s = Company.search
228
+ @s.meta_sort = 'name.asc'
229
+ form_for @s do |f|
230
+ @f = f
231
+ end
232
+ end
233
+
234
+ should "generate a sort link with an up arrow for the sorted column" do
235
+ assert_match /Name &#9650;/,
236
+ @f.sort_link(:name, :controller => 'companies')
237
+ end
238
+
239
+ should "not generate a sort link with an up arrow for a non-sorted column" do
240
+ assert_no_match /Created at &#9650;/,
241
+ @f.sort_link(:created_at, :controller => 'companies')
242
+ end
243
+
244
+ context "and a localization" do
245
+ setup do
246
+ I18n.locale = :es
247
+ end
248
+
249
+ teardown do
250
+ I18n.locale = nil
251
+ end
252
+
253
+ should "use the localized name for the attribute" do
254
+ assert_match /Nombre/,
255
+ @f.sort_link(:name, :controller => 'companies')
256
+ end
257
+ end
258
+ end
259
+
260
+ context "A developer search form sorted by a custom sort method" do
261
+ setup do
262
+ @s = Developer.search
263
+ @s.meta_sort = 'salary_and_name.asc'
264
+ form_for @s do |f|
265
+ @f = f
266
+ end
267
+ end
268
+
269
+ should "generate a sort link with humanized text" do
270
+ assert_match /Salary and name &#9650;/,
271
+ @f.sort_link(:salary_and_name, :controller => 'developers')
272
+ end
273
+
274
+ should "sort results as expected" do
275
+ assert_equal Developer.order('salary ASC, name ASC'),
276
+ @s.all
277
+ end
278
+ end
279
+
280
+ context "A developer search form sorted by multiple columns" do
281
+ setup do
282
+ @s = Developer.search
283
+ @s.meta_sort = 'name_and_salary.asc'
284
+ form_for @s do |f|
285
+ @f = f
286
+ end
287
+ end
288
+
289
+ should "generate a sort link with humanized text" do
290
+ assert_match /Name and salary &#9650;/,
291
+ @f.sort_link(:name_and_salary, :controller => 'developers')
292
+ end
293
+
294
+ should "order by both columns in the order they were specified" do
295
+ assert_match /ORDER BY "developers"."name" ASC, "developers"."salary" ASC/,
296
+ @s.to_sql
297
+ end
298
+
299
+ should "return expected results" do
300
+ assert_equal Developer.order('name ASC, salary ASC').all,
301
+ @s.all
302
+ end
303
+ end
304
+
305
+ context "A company search form with an alternate search_key" do
306
+ setup do
307
+ @s = Company.search({}, :search_key => 'searchy_mcsearchhead')
308
+ form_for @s do |f|
309
+ @f = f
310
+ end
311
+ end
312
+
313
+ should "generate a sort link that places meta_sort param under the specified key" do
314
+ assert_match /searchy_mcsearchhead/,
315
+ @f.sort_link(:name, :controller => 'companies')
316
+ end
317
+ end
318
+
319
+ context "A company search" do
320
+ setup do
321
+ @s = Company.search
322
+ end
323
+
324
+ should "generate a sort link for descending order if set as the default order" do
325
+ assert_match /name.desc/,
326
+ sort_link(@s, :name, :controller => 'companies', :default_order => :desc)
327
+ end
328
+
329
+ should "generate a sort link for ascending order if set as the default order" do
330
+ assert_match /name.asc/,
331
+ sort_link(@s, :name, :controller => 'companies', :default_order => :asc)
332
+ end
333
+
334
+ should "generate a sort link for ascending order if default is specified incorectly" do
335
+ assert_match /name.asc/,
336
+ sort_link(@s, :name, :controller => 'companies', :default_order => :something_else)
337
+ end
338
+
339
+ context "sorted by name ascending" do
340
+ setup do
341
+ @s.meta_sort = 'name.asc'
342
+ end
343
+
344
+ should "generate a sort link with an up arrow for the sorted column" do
345
+ assert_match /Name &#9650;/,
346
+ sort_link(@s, :name, :controller => 'companies')
347
+ end
348
+
349
+ should "not generate a sort link with an up arrow for a non-sorted column" do
350
+ assert_no_match /Created at &#9650;/,
351
+ sort_link(@s, :created_at, :controller => 'companies')
352
+ end
353
+
354
+ should "generate a sort link for descending order if ascending order is the default" do
355
+ assert_match /name.desc/,
356
+ sort_link(@s, :name, :controller => 'companies', :default_order => :asc)
357
+ end
358
+
359
+ should "generate a sort link for descending order if descending order is the default" do
360
+ assert_match /name.desc/,
361
+ sort_link(@s, :name, :controller => 'companies', :default_order => :desc)
362
+ end
363
+
364
+ should "generate a sort link for descending order if default is specified incorrectly" do
365
+ assert_match /name.desc/,
366
+ sort_link(@s, :name, :controller => 'companies', :default_order => :something_else)
367
+ end
368
+
369
+ context "with existing search options" do
370
+ setup do
371
+ @s.name_contains = 'a'
372
+ end
373
+
374
+ should "maintain previous search options in its sort links" do
375
+ assert_match /search%5Bname_contains%5D=a/,
376
+ sort_link(@s, :name, :controller => 'companies')
377
+ end
378
+ end
379
+ end
380
+
381
+ context "sorted by name descending" do
382
+ setup do
383
+ @s.meta_sort = 'name.desc'
384
+ end
385
+
386
+ should "generate a sort link for ascending order if descending order is the default" do
387
+ assert_match /name.asc/,
388
+ sort_link(@s, :name, :controller => 'companies', :default_order => :desc)
389
+ end
390
+
391
+ should "generate a sort link for ascending order if ascending order is the default" do
392
+ assert_match /name.asc/,
393
+ sort_link(@s, :name, :controller => 'companies', :default_order => :asc)
394
+ end
395
+
396
+ should "generate a sort link for ascending order if default is specified incorrectly" do
397
+ assert_match /name.asc/,
398
+ sort_link(@s, :name, :controller => 'companies', :default_order => :desc)
399
+ end
400
+ end
401
+ end
402
+
403
+ context "A developer search" do
404
+ setup do
405
+ @s = Developer.search
406
+ end
407
+
408
+ context "sorted by company name descending" do
409
+ setup do
410
+ @s.meta_sort = 'company_name.desc'
411
+ end
412
+
413
+ should "generate a sort link with a down arrow for the sorted column" do
414
+ assert_match /Company name &#9660;/,
415
+ sort_link(@s, :company_name, :controller => 'developers')
416
+ end
417
+
418
+ should "not generate a sort link with a down arrow for a non-sorted column" do
419
+ assert_no_match /Created at &#9660;/,
420
+ sort_link(@s, :created_at, :controller => 'developers')
421
+ end
422
+
423
+ context "with existing search options" do
424
+ setup do
425
+ @s.name_contains = 'a'
426
+ end
427
+
428
+ should "maintain previous search options in its sort links" do
429
+ assert_match /search%5Bname_contains%5D=a/,
430
+ sort_link(@s, :company_name, :controller => 'companies')
431
+ end
432
+ end
433
+ end
434
+ end
435
+
436
+ context "Any search" do
437
+ setup do
438
+ @s = Company.search(:name_contains => 'foo')
439
+ end
440
+
441
+ should "not modify passed-in parameters" do
442
+ params = { :controller => 'companies' }
443
+ sort_link(@s, :name, params)
444
+ assert_equal ({ :controller => 'companies' }), params
445
+ end
446
+ end
447
+ end
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meta_search_hub
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Ernie Miller
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2012-02-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activerecord
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '3.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '3.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.1'
40
+ - !ruby/object:Gem::Dependency
41
+ name: polyamorous
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.5.0
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.5.0
54
+ - !ruby/object:Gem::Dependency
55
+ name: actionpack
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.1'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.1'
68
+ - !ruby/object:Gem::Dependency
69
+ name: shoulda
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.11'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.11'
82
+ description: "\n Allows simple search forms to be created against an AR3 model\n
83
+ \ and its associations, has useful view helpers for sort links\n and multiparameter
84
+ fields as well.\n "
85
+ email: ernie@metautonomo.us
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files:
89
+ - LICENSE
90
+ - README.rdoc
91
+ files:
92
+ - ".document"
93
+ - ".gitmodules"
94
+ - CHANGELOG
95
+ - Gemfile
96
+ - LICENSE
97
+ - README.rdoc
98
+ - Rakefile
99
+ - VERSION
100
+ - lib/meta_search.rb
101
+ - lib/meta_search/builder.rb
102
+ - lib/meta_search/exceptions.rb
103
+ - lib/meta_search/helpers.rb
104
+ - lib/meta_search/helpers/form_builder.rb
105
+ - lib/meta_search/helpers/form_helper.rb
106
+ - lib/meta_search/helpers/url_helper.rb
107
+ - lib/meta_search/locale/en.yml
108
+ - lib/meta_search/method.rb
109
+ - lib/meta_search/model_compatibility.rb
110
+ - lib/meta_search/searches/active_record.rb
111
+ - lib/meta_search/utility.rb
112
+ - lib/meta_search/where.rb
113
+ - meta_search.gemspec
114
+ - test/fixtures/companies.yml
115
+ - test/fixtures/company.rb
116
+ - test/fixtures/data_type.rb
117
+ - test/fixtures/data_types.yml
118
+ - test/fixtures/developer.rb
119
+ - test/fixtures/developers.yml
120
+ - test/fixtures/developers_projects.yml
121
+ - test/fixtures/note.rb
122
+ - test/fixtures/notes.yml
123
+ - test/fixtures/project.rb
124
+ - test/fixtures/projects.yml
125
+ - test/fixtures/schema.rb
126
+ - test/helper.rb
127
+ - test/locales/es.yml
128
+ - test/locales/flanders.yml
129
+ - test/test_search.rb
130
+ - test/test_view_helpers.rb
131
+ homepage: http://metautonomo.us/projects/metasearch/
132
+ licenses: []
133
+ metadata: {}
134
+ post_install_message: |2+
135
+
136
+ *** Thanks for installing MetaSearch! ***
137
+ Be sure to check out http://metautonomo.us/projects/metasearch/ for a
138
+ walkthrough of MetaSearch's features, and click the donate button if
139
+ you're feeling especially appreciative. It'd help me justify this
140
+ "open source" stuff to my lovely wife. :)
141
+
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubygems_version: 4.0.15
157
+ specification_version: 3
158
+ summary: Object-based searching (and more) for simply creating search forms.
159
+ test_files: []
160
+ ...