active_hash_relation 1.1.0 → 1.2.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.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -0
  3. data/.travis.yml +15 -0
  4. data/README.md +68 -11
  5. data/active_hash_relation.gemspec +13 -0
  6. data/lib/active_hash_relation.rb +18 -12
  7. data/lib/active_hash_relation/aggregation.rb +3 -0
  8. data/lib/active_hash_relation/association_filters.rb +3 -0
  9. data/lib/active_hash_relation/column_filters.rb +45 -11
  10. data/lib/active_hash_relation/filter_applier.rb +37 -23
  11. data/lib/active_hash_relation/helpers.rb +22 -2
  12. data/lib/active_hash_relation/scope_filters.rb +8 -1
  13. data/lib/active_hash_relation/sort_filters.rb +12 -0
  14. data/lib/active_hash_relation/version.rb +1 -1
  15. data/lib/active_record/scope_names.rb +4 -19
  16. data/lib/generators/active_hash_relation/initialize_generator.rb +13 -0
  17. data/lib/generators/active_hash_relation/templates/active_hash_relation.rb +12 -0
  18. data/spec/config/initializers/active_hash_relation.rb +16 -0
  19. data/spec/db/migrate/001_basic_schema.rb +53 -0
  20. data/spec/dummy-rails4/.gitignore +13 -0
  21. data/spec/dummy-rails4/.ruby-version +1 -0
  22. data/spec/dummy-rails4/Gemfile +18 -0
  23. data/spec/dummy-rails4/README.md +3 -0
  24. data/spec/dummy-rails4/Rakefile +6 -0
  25. data/spec/dummy-rails4/app/controllers/application_controller.rb +5 -0
  26. data/spec/dummy-rails4/app/models/.keep +0 -0
  27. data/spec/dummy-rails4/app/models/address.rb +1 -0
  28. data/spec/dummy-rails4/app/models/micropost.rb +1 -0
  29. data/spec/dummy-rails4/app/models/relationship.rb +1 -0
  30. data/spec/dummy-rails4/app/models/user.rb +1 -0
  31. data/spec/dummy-rails4/bin/bundle +3 -0
  32. data/spec/dummy-rails4/bin/rails +4 -0
  33. data/spec/dummy-rails4/bin/rake +4 -0
  34. data/spec/dummy-rails4/bin/setup +29 -0
  35. data/spec/dummy-rails4/config.ru +4 -0
  36. data/spec/dummy-rails4/config/application.rb +35 -0
  37. data/spec/dummy-rails4/config/boot.rb +3 -0
  38. data/spec/dummy-rails4/config/database.yml +18 -0
  39. data/spec/dummy-rails4/config/environment.rb +5 -0
  40. data/spec/dummy-rails4/config/environments/development.rb +41 -0
  41. data/spec/dummy-rails4/config/environments/production.rb +79 -0
  42. data/spec/dummy-rails4/config/environments/test.rb +42 -0
  43. data/spec/dummy-rails4/config/initializers/active_hash_relation.rb +3 -0
  44. data/spec/dummy-rails4/config/initializers/assets.rb +11 -0
  45. data/spec/dummy-rails4/config/initializers/backtrace_silencers.rb +7 -0
  46. data/spec/dummy-rails4/config/initializers/cookies_serializer.rb +3 -0
  47. data/spec/dummy-rails4/config/initializers/filter_parameter_logging.rb +4 -0
  48. data/spec/dummy-rails4/config/initializers/inflections.rb +16 -0
  49. data/spec/dummy-rails4/config/initializers/mime_types.rb +4 -0
  50. data/spec/dummy-rails4/config/initializers/session_store.rb +3 -0
  51. data/spec/dummy-rails4/config/initializers/wrap_parameters.rb +14 -0
  52. data/spec/dummy-rails4/config/locales/en.yml +23 -0
  53. data/spec/dummy-rails4/config/routes.rb +56 -0
  54. data/spec/dummy-rails4/config/secrets.yml +22 -0
  55. data/spec/dummy-rails4/db/migrate/001_basic_schema.rb +1 -0
  56. data/spec/dummy-rails4/db/schema.rb +69 -0
  57. data/spec/dummy-rails4/spec/factories/factories.rb +1 -0
  58. data/spec/dummy-rails4/spec/rails_helper.rb +19 -0
  59. data/spec/dummy-rails4/spec/spec_helper.rb +99 -0
  60. data/spec/dummy-rails4/spec/support/support.rb +1 -0
  61. data/spec/dummy-rails4/spec/tests/tests_spec.rb +3 -0
  62. data/spec/dummy-rails5/.gitignore +17 -0
  63. data/spec/dummy-rails5/.rspec +2 -0
  64. data/spec/dummy-rails5/.ruby-version +1 -0
  65. data/spec/dummy-rails5/Gemfile +19 -0
  66. data/spec/dummy-rails5/README.md +3 -0
  67. data/spec/dummy-rails5/Rakefile +6 -0
  68. data/spec/dummy-rails5/app/controllers/application_controller.rb +3 -0
  69. data/spec/dummy-rails5/app/models/address.rb +1 -0
  70. data/spec/dummy-rails5/app/models/micropost.rb +1 -0
  71. data/spec/dummy-rails5/app/models/relationship.rb +1 -0
  72. data/spec/dummy-rails5/app/models/user.rb +1 -0
  73. data/spec/dummy-rails5/bin/bundle +3 -0
  74. data/spec/dummy-rails5/bin/rails +4 -0
  75. data/spec/dummy-rails5/bin/rake +4 -0
  76. data/spec/dummy-rails5/bin/setup +34 -0
  77. data/spec/dummy-rails5/bin/update +29 -0
  78. data/spec/dummy-rails5/config.ru +5 -0
  79. data/spec/dummy-rails5/config/application.rb +25 -0
  80. data/spec/dummy-rails5/config/boot.rb +3 -0
  81. data/spec/dummy-rails5/config/cable.yml +9 -0
  82. data/spec/dummy-rails5/config/database.yml +18 -0
  83. data/spec/dummy-rails5/config/environment.rb +5 -0
  84. data/spec/dummy-rails5/config/environments/development.rb +54 -0
  85. data/spec/dummy-rails5/config/environments/production.rb +86 -0
  86. data/spec/dummy-rails5/config/environments/test.rb +42 -0
  87. data/spec/dummy-rails5/config/initializers/active_hash_relation.rb +3 -0
  88. data/spec/dummy-rails5/config/initializers/application_controller_renderer.rb +6 -0
  89. data/spec/dummy-rails5/config/initializers/assets.rb +11 -0
  90. data/spec/dummy-rails5/config/initializers/backtrace_silencers.rb +7 -0
  91. data/spec/dummy-rails5/config/initializers/cookies_serializer.rb +5 -0
  92. data/spec/dummy-rails5/config/initializers/filter_parameter_logging.rb +4 -0
  93. data/spec/dummy-rails5/config/initializers/inflections.rb +16 -0
  94. data/spec/dummy-rails5/config/initializers/mime_types.rb +4 -0
  95. data/spec/dummy-rails5/config/initializers/new_framework_defaults.rb +24 -0
  96. data/spec/dummy-rails5/config/initializers/session_store.rb +3 -0
  97. data/spec/dummy-rails5/config/initializers/wrap_parameters.rb +14 -0
  98. data/spec/dummy-rails5/config/locales/en.yml +23 -0
  99. data/spec/dummy-rails5/config/puma.rb +47 -0
  100. data/spec/dummy-rails5/config/routes.rb +3 -0
  101. data/spec/dummy-rails5/config/secrets.yml +22 -0
  102. data/spec/dummy-rails5/config/spring.rb +6 -0
  103. data/spec/dummy-rails5/db/migrate/001_basic_schema.rb +2 -0
  104. data/spec/dummy-rails5/db/schema.rb +64 -0
  105. data/spec/dummy-rails5/spec/factories/factories.rb +1 -0
  106. data/spec/dummy-rails5/spec/rails_helper.rb +19 -0
  107. data/spec/dummy-rails5/spec/spec_helper.rb +99 -0
  108. data/spec/dummy-rails5/spec/support/support.rb +1 -0
  109. data/spec/dummy-rails5/spec/tests/tests_spec.rb +3 -0
  110. data/spec/factories/factories.rb +39 -0
  111. data/spec/models/address.rb +7 -0
  112. data/spec/models/application_record.rb +3 -0
  113. data/spec/models/micropost.rb +9 -0
  114. data/spec/models/relationship.rb +9 -0
  115. data/spec/models/user.rb +32 -0
  116. data/spec/support/support.rb +62 -0
  117. data/spec/tests/aggregations/avg_spec.rb +45 -0
  118. data/spec/tests/aggregations/max_spec.rb +45 -0
  119. data/spec/tests/aggregations/min_spec.rb +46 -0
  120. data/spec/tests/aggregations/sum_spec.rb +43 -0
  121. data/spec/tests/associations/belongs_to_spec.rb +96 -0
  122. data/spec/tests/associations/has_many_spec.rb +91 -0
  123. data/spec/tests/associations/has_one_spec.rb +89 -0
  124. data/spec/tests/booleans_spec.rb +29 -0
  125. data/spec/tests/limit_spec.rb +30 -0
  126. data/spec/tests/null_spec.rb +44 -0
  127. data/spec/tests/numbers_spec.rb +142 -0
  128. data/spec/tests/or_filter_spec.rb +98 -0
  129. data/spec/tests/primary_key_spec.rb +29 -0
  130. data/spec/tests/scopes_spec.rb +48 -0
  131. data/spec/tests/sorting_spec.rb +100 -0
  132. data/spec/tests/strings_spec.rb +86 -0
  133. metadata +392 -4
