trailblazer-finder 0.1.2 → 0.1.3

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.
@@ -16,7 +16,7 @@ module Trailblazer
16
16
  end
17
17
  end
18
18
 
19
- def finder_class(&block)
19
+ def finder_class(&block)
20
20
  define_finder_class do
21
21
  adapters DataMapper
22
22
 
@@ -1,85 +1,85 @@
1
- require 'spec_helper_data_mapper'
2
-
3
- module Trailblazer
4
- class Finder
5
- module Adapters
6
- module DataMapper
7
- describe Sorting do
8
- def finder_class
9
- Class.new do
10
- include Trailblazer::Finder::Base
11
- include Trailblazer::Finder::Features::Sorting
12
- include Trailblazer::Finder::Adapters::DataMapper
13
-
14
- entity_type { DProduct }
15
-
16
- sortable_by :name, :price, :created_at
17
-
18
- filter_by :name
19
- filter_by :price
20
-
21
- # # Need to find a fix for this, not sure how to handle joins with data mapper properly
22
- # filter_by(:d_category) { |entity_type, _| entity_type }
23
- end
24
- end
25
-
26
- def finder_with_sort(sort = nil, filters = {})
27
- finder_class.new filter: { sort: sort }.merge(filters)
28
- end
29
-
30
- it 'can be inherited' do
31
- child_class = Class.new(finder_class)
32
- expect(child_class.new.sort_attribute).to eq 'name'
33
- end
34
-
35
- describe 'sorting' do
36
- after do
37
- DProduct.all.destroy
38
- end
39
-
40
- it 'sorts results based on the sort option desc' do
41
- 5.times { |i| DProduct.create price: i }
42
-
43
- finder = finder_with_sort 'price desc'
44
- expect(finder.results.map(&:price)).to eq [4, 3, 2, 1, 0]
45
- end
46
-
47
- it 'sorts results based on the sort option asc' do
48
- 5.times { |i| DProduct.create price: i }
49
-
50
- finder = finder_with_sort 'price asc'
51
- expect(finder.results.map(&:price)).to eq [0, 1, 2, 3, 4]
52
- end
53
-
54
- it 'defaults to first sort by option' do
55
- 5.times { |i| DProduct.create name: "Name#{i}" }
56
-
57
- finder = finder_with_sort
58
- expect(finder.results.map(&:name)).to eq %w[Name4 Name3 Name2 Name1 Name0]
59
- end
60
-
61
- it 'ignores invalid sort values' do
62
- finder = finder_with_sort 'invalid attribute'
63
- expect { finder.results.to_a }.not_to raise_error
64
- end
65
-
66
- # TODO: Need to find a fix for this, not sure how to handle joins with data mapper properly
67
- it 'can handle renames of sorting in joins' do
68
- # older_category = DCategory.create title: 'older'
69
- # newer_category = DCategory.create title: 'newer'
70
- #
71
- # product_of_newer_category = DProduct.create name: 'older product', d_category: newer_category
72
- # product_of_older_category = DProduct.create name: 'newer product', d_category: older_category
73
- #
74
- # finder = finder_with_sort 'created_at desc', d_category: ''
75
- #
76
- # expect(finder.results.map(&:name)).to eq [product_of_older_category.name, product_of_newer_category.name]
77
- end
78
- end
79
-
80
- it_behaves_like 'a sorting feature'
81
- end
82
- end
83
- end
84
- end
85
- end
1
+ # require 'spec_helper_data_mapper'
2
+ #
3
+ # module Trailblazer
4
+ # class Finder
5
+ # module Adapters
6
+ # module DataMapper
7
+ # describe Sorting do
8
+ # def finder_class
9
+ # Class.new do
10
+ # include Trailblazer::Finder::Base
11
+ # include Trailblazer::Finder::Features::Sorting
12
+ # include Trailblazer::Finder::Adapters::DataMapper
13
+ #
14
+ # entity_type { DProduct }
15
+ #
16
+ # sortable_by :name, :price, :created_at
17
+ #
18
+ # filter_by :name
19
+ # filter_by :price
20
+ #
21
+ # # # Need to find a fix for this, not sure how to handle joins with data mapper properly
22
+ # # filter_by(:d_category) { |entity_type, _| entity_type }
23
+ # end
24
+ # end
25
+ #
26
+ # def finder_with_sort(sort = nil, filters = {})
27
+ # finder_class.new filter: { sort: sort }.merge(filters)
28
+ # end
29
+ #
30
+ # it 'can be inherited' do
31
+ # child_class = Class.new(finder_class)
32
+ # expect(child_class.new.sort_attribute).to eq 'name'
33
+ # end
34
+ #
35
+ # describe 'sorting' do
36
+ # after do
37
+ # DProduct.all.destroy
38
+ # end
39
+ #
40
+ # it 'sorts results based on the sort option desc' do
41
+ # 5.times { |i| DProduct.create price: i }
42
+ #
43
+ # finder = finder_with_sort 'price desc'
44
+ # expect(finder.results.map(&:price)).to eq [4, 3, 2, 1, 0]
45
+ # end
46
+ #
47
+ # it 'sorts results based on the sort option asc' do
48
+ # 5.times { |i| DProduct.create price: i }
49
+ #
50
+ # finder = finder_with_sort 'price asc'
51
+ # expect(finder.results.map(&:price)).to eq [0, 1, 2, 3, 4]
52
+ # end
53
+ #
54
+ # it 'defaults to first sort by option' do
55
+ # 5.times { |i| DProduct.create name: "Name#{i}" }
56
+ #
57
+ # finder = finder_with_sort
58
+ # expect(finder.results.map(&:name)).to eq %w[Name4 Name3 Name2 Name1 Name0]
59
+ # end
60
+ #
61
+ # it 'ignores invalid sort values' do
62
+ # finder = finder_with_sort 'invalid attribute'
63
+ # expect { finder.results.to_a }.not_to raise_error
64
+ # end
65
+ #
66
+ # # TODO: Need to find a fix for this, not sure how to handle joins with data mapper properly
67
+ # it 'can handle renames of sorting in joins' do
68
+ # # older_category = DCategory.create title: 'older'
69
+ # # newer_category = DCategory.create title: 'newer'
70
+ # #
71
+ # # product_of_newer_category = DProduct.create name: 'older product', d_category: newer_category
72
+ # # product_of_older_category = DProduct.create name: 'newer product', d_category: older_category
73
+ # #
74
+ # # finder = finder_with_sort 'created_at desc', d_category: ''
75
+ # #
76
+ # # expect(finder.results.map(&:name)).to eq [product_of_older_category.name, product_of_newer_category.name]
77
+ # end
78
+ # end
79
+ #
80
+ # it_behaves_like 'a sorting feature'
81
+ # end
82
+ # end
83
+ # end
84
+ # end
85
+ # end
@@ -2,7 +2,7 @@ require 'spec_helper_sequel'
2
2
  # require 'spec_helper'
