CloudSesame 0.7.5 → 0.7.7

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +14 -12
  3. data/Guardfile +2 -2
  4. data/cloud_sesame.gemspec +2 -2
  5. data/coverage/.last_run.json +1 -1
  6. data/coverage/.resultset.json +1363 -248
  7. data/lib/cloud_sesame/domain/base.rb +1 -1
  8. data/lib/cloud_sesame/query/ast/abstract/multi_expression_operator.rb +3 -4
  9. data/lib/cloud_sesame/query/ast/abstract/value.rb +10 -2
  10. data/lib/cloud_sesame/query/ast/date_value.rb +1 -4
  11. data/lib/cloud_sesame/query/ast/literal.rb +20 -12
  12. data/lib/cloud_sesame/query/ast/{field_array.rb → multi_expression_operator_children.rb} +8 -2
  13. data/lib/cloud_sesame/query/ast/not.rb +1 -7
  14. data/lib/cloud_sesame/query/ast/range_value.rb +43 -28
  15. data/lib/cloud_sesame/query/ast/root.rb +2 -4
  16. data/lib/cloud_sesame/query/ast/value.rb +1 -9
  17. data/lib/cloud_sesame/query/builder.rb +9 -11
  18. data/lib/cloud_sesame/query/domain/block.rb +1 -3
  19. data/lib/cloud_sesame/query/domain/chaining_block.rb +3 -4
  20. data/lib/cloud_sesame/query/domain/literal.rb +1 -3
  21. data/lib/cloud_sesame/query/dsl/bind_caller.rb +13 -6
  22. data/lib/cloud_sesame/query/dsl/{field_array_methods.rb → literal_chaining_methods.rb} +1 -6
  23. data/lib/cloud_sesame/query/dsl/{field_accessors.rb → literal_methods.rb} +1 -1
  24. data/lib/cloud_sesame/query/node/fuzziness.rb +1 -1
  25. data/lib/cloud_sesame.rb +4 -3
  26. data/spec/cloud_sesame/query/ast/abstract/multi_expression_operator_spec.rb +5 -1
  27. data/spec/cloud_sesame/query/ast/field_array_spec.rb +57 -0
  28. data/spec/cloud_sesame/query/ast/literal_spec.rb +136 -0
  29. data/spec/cloud_sesame/query/ast/not_spec.rb +30 -0
  30. data/spec/cloud_sesame/query/ast/phrase_spec.rb +20 -0
  31. data/spec/cloud_sesame/query/ast/range_value_spec.rb +245 -30
  32. data/spec/cloud_sesame/query/ast/string_value_spec.rb +39 -0
  33. data/spec/cloud_sesame/query/ast/term_spec.rb +20 -0
  34. data/spec/cloud_sesame/query/ast/value_spec.rb +109 -0
  35. data/spec/cloud_sesame/query/builder_spec.rb +4 -4
  36. data/spec/cloud_sesame/query/domain/block_spec.rb +3 -3
  37. data/spec/cloud_sesame/query/dsl/{field_array_methods_spec.rb → literal_chaining_methods_spec.rb} +1 -1
  38. data/spec/cloud_sesame/query/dsl/{field_accessors_spec.rb → literal_methods_spec.rb} +3 -3
  39. data/spec/cloud_sesame/query/node/query_spec.rb +22 -0
  40. data/spec/profiling_spec.rb +155 -155
  41. metadata +23 -9
