with_filters 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +63 -0
- data/Rakefile +1 -0
- data/app/views/with_filters/_filter_form.html.erb +14 -0
- data/app/views/with_filters/filter/_check_box.html.erb +2 -0
- data/app/views/with_filters/filter/_check_boxes.html.erb +5 -0
- data/app/views/with_filters/filter/_radio.html.erb +5 -0
- data/app/views/with_filters/filter/_select.html.erb +2 -0
- data/app/views/with_filters/filter/_select_range.html.erb +4 -0
- data/app/views/with_filters/filter/_text.html.erb +2 -0
- data/app/views/with_filters/filter/_text_range.html.erb +4 -0
- data/changelog.md +2 -0
- data/lib/generators/with_filters/theme/theme_generator.rb +43 -0
- data/lib/with_filters/action_view_extension.rb +110 -0
- data/lib/with_filters/active_record_extension.rb +26 -0
- data/lib/with_filters/active_record_model_extension.rb +163 -0
- data/lib/with_filters/engine.rb +5 -0
- data/lib/with_filters/hash_extraction.rb +31 -0
- data/lib/with_filters/models/action.rb +14 -0
- data/lib/with_filters/models/filter/base.rb +36 -0
- data/lib/with_filters/models/filter/base_range.rb +42 -0
- data/lib/with_filters/models/filter/check_box.rb +20 -0
- data/lib/with_filters/models/filter/choice.rb +23 -0
- data/lib/with_filters/models/filter/collection.rb +28 -0
- data/lib/with_filters/models/filter/filter.rb +59 -0
- data/lib/with_filters/models/filter/radio.rb +7 -0
- data/lib/with_filters/models/filter/select.rb +22 -0
- data/lib/with_filters/models/filter/select_range.rb +15 -0
- data/lib/with_filters/models/filter/text.rb +30 -0
- data/lib/with_filters/models/filter/text_range.rb +15 -0
- data/lib/with_filters/models/filter_form.rb +93 -0
- data/lib/with_filters/value_prep/boolean_prep.rb +10 -0
- data/lib/with_filters/value_prep/date_prep.rb +10 -0
- data/lib/with_filters/value_prep/date_time_prep.rb +51 -0
- data/lib/with_filters/value_prep/default_prep.rb +88 -0
- data/lib/with_filters/value_prep/value_prep.rb +28 -0
- data/lib/with_filters/version.rb +3 -0
- data/lib/with_filters.rb +32 -0
- data/spec/active_record_model_extension_spec.rb +435 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/models/date_time_tester.rb +2 -0
- data/spec/dummy/app/models/field_format_tester.rb +2 -0
- data/spec/dummy/app/models/nobel_prize.rb +3 -0
- data/spec/dummy/app/models/nobel_prize_winner.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +56 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20111227224959_additional_columns.rb +73 -0
- data/spec/dummy/db/migrate/20120127203225_create_nobel_prize_winners.rb +30 -0
- data/spec/dummy/db/migrate/20120203212237_create_nobel_prizes.rb +34 -0
- data/spec/dummy/db/migrate/20120209051208_modify_updated_at.rb +13 -0
- data/spec/dummy/db/migrate/20120210163052_change_created_at.rb +17 -0
- data/spec/dummy/db/migrate/20120214172946_fix_einstein.rb +9 -0
- data/spec/dummy/db/migrate/20120227200013_create_date_time_testers.rb +25 -0
- data/spec/dummy/db/migrate/20120309202722_create_field_format_testers.rb +22 -0
- data/spec/dummy/db/migrate/20120310195447_update_field_format_testers.rb +15 -0
- data/spec/dummy/db/schema.rb +51 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/generators/with_filters_theme_spec.rb +33 -0
- data/spec/hash_extraction_spec.rb +51 -0
- data/spec/helpers/action_view_extension_spec.rb +345 -0
- data/spec/models/action.rb +20 -0
- data/spec/models/filter/base_range_spec.rb +32 -0
- data/spec/models/filter/base_spec.rb +76 -0
- data/spec/models/filter/check_box_spec.rb +36 -0
- data/spec/models/filter/choice_spec.rb +24 -0
- data/spec/models/filter/collection_spec.rb +72 -0
- data/spec/models/filter/filter_spec.rb +35 -0
- data/spec/models/filter/select_spec.rb +12 -0
- data/spec/models/filter/text_spec.rb +16 -0
- data/spec/models/filter_form_spec.rb +212 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/value_prep/boolean_prep_spec.rb +13 -0
- data/spec/value_prep/date_prep_spec.rb +28 -0
- data/spec/value_prep/date_time_prep_spec.rb +106 -0
- data/spec/value_prep/default_prep_spec.rb +43 -0
- data/with_filters.gemspec +27 -0
- metadata +280 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::Filter::BaseStart do
|
4
|
+
subject {described_class.new(:year, :foo, '')}
|
5
|
+
|
6
|
+
its(:field_name) {should == 'foo[year][start]'}
|
7
|
+
end
|
8
|
+
|
9
|
+
describe WithFilters::Filter::BaseStop do
|
10
|
+
subject {described_class.new(:year, :foo, '')}
|
11
|
+
|
12
|
+
its(:field_name) {should == 'foo[year][stop]'}
|
13
|
+
end
|
14
|
+
|
15
|
+
describe WithFilters::Filter::BaseRange do
|
16
|
+
subject {described_class.new(:year, :foo, {})}
|
17
|
+
|
18
|
+
its(:start) {should be_an_instance_of(WithFilters::Filter::BaseStart)}
|
19
|
+
its(:stop) {should be_an_instance_of(WithFilters::Filter::BaseStop)}
|
20
|
+
|
21
|
+
context 'options' do
|
22
|
+
it 'uses the :start and :stop option hashes for the individual filters and default any values not passed to the range options provided' do
|
23
|
+
filter = described_class.new(:year, :foo, {}, label: 'Nobel Prize Won In')
|
24
|
+
filter.start.label.should == 'Nobel Prize Won In'
|
25
|
+
filter.stop.label.should == 'Nobel Prize Won In'
|
26
|
+
|
27
|
+
filter = described_class.new(:year, :foo, {}, label: 'Nobel Prize Won In', start: {label: 'Nobel Prize Won Between'}, stop: {label: 'and'})
|
28
|
+
filter.start.label.should == 'Nobel Prize Won Between'
|
29
|
+
filter.stop.label.should == 'and'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::Filter::Base do
|
4
|
+
describe '#initialize(name, namespace, value, options = {})' do
|
5
|
+
context 'defaults' do
|
6
|
+
subject {described_class.new(:first_name, :foo, 'Aaron')}
|
7
|
+
|
8
|
+
its(:to_partial_path) {should == File.join('with_filters', 'filter', 'base')}
|
9
|
+
its(:label) {should == 'First Name'}
|
10
|
+
its(:label_attrs) {should == {}}
|
11
|
+
its(:field_name) {should == 'foo[first_name]'}
|
12
|
+
its(:value) {should == 'Aaron'}
|
13
|
+
it 'has no collection' do
|
14
|
+
subject.collection.should be_nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'options' do
|
19
|
+
context ':field_name' do
|
20
|
+
it 'manually sets the field name' do
|
21
|
+
field_name = 'fname'
|
22
|
+
described_class.new(:first_name, :foo, 'Aaron', field_name: field_name).field_name.should == field_name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context ':label' do
|
27
|
+
it 'uses the provided label' do
|
28
|
+
label = 'Given Name'
|
29
|
+
described_class.new(:first_name, :foo, 'Aaron', label: label).label.should == label
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context ':label_attrs' do
|
34
|
+
it 'uses the provided label attrs' do
|
35
|
+
label_attrs = {
|
36
|
+
class: 'label_class'
|
37
|
+
}
|
38
|
+
described_class.new(:first_name, :foo, 'Aaron', label_attrs: label_attrs).label_attrs.should == label_attrs
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context ':collection' do
|
43
|
+
it 'creates collection from the provided list' do
|
44
|
+
collection = described_class.new(:gender, :foo, 'Male', collection: ['Male', 'Female']).collection
|
45
|
+
collection.should be_a_kind_of(WithFilters::Filter::Collection)
|
46
|
+
collection.first.label.should == 'Male'
|
47
|
+
collection.last.label.should == 'Female'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context ':theme' do
|
52
|
+
it 'uses the provided theme to create a partial path' do
|
53
|
+
Dir.stub(:glob).and_return([File.join(Rails.root, 'app', 'views', 'with_filters', 'foo', 'filter', '_base.html.erb')])
|
54
|
+
|
55
|
+
filter = described_class.new(:first_name, :foo, 'Aaron', theme: 'foo')
|
56
|
+
|
57
|
+
filter.to_partial_path.should == File.join('with_filters', 'foo', 'filter', 'base')
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'falls back to the original partials if the theme version can not be found' do
|
61
|
+
Dir.stub(:glob).and_return([])
|
62
|
+
|
63
|
+
filter = described_class.new(:first_name, :foo, 'Aaron', theme: 'foo')
|
64
|
+
|
65
|
+
filter.to_partial_path.should == File.join('with_filters', 'filter', 'base')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'everything else' do
|
70
|
+
it 'gets put in attrs' do
|
71
|
+
described_class.new(:first_name, :foo, 'Aaron', {label: 'Given Name', class: 'input_class'}).attrs.should == {class: 'input_class'}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::Filter::CheckBox do
|
4
|
+
describe '#initialize(name, namespace, value, options = {})' do
|
5
|
+
context 'without collection' do
|
6
|
+
subject {described_class.new(:active, :foo, 'on')}
|
7
|
+
|
8
|
+
its(:to_partial_path) {should == 'with_filters/filter/check_box'}
|
9
|
+
|
10
|
+
context 'and value is "on"' do
|
11
|
+
its(:selected?) {should be true}
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'and value is "off"' do
|
15
|
+
subject {described_class.new(:active, :foo, 'off')}
|
16
|
+
its(:selected?) {should be false}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with collection' do
|
21
|
+
let(:collection) {['Chemistry', 'Literature', 'Peace', 'Physics', 'Physiology or Medicine']}
|
22
|
+
subject {described_class.new(:categories, :foo, ['Chemistry', 'Physics'], collection: collection)}
|
23
|
+
|
24
|
+
its(:to_partial_path) {should == 'with_filters/filter/check_boxes'}
|
25
|
+
|
26
|
+
context 'and there are values' do
|
27
|
+
its(:selected?) {should be true}
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'and there are not values' do
|
31
|
+
subject {described_class.new(:categories, :foo, [], collection: collection)}
|
32
|
+
its(:selected?) {should be false}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::Filter::Choice do
|
4
|
+
describe '#initialize(field_name, label, value, options = {})' do
|
5
|
+
context 'default' do
|
6
|
+
subject {described_class.new('field', 'One', 1)}
|
7
|
+
|
8
|
+
its(:field_name) {should == 'field[]'}
|
9
|
+
its(:label) {should == 'One'}
|
10
|
+
its(:value) {should be 1}
|
11
|
+
its(:selected?) {should be_false}
|
12
|
+
its(:attrs) {should == {id: 'field_1'}}
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'options' do
|
16
|
+
context ':selected' do
|
17
|
+
subject {described_class.new('field', 'One', 1, selected: true)}
|
18
|
+
|
19
|
+
its(:selected?) {should be_true}
|
20
|
+
its(:attrs) {should == {id: 'field_1'}}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::Filter::Collection do
|
4
|
+
describe '#initialize(field_name, choices, options = {})' do
|
5
|
+
context 'choices' do
|
6
|
+
context 'is an Array ([1,2,3])' do
|
7
|
+
let(:values) {[1,2,3]}
|
8
|
+
subject {described_class.new('field', values)}
|
9
|
+
|
10
|
+
it 'should create Choice objects' do
|
11
|
+
values.each_with_index do |v, i|
|
12
|
+
subject[i].label.should == v.to_s
|
13
|
+
subject[i].value.should == v
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'is an Array of Arrays ([[:one, 1], [:two, 2], [:three, 3]])' do
|
19
|
+
let(:values) {[[:one, 1], [:two, 2], [:three, 3]]}
|
20
|
+
subject {described_class.new('field', values)}
|
21
|
+
|
22
|
+
it 'should create Choice objects' do
|
23
|
+
values.each_with_index do |a, i|
|
24
|
+
k, v = a
|
25
|
+
subject[i].label.should == k.to_s
|
26
|
+
subject[i].value.should == v
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'is an Array of Arrays with options ([[:one, 1], [:two, 2, {class: "foo"}], [:three, 3]])' do
|
32
|
+
let(:values) {[[:one, 1], [:two, 2, {class: 'foo'}], [:three, 3]]}
|
33
|
+
subject {described_class.new('field', values)}
|
34
|
+
|
35
|
+
it 'should create Choice objects' do
|
36
|
+
values.each_with_index do |a, i|
|
37
|
+
k, v = a
|
38
|
+
subject[i].label.should == k.to_s
|
39
|
+
subject[i].value.should == v
|
40
|
+
subject[i].attrs[:class].should == 'foo' if i == 1
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'is a Range (1..3)' do
|
46
|
+
let(:values) {1..3}
|
47
|
+
subject {described_class.new('field', values)}
|
48
|
+
|
49
|
+
it 'should create Choice objects' do
|
50
|
+
values.to_a.each_with_index do |v, i|
|
51
|
+
subject[i].label.should == v.to_s
|
52
|
+
subject[i].value.should == v
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'is a Hash ({one: 1, two: 2, three: 3})' do
|
58
|
+
let(:values) {{one: 1, two: 2, three: 3}}
|
59
|
+
subject {described_class.new('field', values)}
|
60
|
+
|
61
|
+
it 'should create Choice objects' do
|
62
|
+
i = 0
|
63
|
+
values.each do |k, v|
|
64
|
+
subject[i].label.should == k.to_s
|
65
|
+
subject[i].value.should == v
|
66
|
+
i += 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::Filter do
|
4
|
+
describe '#create(name, namespace, value, options = {})' do
|
5
|
+
context 'options' do
|
6
|
+
context ':as' do
|
7
|
+
subject {described_class.create(:email, :foo, '', as: :email)}
|
8
|
+
|
9
|
+
it 'sets the input type' do
|
10
|
+
subject.attrs[:type].should == 'email'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns a filter based on the type' do
|
14
|
+
subject.should be_an_instance_of(WithFilters::Filter::Text)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#create_range(name, namespace, value, options = {})' do
|
21
|
+
context 'options' do
|
22
|
+
context ':as' do
|
23
|
+
subject {described_class.create_range(:year, :foo, {}, as: :number)}
|
24
|
+
|
25
|
+
it 'sets the input type' do
|
26
|
+
subject.attrs[:type].should == 'number'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'returns a filter based on the type' do
|
30
|
+
subject.should be_an_instance_of(WithFilters::Filter::TextRange)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::Filter::Select do
|
4
|
+
describe '#initialize(name, namespace, value, options = {})' do
|
5
|
+
context 'options' do
|
6
|
+
it 'allows :collection to accept a string' do
|
7
|
+
subject = described_class.new(:gender, :foo, 'Male', collection: '<option>Male</option><option>Female</option>')
|
8
|
+
subject.collection.should == '<option selected="selected">Male</option><option>Female</option>'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::Filter::Text do
|
4
|
+
it 'should look for a partial based on the input type and use it if found' do
|
5
|
+
described_class.new(:email, :foo, '').to_partial_path.should == File.join('with_filters', 'filter', 'text')
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should look for a partial based on the input type and use the default if it is not found' do
|
9
|
+
# there must be a better way to do this
|
10
|
+
Dir.stub(:glob).and_return([File.join('with_filters', 'filter', '_text_as_email.html.erb')])
|
11
|
+
described_class.new(:email, :foo, '', type: :email).to_partial_path.should == File.join('with_filters', 'filter', 'text_as_email')
|
12
|
+
|
13
|
+
Dir.stub(:glob).and_return([])
|
14
|
+
described_class.new(:email, :foo, '', type: :email).to_partial_path.should == File.join('with_filters', 'filter', 'text')
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::FilterForm do
|
4
|
+
describe '#initialize(records, params = {}, options = {})' do
|
5
|
+
context 'defaults' do
|
6
|
+
subject {described_class.new(NobelPrizeWinner.with_filters)}
|
7
|
+
|
8
|
+
its(:attrs) {should == {novalidate: 'novalidate', method: 'get'}}
|
9
|
+
its(:to_partial_path) {should == File.join('with_filters', 'filter_form')}
|
10
|
+
its(:param_namespace) {should be :nobel_prize_winners}
|
11
|
+
its(:filters) {should be_empty}
|
12
|
+
its(:hidden_filters) {should be_empty}
|
13
|
+
its(:actions) {should be_empty}
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'options' do
|
17
|
+
context ':attrs' do
|
18
|
+
it 'attrs should override the defaults' do
|
19
|
+
described_class.new(NobelPrizeWinner.with_filters, {}, method: 'post').attrs.should == {novalidate: 'novalidate', method: 'post'}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context ':theme' do
|
24
|
+
it 'passes the theme to the inputs' do
|
25
|
+
path = [Rails.root, 'app', 'views', 'with_filters', 'foo', 'filter']
|
26
|
+
Dir.stub(:glob).and_return([])
|
27
|
+
Dir.should_receive(:glob).
|
28
|
+
with(File.join(*path, '_text.*')).
|
29
|
+
and_return([File.join(*path, 'text')])
|
30
|
+
|
31
|
+
ff = described_class.new(NobelPrizeWinner.with_filters, {}, theme: 'foo')
|
32
|
+
ff.input(:first_name)
|
33
|
+
|
34
|
+
ff.filters.first.to_partial_path.should == File.join('with_filters', 'foo', 'filter', 'text')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#hidden(name, options = {})' do
|
41
|
+
it 'adds a hidden filter' do
|
42
|
+
ff = described_class.new(NobelPrizeWinner.with_filters)
|
43
|
+
ff.hidden(:hidden)
|
44
|
+
|
45
|
+
ff.hidden_filters.length.should == 1
|
46
|
+
ff.hidden_filters.first.should be_a_kind_of(WithFilters::Filter::Text)
|
47
|
+
ff.hidden_filters.first.attrs[:type].should == 'hidden'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#input(name, options = {})' do
|
52
|
+
it 'adds a filter' do
|
53
|
+
label = 'Given Name'
|
54
|
+
ff = described_class.new(NobelPrizeWinner.with_filters)
|
55
|
+
ff.input(:first_name, label: label)
|
56
|
+
|
57
|
+
ff.filters.length.should == 1
|
58
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::Base)
|
59
|
+
ff.filters.first.label.should == label
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:ff) {described_class.new(FieldFormatTester.with_filters)}
|
63
|
+
|
64
|
+
context 'the type is :hidden' do
|
65
|
+
it 'adds to the hidden_filters list' do
|
66
|
+
ff.input(:foo, as: :hidden)
|
67
|
+
|
68
|
+
ff.filters.should be_empty
|
69
|
+
ff.hidden_filters[0].should be_a_kind_of(WithFilters::Filter::Text)
|
70
|
+
ff.hidden_filters[0].attrs[:type].should == 'hidden'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'the database field is an integer, float or decimal' do
|
75
|
+
it 'uses a number filter' do
|
76
|
+
ff.input(:integer_field)
|
77
|
+
ff.input(:float_field)
|
78
|
+
ff.input(:decimal_field)
|
79
|
+
|
80
|
+
ff.filters[0].should be_a_kind_of(WithFilters::Filter::Text)
|
81
|
+
ff.filters[0].attrs[:type].should == 'number'
|
82
|
+
ff.filters[1].should be_a_kind_of(WithFilters::Filter::Text)
|
83
|
+
ff.filters[1].attrs[:type].should == 'number'
|
84
|
+
ff.filters[2].should be_a_kind_of(WithFilters::Filter::Text)
|
85
|
+
ff.filters[2].attrs[:type].should == 'number'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'the database field is a date' do
|
90
|
+
it 'uses a date filter' do
|
91
|
+
ff.input(:date_field)
|
92
|
+
|
93
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::Text)
|
94
|
+
ff.filters.first.attrs[:type].should == 'date'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'the database field is a time' do
|
99
|
+
it 'uses a time filter' do
|
100
|
+
ff.input(:time_field)
|
101
|
+
|
102
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::Text)
|
103
|
+
ff.filters.first.attrs[:type].should == 'time'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'the database field is a datetime or timestamp' do
|
108
|
+
it 'uses a time filter' do
|
109
|
+
ff.input(:datetime_field)
|
110
|
+
ff.input(:timestamp_field)
|
111
|
+
|
112
|
+
ff.filters[0].should be_a_kind_of(WithFilters::Filter::Text)
|
113
|
+
ff.filters[0].attrs[:type].should == 'datetime'
|
114
|
+
ff.filters[1].should be_a_kind_of(WithFilters::Filter::Text)
|
115
|
+
ff.filters[1].attrs[:type].should == 'datetime'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'the database field is a boolean' do
|
120
|
+
it 'uses a checkbox filter' do
|
121
|
+
ff.input(:boolean_field)
|
122
|
+
|
123
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::CheckBox)
|
124
|
+
ff.filters.first.attrs[:type].should == 'checkbox'
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'the database field is text' do
|
129
|
+
context 'and the name includes "email"' do
|
130
|
+
it 'uses an email filter' do
|
131
|
+
ff.input(:email_field)
|
132
|
+
|
133
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::Text)
|
134
|
+
ff.filters.first.attrs[:type].should == 'email'
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'and the name includes "phone"' do
|
139
|
+
it 'uses a tel filter' do
|
140
|
+
ff.input(:phone_field)
|
141
|
+
|
142
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::Text)
|
143
|
+
ff.filters.first.attrs[:type].should == 'tel'
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context 'and the name includes "url"' do
|
148
|
+
it 'uses a url filter' do
|
149
|
+
ff.input(:url_field)
|
150
|
+
|
151
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::Text)
|
152
|
+
ff.filters.first.attrs[:type].should == 'url'
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'options' do
|
158
|
+
context ':collection' do
|
159
|
+
it 'defaults to a select filter' do
|
160
|
+
ff = described_class.new(FieldFormatTester.with_filters)
|
161
|
+
ff.input(:text_field)
|
162
|
+
|
163
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::Text)
|
164
|
+
ff.filters.first.attrs[:type].should == 'text'
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'no :collection' do
|
169
|
+
it 'defaults to a select filter' do
|
170
|
+
ff = described_class.new(FieldFormatTester.with_filters)
|
171
|
+
ff.input(:text_field, collection: 1..10)
|
172
|
+
|
173
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::Select)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe '#input_range(name, options = {})' do
|
180
|
+
it 'adds a ranged filter' do
|
181
|
+
label = 'Awarded'
|
182
|
+
ff = described_class.new(NobelPrizeWinner.with_filters)
|
183
|
+
ff.input_range(:year, label: label)
|
184
|
+
|
185
|
+
ff.filters.length.should == 1
|
186
|
+
ff.filters.first.should be_a_kind_of(WithFilters::Filter::BaseRange)
|
187
|
+
ff.filters.first.start.label.should == label
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#action(type, options = {})' do
|
192
|
+
context 'type' do
|
193
|
+
context ':submit' do
|
194
|
+
it 'adds an action' do
|
195
|
+
ff = described_class.new(NobelPrizeWinner.with_filters)
|
196
|
+
ff.action(:submit)
|
197
|
+
|
198
|
+
ff.actions.first.should be_a_kind_of(WithFilters::Action)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
context ':reset' do
|
203
|
+
it 'adds an action' do
|
204
|
+
ff = described_class.new(NobelPrizeWinner.with_filters)
|
205
|
+
ff.action(:reset)
|
206
|
+
|
207
|
+
ff.actions.first.should be_a_kind_of(WithFilters::Action)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Configure Rails Environment
|
2
|
+
ENV['RAILS_ENV'] = 'test'
|
3
|
+
|
4
|
+
require File.expand_path('../dummy/config/environment.rb', __FILE__)
|
5
|
+
|
6
|
+
require 'rspec/rails'
|
7
|
+
require 'capybara/rspec'
|
8
|
+
|
9
|
+
Rails.backtrace_cleaner.remove_silencers!
|
10
|
+
|
11
|
+
# Load support files
|
12
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::ValuePrep::BooleanPrep do
|
4
|
+
describe '#value' do
|
5
|
+
it 'turns "on" into `true`' do
|
6
|
+
described_class.new('on').value.should be true
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'turns "off" into `false`' do
|
10
|
+
described_class.new('off').value.should be false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::ValuePrep::DatePrep do
|
4
|
+
describe '#value' do
|
5
|
+
context 'value is a String' do
|
6
|
+
it 'returns a Date' do
|
7
|
+
described_class.new('19140325').value.should be_an_instance_of(Date)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'value is an Array' do
|
12
|
+
it 'returns an array of Date objects' do
|
13
|
+
described_class.new(['19140325', '19140326']).value.each do |v|
|
14
|
+
v.should be_an_instance_of(Date)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'value is a Hash' do
|
20
|
+
it 'returns a Hash of Date objects' do
|
21
|
+
value = described_class.new({start: '19140325', stop: '19140326'}).value
|
22
|
+
|
23
|
+
value[:start].should be_an_instance_of(Date)
|
24
|
+
value[:stop].should be_an_instance_of(Date)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithFilters::ValuePrep::DateTimePrep do
|
4
|
+
describe '#value' do
|
5
|
+
context 'is a String representing a datetime' do
|
6
|
+
context 'to a fraction of a second' do
|
7
|
+
it 'returns a value' do
|
8
|
+
datetime = '1914-03-25 12:34:56.123456'
|
9
|
+
described_class.new(datetime).value.should == Time.zone.parse(datetime).to_s(:db) + '.123456'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'to a second' do
|
14
|
+
it 'returns a value' do
|
15
|
+
datetime = '1914-03-25 12:34:56'
|
16
|
+
value = described_class.new(datetime).value
|
17
|
+
|
18
|
+
value[:start].should == Time.zone.parse(datetime).to_s(:db)
|
19
|
+
value[:stop].should == Time.zone.parse(datetime).advance(seconds: 1).to_s(:db)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'to a minute' do
|
24
|
+
it 'returns a value' do
|
25
|
+
datetime = '1914-03-25 12:34'
|
26
|
+
value = described_class.new(datetime).value
|
27
|
+
|
28
|
+
value[:start].should == Time.zone.parse(datetime).to_s(:db)
|
29
|
+
value[:stop].should == Time.zone.parse(datetime).advance(minutes: 1).to_s(:db)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'to an hour' do
|
34
|
+
it 'returns a value' do
|
35
|
+
datetime = '1914-03-25 12'
|
36
|
+
value = described_class.new(datetime).value
|
37
|
+
|
38
|
+
value[:start].should == Time.zone.parse(datetime).to_s(:db)
|
39
|
+
value[:stop].should == Time.zone.parse(datetime).advance(hours: 1).to_s(:db)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'to a day' do
|
44
|
+
it 'returns a value' do
|
45
|
+
date = '1914-03-25'
|
46
|
+
value = described_class.new(date).value
|
47
|
+
|
48
|
+
value[:start].should == Time.zone.parse(date).to_s(:db)
|
49
|
+
value[:stop].should == Time.zone.parse(date).advance(days: 1).to_s(:db)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'is a Hash representing a datetime range' do
|
55
|
+
context 'to a fraction of a second' do
|
56
|
+
it 'returns a Hash of values' do
|
57
|
+
datetimes = {start: '1914-03-25 12:34:56.123456', stop: '1914-03-26 12:34:56.654321'}
|
58
|
+
value = described_class.new(datetimes).value
|
59
|
+
|
60
|
+
value[:start].should == Time.zone.parse(datetimes[:start]).to_s(:db) + '.123456'
|
61
|
+
value[:stop].should == Time.zone.parse(datetimes[:stop]).to_s(:db) + '.654321'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'to a second' do
|
66
|
+
it 'returns a Hash of values' do
|
67
|
+
datetimes = {start: '1914-03-25 12:34:56', stop: '1914-03-26 12:34:56'}
|
68
|
+
value = described_class.new(datetimes).value
|
69
|
+
|
70
|
+
value[:start].should == Time.zone.parse(datetimes[:start]).to_s(:db)
|
71
|
+
value[:stop].should == Time.zone.parse(datetimes[:stop]).advance(seconds: 1).to_s(:db)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'to a minute' do
|
76
|
+
it 'returns a Hash of values' do
|
77
|
+
datetimes = {start: '1914-03-25 12:34', stop: '1914-03-26 12:34'}
|
78
|
+
value = described_class.new(datetimes).value
|
79
|
+
|
80
|
+
value[:start].should == Time.zone.parse(datetimes[:start]).to_s(:db)
|
81
|
+
value[:stop].should == Time.zone.parse(datetimes[:stop]).advance(minutes: 1).to_s(:db)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'to an hour' do
|
86
|
+
it 'returns a Hash of values' do
|
87
|
+
datetimes = {start: '1914-03-25 12', stop: '1914-03-26 12'}
|
88
|
+
value = described_class.new(datetimes).value
|
89
|
+
|
90
|
+
value[:start].should == Time.zone.parse(datetimes[:start]).to_s(:db)
|
91
|
+
value[:stop].should == Time.zone.parse(datetimes[:stop]).advance(hours: 1).to_s(:db)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'to a day' do
|
96
|
+
it 'returns a Hash of values' do
|
97
|
+
dates = {start: '19140325', stop: '19140326'}
|
98
|
+
date_time_prep = described_class.new(dates)
|
99
|
+
|
100
|
+
date_time_prep.value[:start].should == Time.zone.parse(dates[:start]).to_s(:db)
|
101
|
+
date_time_prep.value[:stop].should == Time.zone.parse(dates[:stop]).advance(days: 1).to_s(:db)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|