usefull_scopes 0.2.1 → 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6efcab8a891866f4ef9f7dfc27efafff32d333cb
4
+ data.tar.gz: 564365193cdc25796641285b196f6930ccea9e3f
5
+ SHA512:
6
+ metadata.gz: f88198052f2a67b4f9a617d76908853a7b861acce54ed5788824ebf0d0366430d962fa4b3518f3eb366e93efc60237990068efef3d9fff973858e6e49bb4c988
7
+ data.tar.gz: 662838b654160f95d8575e05d09e5455bddc91098a512258b06e9e230555ac250cb832517c3077c88f05ab3c2185c9b248d7581e076e7051f66b1ec6f1801f9e
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ - rbx
7
+ - jruby
8
+ gemfile:
9
+ - Gemfile
10
+ matrix:
11
+ allow_failures:
12
+ - rvm: rbx
13
+ - rvm: jruby
@@ -0,0 +1,33 @@
1
+ # Contributing
2
+
3
+ We love pull requests. Here's a quick guide.
4
+
5
+ Fork, then clone the repo:
6
+
7
+ git clone git@github.com:your-username/usefull_scopes.git
8
+
9
+ Make sure the tests pass:
10
+
11
+ rake
12
+
13
+ Make your change. Add tests for your change. Make the tests pass:
14
+
15
+ rake
16
+
17
+ Push to your fork and [submit a pull request][pr].
18
+
19
+ [pr]: https://github.com/kaize/usefull_scopes/compare/
20
+
21
+ At this point you're waiting on us. We like to at least comment on pull requests
22
+ within three business days (and, typically, one business day). We may suggest
23
+ some changes or improvements or alternatives.
24
+
25
+ Some things that will increase the chance that your pull request is accepted:
26
+
27
+ * Write tests.
28
+ * Follow common [style guides][style].
29
+ * Write a [good commit message][commit].
30
+ * squash your commits before sending PR.
31
+
32
+ [style]: https://github.com/thoughtbot/guides/tree/master/style
33
+ [commit]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
data/Gemfile CHANGED
@@ -1,14 +1,15 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
- # Specify your gem's dependencies in usefull_scopes.gemspec
4
3
  gemspec
5
4
 
6
5
  gem 'rake'
7
- gem 'sqlite3'
8
- gem 'minitest'
9
- gem 'tconsole'
10
- gem 'turn'
11
- gem 'activerecord'
12
- gem 'factory_girl'
13
- gem 'simplecov'
14
- gem 'coveralls', require: false
6
+
7
+ group :test do
8
+ gem 'minitest', '~> 5'
9
+ gem 'minitest-reporters'
10
+ gem 'factory_girl'
11
+ gem 'simplecov'
12
+ gem 'coveralls'
13
+
14
+ gem 'sqlite3'
15
+ end
data/README.md CHANGED
@@ -17,12 +17,15 @@ Or install it yourself as:
17
17
 
18
18
  ## Usage
19
19
 
20
- In order to use these scopes, we need to include `UsefullScopes` module in our model.
20
+ In order to access these scopes, include `UsefullScopes` module in your model.
21
+
22
+ For example:
21
23
 
22
24
  class User < ActiveRecord::Base
23
25
  include UsefullScopes
24
26
  end
25
27
 
28
+
26
29
  ### Global scopes
27
30
 
28
31
  <table>
@@ -32,25 +35,49 @@ In order to use these scopes, we need to include `UsefullScopes` module in our m
32
35
  </tr>
33
36
  <tr>
34
37
  <td>random</td>
35
- <td>Fetches a random record</td>
38
+ <td>Random record</td>
36
39
  </tr>
37
40
  <tr>
38
41
  <td>exclude</td>
39
- <td>Selects only those records who are not in a given array (you could also provide a single object as an argument)</td>
42
+ <td>Records who are not in a given array (you could also provide a single object as an argument)</td>
40
43
  </tr>
41
44
  <tr>
42
45
  <td>with</td>