@@ -0,0 +1,136 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ describe Literal do
5
+
6
+ let(:field) { :literal }
7
+ let(:value) { "value" }
8
+ let(:options) { {} }
9
+ subject { Literal.new(field, value, options) }
10
+
11
+ describe '#initialize' do
12
+ context 'when the value is given' do
13
+
14
+ it 'should create an lazy object' do
15
+ expect(LazyObject).to receive(:new)
16
+ subject
17
+ end
18
+
19
+ context 'and the options contains field type' do
20
+ let(:field_type) { class_double(Value) }
21
+ let(:options) {{ type: field_type }}
22
+ before { allow(LazyObject).to receive(:new) { |&b| b.call } }
23
+
24
+ it 'should parse value with field type inside the lazy object' do
25
+ expect(field_type).to receive(:parse).with(value)
26
+ subject
27
+ end
28
+ end
29
+
30
+ context 'and the options does not contain type' do
31
+ before { allow(LazyObject).to receive(:new) { |&b| b.call } }
32
+
33
+ it 'should create a lazy object' do
34
+ expect(Value).to receive(:parse).with(value)
35
+ subject
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ context 'when the value is nil' do
42
+ let(:value) { nil }
43
+ it 'should not parse the value using lazy object' do
44
+ expect(LazyObject).to_not receive(:new)
45
+ subject
46
+ end
47
+ end
48
+
49
+ context 'when the options is nil' do
50
+ let(:options) { nil }
51
+ it 'should use the default options' do
52
+ expect(subject.options).to eq({ type: Value })
53
+ end
54
+ end
55
+ end
56
+
57
+ describe '#applied' do
58
+ let(:included) { true }
59
+ context 'when value is given' do
60
+ it 'should return an hash contains field value and included' do
61
+ expect(subject.applied(included)).to include(
62
+ field: field,
63
+ value: CloudSesame::Query::AST::StringValue.new(value),
64
+ included: included
65
+ )
66
+ end
67
+ end
68
+ context 'when value is not given' do
69
+ let(:value) { nil }
70
+ it 'should return nothing' do
71
+ expect(subject.applied(included)).to be_nil
72
+ end
73
+ end
74
+ end
75
+
76
+ describe '#actual_field_name' do
77
+ context 'when options contains :as value' do
78
+ let(:actual_field_name) { :field1 }
79
+ let(:options) { { as: actual_field_name } }
80
+ it 'should use the :as value as the actual field name' do
81
+ expect(subject.actual_field_name).to eq actual_field_name
82
+ end
83
+ end
84
+ context 'when options does not contain :as value' do
85
+ it 'should use the field as the actual field name' do
86
+ expect(subject.actual_field_name).to eq field
87
+ end
88
+ end
89
+ end
90
+
91
+ describe '#compile' do
92
+ context 'when value is not present' do
93
+ let(:value) { nil }
94
+ it 'should return nothing' do
95
+ expect(subject.compile).to be_nil
96
+ end
97
+ end
98
+ context 'when value is present' do
99
+ it 'should compile the value' do
100
+ expect(subject.value).to receive(:compile)
101
+ subject.compile
102
+ end
103
+ it 'should compile into standard format by default' do
104
+ expect(subject.compile).to eq "#{ field }:#{ subject.value.compile }"
105
+ end
106
+ end
107
+ context 'when request detailed format' do
108
+ it 'should compile into detailed format' do
109
+ expect(subject.compile(true)).to eq("field='#{ field }' #{ subject.value.compile }")
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '#is_for' do
115
+ let(:new_field) { :new_literal }
116
+ it 'should set the field' do
117
+ expect{ subject.is_for(new_field, nil) }.to change{ subject.field }.from(field).to(new_field)
118
+ end
119
+ context 'when options is present' do
120
+ let(:options) { { old: "value" } }
121
+ let(:new_options) { { new: "new value" } }
122
+ it 'should take the options and merge with existing options' do
123
+ expect{ subject.is_for(field, new_options) }.to change{ subject.options }.from(options.clone).to(options.merge(new_options))
124
+ end
125
+ end
126
+ context 'when options is not present' do
127
+ it 'should do nothing with the existing options' do
128
+ expect{ subject.is_for(field, nil) }.to_not change{ subject.options }
129
+ end
130
+ end
131
+ end
132
+
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,30 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ describe Not do
5
+
6
+ let(:context) {{}}
7
+ subject { Not.new(context) }
8
+
9
+ it 'should be a type of operator' do
10
+ expect(Not.ancestors).to include(Abstract::SingleExpressionOperator)
11
+ end
12
+
13
+ it 'should have symbol :not' do
14
+ expect(Not::SYMBOL).to eq :not
15
+ end
16
+
17
+ describe '#applied' do
18
+ let(:included) { false }
19
+ let(:child) { instance_double(Abstract::SingleExpressionOperator) }
20
+ before { subject << child }
21
+ it 'should inverse included and broadcast to it\'s child' do
22
+ expect(child).to receive(:applied).with(!included)
23
+ subject.applied(included)
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ describe Phrase do
5
+ it 'should be a type of operator' do
6
+ expect(Phrase.ancestors).to include(Abstract::SingleExpressionOperator)
7
+ end
8
+
9
+ it 'should have symbol :term' do
10
+ expect(Phrase::SYMBOL).to eq :phrase
11
+ end
12
+
13
+ it 'should be set to detailed' do
14
+ expect(Phrase::DETAILED).to eq true
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -3,48 +3,263 @@ module CloudSesame
3
3
  module AST
