brainstem 1.1.1 → 1.3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +81 -4
- data/Gemfile.lock +9 -9
- data/README.md +134 -37
- data/brainstem.gemspec +1 -1
- data/lib/brainstem/api_docs/endpoint.rb +40 -18
- data/lib/brainstem/api_docs/formatters/markdown/endpoint_formatter.rb +27 -22
- data/lib/brainstem/api_docs/formatters/markdown/helper.rb +9 -0
- data/lib/brainstem/api_docs/formatters/markdown/presenter_formatter.rb +14 -6
- data/lib/brainstem/api_docs/presenter.rb +3 -7
- data/lib/brainstem/concerns/controller_dsl.rb +138 -14
- data/lib/brainstem/concerns/presenter_dsl.rb +39 -6
- data/lib/brainstem/dsl/array_block_field.rb +25 -0
- data/lib/brainstem/dsl/block_field.rb +69 -0
- data/lib/brainstem/dsl/configuration.rb +13 -5
- data/lib/brainstem/dsl/field.rb +15 -1
- data/lib/brainstem/dsl/fields_block.rb +20 -2
- data/lib/brainstem/dsl/hash_block_field.rb +30 -0
- data/lib/brainstem/presenter.rb +10 -6
- data/lib/brainstem/presenter_validator.rb +20 -11
- data/lib/brainstem/version.rb +1 -1
- data/spec/brainstem/api_docs/endpoint_spec.rb +347 -14
- data/spec/brainstem/api_docs/formatters/markdown/endpoint_formatter_spec.rb +106 -13
- data/spec/brainstem/api_docs/formatters/markdown/helper_spec.rb +19 -0
- data/spec/brainstem/api_docs/formatters/markdown/presenter_formatter_spec.rb +150 -37
- data/spec/brainstem/api_docs/presenter_spec.rb +85 -18
- data/spec/brainstem/concerns/controller_dsl_spec.rb +615 -31
- data/spec/brainstem/concerns/inheritable_configuration_spec.rb +32 -9
- data/spec/brainstem/concerns/presenter_dsl_spec.rb +99 -25
- data/spec/brainstem/dsl/array_block_field_spec.rb +43 -0
- data/spec/brainstem/dsl/block_field_spec.rb +188 -0
- data/spec/brainstem/dsl/field_spec.rb +86 -20
- data/spec/brainstem/dsl/hash_block_field_spec.rb +166 -0
- data/spec/brainstem/presenter_collection_spec.rb +24 -24
- data/spec/brainstem/presenter_spec.rb +233 -9
- data/spec/brainstem/query_strategies/filter_and_search_spec.rb +1 -1
- data/spec/spec_helpers/presenters.rb +8 -0
- data/spec/spec_helpers/schema.rb +13 -0
- metadata +15 -6
@@ -52,14 +52,35 @@ describe Brainstem::DSL::Field do
|
|
52
52
|
describe '#run_on' do
|
53
53
|
let(:context) { { } }
|
54
54
|
|
55
|
+
it 'calls `evaluate_value_on`' do
|
56
|
+
mock(field).evaluate_value_on.with(model, context, anything)
|
57
|
+
|
58
|
+
field.run_on(model, context)
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when helper instance is specified' do
|
62
|
+
let(:helper_instance) { Object.new }
|
63
|
+
|
64
|
+
it 'calls `evaluate_value_on` with the given helper instance' do
|
65
|
+
mock(field).evaluate_value_on.with(model, context, helper_instance)
|
66
|
+
|
67
|
+
field.run_on(model, context, helper_instance)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#evaluate_value_on' do
|
73
|
+
let(:context) { { } }
|
74
|
+
let(:helper_instance) { Object.new }
|
75
|
+
|
55
76
|
context 'on :dynamic fields' do
|
56
77
|
let(:options) { { dynamic: lambda { some_instance_method } } }
|
57
78
|
|
58
79
|
it 'calls the :dynamic lambda in the context of the given instance' do
|
59
80
|
do_not_allow(model).title
|
60
|
-
|
61
|
-
|
62
|
-
field.
|
81
|
+
mock(helper_instance).some_instance_method
|
82
|
+
|
83
|
+
field.evaluate_value_on(model, context, helper_instance)
|
63
84
|
end
|
64
85
|
end
|
65
86
|
|
@@ -79,22 +100,22 @@ describe Brainstem::DSL::Field do
|
|
79
100
|
context 'The first model is ran' do
|
80
101
|
it 'builds lookup cache and returns the value for the first model' do
|
81
102
|
expect(context[:lookup][:fields][name.to_s]).to eq(nil)
|
82
|
-
|
83
|
-
|
84
|
-
expect(field.
|
103
|
+
mock(helper_instance).some_instance_method
|
104
|
+
|
105
|
+
expect(field.evaluate_value_on(first_model, context, helper_instance)).to eq("Ben's Project")
|
85
106
|
expect(context[:lookup][:fields][name.to_s]).to eq({ first_model.id => "Ben's Project", second_model.id => "Nate's Project" })
|
86
107
|
end
|
87
108
|
end
|
88
109
|
|
89
110
|
context 'The second model is ran after the first' do
|
90
111
|
it 'returns the value from the lookup cache and does not run the lookup' do
|
91
|
-
|
92
|
-
|
93
|
-
field.
|
112
|
+
mock(helper_instance).some_instance_method
|
113
|
+
|
114
|
+
field.evaluate_value_on(first_model, context, helper_instance)
|
94
115
|
expect(context[:lookup][:fields][name.to_s]).to eq({ first_model.id => "Ben's Project", second_model.id => "Nate's Project" })
|
95
116
|
|
96
|
-
mock(
|
97
|
-
expect(field.
|
117
|
+
mock(helper_instance).some_instance_method.never
|
118
|
+
expect(field.evaluate_value_on(second_model, context, helper_instance)).to eq("Nate's Project")
|
98
119
|
end
|
99
120
|
end
|
100
121
|
|
@@ -104,7 +125,7 @@ describe Brainstem::DSL::Field do
|
|
104
125
|
|
105
126
|
it 'should raise error explaining the default lookup fetch relies on [] to access the model\'s value from the lookup' do
|
106
127
|
expect {
|
107
|
-
field.
|
128
|
+
field.evaluate_value_on(first_model, context)
|
108
129
|
}.to raise_error(StandardError, 'Brainstem expects the return result of the `lookup` to be a Hash since it must respond to [] in order to access the model\'s assocation(s). Default: lookup_fetch: lambda { |lookup, model| lookup[model.id] }`')
|
109
130
|
end
|
110
131
|
end
|
@@ -119,10 +140,10 @@ describe Brainstem::DSL::Field do
|
|
119
140
|
}
|
120
141
|
|
121
142
|
it 'does not use the dynamic lambda' do
|
122
|
-
|
123
|
-
mock(
|
124
|
-
|
125
|
-
expect(field.
|
143
|
+
mock(helper_instance).dynamic_instance_method.never
|
144
|
+
mock(helper_instance).lookup_instance_method
|
145
|
+
|
146
|
+
expect(field.evaluate_value_on(first_model, context, helper_instance)).to eq "Ben's Project"
|
126
147
|
end
|
127
148
|
end
|
128
149
|
|
@@ -137,9 +158,9 @@ describe Brainstem::DSL::Field do
|
|
137
158
|
it 'returns the value from the lookup using the lookup_fetch lambda' do
|
138
159
|
context[:lookup][:fields][name.to_s] = {}
|
139
160
|
context[:lookup][:fields][name.to_s][first_model.id] = "Ben's stubbed out Project"
|
140
|
-
|
141
|
-
|
142
|
-
expect(field.
|
161
|
+
mock(helper_instance).some_instance_method
|
162
|
+
|
163
|
+
expect(field.evaluate_value_on(first_model, context, helper_instance)).to eq("Ben's stubbed out Project")
|
143
164
|
end
|
144
165
|
end
|
145
166
|
end
|
@@ -148,7 +169,52 @@ describe Brainstem::DSL::Field do
|
|
148
169
|
it 'calls method_name on the model' do
|
149
170
|
mock(model).foo
|
150
171
|
mock(field).method_name { 'foo' }
|
151
|
-
|
172
|
+
|
173
|
+
field.evaluate_value_on(model, context)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe '#presentable?' do
|
179
|
+
let(:given_context) {
|
180
|
+
{
|
181
|
+
optional_fields: 'optional field',
|
182
|
+
conditionals: 'conditionals',
|
183
|
+
helper_instance: 'helper instance',
|
184
|
+
conditional_cache: 'conditional cache'
|
185
|
+
}
|
186
|
+
}
|
187
|
+
let(:optioned) { false }
|
188
|
+
let(:conditionals_match) { false }
|
189
|
+
|
190
|
+
before do
|
191
|
+
mock(field).optioned?.with(given_context[:optional_fields]) { optioned }
|
192
|
+
stub(field).conditionals_match?.with(
|
193
|
+
model,
|
194
|
+
given_context[:conditionals],
|
195
|
+
given_context[:helper_instance],
|
196
|
+
given_context[:conditional_cache]
|
197
|
+
) { conditionals_match }
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'calls `optioned?` by passing in the optional fields from the context' do
|
201
|
+
expect(field.presentable?(model, given_context)).to be_falsey
|
202
|
+
end
|
203
|
+
|
204
|
+
context 'when field is not optional' do
|
205
|
+
let(:optioned) { true }
|
206
|
+
|
207
|
+
it 'calls `conditionals_match?` with conditionals, helper instance and conditional cache from the context' do
|
208
|
+
expect(field.presentable?(model, given_context)).to be_falsey
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'when field is not optional and conditionals match' do
|
213
|
+
let(:optioned) { true }
|
214
|
+
let(:conditionals_match) { true }
|
215
|
+
|
216
|
+
it 'returns true' do
|
217
|
+
expect(field.presentable?(model, given_context)).to be_truthy
|
152
218
|
end
|
153
219
|
end
|
154
220
|
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'brainstem/dsl/hash_block_field'
|
3
|
+
|
4
|
+
describe Brainstem::DSL::HashBlockField do
|
5
|
+
let(:name) { :tasks }
|
6
|
+
let(:type) { :hash }
|
7
|
+
let(:description) { 'the title of this model' }
|
8
|
+
let(:options) { { info: description } }
|
9
|
+
let(:nested_field) { Brainstem::DSL::HashBlockField.new(name, type, options) }
|
10
|
+
let(:model) { Workspace.find(1) }
|
11
|
+
let(:lead_user) { model.lead_user }
|
12
|
+
|
13
|
+
before do
|
14
|
+
expect(lead_user).to be_present
|
15
|
+
expect(nested_field.configuration.keys).to be_empty
|
16
|
+
|
17
|
+
# Add sub fields to the hash block field.
|
18
|
+
nested_field.configuration[:type] = Brainstem::DSL::Field.new(:type, type, {})
|
19
|
+
nested_field.configuration[:formatted_type] = Brainstem::DSL::Field.new(:formatted_type, type,
|
20
|
+
dynamic: -> (model) { "Formatted #{model.type}" },
|
21
|
+
use_parent_value: true
|
22
|
+
)
|
23
|
+
|
24
|
+
expect(nested_field.configuration.keys).to eq(%w(type formatted_type))
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#run_on' do
|
28
|
+
let(:context) { { } }
|
29
|
+
let(:helper_instance) { Object.new }
|
30
|
+
|
31
|
+
describe 'when none of the sub-fields are presentable' do
|
32
|
+
before do
|
33
|
+
stub.any_instance_of(Brainstem::DSL::Field).presentable? { false }
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'presents an empty hash' do
|
37
|
+
presented_data = nested_field.run_on(model, context)
|
38
|
+
|
39
|
+
expect(presented_data).to eq({})
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'when the field is executable' do
|
44
|
+
let(:name) { :lead_user }
|
45
|
+
let(:options) { { info: description, via: :lead_user } }
|
46
|
+
|
47
|
+
before do
|
48
|
+
expect(nested_field.executable?).to be_truthy
|
49
|
+
|
50
|
+
expect(nested_field.configuration[:type].options[:use_parent_value]).to be_nil
|
51
|
+
expect(nested_field.configuration[:formatted_type].options[:use_parent_value]).to be_truthy
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'returns a hash with the value from the evaluated parent' do
|
55
|
+
presented_data = nested_field.run_on(model, context)
|
56
|
+
|
57
|
+
expect(presented_data['type']).to eq(lead_user.type)
|
58
|
+
expect(presented_data['formatted_type']).to eq("Formatted #{lead_user.type}")
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when the evaluated parent value is blank' do
|
62
|
+
before do
|
63
|
+
stub(model).lead_user { nil }
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'returns a hash with the value from the evaluated parent' do
|
67
|
+
expect(nested_field.run_on(model, context)).to eq({})
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when the sub field doesn\'t use a parent value' do
|
72
|
+
before do
|
73
|
+
nested_field.configuration[:secret] = Brainstem::DSL::Field.new(:secret, type,
|
74
|
+
via: :secret_info,
|
75
|
+
use_parent_value: false
|
76
|
+
)
|
77
|
+
|
78
|
+
expect(nested_field.configuration.keys).to eq(%w(type formatted_type secret))
|
79
|
+
expect(nested_field.configuration[:secret].options[:use_parent_value]).to be_falsey
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns a hash with the value from itself' do
|
83
|
+
presented_data = nested_field.run_on(model, context)
|
84
|
+
|
85
|
+
expect(presented_data['secret']).to eq(model.secret_info)
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'when the evaluated parent value is blank' do
|
89
|
+
before do
|
90
|
+
stub(model).lead_user { nil }
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'returns a hash with the value from itself' do
|
94
|
+
presented_data = nested_field.run_on(model, context)
|
95
|
+
|
96
|
+
expect(presented_data['secret']).to eq(model.secret_info)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe 'when the field delegates to its parent' do
|
103
|
+
let(:name) { :klass }
|
104
|
+
|
105
|
+
before do
|
106
|
+
expect(nested_field.executable?).to be_falsey
|
107
|
+
|
108
|
+
expect(nested_field.configuration[:type].options[:use_parent_value]).to be_nil
|
109
|
+
expect(nested_field.configuration[:formatted_type].options[:use_parent_value]).to be_truthy
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'returns a hash with the value from its parent' do
|
113
|
+
presented_data = nested_field.run_on(model, context)
|
114
|
+
|
115
|
+
expect(presented_data['type']).to eq(model.type)
|
116
|
+
expect(presented_data['formatted_type']).to eq("Formatted #{model.type}")
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'when the sub field doesn\'t use a parent value' do
|
120
|
+
before do
|
121
|
+
nested_field.configuration[:secret] = Brainstem::DSL::Field.new(:secret, type,
|
122
|
+
via: :secret_info,
|
123
|
+
use_parent_value: false
|
124
|
+
)
|
125
|
+
|
126
|
+
expect(nested_field.configuration.keys).to eq(%w(type formatted_type secret))
|
127
|
+
expect(nested_field.configuration[:secret].options[:use_parent_value]).to be_falsey
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'returns a hash with the value from itself' do
|
131
|
+
presented_data = nested_field.run_on(model, context)
|
132
|
+
|
133
|
+
expect(presented_data['secret']).to eq(model.secret_info)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe '#executable' do
|
140
|
+
subject { nested_field.executable? }
|
141
|
+
|
142
|
+
context 'when dynamic option is specified' do
|
143
|
+
let(:options) { { dynamic: -> { [] } } }
|
144
|
+
|
145
|
+
it { is_expected.to be_truthy }
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'when lookup option is specified' do
|
149
|
+
let(:options) { { lookup: -> { [] } } }
|
150
|
+
|
151
|
+
it { is_expected.to be_truthy }
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'when via option is specified' do
|
155
|
+
let(:options) { { via: :foo } }
|
156
|
+
|
157
|
+
it { is_expected.to be_truthy }
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'when dynamic option is specified' do
|
161
|
+
let(:options) { {} }
|
162
|
+
|
163
|
+
it { is_expected.to be_falsey }
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -482,8 +482,8 @@ describe Brainstem::PresenterCollection do
|
|
482
482
|
|
483
483
|
describe "filters" do
|
484
484
|
before do
|
485
|
-
WorkspacePresenter.filter(:owned_by) { |scope, user_id| scope.owned_by(user_id.to_i) }
|
486
|
-
WorkspacePresenter.filter(:title) { |scope, title| scope.where(:title => title) }
|
485
|
+
WorkspacePresenter.filter(:owned_by, :integer) { |scope, user_id| scope.owned_by(user_id.to_i) }
|
486
|
+
WorkspacePresenter.filter(:title, :string) { |scope, title| scope.where(:title => title) }
|
487
487
|
end
|
488
488
|
|
489
489
|
it "limits records to those matching given filters" do
|
@@ -510,7 +510,7 @@ describe Brainstem::PresenterCollection do
|
|
510
510
|
it "converts boolean parameters from strings to booleans" do
|
511
511
|
jane_id = jane.id
|
512
512
|
bob_id = bob.id
|
513
|
-
WorkspacePresenter.filter(:owned_by_bob) { |scope, boolean| boolean ? scope.where(:user_id => bob_id) : scope.where(:user_id => jane_id) }
|
513
|
+
WorkspacePresenter.filter(:owned_by_bob, :boolean) { |scope, boolean| boolean ? scope.where(:user_id => bob_id) : scope.where(:user_id => jane_id) }
|
514
514
|
result = @presenter_collection.presenting("workspaces", :params => { :owned_by_bob => "false" }) { Workspace.where(nil) }
|
515
515
|
expect(result['workspaces'].values.find { |workspace| workspace['title'].include?("jane") }).to be
|
516
516
|
expect(result['workspaces'].values.find { |workspace| workspace['title'].include?("bob") }).not_to be
|
@@ -518,7 +518,7 @@ describe Brainstem::PresenterCollection do
|
|
518
518
|
|
519
519
|
it "ensures arguments are strings if they are not arrays" do
|
520
520
|
string = nil
|
521
|
-
WorkspacePresenter.filter(:owned_by_bob) do |scope, arg|
|
521
|
+
WorkspacePresenter.filter(:owned_by_bob, :boolean) do |scope, arg|
|
522
522
|
string = arg
|
523
523
|
scope
|
524
524
|
end
|
@@ -528,7 +528,7 @@ describe Brainstem::PresenterCollection do
|
|
528
528
|
|
529
529
|
it "preserves array arguments" do
|
530
530
|
array = nil
|
531
|
-
WorkspacePresenter.filter(:owned_by_bob) do |scope, arg|
|
531
|
+
WorkspacePresenter.filter(:owned_by_bob, :boolean) do |scope, arg|
|
532
532
|
array = arg
|
533
533
|
scope
|
534
534
|
end
|
@@ -537,7 +537,7 @@ describe Brainstem::PresenterCollection do
|
|
537
537
|
end
|
538
538
|
|
539
539
|
it "allows filters to be called with false as an argument" do
|
540
|
-
WorkspacePresenter.filter(:nothing) { |scope, bool| bool ? scope.where(:id => nil) : scope }
|
540
|
+
WorkspacePresenter.filter(:nothing, :boolean) { |scope, bool| bool ? scope.where(:id => nil) : scope }
|
541
541
|
result = @presenter_collection.presenting("workspaces", :params => { :nothing => "true" }) { Workspace.where(nil) }
|
542
542
|
expect(result['workspaces'].length).to eq(0)
|
543
543
|
result = @presenter_collection.presenting("workspaces", :params => { :nothing => "false" }) { Workspace.where(nil) }
|
@@ -546,7 +546,7 @@ describe Brainstem::PresenterCollection do
|
|
546
546
|
|
547
547
|
it "passes colon separated params through as a string" do
|
548
548
|
a, b = nil, nil
|
549
|
-
WorkspacePresenter.filter(:between) { |scope, a_and_b|
|
549
|
+
WorkspacePresenter.filter(:between, :string) { |scope, a_and_b|
|
550
550
|
a, b = a_and_b.split(':')
|
551
551
|
scope
|
552
552
|
}
|
@@ -564,7 +564,7 @@ describe Brainstem::PresenterCollection do
|
|
564
564
|
end
|
565
565
|
|
566
566
|
called = false
|
567
|
-
WorkspacePresenter.filter(:something) { |scope, string|
|
567
|
+
WorkspacePresenter.filter(:something, :string) { |scope, string|
|
568
568
|
called = true
|
569
569
|
some_method
|
570
570
|
scope
|
@@ -576,7 +576,7 @@ describe Brainstem::PresenterCollection do
|
|
576
576
|
|
577
577
|
context "with defaults" do
|
578
578
|
before do
|
579
|
-
WorkspacePresenter.filter(:owner, :default => bob.id) { |scope, id| scope.owned_by(id) }
|
579
|
+
WorkspacePresenter.filter(:owner, :integer, :default => bob.id) { |scope, id| scope.owned_by(id) }
|
580
580
|
end
|
581
581
|
|
582
582
|
let(:jane) { User.where(:username => "jane").first }
|
@@ -587,7 +587,7 @@ describe Brainstem::PresenterCollection do
|
|
587
587
|
end
|
588
588
|
|
589
589
|
it "allows falsy defaults" do
|
590
|
-
WorkspacePresenter.filter(:include_early_workspaces, :default => false) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
590
|
+
WorkspacePresenter.filter(:include_early_workspaces, :boolean, :default => false) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
591
591
|
result = @presenter_collection.presenting("workspaces") { Workspace.unscoped }
|
592
592
|
expect(result['workspaces']['2']).not_to be_present
|
593
593
|
result = @presenter_collection.presenting("workspaces", :params => { :include_early_workspaces => "true" }) { Workspace.unscoped }
|
@@ -595,7 +595,7 @@ describe Brainstem::PresenterCollection do
|
|
595
595
|
end
|
596
596
|
|
597
597
|
it "allows defaults to be skipped if :apply_default_filters is false" do
|
598
|
-
WorkspacePresenter.filter(:include_early_workspaces, :default => false) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
598
|
+
WorkspacePresenter.filter(:include_early_workspaces, :boolean, :default => false) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
599
599
|
result = @presenter_collection.presenting("workspaces", :apply_default_filters => true) { Workspace.unscoped }
|
600
600
|
expect(result['workspaces']['2']).not_to be_present
|
601
601
|
result = @presenter_collection.presenting("workspaces", :apply_default_filters => false) { Workspace.unscoped }
|
@@ -603,7 +603,7 @@ describe Brainstem::PresenterCollection do
|
|
603
603
|
end
|
604
604
|
|
605
605
|
it "allows defaults set to false to be skipped if params contain :apply_default_filters with a false value" do
|
606
|
-
WorkspacePresenter.filter(:include_early_workspaces, :default => false) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
606
|
+
WorkspacePresenter.filter(:include_early_workspaces, :boolean, :default => false) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
607
607
|
|
608
608
|
result = @presenter_collection.presenting("workspaces", :params => { :apply_default_filters => "true" }) { Workspace.unscoped }
|
609
609
|
expect(result['workspaces']['2']).not_to be_present
|
@@ -613,7 +613,7 @@ describe Brainstem::PresenterCollection do
|
|
613
613
|
end
|
614
614
|
|
615
615
|
it "allows defaults set to true to be skipped if params contain :apply_default_filters with a false value" do
|
616
|
-
WorkspacePresenter.filter(:include_early_workspaces, :default => true) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
616
|
+
WorkspacePresenter.filter(:include_early_workspaces, :boolean, :default => true) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
617
617
|
|
618
618
|
result = @presenter_collection.presenting("workspaces", :params => { :apply_default_filters => "false" }) { Workspace.unscoped }
|
619
619
|
expect(result['workspaces']['2']).to be_present
|
@@ -626,7 +626,7 @@ describe Brainstem::PresenterCollection do
|
|
626
626
|
result = @presenter_collection.presenting("workspaces", :params => { :owner => jane.id.to_s }) { Workspace.unscoped }
|
627
627
|
expect(result['workspaces'].keys).to match_array(jane.workspaces.map(&:id).map(&:to_s))
|
628
628
|
|
629
|
-
WorkspacePresenter.filter(:include_early_workspaces, :default => true) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
629
|
+
WorkspacePresenter.filter(:include_early_workspaces, :boolean, :default => true) { |scope, bool| bool ? scope : scope.where("id > 3") }
|
630
630
|
result = @presenter_collection.presenting("workspaces", :params => { :include_early_workspaces => "false" }) { Workspace.unscoped }
|
631
631
|
expect(result['workspaces']['2']).not_to be_present
|
632
632
|
end
|
@@ -637,7 +637,7 @@ describe Brainstem::PresenterCollection do
|
|
637
637
|
let(:jane) { User.where(:username => "jane").first }
|
638
638
|
|
639
639
|
before do
|
640
|
-
WorkspacePresenter.filter(:owned_by, :default => bob.id)
|
640
|
+
WorkspacePresenter.filter(:owned_by, :boolean, :default => bob.id)
|
641
641
|
end
|
642
642
|
|
643
643
|
it "calls the named scope with default arguments" do
|
@@ -651,7 +651,7 @@ describe Brainstem::PresenterCollection do
|
|
651
651
|
end
|
652
652
|
|
653
653
|
it "can use filters without lambdas in the presenter or model, but behaves strangely when false is given" do
|
654
|
-
WorkspacePresenter.filter(:numeric_description)
|
654
|
+
WorkspacePresenter.filter(:numeric_description, :boolean)
|
655
655
|
|
656
656
|
result = @presenter_collection.presenting("workspaces") { Workspace.where(nil) }
|
657
657
|
expect(result['workspaces'].keys).to eq(%w[1 2 3 4])
|
@@ -668,13 +668,13 @@ describe Brainstem::PresenterCollection do
|
|
668
668
|
|
669
669
|
context "with include_params" do
|
670
670
|
it "passes the params into the filter block" do
|
671
|
-
WorkspacePresenter.filter(:other_filter) { |scope, opt| scope }
|
672
|
-
WorkspacePresenter.filter(:unused_filter) { |scope, opt| scope }
|
673
|
-
WorkspacePresenter.filter(:other_filter_with_default, default: true) { |scope, opt| scope }
|
671
|
+
WorkspacePresenter.filter(:other_filter, :integer) { |scope, opt| scope }
|
672
|
+
WorkspacePresenter.filter(:unused_filter, :string) { |scope, opt| scope }
|
673
|
+
WorkspacePresenter.filter(:other_filter_with_default, :boolean, default: true) { |scope, opt| scope }
|
674
674
|
|
675
675
|
provided_params = nil
|
676
676
|
|
677
|
-
WorkspacePresenter.filter :filter_with_param, :include_params => true do |scope, option, params|
|
677
|
+
WorkspacePresenter.filter :filter_with_param, :string, :include_params => true do |scope, option, params|
|
678
678
|
provided_params = params
|
679
679
|
scope
|
680
680
|
end
|
@@ -767,7 +767,7 @@ describe Brainstem::PresenterCollection do
|
|
767
767
|
|
768
768
|
describe "passing options to the search block" do
|
769
769
|
it "passes the search method, the search string, includes, order, and paging options" do
|
770
|
-
WorkspacePresenter.filter(:owned_by) { |scope| scope }
|
770
|
+
WorkspacePresenter.filter(:owned_by, :integer) { |scope| scope }
|
771
771
|
search_args = nil
|
772
772
|
WorkspacePresenter.search do |*args|
|
773
773
|
search_args = args
|
@@ -801,7 +801,7 @@ describe Brainstem::PresenterCollection do
|
|
801
801
|
|
802
802
|
describe "filters" do
|
803
803
|
it "passes through the default filters if no filter is requested" do
|
804
|
-
WorkspacePresenter.filter(:owned_by, :default => true) { |scope| scope }
|
804
|
+
WorkspacePresenter.filter(:owned_by, :boolean, :default => true) { |scope| scope }
|
805
805
|
search_options = nil
|
806
806
|
WorkspacePresenter.search do |string, options|
|
807
807
|
search_options = options
|
@@ -824,7 +824,7 @@ describe Brainstem::PresenterCollection do
|
|
824
824
|
end
|
825
825
|
|
826
826
|
it "does not pass through existing non-default filters that are not requested" do
|
827
|
-
WorkspacePresenter.filter(:owned_by) { |scope| scope }
|
827
|
+
WorkspacePresenter.filter(:owned_by, :integer) { |scope| scope }
|
828
828
|
search_options = nil
|
829
829
|
WorkspacePresenter.search do |string, options|
|
830
830
|
search_options = options
|
@@ -1090,7 +1090,7 @@ describe Brainstem::PresenterCollection do
|
|
1090
1090
|
|
1091
1091
|
describe "the count top level key" do
|
1092
1092
|
it "should return the total number of matched records" do
|
1093
|
-
WorkspacePresenter.filter(:owned_by) { |scope, user_id| scope.owned_by(user_id.to_i) }
|
1093
|
+
WorkspacePresenter.filter(:owned_by, :integer) { |scope, user_id| scope.owned_by(user_id.to_i) }
|
1094
1094
|
|
1095
1095
|
result = @presenter_collection.presenting("workspaces") { Workspace.where(:id => 1) }
|
1096
1096
|
expect(result['count']).to eq(1)
|