43
- <td>Returns records, where attributes' values are corresponding to a given hash.</td>
46
+ <td>Records, where attributes' values are corresponding to a given hash.</td>
44
47
  </tr>
45
48
  <tr>
46
49
  <td>without</td>
47
- <td>Returns records, where attributes' values are `NULL` or aren't equal to values from a given hash.</td>
50
+ <td>Records, where attributes' values are `NULL` or aren't equal to values from a given hash.</td>
51
+ </tr>
52
+ <tr>
53
+ <td>asc_by</td>
54
+ <td>Records sorted in ascending order using provided attributes.</td>
55
+ </tr>
56
+ <tr>
57
+ <td>desc_by</td>
58
+ <td>Records sorted in descending order using provided attributes.</td>
59
+ </tr>
60
+ <tr>
61
+ <td>more_than</td>
62
+ <td>FIXME</td>
63
+ </tr>
64
+ <tr>
65
+ <td>less_than</td>
66
+ <td>FIXME</td>
67
+ </tr>
68
+ <tr>
69
+ <td>more_or_equal</td>
70
+ <td>FIXME</td>
71
+ </tr>
72
+ <tr>
73
+ <td>less_or_equal</td>
74
+ <td>FIXME</td>
48
75
  </tr>
49
76
  </table>
50
77
 
51
78
  ### Scopes per attribute
52
79
 
53
- These are the scopes created for each model's attribute.
80
+ These are the scopes created for each of the model attribute.
54
81
 
55
82
  <table>
56
83
  <tr>
@@ -58,24 +85,40 @@ These are the scopes created for each model's attribute.
58
85
  <th>Description</th>
59
86
  </tr>
60
87
  <tr>
61
- <td>by_attribute</td>
62
- <td>Returns records ordered by `attribute` in descending order</td>
88
+ <td>by_{attribute}</td>
89
+ <td>Records ordered by attribute in descending order.</td>
63
90
  </tr>
64
91
  <tr>
65
- <td>asc_by_attribute</td>
66
- <td>Returns records ordered by `attribute` in ascending order</td>
92
+ <td>asc_{by_attribute}</td>
93
+ <td>Records ordered by attribute in ascending order.</td>
67
94
  </tr>
68
95
  <tr>
69
- <td>like_by_attribute</td>
70
- <td>Returns records, where attribute's value like a given term </td>
96
+ <td>like_by_{attribute}</td>
97
+ <td>Records, where attribute's value LIKE a given term.</td>
71
98
  </tr>
72
99
  <tr>
73
- <td>ilike_by_attribute</td>
74
- <td>Сase insensitive implementation of `like_by_attribute`</td>
100
+ <td>ilike_by_{attribute}</td>
101
+ <td>Сase insensitive implementation of `like_by_{attribute}`.</td>
102
+ </tr>
103
+ <tr>
104
+ <td>{attribute}_more</td>
105
+ <td>Records with attribute's value greater than a given value.</td>
106
+ </tr>
107
+ <tr>
108
+ <td>{attribute}_less</td>
109
+ <td>Records with attribute's value less than a given value.</td>
110
+ </tr>
111
+ <tr>
112
+ <td>{attribute}_more_or_equal</td>
113
+ <td>Records with attribute's value greater or equal than a given value.</td>
114
+ </tr>
115
+ <tr>
116
+ <td>{attribute}_less_or_equal</td>
117
+ <td>Records with attribute's value less or equal than a given value.</td>
75
118
  </tr>
76
119
  </table>
77
120
 
78
- ### Example
121
+ ### Examples
79
122
 
80
123
  Now, it is time to play with our model!
81
124
 
@@ -112,8 +155,16 @@ Now, it is time to play with our model!
112
155
 
113
156
  ## Contributing
114
157
 