4
4
  describe RangeValue do
5
5
 
6
- describe 'initialize' do
7
- shared_examples 'initialize with initial value' do
8
- it 'should be an array' do
9
- expect(subject.value).to be_kind_of(Array)
6
+ let(:type) { nil }
7
+ subject { RangeValue.new(initial_value, type) }
8
+
9
+ describe '#initialize' do
10
+
11
+ shared_examples 'determine lower bound, begin, end' do
12
+ it 'should determine the lower bound' do
13
+ expect(subject.lower_bound).to eq lower_bound
14
+ end
15
+ it 'should determine the begin value' do
16
+ expect(subject.begin).to eq start_value
17
+ end
18
+ it 'should determine the end value' do
19
+ expect(subject.end).to eq end_value
20
+ end
21
+ it 'should determine the upper bound' do
22
+ expect(subject.upper_bound).to eq upper_bound
23
+ end
24
+ end
25
+
26
+ shared_examples 'possible upper bound' do
27
+ context 'when upper bound is included' do
28
+ let(:upper_bound) { ']' }
29
+ include_examples 'determine lower bound, begin, end'
10
30
  end
11
- it 'should not be empty' do
12
- expect(subject.value).to_not be_empty
31
+ context 'when upper bound is excluded' do
32
+ let(:upper_bound) { '}' }
33
+ include_examples 'determine lower bound, begin, end'
34
+ end
35
+ end
36
+
37
+ context 'when given a ruby range object' do
38
+ let(:start_value) { 10 }
39
+ let(:end_value) { 20 }
40
+
41
+ let(:lower_bound) { '[' }
42
+ context 'when upper bound is included' do
43
+ let(:upper_bound) { ']' }
44
+ let(:initial_value) { start_value..end_value }
45
+ include_examples 'determine lower bound, begin, end'
46
+ end
47
+ context 'when lower bound is excluded' do
48
+ let(:initial_value) { start_value...end_value }
49
+ let(:upper_bound) { '}' }
50
+ include_examples 'determine lower bound, begin, end'
51
+ end
52
+ end
53
+
54
+ context 'when given a aws range string' do
55
+ let(:start_value) { "10" }
56
+ let(:end_value) { "20" }
57
+ let(:initial_value) { "#{ lower_bound }#{ start_value },#{ end_value }#{ upper_bound }" }
58
+
59
+ context 'when lower bound is included' do
60
+ let(:lower_bound) { '[' }
61
+ include_examples 'possible upper bound'
13
62
  end
14
- it 'should capture the range information' do
15
- expect(subject.value).to eq data
63
+ context 'when lower bound is excluded' do
64
+ let(:lower_bound) { '{' }
65
+ include_examples 'possible upper bound'
16
66
  end