3
3
 
4
4
  describe "Trailblazer::Finder::Adapters::Sequel::Predicates" do
5
- class TestFinder < Trailblazer::Finder
5
+ class TestSequelFinder < Trailblazer::Finder
6
6
  features Predicate
7
7
  adapters Sequel
8
8
 
@@ -14,7 +14,7 @@ require 'spec_helper_sequel'
14
14
  end
15
15
 
16
16
  def finder_with_predicate(filter = nil, value = nil, filters = {})
17
- TestFinder.new filter: { filter => value }.merge(filters)
17
+ TestSequelFinder.new filter: { filter => value }.merge(filters)
18
18
  end
19
19
 
20
20
  describe 'equals' do
@@ -1,86 +1,107 @@
1
1
  require 'spec_helper_sequel'
2
2
 
3
- module Trailblazer
4
- class Finder
5
- module Adapters
6
- module Sequel
7
- describe Sorting do
8
- def finder_class
9
- Class.new do
10
- include Trailblazer::Finder::Base
11
- include Trailblazer::Finder::Features::Sorting
12
- include Trailblazer::Finder::Adapters::Sequel
13
-
14
- entity_type { SProduct }
15
-
16
- sortable_by :name, :price, :created_at
17
-
18
- filter_by :name
19
- filter_by :price
20
- filter_by(:s_category) { |entity_type, _| entity_type.association_join(:s_category) }
21
- end
22
- end
23
-
24
- def finder_with_sort(sort = nil, filters = {})
25
- finder_class.new filter: { sort: sort }.merge(filters)
26
- end
27
-
28
- it 'can be inherited' do
29
- child_class = Class.new(finder_class)
30
- expect(child_class.new.sort_attribute).to eq 'name'
31
- end
32
-
33
- describe 'sorting' do
34
- before do
35
- SProduct.order(:id).delete
36
- end
37
-
38
- after do
39
- SProduct.order(:id).delete
40
- end
41
-
42
- it 'sorts results based on the sort option desc' do
43
- 5.times { |i| SProduct.create price: i }
44
-
45
- finder = finder_with_sort 'price desc'
46
- expect(finder.results.map(&:price)).to eq [4, 3, 2, 1, 0]
47
- end
48
-
49
- it 'sorts results based on the sort option asc' do
50
- 5.times { |i| SProduct.create price: i }
51
-
52
- finder = finder_with_sort 'price asc'
53
- expect(finder.results.map(&:price)).to eq [0, 1, 2, 3, 4]
54
- end
55
-
56
- it 'defaults to first sort by option' do
57
- 5.times { |i| SProduct.create name: "Name#{i}" }
58
-
59
- finder = finder_with_sort
60
- expect(finder.results.map(&:name)).to eq %w[Name4 Name3 Name2 Name1 Name0]
61
- end
62
-
63
- it 'ignores invalid sort values' do
64
- finder = finder_with_sort 'invalid attribute'
65
- expect { finder.results.to_a }.not_to raise_error
66
- end
67
-
68
- it 'can handle renames of sorting in joins' do
69
- older_category = SCategory.create title: 'older'
70
- newer_category = SCategory.create title: 'newer'
71
-
72
- product_of_newer_category = SProduct.create name: 'older product', s_category: newer_category
73
- product_of_older_category = SProduct.create name: 'newer product', s_category: older_category
74
-
75
- finder = finder_with_sort 'created_at desc', s_category: ''
76
-
77
- expect(finder.results.map(&:name)).to eq [product_of_older_category.name, product_of_newer_category.name]
78
- end
79
- end
80
-
81
- it_behaves_like 'a sorting feature'
82
- end
3
+ describe 'Trailblazer::Finder::Adapters::Sequel::Sorting', :sorting do
4
+ after do
5
+ SProduct.order(:id).delete
6
+ end
7
+
8
+ before do
9
+ SProduct.order(:id).delete
10
+ end
11
+
12
+ class TestSequelSortFinder < Trailblazer::Finder
13
+ features Sorting
14
+ adapters Sequel
15
+
16
+ entity_type { SProduct }
17
+
18
+ sortable_by :name, :price, :created_at
19
+
20
+ filter_by :name
21
+ filter_by :price
22
+ filter_by(:s_category) { |entity_type, _| entity_type.association_join(:s_category) }
23
+ end
24
+
25
+ def finder_with_sort(sort = nil, filters = {})
26
+ TestSequelSortFinder.new filter: (sort.nil? ? {} : { sort: sort }).merge(filters)
27
+ end
28
+
29
+ def finder_with_nil_sort
30
+ TestSequelSortFinder.new filter: { sort: nil }
31
+ end
32
+
33
+ describe 'sorting' do
34
+ it 'loads results if no sort options are supplied in the params' do
35
+ 5.times { |i| SProduct.create price: i }
36
+ finder = finder_with_nil_sort
37
+ expect(finder.results.map(&:price)).to eq [0, 1, 2, 3, 4]
38
+ end
39
+
40
+ it 'sorts results based on the sort option desc' do
41
+ 5.times { |i| SProduct.create price: i }
42
+
43
+ finder = finder_with_sort 'price desc'
44
+ expect(finder.results.map(&:price)).to eq [4, 3, 2, 1, 0]
45
+ end
46
+
47
+ it 'sorts results based on the sort option asc' do
48
+ 5.times { |i| SProduct.create price: i }
49
+
50
+ finder = finder_with_sort 'price asc'
51
+ expect(finder.results.map(&:price)).to eq [0, 1, 2, 3, 4]
52
+ end
53
+
54
+ it 'defaults to first sort by option' do
55
+ 5.times { |i| SProduct.create name: "Name#{i}" }
56
+
57
+ finder = finder_with_sort
58
+ expect(finder.results.map(&:name)).to eq %w[Name0 Name1 Name2 Name3 Name4]
59
+ end
60
+
61
+ it 'ignores invalid sort values' do
62
+ finder = finder_with_sort 'invalid attribute'
63
+ expect { finder.results.to_a }.not_to raise_error
64
+ end
65
+
66
+ it 'can handle renames of sorting in joins' do
67
+ older_category = SCategory.create title: 'older'
68
+ newer_category = SCategory.create title: 'newer'
69
+
70
+ product_of_newer_category = SProduct.create name: 'older product', s_category: newer_category
71
+ product_of_older_category = SProduct.create name: 'newer product', s_category: older_category
72
+
73
+ finder = finder_with_sort 'created_at desc', s_category: ''
74
+
75
+ expect(finder.results.map(&:name)).to eq [product_of_older_category.name, product_of_newer_category.name]
76
+ end
77
+ end
78
+
79
+ describe 'sorting by multiple' do
80
+ before do
81
+ 5.times do |i|
82
+ SProduct.create name: "Name#{i}", price: "1#{i}"
83
83
  end