@@ -0,0 +1,7 @@
1
+ require_relative './application_record'
2
+
3
+ class Address < ApplicationRecord
4
+ belongs_to :user
5
+
6
+ scope :in_sweden, -> { where(country: 'SE') }
7
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -0,0 +1,9 @@
1
+ require_relative './application_record'
2
+
3
+ class Micropost < ApplicationRecord
4
+ belongs_to :user, counter_cache: true
5
+
6
+ enum status: {draft: 0, published: 1, archived: 2 }
7
+
8
+ scope :created_on, ->(date) {where("date(microposts.created_at) = ?", date.to_date)}
9
+ end
@@ -0,0 +1,9 @@
1
+ require_relative './application_record'
2
+
3
+ class Relationship < ApplicationRecord
4
+ belongs_to :follower, class_name: "User", counter_cache: :followings_count
5
+ belongs_to :followed, class_name: "User", counter_cache: :followers_count
6
+
7
+ validates :follower_id, presence: true
8
+ validates :followed_id, presence: true
9
+ end
@@ -0,0 +1,32 @@
1
+ require_relative './application_record'
2
+
3
+ class User < ApplicationRecord
4
+ has_many :microposts, dependent: :destroy
5
+ has_many :active_relationships, class_name: "Relationship",
6
+ foreign_key: "follower_id",
7
+ dependent: :destroy
8
+ has_many :passive_relationships, class_name: "Relationship",
9
+ foreign_key: "followed_id",
10
+ dependent: :destroy
11
+ has_many :following, through: :active_relationships, source: :followed
12
+ has_many :followers, through: :passive_relationships, source: :follower
13
+ has_one :address
14
+
15
+ before_validation :ensure_token
16
+
17
+ scope :unverified, -> {where(verified: false)}
18
+ scope :unsocial, -> {where(followings_count: 0, followers_count: 0)}
19
+ scope :created_on, ->(date) {where("date(created_at) = ?", date.to_date)}
20
+
21
+ private
22
+ def ensure_token
23
+ self.token = generate_hex(:token) unless token.present?
24
+ end
25
+
26
+ def generate_hex(column)
27
+ loop do
28
+ hex = SecureRandom.hex
29
+ break hex unless self.class.where(column => hex).any?
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,62 @@
1
+ RSpec.configure do |config|
2
+ config.before :suite do
3
+ DatabaseCleaner[:active_record].strategy = :transaction
4
+ DatabaseCleaner.clean_with(:truncation)
5
+ end
6
+
7
+ config.around(:each) do |example|
8
+ DatabaseCleaner.cleaning do
9
+ example.run
10
+ end
11
+ end
12
+ end
13
+
14
+ RSpec.configure do |config|
15
+ config.include FactoryGirl::Syntax::Methods
16
+
17
+ config.before(:suite) do
18
+ begin
19
+ DatabaseCleaner.start
20
+ FactoryGirl.lint
21
+ ensure
22
+ DatabaseCleaner.clean
23
+ end
24
+ end
25
+ end
26
+
27
+ class HelperClass
28
+ include ActiveHashRelation
29
+ end
30
+
31
+ module Helpers
32
+ def strip(query)
33
+ query.gsub("\"","").gsub(/\s+/, ' ')
34
+ end
35
+
36
+ def select_all(table)
37
+ ExpectedQuery.new("SELECT #{table}.* FROM users WHERE")
38
+ end
39
+ alias_method :select_all_where, :select_all
40
+
41
+ def query(str)
42
+ ExpectedQuery.new(str, subquery: true)
43
+ end
44
+
45
+ def q(*args)
46
+ args.each.with_index.inject(''){|memo, (str, index)|
47
+ if args[index-1] == '('
48
+ "#{memo}#{str}"
49
+ elsif str == ')'
50
+ "#{memo}#{str}"
51
+ else
52
+ "#{memo} #{str}"
53
+ end
54
+ }.strip
55
+ end
56
+ end
57
+
58
+ class Array
59
+ def avg
60
+ sum / size.to_f
61
+ end
62
+ end
@@ -0,0 +1,45 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'aggregations' do
5
+ context 'avg' do
6
+ before do
7
+ FactoryGirl.create_list(:micropost, 10)
8
+ end
9
+
10
+ it "one aggregation" do
11
+ hash = { aggregate: {likes: {avg: true} } }
12
+
13
+ aggregations = HelperClass.new.aggregations(Micropost.all, hash)
14
+ expected_aggregations = HashWithIndifferentAccess.new({
15
+ likes: {
16
+ avg: Micropost.pluck(:likes).avg
17
+ }
18
+ })
19
+ expect(aggregations).to eq expected_aggregations
20
+ end
21
+ it "multiple aggregations" do
22
+ hash = {
23
+ aggregate: {
24
+ likes: {avg: true}, reposts: {avg: true}, created_at: {avg: true}
25
+ }
26
+ }
27
+
28
+ aggregations = HelperClass.new.aggregations(Micropost.all, hash)
29
+ expected_aggregations = HashWithIndifferentAccess.new({
30
+ likes: {
31
+ avg: Micropost.pluck(:likes).avg
32
+ },
33
+ reposts: {
34
+ avg: Micropost.pluck(:reposts).avg
35
+ },
36
+ created_at: {}
37
+ })
38
+ expect(aggregations).to eq expected_aggregations
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+
45
+
@@ -0,0 +1,45 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'aggregations' do
5
+ context 'max' do
6
+ before do
7
+ FactoryGirl.create_list(:micropost, 10)
8
+ end
9
+
10
+ it "one aggregation" do
11
+ hash = { aggregate: {likes: {max: true} } }
12
+
13
+ aggregations = HelperClass.new.aggregations(Micropost.all, hash)
14
+ expected_aggregations = HashWithIndifferentAccess.new({
15
+ likes: {
16
+ max: Micropost.pluck(:likes).max
17
+ }
18
+ })
19
+ expect(aggregations).to eq expected_aggregations
20
+ end
21
+ it "multiple aggregations" do
22
+ hash = {
23
+ aggregate: {
24
+ likes: {max: true}, reposts: {max: true}, created_at: {max: true}
25
+ }
26
+ }
27
+
28
+ aggregations = HelperClass.new.aggregations(Micropost.all, hash)
29
+ expected_aggregations = HashWithIndifferentAccess.new({
30
+ likes: {
31
+ max: Micropost.pluck(:likes).max,
32
+ },
33
+ reposts: {
34
+ max: Micropost.pluck(:reposts).max,
35
+ },
36
+ created_at: {
37
+ max: Micropost.pluck(:created_at).max.to_time
38
+ }
39
+ })
40
+ expect(aggregations).to eq expected_aggregations
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,46 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'aggregations' do
5
+ context 'min' do
6
+ before do
7
+ FactoryGirl.create_list(:micropost, 10)
8
+ end
9
+
10
+ it "one aggregation" do
11
+ hash = { aggregate: {likes: {min: true} } }
12
+
13
+ aggregations = HelperClass.new.aggregations(Micropost.all, hash)
14
+ expected_aggregations = HashWithIndifferentAccess.new({
15
+ likes: {
16
+ min: Micropost.pluck(:likes).min
17
+ }
18
+ })
19
+ expect(aggregations).to eq expected_aggregations
20
+ end
21
+ it "multiple aggregations" do
22
+ hash = {
23
+ aggregate: {
24
+ likes: {min: true}, reposts: {min: true}, created_at: {min: true}
25
+ }
26
+ }
27
+
28
+ aggregations = HelperClass.new.aggregations(Micropost.all, hash)
29
+ expected_aggregations = HashWithIndifferentAccess.new({
30
+ likes: {
31
+ min: Micropost.pluck(:likes).min
32
+ },
33
+ reposts: {
34
+ min: Micropost.pluck(:reposts).min
35
+ },
36
+ created_at: {
37
+ min: Micropost.pluck(:created_at).min.to_time
38
+ }
39
+ })
40
+ expect(aggregations).to eq expected_aggregations
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,43 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'aggregations' do
5
+ context 'sum' do
6
+ before do
7
+ FactoryGirl.create_list(:micropost, 10)
8
+ end
9
+
10
+ it "one aggregation" do
11
+ hash = { aggregate: {likes: {sum: true} } }
12
+
13
+ aggregations = HelperClass.new.aggregations(Micropost.all, hash)
14
+ expected_aggregations = HashWithIndifferentAccess.new({
15
+ likes: {
16
+ sum: Micropost.pluck(:likes).sum
17
+ }
18
+ })
19
+ expect(aggregations).to eq expected_aggregations
20
+ end
21
+ it "multiple aggregations" do
22
+ hash = {
23
+ aggregate: {
24
+ likes: {sum: true}, reposts: {sum: true}, created_at: {sum: true}
25
+ }
26
+ }
27
+
28
+ aggregations = HelperClass.new.aggregations(Micropost.all, hash)
29
+ expected_aggregations = HashWithIndifferentAccess.new({
30
+ likes: {
31
+ sum: Micropost.pluck(:likes).sum
32
+ },
33
+ reposts: {
34
+ sum: Micropost.pluck(:reposts).sum
35
+ },
36
+ created_at: {}
37
+ })
38
+ expect(aggregations).to eq expected_aggregations
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,96 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'associations' do
5
+ context 'belongs_to' do
6
+ it "one where clause" do
7
+ hash = {user: {name: 'Filippos' }}
8
+
9
+ query = HelperClass.new.apply_filters(Micropost.all, hash, include_associations: true).to_sql
10
+ expected_query = q(
11
+ "SELECT microposts.* FROM microposts",
12
+ "INNER JOIN users ON users.id = microposts.user_id",
13
+ "WHERE (users.name = 'Filippos')"
14
+ )
15
+
16
+ expect(strip(query)).to eq expected_query.to_s
17
+ end
18
+ it "multiple where clause" do
19
+ hash = {user: {name: 'Filippos', verified: true }}
20
+
21
+ query = HelperClass.new.apply_filters(Micropost.all, hash, include_associations: true).to_sql
22
+ expected_query = q(
23
+ "SELECT microposts.* FROM microposts",
24
+ "INNER JOIN users ON users.id = microposts.user_id",
25
+ "WHERE (users.name = 'Filippos')",
26
+ "AND users.verified = 't'"
27
+ )
28
+
29
+ expect(strip(query)).to eq expected_query.to_s
30
+ end
31
+
32
+ it "multiple queries" do
33
+ date = DateTime.now.utc.to_s
34
+ hash = {
35
+ user: {
36
+ name: {starts_with: 'filippos', with_ilike: true},
37
+ created_at: {leq: date}
38
+ }
39
+ }
40
+
41
+ query = HelperClass.new.apply_filters(Micropost.all, hash, include_associations: true).to_sql
42
+ expected_query = q(
43
+ "SELECT microposts.* FROM microposts",
44
+ "INNER JOIN users ON users.id = microposts.user_id",
45
+ "WHERE (users.name ILIKE 'filippos%')",
46
+ "AND (users.created_at <= '#{date}')"
47
+ )
48
+
49
+ expect(strip(query)).to eq expected_query.to_s
50
+ end
51
+
52
+ it "scope" do
53
+ hash = {user: {scopes: {unverified: true} }}
54
+
55
+ query = HelperClass.new.apply_filters(Micropost.all, hash, include_associations: true).to_sql
56
+ expected_query = q(
57
+ "SELECT microposts.* FROM microposts",
58
+ "INNER JOIN users ON users.id = microposts.user_id",
59
+ "WHERE users.verified = 'f'"
60
+ )
61
+
62
+ expect(strip(query)).to eq expected_query.to_s
63
+ end
64
+
65
+ it "null" do
66
+ hash = {user: {name: {null: true} }}
67
+
68
+ query = HelperClass.new.apply_filters(Micropost.all, hash, include_associations: true).to_sql
69
+ expected_query = q(
70
+ "SELECT microposts.* FROM microposts",
71
+ "INNER JOIN users ON users.id = microposts.user_id",
72
+ "WHERE (users.name IS NULL)"
73
+ )
74
+
75
+ expect(strip(query)).to eq expected_query.to_s
76
+ end
77
+
78
+ it "sorting" do
79
+ hash = {user: {name: 'Filippos', sort: {property: :created_at} }}
80
+
81
+ query = HelperClass.new.apply_filters(Micropost.all, hash, include_associations: true).to_sql
82
+ expected_query = q(
83
+ "SELECT microposts.* FROM microposts",
84
+ "INNER JOIN users ON users.id = microposts.user_id",
85
+ "WHERE (users.name = 'Filippos')",
86
+ "ORDER BY users.created_at DESC"
87
+ )
88
+
89
+ expect(strip(query)).to eq expected_query.to_s
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+
96
+
@@ -0,0 +1,91 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'associations' do
5
+ context 'has_many' do
6
+ it "one where clause" do
7
+ hash = {microposts: {content: 'Sveavägen 4' }}
8
+
9
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
10
+ expected_query = q(
11
+ "SELECT users.* FROM users",
12
+ "INNER JOIN microposts ON microposts.user_id = users.id",
13
+ "WHERE (microposts.content = 'Sveavägen 4')"
14
+ )
15
+
16
+ expect(strip(query)).to eq expected_query.to_s
17
+ end
18
+
19
+ it "multiple where clause" do
20
+ hash = {microposts: {content: 'Sveavägen 4', created_at: '2017-01-15 16:11:06 UTC' }}
21
+
22
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
23
+ expected_query = q(
24
+ "SELECT users.* FROM users",
25
+ "INNER JOIN microposts ON microposts.user_id = users.id",
26
+ "WHERE (microposts.content = 'Sveavägen 4')",
27
+ "AND microposts.created_at = '2017-01-15 16:11:06 UTC'"
28
+ )
29
+
30
+ expect(strip(query)).to eq expected_query.to_s
31
+ end
32
+
33
+ it "multiple queries" do
34
+ hash = {microposts: {content: {ends_with: '4'}, created_at: {leq: '2017-01-15 16:11:06 UTC'} }}
35
+
36
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
37
+ expected_query = q(
38
+ "SELECT users.* FROM users",
39
+ "INNER JOIN microposts ON microposts.user_id = users.id",
40
+ "WHERE (microposts.content LIKE '%4')",
41
+ "AND (microposts.created_at <= '2017-01-15 16:11:06 UTC')"
42
+ )
43
+
44
+ expect(strip(query)).to eq expected_query.to_s
45
+ end
46
+
47
+ it "scope" do
48
+ date = DateTime.now.to_date.to_s
49
+ hash = {microposts: {scopes: {created_on: [date] }}}
50
+
51
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
52
+ expected_query = q(
53
+ "SELECT users.* FROM users",
54
+ "INNER JOIN microposts ON microposts.user_id = users.id",
55
+ "WHERE (date(microposts.created_at) = '#{date}')"
56
+ )
57
+
58
+ expect(strip(query)).to eq expected_query.to_s
59
+ end
60
+
61
+ it "null" do
62
+ hash = {microposts: {content: {null: true} }}
63
+
64
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
65
+ expected_query = q(
66
+ "SELECT users.* FROM users",
67
+ "INNER JOIN microposts ON microposts.user_id = users.id",
68
+ "WHERE (microposts.content IS NULL)"
69
+ )
70
+
71
+ expect(strip(query)).to eq expected_query.to_s
72
+ end
73
+
74
+ it "sorting" do
75
+ hash = {microposts: {content: 'Sveavägen 4', sort: {property: :created_at} }}
76
+
77
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
78
+ expected_query = q(
79
+ "SELECT users.* FROM users",
80
+ "INNER JOIN microposts ON microposts.user_id = users.id",
81
+ "WHERE (microposts.content = 'Sveavägen 4')",
82
+ "ORDER BY microposts.created_at DESC"
83
+ )
84
+
85
+ expect(strip(query)).to eq expected_query.to_s
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+