17
67
  end
18
68
 
19
- context 'when given a range value' do
20
- {
21
- (0..10) => ['[', 0, 10, ']'],
22
- (0...10) => ['[', 0, 10, '}'],
23
- (Date.today..(Date.today + 3)) => ['[', Date.today, Date.today + 3, ']']
24
- }.each do |before_value, after_value|
25
- subject { RangeValue.new(before_value) }
26
- let(:data) { after_value }
27
- include_examples 'initialize with initial value'
69
+ context 'when given no initial value' do
70
+ let(:initial_value) { nil }
71
+ let(:lower_bound) { "[" }
72
+ let(:upper_bound) { "]" }
73
+ let(:start_value) { nil }
74
+ let(:end_value) { nil }
75
+ include_examples 'determine lower bound, begin, end'
76
+ end
77
+
78
+ context 'when given type' do
79
+ let(:start_value) { 10 }
80
+ let(:end_value) { 20 }
81
+ let(:initial_value) { start_value..end_value }
82
+ let(:type) { Value }
83
+ it 'should parse the start and end value with type' do
84
+ expect(type).to receive(:parse).with(end_value)
85
+ expect(type).to receive(:parse).with(start_value)
86
+ subject
87
+ end
88
+ it 'should convert start and end value to value object' do
89
+ expect(subject.begin).to be_kind_of(Abstract::Value)
90
+ expect(subject.end).to be_kind_of(Abstract::Value)
28
91
  end
29
92
  end
30
93
 
31
- context 'when given a range value in string format' do
32
- {
33
- "[0, nil}" => ['[', 0, nil, '}'],
34
- "{, 100]" => ['{', '', '100', ']'],
35
- }.each do |before_value, after_value|
36
- subject { RangeValue.new(before_value) }
37
- let(:data) { after_value }
38
- include_examples 'initialize with initial value'
94
+ context 'when given no type' do
95
+ let(:initial_value) { 10..20 }
96
+
97
+ it 'should not parse the start and end value' do
98
+ expect(type).to_not receive(:parse)
99
+ subject
100
+ end
101
+ it 'should keep the original start and end value' do
102
+ expect(subject.begin).to be_kind_of(Numeric)
103
+ expect(subject.end).to be_kind_of(Numeric)
39
104
  end
40
105
  end
41
106
 
42
- context 'when value is not given' do
43
- subject { RangeValue.new }
44
- let(:data) { [] }
45
- it 'should set the data to the default value' do
46
- expect(subject.value).to eq ['{', nil, nil, '}']
107
+ end
108
+
109
+ describe '#parse' do
110
+ let(:begin_value) { 1 }
111
+ let(:end_value) { 10 }
112
+ let(:initial_value) { begin_value..end_value }
113
+
114
+ it 'should return self' do
115
+ expect(subject.parse(nil)).to eq subject
116
+ end
117
+
118
+ context 'given type and type respond to parse' do
119
+ let(:parse_type) { Value }
120
+
121
+ context 'and begin and end value is not empty in string form' do
122
+ it 'should parse the begin and end value' do
123
+ expect(parse_type).to receive(:parse).with(end_value)
124
+ expect(parse_type).to receive(:parse).with(begin_value)
125
+ subject.parse(parse_type)
126
+ end
127
+ end
128
+ context 'and begin and end value is empty in string form' do
129
+ let(:begin_value) { nil }
130
+ let(:end_value) { nil }
131
+
132
+ it 'should not try to parse the begin and end value' do
133
+ expect(parse_type).to_not receive(:parse)
134
+ subject.parse(parse_type)
135
+ end
136
+ end
137
+ end
138
+ context 'given type does not respond to parse' do
139
+ let(:parse_type) { "Random Type" }
140
+ before { allow(parse_type).to receive(:respond_to?).and_return(false) }
141
+ it 'should not try to parse the begin and end value' do
142
+ expect(parse_type).to_not receive(:parse)
143
+ subject.parse(parse_type)
144
+ end
145
+ end
146
+ context 'given type is nil' do
147
+ let(:parse_type) { nil }
148
+ it 'should not try to parse the begin and end value' do
149
+ expect(parse_type).to_not receive(:parse)
150
+ subject.parse(parse_type)
47
151
  end
