cullender 0.0.1
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +34 -0
- data/app/assets/javascripts/cullender/application.js +13 -0
- data/app/assets/javascripts/cullender/rules.js +46 -0
- data/app/assets/stylesheets/cullender/application.css +13 -0
- data/app/assets/stylesheets/cullender/rules.css.scss +15 -0
- data/app/controllers/cullender/rules_controller.rb +68 -0
- data/app/controllers/cullender_controller.rb +105 -0
- data/app/helpers/cullender/rules_helper.rb +136 -0
- data/app/models/cullender/rule.rb +204 -0
- data/app/views/cullender/rules/_form.html.erb +20 -0
- data/app/views/cullender/rules/_trigger_fields.html.erb +19 -0
- data/app/views/cullender/rules/create.js.erb +3 -0
- data/app/views/cullender/rules/index.html.erb +25 -0
- data/app/views/cullender/rules/new.html.erb +1 -0
- data/app/views/cullender/rules/show.html.erb +3 -0
- data/config/locales/en.yml +12 -0
- data/config/routes.rb +4 -0
- data/lib/cullender.rb +96 -0
- data/lib/cullender/controllers/filter_logic.rb +89 -0
- data/lib/cullender/controllers/scoped_views.rb +17 -0
- data/lib/cullender/core_ext/hash.rb +1 -0
- data/lib/cullender/core_ext/hash/deep_delete.rb +13 -0
- data/lib/cullender/engine.rb +15 -0
- data/lib/cullender/engine/routes.rb +306 -0
- data/lib/cullender/mapping.rb +139 -0
- data/lib/cullender/version.rb +3 -0
- data/lib/generators/cullender/cullender_generator.rb +66 -0
- data/lib/generators/cullender/install_generator.rb +18 -0
- data/lib/generators/cullender/orm_helpers.rb +32 -0
- data/lib/generators/cullender/templates/cullender.rb +3 -0
- data/lib/generators/cullender/templates/cullender_migration.rb +13 -0
- data/lib/tasks/cullender_tasks.rake +4 -0
- data/spec/controllers/cullender/rules_controller_spec.rb +180 -0
- data/spec/cullender/controllers/filter_logic_spec.rb +233 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +17 -0
- data/spec/dummy/app/assets/stylesheets/application.css +14 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/events_controller.rb +60 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/event.rb +16 -0
- data/spec/dummy/app/views/cullender/rules/_form.html.erb +33 -0
- data/spec/dummy/app/views/cullender/rules/index.html.erb +24 -0
- data/spec/dummy/app/views/cullender/rules/new.html.erb +1 -0
- data/spec/dummy/app/views/cullender/rules/show.html.erb +3 -0
- data/spec/dummy/app/views/events/_form.html.erb +21 -0
- data/spec/dummy/app/views/events/edit.html.erb +6 -0
- data/spec/dummy/app/views/events/index.html.erb +27 -0
- data/spec/dummy/app/views/events/new.html.erb +5 -0
- data/spec/dummy/app/views/events/show.html.erb +10 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +23 -0
- data/spec/dummy/config/boot.rb +9 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +27 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cullender.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/cullender.en.yml +12 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/123344556676_create_cullender_tables.rb +12 -0
- data/spec/dummy/db/schema.rb +24 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +9987 -0
- data/spec/dummy/log/test.log +19786 -0
- data/spec/dummy/public/404.html +27 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/268a828ee4997cf5c19106e5f00fcfb8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/56b2eb9b46b9aca7e86b5132ddf0d9de +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/750887406b3e8dacb2b03f986330932d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/750b42e431d194c41f5b1cde4a257e47 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/921642fe740290e9e5e88a706e5a562c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a967ed3fc5f8406f3ff72180775f1b40 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ae74bf4fc3fd20e7f7b98860b8ef0f74 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c7dbd1f5acc2d5bc078363f4f3c70c54 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d995daf8d6f36c27b6e9d1b4672eaf1e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/helpers/cullender/rules_helper_spec.rb +360 -0
- data/spec/models/cullender/rule_spec.rb +425 -0
- data/spec/requests/rules_spec.rb +19 -0
- data/spec/spec_helper.rb +60 -0
- metadata +319 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
|
5
|
+
<style>
|
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
|
7
|
+
div.dialog {
|
|
8
|
+
width: 25em;
|
|
9
|
+
padding: 0 4em;
|
|
10
|
+
margin: 4em auto 0 auto;
|
|
11
|
+
border: 1px solid #ccc;
|
|
12
|
+
border-right-color: #999;
|
|
13
|
+
border-bottom-color: #999;
|
|
14
|
+
}
|
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<!-- This file lives in public/404.html -->
|
|
21
|
+
<div class="dialog">
|
|
22
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
|
23
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
|
24
|
+
</div>
|
|
25
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
26
|
+
</body>
|
|
27
|
+
</html>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
|
5
|
+
<style>
|
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
|
7
|
+
div.dialog {
|
|
8
|
+
width: 25em;
|
|
9
|
+
padding: 0 4em;
|
|
10
|
+
margin: 4em auto 0 auto;
|
|
11
|
+
border: 1px solid #ccc;
|
|
12
|
+
border-right-color: #999;
|
|
13
|
+
border-bottom-color: #999;
|
|
14
|
+
}
|
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<!-- This file lives in public/422.html -->
|
|
21
|
+
<div class="dialog">
|
|
22
|
+
<h1>The change you wanted was rejected.</h1>
|
|
23
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
|
24
|
+
</div>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
|
5
|
+
<style>
|
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
|
7
|
+
div.dialog {
|
|
8
|
+
width: 25em;
|
|
9
|
+
padding: 0 4em;
|
|
10
|
+
margin: 4em auto 0 auto;
|
|
11
|
+
border: 1px solid #ccc;
|
|
12
|
+
border-right-color: #999;
|
|
13
|
+
border-bottom-color: #999;
|
|
14
|
+
}
|
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<!-- This file lives in public/500.html -->
|
|
21
|
+
<div class="dialog">
|
|
22
|
+
<h1>We're sorry, but something went wrong.</h1>
|
|
23
|
+
</div>
|
|
24
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
# Specs in this file have access to a helper object that includes
|
|
4
|
+
# the EventsHelper. For example:
|
|
5
|
+
#
|
|
6
|
+
# describe EventsHelper do
|
|
7
|
+
# describe "string concat" do
|
|
8
|
+
# it "concats two strings with spaces" do
|
|
9
|
+
# helper.concat_strings("this","that").should == "this that"
|
|
10
|
+
# end
|
|
11
|
+
# end
|
|
12
|
+
# end
|
|
13
|
+
describe Cullender::RulesHelper do
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
describe "#cullender_collection_or_select" do
|
|
17
|
+
before(:each) do
|
|
18
|
+
helper.stub(:nested_property_prefix).with([]).and_return("prefix")
|
|
19
|
+
end
|
|
20
|
+
context "is base" do
|
|
21
|
+
it "renders the attribute select menu and OR submit btn" do
|
|
22
|
+
html = helper.cullender_collection_or_select(["attr1", "attr2"], [], {:base => true})
|
|
23
|
+
html.should have_selector("select#or_raise_fieldprefix", :text => "attr1\nattr2")
|
|
24
|
+
html.should have_selector("input[type='submit'][name='or[raise]prefix']")
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
context "is not a base" do
|
|
28
|
+
it "renders the attribute select menu and OR submit btn" do
|
|
29
|
+
html = helper.cullender_collection_or_select(["attr1", "attr2"])
|
|
30
|
+
html.should have_selector("select#or_fieldprefix", :text => "attr1\nattr2")
|
|
31
|
+
html.should have_selector("input[type='submit'][name='or[commit]prefix']")
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "#cullender_collection_and_select" do
|
|
37
|
+
before(:each) do
|
|
38
|
+
helper.stub(:nested_property_prefix).with([]).and_return("prefix")
|
|
39
|
+
helper.stub(:option_for_select).and_return("options_for_select")
|
|
40
|
+
end
|
|
41
|
+
it "renders the attribute select menu and AND submit btn" do
|
|
42
|
+
html = helper.cullender_collection_and_select(["attr1", "attr2"])
|
|
43
|
+
html.should have_selector("select#and_fieldprefix", :text => "attr1\nattr2")
|
|
44
|
+
html.should have_selector("input[type='submit'][name='and[commit]prefix']")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
describe "#link_to_filter" do
|
|
50
|
+
before(:each) do
|
|
51
|
+
controller.params.merge!(:controller => "cullender/rules", :action => "index", :use_route => :cullender)
|
|
52
|
+
@options = {}
|
|
53
|
+
end
|
|
54
|
+
it "doesn't modify the params hash" do
|
|
55
|
+
params = controller.params
|
|
56
|
+
helper.link_to_filter(:attribute, "Name")
|
|
57
|
+
controller.params == params
|
|
58
|
+
end
|
|
59
|
+
context "with attribute in the filter" do
|
|
60
|
+
before(:each) do
|
|
61
|
+
controller.params.merge!(:filter => {:attribute => {"v" => "value"}})
|
|
62
|
+
end
|
|
63
|
+
it "returns the text of the attribute" do
|
|
64
|
+
html = helper.link_to_filter(:attribute, "Name")
|
|
65
|
+
html.should include "Name"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
context "without the attribute in the filter" do
|
|
70
|
+
it "returns a link to filter by the attribute" do
|
|
71
|
+
html = helper.link_to_filter(:attribute, "Name")
|
|
72
|
+
html.should have_selector("a", :text => "Name")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
describe "#remove_filter_link" do
|
|
78
|
+
before(:each) do
|
|
79
|
+
controller.params.merge!(:controller => "cullender/rules", :action => "index", :use_route => :cullender)
|
|
80
|
+
@options = {}
|
|
81
|
+
end
|
|
82
|
+
it "doesn't modify the params hash" do
|
|
83
|
+
params = controller.params
|
|
84
|
+
helper.remove_filter_link(:attribute, "value", 2)
|
|
85
|
+
controller.params == params
|
|
86
|
+
end
|
|
87
|
+
context "with attribute in the filter" do
|
|
88
|
+
before(:each) do
|
|
89
|
+
controller.params.deep_merge!({:filter => {"attribute" => {"o" => 1, "v" => "value"}}})
|
|
90
|
+
end
|
|
91
|
+
it "returns a link to remove the filter" do
|
|
92
|
+
html = helper.remove_filter_link(:attribute, "value", 2)
|
|
93
|
+
html.should have_selector("a", :text => "remove")
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
context "without attribute in the filter" do
|
|
97
|
+
it "returns the count" do
|
|
98
|
+
html = helper.remove_filter_link(:attribute, "value", 2)
|
|
99
|
+
html.should have_selector("span", :text => "2")
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# def render_property_tree(name, hash, options = {}, hierarchy = [], &block)
|
|
105
|
+
# options.merge!(:class => "group level_#{hierarchy.length}")
|
|
106
|
+
# last_key = hash.keys.last
|
|
107
|
+
# html = content_tag :div, options do
|
|
108
|
+
# hash.each do |field, value|
|
|
109
|
+
# if value.keys.include?("o")
|
|
110
|
+
# block.call property_item(name, field, value, hierarchy), last_key == field ? 1 : -1, hierarchy
|
|
111
|
+
# else
|
|
112
|
+
# hierarchy.push(field)
|
|
113
|
+
# block.call render_property_tree(name, value, {}, hierarchy, &block), last_key == field ? 0 : -1, hierarchy
|
|
114
|
+
# end
|
|
115
|
+
# end
|
|
116
|
+
# end if hash.present?
|
|
117
|
+
# hierarchy.pop()
|
|
118
|
+
# html
|
|
119
|
+
# end
|
|
120
|
+
describe "#render_property_tree" do
|
|
121
|
+
context "with an empty hash" do
|
|
122
|
+
it "returns nil" do
|
|
123
|
+
helper.render_property_tree("f", {}, {}).should be_nil
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
context "hash value has name and value key" do
|
|
127
|
+
it "should render the next level of the hash" do
|
|
128
|
+
inner_hash = {:these => {"o" => 1, "v" => "values"}}
|
|
129
|
+
helper.should_receive(:property_item).with("f", :these, {:type =>"string"}, {"o" => 1, "v" => "values"}, []).once
|
|
130
|
+
helper.render_property_tree("f", {:these => {:type => "string"}}, inner_hash, {}, []) do |a, b, c|
|
|
131
|
+
"#{a}, #{b}, #{c}"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
context "hash value does not have name and value key" do
|
|
136
|
+
it "should render the next level of the hash" do
|
|
137
|
+
inner_hash = {"these" => {"o" => 1, "v" => "values"}}
|
|
138
|
+
html = helper.render_property_tree("f", {:these => {:type => "text_field"}}, {"key" => inner_hash}, {}, []) do |a, b, c|
|
|
139
|
+
"#{a}, #{b}, #{c}"
|
|
140
|
+
end
|
|
141
|
+
html.should have_selector("div[class='group level_0']")
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
describe "#property_item" do
|
|
147
|
+
before(:each) do
|
|
148
|
+
helper.stub(:nested_property_prefix).and_return("prefix")
|
|
149
|
+
helper.stub(:property_value_field).and_return("")
|
|
150
|
+
helper.should_receive(:property_value_field).once
|
|
151
|
+
# Cullender::Event.stub(:field_operators).with('field_name').and_return({"name1" => "value1", "name2" => "value2", "name3" => "value3"})
|
|
152
|
+
# Cullender::Event.stub(:properties).and_return(['field_name', 'field1', 'field2', 'field3'])
|
|
153
|
+
# Cullender::Event.stub(:property_types).and_return({'field_name' => 'string', 'field2' => 'string', 'field3' => 'string'})
|
|
154
|
+
|
|
155
|
+
end
|
|
156
|
+
it "wraps the content with a tag with the field name as a class" do
|
|
157
|
+
html = helper.property_item("name", :field_name, {:type => "string"}, {}, [1,2,3])
|
|
158
|
+
html.should have_selector("div[class='item field_name']")
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "is html safe" do
|
|
162
|
+
html = helper.property_item("name", :field_name, {:type => "string"}, {}, [1,2,3])
|
|
163
|
+
html.should be_html_safe
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "returns a label with the field name" do
|
|
167
|
+
html = helper.property_item("name", :field_name, {:type => "string"}, {}, [1,2,3])
|
|
168
|
+
html.should have_selector("label[for='prefix[field_name][v]']", :text => "field_name")
|
|
169
|
+
end
|
|
170
|
+
# it "returns a hidden field with the field name" do
|
|
171
|
+
# html = helper.property_item("name", "field_name", {}, [1,2,3])
|
|
172
|
+
# puts html
|
|
173
|
+
# html.should have_selector("input[name='prefix[n]'][type='hidden']")
|
|
174
|
+
# end
|
|
175
|
+
|
|
176
|
+
context "without an operator set in the value_hash" do
|
|
177
|
+
it "returns a select menu to select an operator" do
|
|
178
|
+
html = helper.property_item("name", :field_name, {:type => "string"}, {}, [1,2,3])
|
|
179
|
+
html.should have_selector("select[name='prefix[field_name][o]']")
|
|
180
|
+
(1..3).each {|i| html.should have_selector("option[value='term']", :text => I18n.t("cullender.operators.term"))}
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
context "with an operator set in the value_hash" do
|
|
185
|
+
it "returns a select menu with the operator selected" do
|
|
186
|
+
html = helper.property_item("name", :field_name, {:type => "string"}, {"o" => "term"}, [1,2,3])
|
|
187
|
+
html.should have_selector("option[value='term'][selected='selected']")
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
describe "#property_value_field" do
|
|
193
|
+
context "with invalid value" do
|
|
194
|
+
before(:each) do
|
|
195
|
+
helper.stub(:call_options).with("field_name").and_return({:class => "my_property"})
|
|
196
|
+
end
|
|
197
|
+
context "when field type is a number" do
|
|
198
|
+
it "returns a number field with the value set" do
|
|
199
|
+
# Cullender::Event.stub(:field_type).with("field_name").and_return("number")
|
|
200
|
+
html = helper.property_value_field("field_name", "number_field", nil, {}, "prefix")
|
|
201
|
+
html.should have_selector("input[type='number'][name='prefix[field_name][v]']")
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
context "when field type is a range" do
|
|
205
|
+
it "returns a range field with the value set" do
|
|
206
|
+
# Cullender::Event.stub(:field_type).with("field_name").and_return("range")
|
|
207
|
+
html = helper.property_value_field("field_name", "range_field", nil, {}, "prefix")
|
|
208
|
+
html.should have_selector("input[type='range'][name='prefix[field_name][v]']")
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
context "when field type is a select menu" do
|
|
212
|
+
it "returns a select menu with the value set" do
|
|
213
|
+
helper.stub(:options_for_select).with({}, nil).and_return("options_for_select")
|
|
214
|
+
# Cullender::Event.stub(:field_type).with("field_name").and_return("select")
|
|
215
|
+
html = helper.property_value_field("field_name", "select", nil, {}, "prefix")
|
|
216
|
+
html.should have_selector("select[name='prefix[field_name][v]']", :text => "options_for_select")
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
context "when field type is text" do
|
|
220
|
+
# it "returns a text field with the value set" do
|
|
221
|
+
# Event.stub(:field_type).with("field_name").and_return(Event::TEXT)
|
|
222
|
+
# html = helper.property_value_field("field_name", nil, "prefix")
|
|
223
|
+
# html.should have_selector("input", :type => "text", :name => "prefix[v]", :class => "my_property")
|
|
224
|
+
# end
|
|
225
|
+
end
|
|
226
|
+
context "when field type is not found" do
|
|
227
|
+
it "returns a text field with the value set" do
|
|
228
|
+
# Cullender::Event.stub(:field_type).with("field_name").and_return(3454)
|
|
229
|
+
html = helper.property_value_field("field_name", "text_field", nil, {}, "prefix")
|
|
230
|
+
html.should have_selector("input[type='text'][name='prefix[field_name][v]']")
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
context "when field type is datetime" do
|
|
234
|
+
it "returns datetime select menus with the value set" do
|
|
235
|
+
time = Time.zone.now
|
|
236
|
+
helper.stub(:set_datetime).and_return(time)
|
|
237
|
+
# Cullender::Event.stub(:field_type).with("field_name").and_return("datetime")
|
|
238
|
+
html = helper.property_value_field("field_name", "datetime", nil, {}, "prefix")
|
|
239
|
+
html.should have_selector("select[name='prefix[field_name][v][year]']")
|
|
240
|
+
html.should have_selector("select[name='prefix[field_name][v][month]']")
|
|
241
|
+
html.should have_selector("select[name='prefix[field_name][v][day]']")
|
|
242
|
+
html.should have_selector("select[name='prefix[field_name][v][hour]']")
|
|
243
|
+
html.should have_selector("select[name='prefix[field_name][v][minute]']")
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
context "when field type is date" do
|
|
247
|
+
it "returns date select menus with the value set" do
|
|
248
|
+
date = Date.today
|
|
249
|
+
helper.stub(:set_date).and_return(date)
|
|
250
|
+
# Cullender::Event.stub(:field_type).with("field_name").and_return("date")
|
|
251
|
+
html = helper.property_value_field("field_name", "date", nil, {}, "prefix")
|
|
252
|
+
html.should have_selector("select[name='prefix[field_name][v][year]']")
|
|
253
|
+
html.should have_selector("select[name='prefix[field_name][v][month]']")
|
|
254
|
+
html.should have_selector("select[name='prefix[field_name][v][day]']")
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
context "with a valid value" do
|
|
260
|
+
before(:each) do
|
|
261
|
+
helper.stub(:call_options).with("field_name").and_return({})
|
|
262
|
+
end
|
|
263
|
+
context "when field type is a number" do
|
|
264
|
+
it "returns a number field with the value set" do
|
|
265
|
+
# Cullender::Event.stub(:field_type).with("field_name").and_return("number")
|
|
266
|
+
html = helper.property_value_field("field_name", "number_field", 3, {}, "prefix")
|
|
267
|
+
html.should have_selector("input[type='number'][name ='prefix[field_name][v]'][value='3']")
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
context "when field type is a range" do
|
|
271
|
+
it "returns a range field with the value set" do
|
|
272
|
+
# Cullender::Event.stub(:field_type).with("field_name").and_return("range")
|
|
273
|
+
html = helper.property_value_field("field_name", "range_field", 3, {}, "prefix")
|
|
274
|
+
html.should have_selector("input[type='range'][name ='prefix[field_name][v]'][value='3']")
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
context "when field type is text" do
|
|
278
|
+
# it "returns a text field with the value set" do
|
|
279
|
+
# Event.stub(:field_type).with("field_name").and_return(Event::TEXT)
|
|
280
|
+
# html = helper.property_value_field("field_name", "my_value", "prefix")
|
|
281
|
+
# html.should have_selector("input", :type => "text", :name => "prefix[v]", :value => "my_value")
|
|
282
|
+
# end
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
# def nested_property_prefix(hierarchy)
|
|
289
|
+
# "f#{hierarchy.inject("") {|result, item| result += "[#{item}]"}}"
|
|
290
|
+
# end
|
|
291
|
+
describe "#nested_property_prefix" do
|
|
292
|
+
it "returns a string with the proper hash code" do
|
|
293
|
+
helper.nested_property_prefix([1,2,3,4,5]).should == "[1][2][3][4][5]"
|
|
294
|
+
end
|
|
295
|
+
it "returns a string with the proper hash code and a prefix" do
|
|
296
|
+
helper.nested_property_prefix([1,2,3,4,5], "pre").should == "pre[1][2][3][4][5]"
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
describe ".formatted_triggers" do
|
|
301
|
+
it "displays the 'AND'ed triggers" do
|
|
302
|
+
input = {"amount"=>{"o"=>"lt", "v"=>"fsfdb"}, "card_number"=>{"o"=>"gt", "v"=>"fdbsb"}, "start_at"=>{"o"=>"gt", "v"=>"dfbsb"}}
|
|
303
|
+
output = "(amount < fsfdb AND card_number > fdbsb AND start_at > dfbsb)"
|
|
304
|
+
helper.formatted_triggers(input).should eql(output)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
it "displays nested 'OR'ed triggers" do
|
|
308
|
+
input = {"0"=>{"0"=>{"amount"=>{"o"=>"lt", "v"=>"fsfdb"}, "card_number"=>{"o"=>"gt", "v"=>"fdbsb"}, "start_at"=>{"o"=>"gt", "v"=>"dfbsb"}}, "1"=>{"card_bank_number"=>{"o"=>"gt", "v"=>"fbdsb"}}}, "1"=>{"card_bank_number"=>{"o"=>"gt", "v"=>"fsdbfd"}}}
|
|
309
|
+
output = "(((amount < fsfdb AND card_number > fdbsb AND start_at > dfbsb) OR (card_bank_number > fbdsb)) OR (card_bank_number > fsdbfd))"
|
|
310
|
+
helper.formatted_triggers(input).should eql(output)
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
describe ".filter_to_s" do
|
|
316
|
+
it "writes the filter as a string" do
|
|
317
|
+
helper.filter_to_s("amount", {"o"=>"lt", "v"=>"fsfdb"}).should eql("amount < fsfdb")
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
# describe "#format_for_datatype" do
|
|
322
|
+
# it "calls number_to_currency when type is a currency" do
|
|
323
|
+
# helper.should_receive(:number_to_currency).with(123.23)
|
|
324
|
+
# helper.format_for_datatype(123.23, Event::CURRENCY)
|
|
325
|
+
# end
|
|
326
|
+
# it "calls short localize when type is a date" do
|
|
327
|
+
# I18n.should_receive(:localize).with(Time.zone.at(1333078177), :format => :short)
|
|
328
|
+
# helper.format_for_datatype(1333078177, Event::DATE)
|
|
329
|
+
# end
|
|
330
|
+
# it "calls short localize when type is a datetime" do
|
|
331
|
+
# I18n.should_receive(:localize).with(Time.zone.at(1333078177), :format => :long)
|
|
332
|
+
# helper.format_for_datatype(1333078177, Event::DATETIME)
|
|
333
|
+
# end
|
|
334
|
+
|
|
335
|
+
# it "calls number_with_delimiter when type is an integer" do
|
|
336
|
+
# helper.should_receive(:number_with_delimiter).with(12323)
|
|
337
|
+
# helper.format_for_datatype(12323, Event::INTEGER)
|
|
338
|
+
# end
|
|
339
|
+
|
|
340
|
+
# it "calls number_with_precision when type is an decimal" do
|
|
341
|
+
# helper.should_receive(:number_with_precision).with(12323.23242)
|
|
342
|
+
# helper.format_for_datatype(12323.23242, Event::DECIMAL)
|
|
343
|
+
# end
|
|
344
|
+
|
|
345
|
+
# it "calls number_to_percentage when type is a percentage" do
|
|
346
|
+
# helper.should_receive(:number_to_percentage).with(12)
|
|
347
|
+
# helper.format_for_datatype(12, Event::PERCENTAGE)
|
|
348
|
+
# end
|
|
349
|
+
|
|
350
|
+
# it "calls number_to_human_size when type is a filesize" do
|
|
351
|
+
# helper.should_receive(:number_to_human_size).with(1333078177)
|
|
352
|
+
# helper.format_for_datatype(1333078177, Event::FILESIZE)
|
|
353
|
+
# end
|
|
354
|
+
|
|
355
|
+
# it "returns the value if case is not present" do
|
|
356
|
+
# helper.format_for_datatype(1333078177, 9999).should == 1333078177
|
|
357
|
+
# end
|
|
358
|
+
# end
|
|
359
|
+
|
|
360
|
+
end
|