84
+ SProduct.create name: 'Name3', price: '8'
85
+ end
86
+
87
+ it 'sorts by multiple columns name asc and price asc' do
88
+ finder = finder_with_sort 'name asc, price asc'
89
+ expect(finder.results.map(&:name)).to eq %w[Name0 Name1 Name2 Name3 Name3 Name4]
90
+ expect(finder.results.map(&:price)).to eq [10, 11, 12, 8, 13, 14]
91
+ end
92
+
93
+ it 'sorts by multiple columns name asc and price desc' do
94
+ finder = finder_with_sort 'name asc, price desc'
95
+ expect(finder.results.map(&:name)).to eq %w[Name0 Name1 Name2 Name3 Name3 Name4]
96
+ expect(finder.results.map(&:price)).to eq [10, 11, 12, 13, 8, 14]
97
+ end
98
+
99
+ it 'sorts by multiple columns name desc and price desc' do
100
+ finder = finder_with_sort 'name desc, price desc'
101
+ expect(finder.results.map(&:name)).to eq %w[Name4 Name3 Name3 Name2 Name1 Name0]
102
+ expect(finder.results.map(&:price)).to eq [14, 13, 8, 12, 11, 10]
84
103
  end
85
104
  end
105
+
106
+ it_behaves_like 'a sorting feature'
86
107
  end