152
+ end
153
+ end
154
+
155
+ describe '#begin' do
156
+ let(:begin_value) { 1 }
157
+ let(:end_value) { 10 }
158
+ let(:initial_value) { begin_value..end_value }
159
+ it 'should return the begin value' do
160
+ expect(subject.begin).to eq begin_value
161
+ end
162
+ end
163
+
164
+ describe '#end' do
165
+ let(:begin_value) { 1 }
166
+ let(:end_value) { 10 }
167
+ let(:initial_value) { begin_value..end_value }
168
+ it 'should return the end value' do
169
+ expect(subject.end).to eq end_value
170
+ end
171
+ end
172
+
173
+ describe '#lower_bound' do
174
+ let(:lower_bound) { "{" }
175
+ let(:upper_bound) { "}" }
176
+ let(:begin_value) { "1" }
177
+ let(:end_value) { "10" }
178
+ let(:initial_value) { lower_bound + begin_value + ',' + end_value + upper_bound }
179
+ it 'should return the lower bound symbol' do
180
+ expect(subject.lower_bound).to eq lower_bound
181
+ end
182
+ end
183
+
184
+ describe '#upper_bound' do
185
+ let(:lower_bound) { "{" }
186
+ let(:upper_bound) { "}" }
187
+ let(:begin_value) { "1" }
188
+ let(:end_value) { "10" }
189
+ let(:initial_value) { lower_bound + begin_value + ',' + end_value + upper_bound }
190
+ it 'should return the upper bound symbol' do
191
+ expect(subject.upper_bound).to eq upper_bound
192
+ end
193
+ end
194
+
195
+ describe '#gt' do
196
+ let(:value) { 100 }
197
+ let(:initial_value) { nil }
198
+ it 'should set the begin value' do
199
+ expect{ subject.gt(value) }.to change{ subject.begin }.from(nil).to(value)
200
+ end
201
+ it 'should set the lower bound to be excluded' do
202
+ subject.gt(value)
203
+ expect(subject.lower_bound).to eq '{'
204
+ end
205
+ end
206
+
207
+ describe '#gte' do
208
+ let(:value) { 101 }
209
+ let(:initial_value) { nil }
210
+ it 'should set the begin value' do
211
+ expect{ subject.gte(value) }.to change{ subject.begin }.from(nil).to(value)
212
+ end
213
+ it 'should set the lower bound to be excluded' do
214
+ subject.gte(value)
215
+ expect(subject.lower_bound).to eq '['
216
+ end
217
+ end
218
+
219
+ describe '#lt' do
220
+ let(:value) { 100 }
221
+ let(:initial_value) { nil }
222
+ it 'should set the begin value' do
223
+ expect{ subject.lt(value) }.to change{ subject.end }.from(nil).to(value)
224
+ end
225
+ it 'should set the lower bound to be excluded' do
226
+ subject.lt(value)
227
+ expect(subject.upper_bound).to eq '}'
228
+ end
229
+ end
230
+
231
+ describe '#lte' do
232
+ let(:value) { 100 }
233
+ let(:initial_value) { nil }
234
+ it 'should set the begin value' do
235
+ expect{ subject.lte(value) }.to change{ subject.end }.from(nil).to(value)
236
+ end
237
+ it 'should set the lower bound to be excluded' do
238
+ subject.lte(value)
239
+ expect(subject.upper_bound).to eq ']'
240
+ end
241
+ end
242
+
243
+ describe '#to_s' do
244
+ let(:initial_value) { 10..255 }
245
+ it 'should return the compiled value' do
246
+ expect(subject.to_s).to eq subject.compile
247
+ end
248
+ end
249
+
250
+ describe '#==' do
251
+ let(:initial_value) { 10...255 }
252
+ let(:object) { "[10,255}" }
253
+ it 'should convert the object comparing with to RangeValue' do
254
+ subject
255
+ expect(RangeValue).to receive(:new).with(object, Value).and_call_original
256
+ subject == object
257
+ end
258
+ it 'should return true when the parsed value are the same' do
259
+ expect(subject == object).to eq true
260
+ end
261
+ it 'should return false when the parsed value is different' do
262
+ expect(subject == (10..255)).to eq false
48
263
  end