115
- 1. Fork it
116
- 2. Create your feature branch (`git checkout -b my-new-feature`)
117
- 3. Commit your changes (`git commit -am 'Added some feature'`)
118
- 4. Push to the branch (`git push origin my-new-feature`)
119
- 5. Create new Pull Request
158
+ Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.
159
+
160
+ ## Credits
161
+
162
+ Maintained by kaize.
163
+
164
+ Thank you to all our amazing [contributors](http://github.com/kaize/usefull_scopes/contributors)!
165
+
166
+ ## License
167
+
168
+ usefull_scopes is Copyright © 2012-2014 kaize. It is free
169
+ software, and may be redistributed under the terms specified in the LICENSE
170
+ file.
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
-
3
2
  require 'rake/testtask'
4
3
 
5
4
  Rake::TestTask.new do |t|
@@ -1,9 +1,10 @@
1
+ require 'active_support/concern'
2
+
1
3
  module UsefullScopes
2
- autoload :Version, 'usefull_scopes/version'
3
4
  extend ActiveSupport::Concern
4
5
 
5
6
  included do
6
- scope :random, order("RANDOM()")
7
+ scope :random, -> { order("RANDOM()") }
7
8
 
8
9
  scope :exclude, ->(collection_or_object) {
9
10
  collection = Array(collection_or_object)
@@ -96,7 +97,7 @@ module UsefullScopes
96
97
  when Hash
97
98
  hash_or_object
98
99
  when Array
99
-
100
+
100
101
  else
101
102
  raise TypeError, "Hash or AR object is expected"
102
103
  end
@@ -114,9 +115,9 @@ module UsefullScopes
114
115
  attribute_names.each do |a|
115
116
  a = a.to_sym
116
117
 
117
- scope "by_#{a}", order(arel_table[a].desc)
118
+ scope "by_#{a}", -> { order(arel_table[a].desc) }
118
119
 
119
- scope "asc_by_#{a}", order(arel_table[a].asc)
120
+ scope "asc_by_#{a}", -> { order(arel_table[a].asc) }
120
121
 
121
122
  scope "like_by_#{a}", ->(term) {
122
123
  quoted_term = connection.quote(term + '%')
@@ -1,3 +1,3 @@
1
1
  module UsefullScopes
2
- VERSION = "0.2.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -0,0 +1,658 @@
1
+ require 'test_helper'
2
+
3
+ class ScopesTest < TestCase
4
+ def setup
5
+ 3.times { create :model }
6
+ @model = Model.first
7
+ end
8
+
9
+ def test_random_order_condition
10
+ random_request = Model.random
11
+
12
+ request_arel = random_request.arel
13
+ order = request_arel.order
14
+ order_conditions = order.orders
15
+
16
+ assert_includes order_conditions, "RANDOM()"
17
+ end
18
+
19
+ def test_random_sql
20
+ random_request = Model.random
21
+
22
+ assert_equal "SELECT \"models\".* FROM \"models\" ORDER BY RANDOM()", random_request.to_sql
23
+ end
24
+
25
+ def test_exclude_result
26
+ @models = Model.exclude(@model)
27
+
28
+ models_count = Model.count - 1
29
+
30
+ assert_equal models_count, @models.count
31
+ end
32
+
33
+ def test_exclude_conditions
34
+ @models = Model.exclude(@model)
35
+
36
+ wheres = @models.arel.constraints
37
+
38
+ assert_equal 1, wheres.count
39
+
40
+ grouping = wheres.first.children.first
41
+ assert_kind_of Arel::Nodes::NotIn, grouping.expr
42
+ end
43
+
44
+ def test_with_result
45
+ @models = Model.with({field_1: @model.field_1})
46
+
47
+ assert @models
48
+
49
+ assert_includes @models, @model
50
+ end
51
+
52
+ def test_with_conditions
53
+ @models = Model.with({field_1: @model.field_1})
54
+
55
+ wheres = @models.arel.constraints
56
+
57
+ assert wheres.any?
58
+
59
+ wheres.each do |w|
60
+ equality = w.children.first
61
+ assert_kind_of Arel::Nodes::Equality, equality
62
+ end
63
+ end
64
+
65
+ def test_with_incorrect_params
66
+ begin
67
+ @models = Model.with("field_1 = #{@model.field_1}")
68
+ rescue Exception => e
69
+ assert_equal "Hash is expected", e.message
70
+ end
71
+ end
72
+
73
+ def test_without_result
74
+ @models = Model.without({field_1: @model.field_1})
75
+
76
+ assert @models
77
+
78
+ refute @models.include?(@model)
79
+ end
80
+
81
+ def test_without_conditions
82
+ @models = Model.without({field_1: @model.field_1})
83
+
84
+ wheres = @models.arel.constraints
85
+
86
+ assert wheres.any?
87
+
88
+ wheres.each do |w|
89
+ grouping = w.children.first
90
+
91
+ assert_kind_of Arel::Nodes::Grouping, grouping
92
+ grouping.expr.children.each do |grouping_part|
93
+ assert_kind_of Arel::Nodes::NotIn, grouping_part
94
+
95
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
96
+
97
+ assert_equal :field_1, grouping_part.left.name
98
+ assert_equal 1, grouping_part.right
99
+ end
100
+ end
101
+ end
102
+
103
+ def test_without_incorrect_params
104
+ begin
105
+ @models = Model.without("field_1 = #{@model.field_1}")
106
+ rescue Exception => e
107
+ assert_equal "Hash is expected", e.message
108
+ end
109
+ end
110
+
111
+ def test_like_by_result
112
+
113
+ assert_respond_to Model, :like_by_field_2
114
+
115
+ @models = Model.like_by_field_2(@model.field_2[0..3])
116
+
117
+ assert @models.any?
118
+ assert_includes @models, @model
119
+ end
120
+
121
+ def test_like_by_condition
122
+ @models = Model.like_by_field_2(@model.field_2[0..3])
123
+
124
+ wheres = @models.arel.constraints
125
+
126
+ assert wheres.any?
127
+
128
+ wheres.each do |w|
129
+ grouping = w.children.first
130
+ assert_kind_of Arel::Nodes::Grouping, grouping
131
+ assert grouping.expr.match "like"
132
+ end
133
+ end
134
+
135
+ def test_ilike_by_result
136
+ assert_respond_to Model, :ilike_by_field_2
137
+
138
+ @models = Model.ilike_by_field_2(@model.field_2[0..3])
139
+
140
+ assert @models.any?
141
+ assert_includes @models, @model
142
+ end
143
+
144
+ def test_ilike_by_condition
145
+ @models = Model.ilike_by_field_2(@model.field_2[0..3])
146
+
147
+
148
+ wheres = @models.arel.constraints
149
+
150
+ assert wheres.any?
151
+
152
+ wheres.each do |w|
153
+ grouping = w.children.first
154
+ assert_kind_of Arel::Nodes::Grouping, grouping
155
+ assert_kind_of Arel::Nodes::Matches, grouping.expr
156
+
157
+ assert_kind_of Arel::Attributes::Attribute, grouping.expr.left
158
+ assert_equal :field_2, grouping.expr.left.name
159
+ assert_equal "stri%", grouping.expr.right
160
+ end
161
+ end
162
+
163
+ def test_desc_by_result
164
+ assert_respond_to Model, :desc_by
165
+
166
+ @models = Model.desc_by(:field_1)
167
+
168
+ assert @models.any?
169
+ end
170
+
171
+ def test_desc_by_condition_array_attrs
172
+ attrs = [:field_1, :field_2]
173
+
174
+ @models = Model.desc_by(attrs)
175
+
176
+ arel = @models.arel
177
+ orders_conditions = arel.orders
178
+
179
+ assert orders_conditions.any?
180
+
181
+ orders_conditions.each_with_index do |condition, index|
182
+ assert_kind_of Arel::Nodes::Descending, condition
183
+ assert_kind_of Arel::Attributes::Attribute, condition.expr
184
+
185
+ assert_equal attrs[index], condition.expr.name
186
+ end
187
+ end
188
+
189
+ def test_desc_by_condition
190
+ @models = Model.desc_by(:field_1)
191
+
192
+ arel = @models.arel
193
+ orders_conditions = arel.orders
194
+
195
+ assert orders_conditions.any?
196
+
197
+ orders_conditions.each do |condition|
198
+ assert_kind_of Arel::Nodes::Descending, condition
199
+ assert_kind_of Arel::Attributes::Attribute, condition.expr
200
+
201
+ assert_equal :field_1, condition.expr.name
202
+ end
203
+ end
204
+
205
+ def test_desc_by_incorrect_params
206
+ begin
207
+ @models = Model.desc_by("field_1")
208
+ rescue Exception => e
209
+ assert_equal "Symbol or Array of symbols is expected", e.message
210
+ end
211
+ end
212
+
213
+ def test_asc_by_result
214
+ assert_respond_to Model, :asc_by
215
+
216
+ @models = Model.asc_by(:field_1)
217
+
218
+ assert @models.any?
219
+ end
220
+
221
+ def test_asc_by_condition_array_attrs
222
+ attrs = [:field_1, :field_2]
223
+
224
+ @models = Model.asc_by(attrs)
225
+
226
+ arel = @models.arel
227
+ orders_conditions = arel.orders
228
+
229
+ assert orders_conditions.any?
230
+
231
+ orders_conditions.each_with_index do |condition, index|
232
+ assert_kind_of Arel::Nodes::Ascending, condition
233
+ assert_kind_of Arel::Attributes::Attribute, condition.expr
234
+
235
+ assert_equal attrs[index], condition.expr.name
236
+ end
237
+ end
238
+
239
+ def test_asc_by_condition
240
+ @models = Model.asc_by(:field_1)
241
+
242
+ arel = @models.arel
243
+ orders_conditions = arel.orders
244
+
245
+ assert orders_conditions.any?
246
+
247
+ orders_conditions.each do |condition|
248
+ assert_kind_of Arel::Nodes::Ascending, condition
249
+ assert_kind_of Arel::Attributes::Attribute, condition.expr
250
+
251
+ assert_equal :field_1, condition.expr.name
252
+ end
253
+ end
254
+
255
+ def test_asc_by_incorrect_params
256
+ begin
257
+ @models = Model.asc_by("field_1")
258
+ rescue Exception => e
259
+ assert_equal "Symbol or Array of symbols is expected", e.message
260
+ end
261
+ end
262
+
263
+ def test_field_more_than_value_by_result
264
+ @model_less = create :model
265
+ @model_more = create :model, field_1: @model_less.field_1 + 1
266
+
267
+ @models = Model.field_1_more(@model_less.field_1)
268
+
269
+ assert @models.any?
270
+ assert @models.include?(@model_more)
271
+ refute @models.include?(@model_less)
272
+ end
273
+
274
+ def test_field_more_than_object_by_result
275
+ @model_less = create :model
276
+ @model_more = create :model, field_1: @model_less.field_1 + 1
277
+
278
+ @models = Model.field_1_more(@model_less)
279
+
280
+ assert @models.any?
281
+ assert @models.include?(@model_more)
282
+ refute @models.include?(@model_less)
283
+ end
284
+
285
+ def test_field_more_by_condition
286
+ @models = Model.field_1_more(@model.field_1)
287
+
288
+ wheres = @models.arel.constraints
289
+
290
+ assert wheres.any?
291
+
292
+ wheres.each do |w|
293
+ grouping = w.children.first
294
+ assert_kind_of Arel::Nodes::Grouping, grouping
295
+ assert_kind_of Arel::Nodes::GreaterThan, grouping.expr
296
+ assert_equal @model.field_1, grouping.expr.right
297
+ end
298
+ end
299
+
300
+ def test_field_less_than_value_by_result
301
+ @model_less = create :model
302
+ @model_more = create :model, field_1: @model_less.field_1 + 1
303
+
304
+ @models = Model.field_1_less(@model_more.field_1)
305
+
306
+ assert @models.any?
307
+ assert @models.include?(@model_less)
308
+ refute @models.include?(@model_more)
309
+ end
310
+
311
+ def test_field_less_than_object_by_result
312
+ @model_less = create :model
313
+ @model_more = create :model, field_1: @model_less.field_1 + 1
314
+
315
+ @models = Model.field_1_less(@model_more)
316
+
317
+ assert @models.any?
318
+ assert @models.include?(@model_less)
319
+ refute @models.include?(@model_more)
320
+ end
321
+
322
+ def test_field_less_by_condition
323
+ @models = Model.field_1_less(@model.field_1)
324
+
325
+ wheres = @models.arel.constraints
326
+
327
+ assert wheres.any?
328
+
329
+ wheres.each do |w|
330
+ grouping = w.children.first
331
+ assert_kind_of Arel::Nodes::Grouping, grouping
332
+ assert_kind_of Arel::Nodes::LessThan, grouping.expr
333
+ assert_equal @model.field_1, grouping.expr.right
334
+ end
335
+ end
336
+
337
+ def test_field_more_or_equal_than_value_by_result
338
+ @model_less = create :model
339
+ @model_more = create :model, field_1: @model_less.field_1 + 1
340
+
341
+ @models = Model.field_1_more_or_equal(@model_more.field_1)
342
+
343
+ assert @models.any?
344
+ assert @models.include?(@model_more)
345
+ refute @models.include?(@model_less)
346
+ end
347
+
348
+ def test_field_more_or_equal_than_object_by_result
349
+ @model_less = create :model
350
+ @model_more = create :model, field_1: @model_less.field_1 + 1
351
+
352
+ @models = Model.field_1_more_or_equal(@model_more)
353
+
354
+ assert @models.any?
355
+ assert @models.include?(@model_more)
356
+ refute @models.include?(@model_less)
357
+ end
358
+
359
+ def test_field_more_or_equal_by_condition
360
+ @models = Model.field_1_more_or_equal(@model.field_1)
361
+
362
+ wheres = @models.arel.constraints
363
+
364
+ assert wheres.any?
365
+
366
+ wheres.each do |w|
367
+ grouping = w.children.first
368
+ assert_kind_of Arel::Nodes::Grouping, grouping
369
+ assert_kind_of Arel::Nodes::GreaterThanOrEqual, grouping.expr
370
+ assert_equal @model.field_1, grouping.expr.right
371
+ end
372
+ end
373
+
374
+ def test_field_less_or_equal_than_value_by_result
375
+ @model_less = create :model
376
+ @model_more = create :model, field_1: @model_less.field_1 + 1
377
+
378
+ @models = Model.field_1_less_or_equal(@model_less.field_1)
379
+
380
+ assert @models.any?
381
+ assert @models.include?(@model_less)
382
+ refute @models.include?(@model_more)
383
+ end
384
+
385
+ def test_field_less_or_equal_than_object_by_result
386
+ @model_less = create :model
387
+ @model_more = create :model, field_1: @model_less.field_1 + 1
388
+
389
+ @models = Model.field_1_less_or_equal(@model_less)
390
+
391
+ assert @models.any?
392
+ assert @models.include?(@model_less)
393
+ refute @models.include?(@model_more)
394
+ end
395
+ def test_field_less_or_equal_by_condition
396
+ @models = Model.field_1_less_or_equal(@model.field_1)
397
+
398
+ wheres = @models.arel.constraints
399
+
400
+ assert wheres.any?
401
+
402
+ wheres.each do |w|
403
+ grouping = w.children.first
404
+ assert_kind_of Arel::Nodes::Grouping, grouping
405
+ assert_kind_of Arel::Nodes::LessThanOrEqual, grouping.expr
406
+ assert_equal @model.field_1, grouping.expr.right
407
+ end
408
+ end
409
+
410
+ def test_more_than_result
411
+ @model = Model.last
412
+
413
+ @models = Model.more_than({field_1: 1})
414
+
415
+ assert @models.any?
416
+ assert @models.include?(@model)
417
+ end
418
+
419
+ def test_more_than_condition_value
420
+ @models = Model.more_than({field_1: 1})
421
+
422
+ wheres = @models.arel.constraints
423
+
424
+ assert wheres.any?
425
+
426
+ wheres.each do |w|
427
+ grouping = w.children.first
428
+
429
+ assert_kind_of Arel::Nodes::Grouping, grouping
430
+ grouping.expr.children.each do |grouping_part|
431
+ assert_kind_of Arel::Nodes::GreaterThan, grouping_part
432
+
433
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
434
+
435
+ assert_equal :field_1, grouping_part.left.name
436
+ assert_equal 1, grouping_part.right
437
+ end
438
+ end
439
+ end
440
+
441
+ def test_more_than_condition_ar_object
442
+ @models = Model.more_than(@model)
443
+
444
+ wheres = @models.arel.constraints
445
+
446
+ assert wheres.any?
447
+
448
+ wheres.each do |w|
449
+ grouping = w.children.first
450
+
451
+ assert_kind_of Arel::Nodes::Grouping, grouping
452
+ grouping.expr.children.each do |grouping_part|
453
+ assert_kind_of Arel::Nodes::GreaterThan, grouping_part
454
+
455
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
456
+
457
+ assert_equal :id, grouping_part.left.name
458
+ assert_equal 1, grouping_part.right
459
+ end
460
+ end
461
+ end
462
+
463
+ def test_more_than_incorrect_params
464
+ begin
465
+ @models = Model.more_than("field_1")
466
+ rescue Exception => e
467
+ assert_equal "Hash or AR object is expected", e.message
468
+ end
469
+ end
470
+
471
+ def test_less_than_result
472
+ @model_first = Model.first
473
+ @model_last = Model.last
474
+
475
+ @models = Model.less_than({field_1: @model_last.field_1})
476
+
477
+ assert @models.any?
478
+ assert @models.include?(@model_first)
479
+ end
480
+
481
+ def test_less_than_condition_value
482
+ @models = Model.less_than({field_1: 1})
483
+
484
+ wheres = @models.arel.constraints
485
+
486
+ assert wheres.any?
487
+
488
+ wheres.each do |w|
489
+ grouping = w.children.first
490
+
491
+ assert_kind_of Arel::Nodes::Grouping, grouping
492
+ grouping.expr.children.each do |grouping_part|
493
+ assert_kind_of Arel::Nodes::LessThan, grouping_part
494
+
495
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
496
+
497
+ assert_equal :field_1, grouping_part.left.name
498
+ assert_equal 1, grouping_part.right
499
+ end
500
+ end
501
+ end
502
+
503
+ def test_less_than_condition_ar_object
504
+ @models = Model.less_than(@model)
505
+
506
+ wheres = @models.arel.constraints
507
+
508
+ assert wheres.any?
509
+
510
+ wheres.each do |w|
511
+ grouping = w.children.first
512
+
513
+ assert_kind_of Arel::Nodes::Grouping, grouping
514
+ grouping.expr.children.each do |grouping_part|
515
+ assert_kind_of Arel::Nodes::LessThan, grouping_part
516
+
517
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
518
+
519
+ assert_equal :id, grouping_part.left.name
520
+ assert_equal 1, grouping_part.right
521
+ end
522
+ end
523
+ end
524
+
525
+ def test_less_than_incorrect_params
526
+ begin
527
+ @models = Model.less_than("field_1")
528
+ rescue Exception => e
529
+ assert_equal "Hash or AR object is expected", e.message
530
+ end
531
+ end
532
+
533
+ def test_more_or_equal_result
534
+ @model_first = Model.first
535
+ @model_last = Model.last
536
+
537
+ @models = Model.more_or_equal({field_1: @model_last.field_1})
538
+
539
+ assert @models.any?
540
+ assert @models.include?(@model_last)
541
+ assert_equal @models.count, 1
542
+ end
543
+
544
+ def test_more_or_equal_condition_value
545
+ @models = Model.more_or_equal({field_1: 1})
546
+
547
+ wheres = @models.arel.constraints
548
+
549
+ assert wheres.any?
550
+
551
+ wheres.each do |w|
552
+ grouping = w.children.first
553
+
554
+ assert_kind_of Arel::Nodes::Grouping, grouping
555
+ grouping.expr.children.each do |grouping_part|
556
+ assert_kind_of Arel::Nodes::GreaterThanOrEqual, grouping_part
557
+
558
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
559
+
560
+ assert_equal :field_1, grouping_part.left.name
561
+ assert_equal 1, grouping_part.right
562
+ end
563
+ end
564
+ end
565
+
566
+ def test_more_or_equal_condition_ar_object
567
+ @models = Model.more_or_equal(@model)
568
+
569
+ wheres = @models.arel.constraints
570
+
571
+ assert wheres.any?
572
+
573
+ wheres.each do |w|
574
+ grouping = w.children.first
575
+
576
+ assert_kind_of Arel::Nodes::Grouping, grouping
577
+ grouping.expr.children.each do |grouping_part|
578
+ assert_kind_of Arel::Nodes::GreaterThanOrEqual, grouping_part
579
+
580
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
581
+
582
+ assert_equal :id, grouping_part.left.name
583
+ assert_equal 1, grouping_part.right
584
+ end
585
+ end
586
+ end
587
+
588
+ def test_more_or_equal_incorrect_params
589
+ begin
590
+ @models = Model.more_or_equal("field_1")
591
+ rescue Exception => e
592
+ assert_equal "Hash or AR object is expected", e.message
593
+ end
594
+ end
595
+
596
+ def test_less_or_equal_result
597
+ @model_first = Model.first
598
+ @model_last = Model.last
599
+
600
+ @models = Model.less_or_equal({field_1: @model_first.field_1})
601
+
602
+ assert @models.any?
603
+ assert @models.include?(@model_first)
604
+ assert_equal @models.count, 1
605
+ end
606
+
607
+ def test_less_or_equal_condition_value
608
+ @models = Model.less_or_equal({field_1: 1})
609
+
610
+ wheres = @models.arel.constraints
611
+
612
+ assert wheres.any?
613
+
614
+ wheres.each do |w|
615
+ grouping = w.children.first
616
+
617
+ assert_kind_of Arel::Nodes::Grouping, grouping
618
+ grouping.expr.children.each do |grouping_part|
619
+ assert_kind_of Arel::Nodes::LessThanOrEqual, grouping_part
620
+
621
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
622
+
623
+ assert_equal :field_1, grouping_part.left.name
624
+ assert_equal 1, grouping_part.right
625
+ end
626
+ end
627
+ end
628
+
629
+ def test_less_or_equal_condition_ar_object
630
+ @models = Model.less_or_equal(@model)
631
+
632
+ wheres = @models.arel.constraints
633
+
634
+ assert wheres.any?
635
+
636
+ wheres.each do |w|
637
+ grouping = w.children.first
638
+
639
+ assert_kind_of Arel::Nodes::Grouping, grouping
640
+ grouping.expr.children.each do |grouping_part|
641
+ assert_kind_of Arel::Nodes::LessThanOrEqual, grouping_part
642
+
643
+ assert_kind_of Arel::Attributes::Attribute, grouping_part.left
644
+
645
+ assert_equal :id, grouping_part.left.name
646
+ assert_equal 1, grouping_part.right
647
+ end
648
+ end
649
+ end
650
+
651
+ def test_less_or_equal_incorrect_params
652
+ begin
653
+ @models = Model.less_or_equal("field_1")
654
+ rescue Exception => e
655
+ assert_equal "Hash or AR object is expected", e.message
656
+ end
657
+ end
658
+ end