@@ -1,89 +1,65 @@
1
+ # require 'spec_helper_sequel'
1
2
  require 'spec_helper'
2
- require 'support/sorting_shared_example'
3
3
 
4
4
  module Trailblazer
5
5
  class Finder
6
6
  module Features
7
- describe Sorting do
8
- it 'uses a pre-defined Hash entity_type instead of any ORM' do
9
- true
10
- end
7
+ describe Sorting, :sorting do
8
+ class TestSortingFinder < Trailblazer::Finder
9
+ features Sorting
10
+
11
+ def create_product(id, name, price)
12
+ {
13
+ id: id,
14
+ name: name,
15
+ price: price,
16
+ created_at: Time.now,
17
+ updated_at: Time.now
18
+ }
19
+ end
11
20
 
12
- def finder_class
13
- Class.new(Trailblazer::Finder) do
14
- features Sorting
15
-
16
- entity_type do
17
- [
18
- {
19
- id: 1,
20
- name: 'product_1',
21
- price: '11',
22
- created_at: Time.now,
23
- updated_at: Time.now
24
- },
25
- {
26
- id: 2,
27
- name: 'product_2',
28
- price: '12',
29
- created_at: Time.now,
30
- updated_at: Time.now
31
- },
32
- {
33
- id: 3,
34
- name: 'product_3',
35
- price: '13',
36
- created_at: Time.now,
37
- updated_at: Time.now
38
- },
39
- {
40
- id: 4,
41
- name: 'product_4',
42
- price: '14',
43
- created_at: Time.now,
44
- updated_at: Time.now
45
- },
46
- {
47
- id: 5,
48
- name: 'product_5',
49
- price: '15',
50
- created_at: Time.now,
51
- updated_at: Time.now
52
- }
53
- ]
54
- end
55
-
56
- sortable_by :name, :price, :created_at
57
-
58
- filter_by :name
59
- filter_by :price
60
- filter_by(:category) { |entity_type, _| entity_type.joins(:category) }
21
+ entity_type do
22
+ Array.new(5) do |i|
23
+ next create_product(i + 1, '', "1#{i}".to_i) if i == 7
24
+ next create_product(i + 1, 'Name4', "1#{i}".to_i) if i == 9
25
+ create_product(i + 1, "Name#{i}", "1#{i}".to_i)
26
+ end.push(create_product(6, 'Name3', 8))
61
27
  end
