trailblazer-finder 0.1.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop-https---raw-githubusercontent-com-trailblazer-meta-master-rubocop-yml +101 -0
  4. data/.rubocop.yml +3 -43
  5. data/.rubocop_todo.yml +42 -196
  6. data/.travis.yml +5 -8
  7. data/Gemfile +2 -2
  8. data/LICENSE.txt +7 -21
  9. data/README.md +177 -292
  10. data/Rakefile +12 -12
  11. data/lib/trailblazer/finder.rb +48 -23
  12. data/lib/trailblazer/finder/activity/find.rb +57 -0
  13. data/lib/trailblazer/finder/activity/prepare.rb +29 -0
  14. data/lib/trailblazer/finder/activity/prepare/adapters.rb +66 -0
  15. data/lib/trailblazer/finder/activity/prepare/entity.rb +32 -0
  16. data/lib/trailblazer/finder/activity/prepare/filters.rb +36 -0
  17. data/lib/trailblazer/finder/activity/prepare/paging.rb +49 -0
  18. data/lib/trailblazer/finder/activity/prepare/params.rb +33 -0
  19. data/lib/trailblazer/finder/activity/prepare/properties.rb +47 -0
  20. data/lib/trailblazer/finder/activity/prepare/sorting.rb +57 -0
  21. data/lib/trailblazer/finder/activity/process.rb +18 -0
  22. data/lib/trailblazer/finder/activity/process/adapters.rb +48 -0
  23. data/lib/trailblazer/finder/activity/process/filters.rb +28 -0
  24. data/lib/trailblazer/finder/activity/process/paging.rb +26 -0
  25. data/lib/trailblazer/finder/activity/process/predicates.rb +30 -0
  26. data/lib/trailblazer/finder/activity/process/sorting.rb +26 -0
  27. data/lib/trailblazer/finder/adapters/active_record/paging.rb +9 -8
  28. data/lib/trailblazer/finder/adapters/active_record/predicates.rb +78 -17
  29. data/lib/trailblazer/finder/adapters/active_record/sorting.rb +14 -12
  30. data/lib/trailblazer/finder/adapters/basic/paging.rb +21 -0
  31. data/lib/trailblazer/finder/adapters/basic/predicates.rb +115 -0
  32. data/lib/trailblazer/finder/adapters/basic/sorting.rb +40 -0
  33. data/lib/trailblazer/finder/adapters/kaminari/paging.rb +21 -0
  34. data/lib/trailblazer/finder/adapters/sequel/paging.rb +9 -8
  35. data/lib/trailblazer/finder/adapters/sequel/predicates.rb +78 -17
  36. data/lib/trailblazer/finder/adapters/sequel/sorting.rb +17 -15
  37. data/lib/trailblazer/finder/adapters/will_paginate/paging.rb +21 -0
  38. data/lib/trailblazer/finder/base.rb +20 -83
  39. data/lib/trailblazer/finder/dsl.rb +56 -0
  40. data/lib/trailblazer/finder/find.rb +28 -15
  41. data/lib/trailblazer/finder/helpers/basic.rb +44 -0
  42. data/lib/trailblazer/finder/helpers/sorting.rb +54 -0
  43. data/lib/trailblazer/finder/utils/array.rb +20 -0
  44. data/lib/trailblazer/finder/utils/extra.rb +10 -20
  45. data/lib/trailblazer/finder/utils/hash.rb +36 -0
  46. data/lib/trailblazer/finder/utils/splitter.rb +16 -17
  47. data/lib/trailblazer/finder/utils/string.rb +20 -10
  48. data/lib/trailblazer/finder/version.rb +3 -1
  49. data/lib/trailblazer/operation/finder.rb +20 -19
  50. data/spec/spec_helper.rb +5 -11
  51. data/spec/spec_helper_active_record.rb +11 -12
  52. data/spec/spec_helper_sequel.rb +4 -4
  53. data/spec/spec_helper_will_paginate.rb +13 -0
  54. data/spec/trailblazer/finder/adapters/active_record_spec.rb +267 -0
  55. data/spec/trailblazer/finder/adapters/basic_spec.rb +251 -0
  56. data/spec/trailblazer/finder/adapters/kaminari_spec.rb +78 -32
  57. data/spec/trailblazer/finder/adapters/sequel_spec.rb +267 -0
  58. data/spec/trailblazer/finder/adapters/will_paginate_spec.rb +81 -40
  59. data/spec/trailblazer/finder/base_spec.rb +292 -204
  60. data/spec/trailblazer/finder/dsl_spec.rb +213 -0
  61. data/spec/trailblazer/finder/utils/hash_spec.rb +26 -0
  62. data/spec/trailblazer/finder/utils/splitter_spec.rb +39 -0
  63. data/spec/trailblazer/finder/utils/string_spec.rb +52 -9
  64. data/spec/trailblazer/operation/finder_spec.rb +35 -32
  65. data/trailblazer-finder.gemspec +31 -30
  66. metadata +119 -137
  67. data/lib/trailblazer/finder/adapters.rb +0 -26
  68. data/lib/trailblazer/finder/adapters/active_record.rb +0 -32
  69. data/lib/trailblazer/finder/adapters/data_mapper.rb +0 -32
  70. data/lib/trailblazer/finder/adapters/data_mapper/paging.rb +0 -20
  71. data/lib/trailblazer/finder/adapters/data_mapper/predicates.rb +0 -42
  72. data/lib/trailblazer/finder/adapters/data_mapper/sorting.rb +0 -38
  73. data/lib/trailblazer/finder/adapters/friendly_id.rb +0 -31
  74. data/lib/trailblazer/finder/adapters/kaminari.rb +0 -18
  75. data/lib/trailblazer/finder/adapters/sequel.rb +0 -32
  76. data/lib/trailblazer/finder/adapters/will_paginate.rb +0 -18
  77. data/lib/trailblazer/finder/errors/block_ignored.rb +0 -11
  78. data/lib/trailblazer/finder/errors/invalid_defined_by_value.rb +0 -11
  79. data/lib/trailblazer/finder/errors/invalid_number.rb +0 -16
  80. data/lib/trailblazer/finder/errors/missing_entity_type.rb +0 -11
  81. data/lib/trailblazer/finder/errors/with_ignored.rb +0 -11
  82. data/lib/trailblazer/finder/features.rb +0 -23
  83. data/lib/trailblazer/finder/features/paging.rb +0 -55
  84. data/lib/trailblazer/finder/features/predicate.rb +0 -32
  85. data/lib/trailblazer/finder/features/sorting.rb +0 -108
  86. data/lib/trailblazer/finder/filter.rb +0 -66
  87. data/lib/trailblazer/finder/predicates.rb +0 -39
  88. data/lib/trailblazer/finder/utils/deep_locate.rb +0 -30
  89. data/lib/trailblazer/finder/utils/params.rb +0 -28
  90. data/lib/trailblazer/finder/utils/parse.rb +0 -25
  91. data/spec/spec_helper_data_mapper.rb +0 -35
  92. data/spec/support/paging_shared_example.rb +0 -65
  93. data/spec/support/sorting_shared_example.rb +0 -125
  94. data/spec/trailblazer/finder/adapters/active_record/base_spec.rb +0 -112
  95. data/spec/trailblazer/finder/adapters/active_record/paging_spec.rb +0 -64
  96. data/spec/trailblazer/finder/adapters/active_record/predicates_spec.rb +0 -101
  97. data/spec/trailblazer/finder/adapters/active_record/sorting_spec.rb +0 -99
  98. data/spec/trailblazer/finder/adapters/data_mapper/base_spec.rb +0 -112
  99. data/spec/trailblazer/finder/adapters/data_mapper/paging_spec.rb +0 -64
  100. data/spec/trailblazer/finder/adapters/data_mapper/predicates_spec.rb +0 -100
  101. data/spec/trailblazer/finder/adapters/data_mapper/sorting_spec.rb +0 -97
  102. data/spec/trailblazer/finder/adapters/friendly_id_spec.rb +0 -46
  103. data/spec/trailblazer/finder/adapters/sequel/base_spec.rb +0 -125
  104. data/spec/trailblazer/finder/adapters/sequel/paging_spec.rb +0 -64
  105. data/spec/trailblazer/finder/adapters/sequel/predicates_spec.rb +0 -89
  106. data/spec/trailblazer/finder/adapters/sequel/sorting_spec.rb +0 -110
  107. data/spec/trailblazer/finder/adapters_spec.rb +0 -110
  108. data/spec/trailblazer/finder/features/paging_spec.rb +0 -104
  109. data/spec/trailblazer/finder/features/predicates_spec.rb +0 -99
  110. data/spec/trailblazer/finder/features/sorting_spec.rb +0 -96
  111. data/spec/trailblazer/finder/features_spec.rb +0 -55
  112. data/spec/trailblazer/finder/filter_spec.rb +0 -133
  113. data/spec/trailblazer/finder/find_spec.rb +0 -72
  114. data/spec/trailblazer/finder/utils/extra_spec.rb +0 -41
  115. data/spec/trailblazer/finder/utils/params_spec.rb +0 -39
  116. data/spec/trailblazer/finder/utils/parse_spec.rb +0 -33
  117. data/spec/trailblazer/operation/paging_spec.rb +0 -68
  118. data/spec/trailblazer/operation/predicates_spec.rb +0 -127
  119. data/spec/trailblazer/operation/sorting_spec.rb +0 -80
  120. data/spec/trailblazer/test_spec.rb +0 -41