49
264
  end
50
265
 
@@ -0,0 +1,39 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ describe StringValue do
5
+
6
+ describe '.parse' do
7
+ let(:value) { "value" }
8
+
9
+ it 'should instantiate a StringValue' do
10
+ expect(StringValue).to receive(:new).with(value)
11
+ StringValue.parse(value)
12
+ end
13
+ it 'should return the StringValue' do
14
+ expect(StringValue.parse(value)).to be_kind_of(StringValue)
15
+ end
16
+ end
17
+
18
+ describe '.compile' do
19
+ subject { StringValue.new(value) }
20
+
21
+ context 'when value is not present' do
22
+ let(:value) { nil }
23
+ it 'should return nothing' do
24
+ expect(subject.compile).to eq nil
25
+ end
26
+ end
27
+ context 'when value is present' do
28
+ let(:value) { "value" }
29
+ it 'should return the escaped the value' do
30
+ expect(subject.compile).to eq "'#{ value }'"
31
+ end
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ describe Term do
5
+ it 'should be a type of operator' do
6
+ expect(Term.ancestors).to include(Abstract::SingleExpressionOperator)
7
+ end
8
+
9
+ it 'should have symbol :term' do
10
+ expect(Term::SYMBOL).to eq :term
11
+ end
12
+
13
+ it 'should be set to detailed' do
14
+ expect(Term::DETAILED).to eq true
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,109 @@
1
+ require 'bigdecimal'
2
+
3
+ module CloudSesame
4
+ module Query
5
+ module AST
6
+ describe Value do
7
+
8
+ describe '.map_type' do
9
+ it 'should return self when type does not match' do
10
+ expect(Value.map_type(:random)).to eq(Value)
11
+ end
12
+ it 'should return the class matched the type' do
13
+ expect(Value.map_type(:string)).to eq(StringValue)
14
+ expect(Value.map_type(:numeric)).to eq(NumericValue)
15
+ expect(Value.map_type(:datetime)).to eq(DateValue)
16
+ end
17
+ end
18
+
19
+ describe '.parse' do
20
+ context 'when value is a RangeValue object' do
21
+ let(:begin_value) { 100 }
22
+ let(:end_value) { 200 }
23
+ let(:value) { RangeValue.new(begin_value..end_value) }
24
+ it 'should parse the RangeValue' do
25
+ expect(value).to receive(:parse).with(Value).and_call_original
26
+ expect(Value.parse(value)).to eq value
27
+ end
28
+ end
29
+ context 'when value is an ruby range object' do
30
+ let(:begin_value) { 100 }
31
+ let(:end_value) { 200 }
32
+ let(:value) { begin_value..end_value }
33
+ it 'should initialize a RangeValue' do
34
+ expect(RangeValue).to receive(:new).with(value, Value).and_call_original
35
+ expect(Value.parse(value)).to be_kind_of(RangeValue)
36
+ end
37
+ end
38
+ context 'when value is a AWS range string' do
39
+ let(:lower_bound) { '{' }
40
+ let(:upper_bound) { '}' }
41
+ let(:begin_value) { 100 }
42
+ let(:end_value) { 200 }
43
+ let(:value) { "#{ lower_bound }#{ begin_value },#{ end_value }#{ upper_bound }" }
44
+ it 'should initialize a RangeValue' do
45
+ expect(RangeValue).to receive(:new).with(value, Value).and_call_original
46
+ expect(Value.parse(value)).to be_kind_of(RangeValue)
47
+ end
48
+ end
49
+ context 'when value is a numeric value' do
50
+ let(:value) { 10 }
51
+ it 'should initialize a NumericValue' do
52
+ expect(NumericValue).to receive(:new).with(value, Value).and_call_original
53
+ expect(Value.parse(value)).to be_kind_of(NumericValue)
54
+ end
55
+ end
56
+ context 'when value is a string contains numeric' do
57
+ let(:value) { "10" }
58
+ it 'should initialize a NumericValue' do
59
+ expect(NumericValue).to receive(:new).with(value, Value).and_call_original
60
+ expect(Value.parse(value)).to be_kind_of(NumericValue)
61
+ end
62
+ end
63
+ context 'when value is not neither a range, numeric or range' do
64
+ let(:value) { [10] }
65
+ it 'should initialize a NumericValue' do
66
+ expect(StringValue).to receive(:new).with(value, Value).and_call_original
67
+ expect(Value.parse(value)).to be_kind_of(StringValue)
68
+ end
69
+ end
70
+ end
71
+
72
+ describe '.range_value?' do
73
+ it 'should return true when value is a ruby range object' do
74
+ expect(Value.range_value?(1..20)).to eq true
75
+ end
76
+ it 'should return true when value is a aws range string' do
77
+ expect(Value.range_value?("[1,20]")).to eq true
78
+ expect(Value.range_value?("[1,20}")).to eq true
79
+ expect(Value.range_value?("{,20]")).to eq true
80
+ expect(Value.range_value?("{1,}")).to eq true
81
+ end
82
+ it 'should return false when value is not a range' do
83
+ expect(Value.range_value?("abc")).to eq false
84
+ expect(Value.range_value?(['[', 2, 3, '}'])).to eq false
85
+ end
86
+ end
87
+
88
+ describe 'numeric_value?' do
89
+ it 'should return true when value is a integer, float, or bigdecimal' do
90
+ expect(Value.numeric_value?(1)).to eq true
91
+ expect(Value.numeric_value?(0.99)).to eq true
92
+ expect(Value.numeric_value?(BigDecimal.new("10"))).to eq true
93
+ end
94
+ it 'should return true when value matches string numeric format' do
95
+ expect(Value.numeric_value?("1")).to eq true
96
+ expect(Value.numeric_value?("0.99")).to eq true
97
+ end
98
+ it 'should return false when value is not a numeric' do
99
+ expect(Value.numeric_value?("abc")).to eq false
100
+ expect(Value.numeric_value?([1, 2, 3])).to eq false
101
+ expect(Value.numeric_value?(h: 2)).to eq false
102
+ end
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+ end
109
+ end
@@ -1,5 +1,5 @@
1
1
  require_relative 'dsl/applied_filter_query_spec'
2
- require_relative 'dsl/field_accessors_spec'
2
+ require_relative 'dsl/literal_methods_spec'
3
3
 
4
4
  module CloudSesame
5
5
  module Query
@@ -9,11 +9,11 @@ module CloudSesame
9
9
  subject { Builder.new({}, "Searchable") }
10
10
  end
11
11
 
12
- it_behaves_like DSL::FieldAccessors do
12
+ it_behaves_like DSL::LiteralMethods do
13
13
  subject { Builder.new({}, "Searchable") }
14
14
  before {
15
- Builder.send(:include, DSL::FieldAccessors)
16
- Domain::Block.send(:include, DSL::FieldAccessors)
15
+ Builder.send(:include, DSL::LiteralMethods)
16
+ Domain::Block.send(:include, DSL::LiteralMethods)
17
17
  allow(_scope).to receive(:context).and_return(context)
18
18
  }
19
19
  end