28
+
29
+ sortable_by :name, :price, :created_at, :id
30
+
31
+ filter_by :name
32
+ filter_by :price
33
+ filter_by(:category) { |entity_type, _| entity_type.joins(:category) }
62
34
  end
63
35
 
64
36
  def finder_with_sort(sort = nil, filters = {})
65
- finder_class.new filter: { sort: sort }.merge(filters)
37
+ TestSortingFinder.new filter: (sort.nil? ? {} : { sort: sort }).merge(filters)
66
38
  end
67
39
 
68
- it 'can be inherited' do
69
- child_class = Class.new(finder_class)
70
- expect(child_class.new.sort_attribute).to eq 'name'
40
+ def finder_with_nil_sort
41
+ TestSortingFinder.new filter: { sort: nil }
71
42
  end
72
43
 
73
44
  describe 'sorting' do
45
+ it 'loads results if no sort options are supplied in the params' do
46
+ finder = finder_with_nil_sort
47
+ expect(finder.results.map { |n| n[:price] }).to eq [14, 13, 8, 12, 11, 10]
48
+ end
49
+
74
50
  it 'sorts results based on the sort option desc' do
75
51
  finder = finder_with_sort 'price desc'
76
- expect(finder.results.map { |n| n[:price] }).to eq %w[15 14 13 12 11]
52
+ expect(finder.results.map { |n| n[:price] }).to eq [14, 13, 12, 11, 10, 8]
77
53
  end
78
54
 
79
55
  it 'sorts results based on the sort option asc' do
80
56
  finder = finder_with_sort 'price asc'
81
- expect(finder.results.map { |n| n[:price] }).to eq %w[11 12 13 14 15]
57
+ expect(finder.results.map { |n| n[:price] }).to eq [8, 10, 11, 12, 13, 14]
82
58
  end
83
59
 
84
- it 'defaults to first sort by option' do
60
+ it 'defaults to original sorted hash' do
85
61
  finder = finder_with_sort
86
- expect(finder.results.map { |n| n[:name] }).to eq %w[product_5 product_4 product_3 product_2 product_1]
62
+ expect(finder.results.map { |n| n[:name] }).to eq ['Name0', 'Name1', 'Name2', 'Name3', 'Name4', 'Name3']
87
63
  end
88
64
 
89
65
  it 'ignores invalid sort values' do
@@ -92,6 +68,27 @@ module Trailblazer
92
68
  end
93
69
  end
94
70
 
71
+ describe 'sorting by multiple' do
72
+
73
+ it 'sorts by multiple columns name asc and price asc' do
74
+ finder = finder_with_sort 'name asc, price asc'
75
+ expect(finder.results.map { |n| n[:name] }).to eq ['Name0', 'Name1', 'Name2', 'Name3', 'Name3', 'Name4']
76
+ expect(finder.results.map { |n| n[:price] }).to eq [10, 11, 12, 8, 13, 14]
77
+ end
78
+
79
+ it 'sorts by multiple columns name asc and price desc' do
80
+ finder = finder_with_sort 'name asc, price desc'
81
+ expect(finder.results.map { |n| n[:name] }).to eq ['Name0', 'Name1', 'Name2', 'Name3', 'Name3', 'Name4']
82
+ expect(finder.results.map { |n| n[:price] }).to eq [10, 11, 12, 13, 8, 14]
83
+ end
84
+
85
+ it 'sorts by multiple columns name desc and price desc' do
86
+ finder = finder_with_sort 'name desc, price desc'
87
+ expect(finder.results.map { |n| n[:name] }).to eq ['Name4', 'Name3', 'Name3', 'Name2', 'Name1', 'Name0']
88
+ expect(finder.results.map { |n| n[:price] }).to eq [14, 13, 8, 12, 11, 10]
89
+ end
90
+ end
91
+
95
92
  it_behaves_like 'a sorting feature'
96
93
  end
97
94
  end