data/spec/spec_helper.rb CHANGED
@@ -1,16 +1,10 @@
1
- require 'bundler/setup'
2
- require 'simplecov'
3
- SimpleCov.start do
4
- add_group 'Trailblazer-Finder', 'lib'
5
- add_group 'Tests', 'spec'
6
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "pry-byebug"
7
5
 
8
6
  RSpec.configure do |config|
9
7
  config.expect_with(:rspec) { |c| c.syntax = :expect }
10
8
  end
11
9
 
12
- # require 'coveralls'
13
- # Coveralls.wear!
14
-
15
- require_relative 'support/sorting_shared_example'
16
- require 'trailblazer/finder'
10
+ require "trailblazer/finder"
@@ -1,8 +1,9 @@
1
- require_relative 'spec_helper'
2
- require_relative 'support/paging_shared_example'
3
- require 'active_record'
1
+ # frozen_string_literal: true
4
2
 
5
- ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
3
+ require_relative "spec_helper"
4
+ require "active_record"
5
+
6
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
6
7
 
7
8
  ActiveRecord::Schema.define do
8
9
  self.verbose = false
@@ -35,14 +36,12 @@ module ActiveRecord
35
36
  class Base
36
37
  def self.reset_pk_sequence
37
38
  case ActiveRecord::Base.connection.adapter_name
38
- when 'SQLite'
39
- new_max = maximum(primary_key) || 0
40
- update_seq_sql = "update sqlite_sequence set seq = #{new_max} where name = '#{table_name}';"
41
- ActiveRecord::Base.connection.execute(update_seq_sql)
42
- when 'PostgreSQL'
43
- ActiveRecord::Base.connection.reset_pk_sequence!(table_name)
44
- else
45
- raise 'Task not implemented for this DB adapter'
39
+ when "SQLite"
40
+ new_max = maximum(primary_key) || 0
41
+ update_seq_sql = "update sqlite_sequence set seq = #{new_max} where name = '#{table_name}';"
42
+ ActiveRecord::Base.connection.execute(update_seq_sql)
43
+ else
44
+ exit(1)
46
45
  end
47
46
  end
48
47
  end
@@ -1,7 +1,7 @@
1
- require_relative 'spec_helper'
2
- require_relative 'support/paging_shared_example'
3
- require_relative 'support/sorting_shared_example'
4
- require 'sequel'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "spec_helper"
4
+ require "sequel"
5
5
  Sequel::Model.plugin :timestamps
6
6
 
7
7
  DB = Sequel.sqlite
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ if defined?(WillPaginate)
4
+ module WillPaginate
5
+ module ActiveRecord
6
+ module RelationMethods
7
+ def per(value = nil)
8
+ per_page(value)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,267 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper_active_record"
4
+
5
+ module Trailblazer
6
+ class Finder
7
+ module Adapters
8
+ describe ActiveRecord do
9
+ after do
10
+ Product.delete_all
11
+ Product.reset_pk_sequence
12
+ end
13
+
14
+ def define_finder_class(&block)
15
+ Class.new(Trailblazer::Finder) do
16
+ adapters ActiveRecord
17
+ entity { Product }
18
+
19
+ class_eval(&block)
20
+ end
21
+ end
22
+
23
+ def finder_class(&block)
24
+ define_finder_class do
25
+ class_eval(&block) unless block.nil?
26
+ end
27
+ end
28
+
29
+ def new_finder(filter = {}, &block)
30
+ finder_class(&block).new params: filter
31
+ end
32
+
33
+ describe "#property" do
34
+ it "sets the property and works with eq predicate" do
35
+ 10.times { |i| Product.create name: "product_#{i}" }
36
+ finder = new_finder name_eq: "product_2" do
37
+ property :name, type: Types::String
38
+ end
39
+
40
+ expect(finder.result.first.id).to eq 3
41
+ expect(finder.result.count).to eq 1
42
+ end
43
+
44
+ it "sets the property and works with not_eq predicate" do
45
+ 10.times { |i| Product.create name: "product_#{i}" }
46
+ finder = new_finder name_not_eq: "product_2" do
47
+ property :name, type: Types::String
48
+ end
49
+
50
+ expect(finder.result.count).to eq 9
51
+ end
52
+
53
+ it "sets the property and works with blank predicate" do
54
+ 9.times { |i| Product.create name: "product_#{i}" }
55
+ Product.create name: "", slug: "Blank Test"
56
+ finder = new_finder name_blank: true do
57
+ property :name, type: Types::String
58
+ end
59
+
60
+ expect(finder.result.count).to eq 1
61
+ expect(finder.result.first.slug).to eq "Blank Test"
62
+ expect(finder.result.first.id).to eq 10
63
+ end
64
+
65
+ it "sets the property and works with not blank predicate" do
66
+ 9.times { |i| Product.create name: "product_#{i}" }
67
+ Product.create name: "", slug: "Blank Test"
68
+ finder = new_finder name_not_blank: true do
69
+ property :name, type: Types::String
70
+ end
71
+
72
+ expect(finder.result.count).to eq 9
73
+ end
74
+
75
+ it "sets the property and works with gt (greater than) predicate" do
76
+ 10.times { |i| Product.create name: "product_#{i}" }
77
+ finder = new_finder id_gt: 3 do
78
+ property :id, type: Types::Integer
79
+ end
80
+
81
+ expect(finder.result.count).to eq 7
82
+ end
83
+
84
+ it "sets the property and works with gte (greater than or equal to) predicate" do
85
+ 10.times { |i| Product.create name: "product_#{i}" }
86
+ finder = new_finder id_gte: 3 do
87
+ property :id, type: Types::Integer
88
+ end
89
+
90
+ expect(finder.result.count).to eq 8
91
+ end
92
+
93
+ it "sets the property and works with lt (less than) predicate" do
94
+ 10.times { |i| Product.create name: "product_#{i}" }
95
+ finder = new_finder id_lt: 3 do
96
+ property :id, type: Types::Integer
97
+ end
98
+
99
+ expect(finder.result.count).to eq 2
100
+ end
101
+
102
+ it "sets the property and works with lte (less than or equal to) predicate" do
103
+ 10.times { |i| Product.create name: "product_#{i}" }
104
+ finder = new_finder id_lte: 3 do
105
+ property :id, type: Types::Integer
106
+ end
107
+
108
+ expect(finder.result.count).to eq 3
109
+ end
110
+
111
+ it "sets the property and works with cont predicate" do
112
+ 5.times { |i| Product.create name: "product_#{i}" }
113
+ 5.times { |i| Product.create name: "none_#{i}" }
114
+ finder = new_finder name_cont: "product" do
115
+ property :name, type: Types::String
116
+ end
117
+
118
+ expect(finder.result.first.id).to eq 1
119
+ expect(finder.result.count).to eq 5
120
+ end
121
+
122
+ it "sets the property and works with not_cont predicate" do
123
+ 5.times { |i| Product.create name: "product_#{i}" }
124
+ 5.times { |i| Product.create name: "none_#{i}" }
125
+ finder = new_finder name_not_cont: "product" do
126
+ property :name, type: Types::String
127
+ end
128
+
129
+ expect(finder.result.first.id).to eq 6
130
+ expect(finder.result.count).to eq 5
131
+ end
132
+
133
+ it "sets the property and works with sw predicate" do
134
+ 5.times { |i| Product.create name: "product_#{i}" }
135
+ 1.times { |i| Product.create name: "predicate_#{i}" }
136
+ 4.times { |i| Product.create name: "none_#{i}" }
137
+ finder = new_finder name_sw: "pr" do
138
+ property :name, type: Types::String
139
+ end
140
+
141
+ expect(finder.result.first.id).to eq 1
142
+ expect(finder.result.count).to eq 6
143
+ end
144
+
145
+ it "sets the property and works with not_sw predicate" do
146
+ 5.times { |i| Product.create name: "product_#{i}" }
147
+ 1.times { |i| Product.create name: "predicate_#{i}" }
148
+ 4.times { |i| Product.create name: "none_#{i}" }
149
+ finder = new_finder name_not_sw: "pr" do
150
+ property :name, type: Types::String
151
+ end
152
+
153
+ expect(finder.result.first.id).to eq 7
154
+ expect(finder.result.count).to eq 4
155
+ end
156
+
157
+ it "sets the property and works with ew predicate" do
158
+ 5.times { |i| Product.create name: "product_#{i}_end" }
159
+ 1.times { |i| Product.create name: "predicate_#{i}_endwow" }
160
+ 4.times { |i| Product.create name: "none_#{i}" }
161
+ finder = new_finder name_ew: "end" do
162
+ property :name, type: Types::String
163
+ end
164
+
165
+ expect(finder.result.first.id).to eq 1
166
+ expect(finder.result.count).to eq 5
167
+ end
168
+
169
+ it "sets the property and works with not_ew predicate" do
170
+ 5.times { |i| Product.create name: "product_#{i}_end" }
171
+ 1.times { |i| Product.create name: "predicate_#{i}_endwow" }
172
+ 4.times { |i| Product.create name: "none_#{i}" }
173
+ finder = new_finder name_not_ew: "end" do
174
+ property :name, type: Types::String
175
+ end
176
+
177
+ expect(finder.result.first.id).to eq 6
178
+ expect(finder.result.count).to eq 5
179
+ end
180
+ end
181
+
182
+ describe "#paging" do
183
+ it "sets the paging values and shows only the first page results" do
184
+ 10.times { |i| Product.create name: "product_#{i}" }
185
+ finder = new_finder do
186
+ paging per_page: 2, min_per_page: 1, max_per_page: 5
187
+ end
188
+
189
+ expect(finder.result.map { |n| n[:name] }).to eq %w[product_0 product_1]
190
+ end
191
+
192
+ it "accepts per_page as a parameter" do
193
+ 10.times { |i| Product.create name: "product_#{i}" }
194
+ finder = new_finder page: 2, per_page: 4 do
195
+ paging per_page: 5, min_per_page: 2, max_per_page: 8
196
+ end
197
+
198
+ expect(finder.result.first.id).to eq 5
199
+ expect(finder.result.map(&:id)).to eq [5, 6, 7, 8]
200
+ end
201
+
202
+ it "uses max_per_page in finder as maximum per_page" do
203
+ 10.times { |i| Product.create name: "product_#{i}" }
204
+ finder = new_finder page: 2, per_page: 9 do
205
+ paging per_page: 5, min_per_page: 2, max_per_page: 8
206
+ end
207
+
208
+ expect(finder.result.first.id).to eq 9
209
+ expect(finder.result.map(&:id)).to eq [9, 10]
210
+ end
211
+
212
+ it "uses min_per_page in finder as minimum per_page" do
213
+ 10.times { |i| Product.create name: "product_#{i}" }
214
+ finder = new_finder page: 2, per_page: 1 do
215
+ paging per_page: 5, min_per_page: 2, max_per_page: 8
216
+ end
217
+
218
+ expect(finder.result.first.id).to eq 3
219
+ expect(finder.result.map(&:id)).to eq [3, 4]
220
+ end
221
+ end
222
+
223
+ describe "#sorting" do
224
+ it "sets the property and works with eq predicate and sorting" do
225
+ 5.times { |i| Product.create name: "product_#{i}" }
226
+ 5.times { |_i| Product.create name: "product" }
227
+ finder = new_finder name_eq: "product", sort: "id desc" do
228
+ property :name, type: Types::String
229
+ property :id, type: Types::Integer, sortable: true
230
+ end
231
+
232
+ expect(finder.result.first.id).to eq 10
233
+ expect(finder.result.count).to eq 5
234
+ end
235
+
236
+ it "sets the property and sorts by multiple columns" do
237
+ 5.times { |i| Product.create name: "product_#{i}", slug: "slug #{i}" }
238
+ 5.times { |i| Product.create name: "product", slug: "slug #{i}" }
239
+ finder = new_finder sort: "name asc, slug desc" do
240
+ property :name, type: Types::String, sortable: true
241
+ property :slug, type: Types::String, sortable: true
242
+ property :id, type: Types::Integer, sortable: true
243
+ end
244
+
245
+ expect(finder.result.map { |n| n[:id] }).to eq [10, 9, 8, 7, 6, 1, 2, 3, 4, 5]
246
+ expect(finder.result.count).to eq 10
247
+ end
248
+ end
249
+
250
+ describe "Predicates, Paging and Sorting together" do
251
+ it "sets the property and works with eq predicate and paging" do
252
+ 5.times { |i| Product.create name: "product_#{i}" }
253
+ 5.times { |_i| Product.create name: "product" }
254
+ finder = new_finder name_eq: "product", sort: "id desc", page: 2 do
255
+ paging per_page: 2, min_per_page: 1, max_per_page: 5
256
+ property :name, type: Types::String
257
+ property :id, type: Types::Integer, sortable: true
258
+ end
259
+
260
+ expect(finder.result.first.id).to eq 8
261
+ expect(finder.result.map(&:id)).to eq [8, 7]
262
+ end
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end
@@ -0,0 +1,251 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module Trailblazer
6
+ class Finder
7
+ module Adapters
8
+ describe Basic do
9
+ def define_finder_class(&block)
10
+ Class.new(Trailblazer::Finder) do
11
+ class_eval(&block)
12
+ end
13
+ end
14
+
15
+ def finder_class(default_entity = [], &block)
16
+ define_finder_class do
17
+ entity { default_entity }
18
+
19
+ class_eval(&block) unless block.nil?
20
+ end
21
+ end
22
+
23
+ def new_finder(default_entity = [], filter = {}, &block)
24
+ finder_class(default_entity, &block).new params: filter
25
+ end
26
+
27
+ describe "#property" do
28
+ it "sets the property and works with eq predicate" do
29
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: "Test 3"}]
30
+ finder = new_finder entity, value_eq: "Test 1" do
31
+ property :value, type: Types::String
32
+ end
33
+
34
+ expect(finder.result.map { |n| n[:value] }).to eq ["Test 1"]
35
+ end
36
+
37
+ it "sets the property and works with not_eq predicate" do
38
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: "Test 3"}]
39
+ finder = new_finder entity, value_not_eq: "Test 1" do
40
+ property :value, type: Types::String
41
+ end
42
+
43
+ expect(finder.result.map { |n| n[:value] }).to eq ["Test 2", "Test 3"]
44
+ end
45
+
46
+ it "sets the property and works with blank predicate" do
47
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: ""}, {id: 4, value: "Test 4"}]
48
+ finder = new_finder entity, value_blank: true do
49
+ property :value, type: Types::String
50
+ end
51
+
52
+ expect(finder.result.map { |n| n[:id] }).to eq [3]
53
+ end
54
+
55
+ it "sets the property and works with not_blank predicate" do
56
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: ""}, {id: 4, value: "Test 4"}]
57
+ finder = new_finder entity, value_not_blank: true do
58
+ property :value, type: Types::String
59
+ end
60
+
61
+ expect(finder.result.map { |n| n[:id] }).to eq [1, 2, 4]
62
+ end
63
+
64
+ it "sets the property and works gt (greater than) predicate" do
65
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: ""}, {id: 4, value: "Test 4"}]
66
+ finder = new_finder entity, id_gt: 1 do
67
+ property :id, type: Types::String
68
+ end
69
+
70
+ expect(finder.result.map { |n| n[:id] }).to eq [2, 3, 4]
71
+ end
72
+
73
+ it "sets the property and works gte (greater than or equal to) predicate" do
74
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: ""}, {id: 4, value: "Test 4"}]
75
+ finder = new_finder entity, id_gte: 2 do
76
+ property :id, type: Types::String
77
+ end
78
+
79
+ expect(finder.result.map { |n| n[:id] }).to eq [2, 3, 4]
80
+ end
81
+
82
+ it "sets the property and works lt (less than) predicate" do
83
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: ""}, {id: 4, value: "Test 4"}]
84
+ finder = new_finder entity, id_lt: 4 do
85
+ property :id, type: Types::String
86
+ end
87
+
88
+ expect(finder.result.map { |n| n[:id] }).to eq [1, 2, 3]
89
+ end
90
+
91
+ it "sets the property and works lte (lesss than or equal to) predicate" do
92
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: ""}, {id: 4, value: "Test 4"}]
93
+ finder = new_finder entity, id_lte: 3 do
94
+ property :id, type: Types::String
95
+ end
96
+
97
+ expect(finder.result.map { |n| n[:id] }).to eq [1, 2, 3]
98
+ end
99
+
100
+ it "sets the property and works lte (lesss than or equal to) predicate" do
101
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: ""}, {id: 4, value: "Test 4"}]
102
+ finder = new_finder entity, id_ltse: 3 do
103
+ property :id, type: Types::String
104
+ end
105
+
106
+ expect(finder.result.map { |n| n[:id] }).to eq [1, 2, 3, 4]
107
+ end
108
+
109
+ it "sets the property and works with cont predicate" do
110
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "None 2"}, {id: 3, value: "Test 3"}]
111
+ finder = new_finder entity, value_cont: "Test" do
112
+ property :value, type: Types::String
113
+ end
114
+
115
+ expect(finder.result.map { |n| n[:value] }).to eq ["Test 1", "Test 3"]
116
+ end
117
+
118
+ it "sets the property and works with not_cont predicate" do
119
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "None 2"}, {id: 3, value: "Test 3"}]
120
+ finder = new_finder entity, value_not_cont: "Test" do
121
+ property :value, type: Types::String
122
+ end
123
+
124
+ expect(finder.result.map { |n| n[:value] }).to eq ["None 2"]
125
+ end
126
+
127
+ it "sets the property and works with sw predicate" do
128
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "None 2"}, {id: 3, value: "Testical 3"}]
129
+ finder = new_finder entity, value_sw: "Test" do
130
+ property :value, type: Types::String
131
+ end
132
+
133
+ expect(finder.result.map { |n| n[:value] }).to eq ["Test 1", "Testical 3"]
134
+ end
135
+
136
+ it "sets the property and works with not_sw predicate" do
137
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "None 2"}, {id: 3, value: "ATest 3"}]
138
+ finder = new_finder entity, value_not_sw: "Test" do
139
+ property :value, type: Types::String
140
+ end
141
+
142
+ expect(finder.result.map { |n| n[:value] }).to eq ["None 2", "ATest 3"]
143
+ end
144
+
145
+ it "sets the property and works with ew predicate" do
146
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "None 1"}, {id: 3, value: "Test 3"}]
147
+ finder = new_finder entity, value_ew: "1" do
148
+ property :value, type: Types::String
149
+ end
150
+
151
+ expect(finder.result.map { |n| n[:value] }).to eq ["Test 1", "None 1"]
152
+ end
153
+
154
+ it "sets the property and works with not_ew predicate" do
155
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "None 1"}, {id: 3, value: "ATest 3"}]
156
+ finder = new_finder entity, value_not_ew: "1" do
157
+ property :value, type: Types::String
158
+ end
159
+
160
+ expect(finder.result.map { |n| n[:value] }).to eq ["ATest 3"]
161
+ end
162
+ end
163
+
164
+ describe "#paging" do
165
+ it "sets the paging values and shows only the first page results" do
166
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: "Test 3"}]
167
+ finder = new_finder entity do
168
+ paging per_page: 2, min_per_page: 1, max_per_page: 5
169
+ property :value, type: Types::String
170
+ end
171
+
172
+ expect(finder.result.map { |n| n[:value] }).to eq ["Test 1", "Test 2"]
173
+ end
174
+
175
+ it "accepts per_page as a parameter" do
176
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: "Test 3"}, {id: 4, value: "Test 4"}, {id: 5, value: "Test 5"}, {id: 6, value: "Test 6"}, {id: 7, value: "Test 7"}, {id: 8, value: "Test 8"}, {id: 9, value: "Test 9"}, {id: 10, value: "Test 10"}]
177
+ finder = new_finder entity, page: 2, per_page: 4 do
178
+ paging per_page: 5, min_per_page: 2, max_per_page: 8
179
+ end
180
+
181
+ expect(finder.result.first.id).to eq 5
182
+ expect(finder.result.map(&:id)).to eq [5, 6, 7, 8]
183
+ end
184
+
185
+ it "uses max_per_page in finder as maximum per_page" do
186
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: "Test 3"}, {id: 4, value: "Test 4"}, {id: 5, value: "Test 5"}, {id: 6, value: "Test 6"}, {id: 7, value: "Test 7"}, {id: 8, value: "Test 8"}, {id: 9, value: "Test 9"}, {id: 10, value: "Test 10"}]
187
+ finder = new_finder entity, page: 2, per_page: 9 do
188
+ paging per_page: 5, min_per_page: 2, max_per_page: 8
189
+ end
190
+
191
+ expect(finder.result.first.id).to eq 9
192
+ expect(finder.result.map(&:id)).to eq [9, 10]
193
+ end
194
+
195
+ it "uses min_per_page in finder as minimum per_page" do
196
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 2"}, {id: 3, value: "Test 3"}, {id: 4, value: "Test 4"}, {id: 5, value: "Test 5"}, {id: 6, value: "Test 6"}, {id: 7, value: "Test 7"}, {id: 8, value: "Test 8"}, {id: 9, value: "Test 9"}, {id: 10, value: "Test 10"}]
197
+ finder = new_finder entity, page: 2, per_page: 1 do
198
+ paging per_page: 5, min_per_page: 2, max_per_page: 8
199
+ end
200
+
201
+ expect(finder.result.first.id).to eq 3
202
+ expect(finder.result.map(&:id)).to eq [3, 4]
203
+ end
204
+ end
205
+
206
+ describe "#sorting" do
207
+ it "sets the property and works with eq predicate and sorting" do
208
+ entity = [{id: 1, value: "Test 1"}, {id: 2, value: "Test 1"}, {id: 3, value: "Test 3"}]
209
+ finder = new_finder entity, value_eq: "Test 1", sort: "id desc" do
210
+ property :value, type: Types::String, sortable: true
211
+ property :id, type: Types::Integer, sortable: true
212
+ end
213
+
214
+ expect(finder.result.map { |n| n[:id] }).to eq [2, 1]
215
+ end
216
+
217
+ it "sets the property and works with eq predicate and sorting by multiple columns" do
218
+ entity = [{id: 1, value: "Test 1", slug: 4}, {id: 2, value: "Test 2", slug: 1}, {id: 3, value: "Test 1", slug: 2}]
219
+ finder = new_finder entity, value_eq: "Test 1", sort: "slug asc, id desc" do
220
+ property :value, type: Types::String, sortable: true
221
+ property :id, type: Types::Integer, sortable: true
222
+ end
223
+
224
+ expect(finder.result.map { |n| n[:id] }).to eq [3, 1]
225
+ end
226
+ end
227
+
228
+ describe "Predicates, Paging and Sorting together" do
229
+ it "sets the property and works with eq predicate and paging" do
230
+ entity = [
231
+ {id: 1, value: "Test 1"},
232
+ {id: 2, value: "Test 2"},
233
+ {id: 3, value: "Test 1"},
234
+ {id: 4, value: "Test 4"},
235
+ {id: 5, value: "Test 1"}
236
+ ]
237
+
238
+ finder = new_finder entity, value_eq: "Test 1", sort: "id desc", page: 2 do
239
+ paging per_page: 2, min_per_page: 1, max_per_page: 5
240
+ property :value, type: Types::String, sortable: true
241
+ property :id, type: Types::Integer, sortable: true
242
+ end
243
+
244
+ expect(finder.result.map { |n| n[:id] }).to eq [1]
245
+ expect(finder.count).to eq 1
246
+ end
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end