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,89 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'associations' do
5
+ context 'has_one' do
6
+ it "one where clause" do
7
+ hash = {address: {street: '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 addresses ON addresses.user_id = users.id",
13
+ "WHERE (addresses.street = '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 = {address: {street: 'Sveavägen 4', country: 'SE' }}
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 addresses ON addresses.user_id = users.id",
26
+ "WHERE (addresses.street = 'Sveavägen 4')",
27
+ "AND (addresses.country = 'SE')"
28
+ )
29
+
30
+ expect(strip(query)).to eq expected_query.to_s
31
+ end
32
+
33
+ it "multiple queries" do
34
+ hash = {address: {street: {like: 'sveav', with_ilike: true}, city: {starts_with: 'New'} }}
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 addresses ON addresses.user_id = users.id",
40
+ "WHERE (addresses.street ILIKE '%sveav%')",
41
+ "AND (addresses.city LIKE 'New%')"
42
+ )
43
+
44
+ expect(strip(query)).to eq expected_query.to_s
45
+ end
46
+
47
+ it "scope" do
48
+ hash = {address: {scopes: {in_sweden: true} }}
49
+
50
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
51
+ expected_query = q(
52
+ "SELECT users.* FROM users",
53
+ "INNER JOIN addresses ON addresses.user_id = users.id",
54
+ "WHERE addresses.country = 'SE'"
55
+ )
56
+
57
+ expect(strip(query)).to eq expected_query.to_s
58
+ end
59
+
60
+ it "null" do
61
+ hash = {address: {street: {null: false} }}
62
+
63
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
64
+ expected_query = q(
65
+ "SELECT users.* FROM users",
66
+ "INNER JOIN addresses ON addresses.user_id = users.id",
67
+ "WHERE (addresses.street IS NOT NULL)"
68
+ )
69
+
70
+ expect(strip(query)).to eq expected_query.to_s
71
+ end
72
+
73
+ it "sorting" do
74
+ hash = {address: {street: {like: 'svea'}, sort: {property: :street, order: :asc} }}
75
+
76
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
77
+ expected_query = q(
78
+ "SELECT users.* FROM users",
79
+ "INNER JOIN addresses ON addresses.user_id = users.id",
80
+ "WHERE (addresses.street LIKE '%svea%')",
81
+ "ORDER BY addresses.street ASC"
82
+ )
83
+
84
+ expect(strip(query)).to eq expected_query.to_s
85
+ end
86
+ end
87
+ end
88
+ end
89
+
@@ -0,0 +1,29 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'booleans' do
5
+ it "one boolean where clause" do
6
+ hash = {admin: false}
7
+
8
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
9
+ expected_query = q(
10
+ "SELECT users.* FROM users",
11
+ "WHERE users.admin = 'f'"
12
+ )
13
+
14
+ expect(strip(query)).to eq expected_query.to_s
15
+ end
16
+
17
+ it "multi boolean where clauses" do
18
+ hash = {admin: false, verified: true}
19
+
20
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
21
+ expected_query = q(
22
+ "SELECT users.* FROM users",
23
+ "WHERE users.admin = 'f' AND users.verified = 't'"
24
+ )
25
+
26
+ expect(strip(query)).to eq expected_query.to_s
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'limit' do
5
+ it "one where clause" do
6
+ hash = {microposts_count: 10, limit: 10}
7
+
8
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
9
+ expected_query = q(
10
+ "SELECT users.* FROM users WHERE (users.microposts_count = 10) LIMIT 10"
11
+ )
12
+
13
+ expect(strip(query)).to eq expected_query.to_s
14
+ end
15
+
16
+ it "multiple where clause" do
17
+ hash = {microposts_count: 3, followers_count: 5, limit: 10}
18
+
19
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
20
+ expected_query = q(
21
+ "SELECT users.* FROM users",
22
+ "WHERE (users.microposts_count = 3)",
23
+ "AND (users.followers_count = 5)",
24
+ "LIMIT 10"
25
+ )
26
+
27
+ expect(strip(query)).to eq expected_query.to_s
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,44 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'NULL' do
5
+ context "one where clause" do
6
+ it "is null" do
7
+ hash = {admin: {null: true}}
8
+
9
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
10
+ expected_query = q(
11
+ "SELECT users.* FROM users",
12
+ "WHERE (users.admin IS NULL)"
13
+ )
14
+
15
+ expect(strip(query)).to eq expected_query.to_s
16
+ end
17
+
18
+ it "is not null" do
19
+ hash = {admin: {null: false}}
20
+
21
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
22
+ expected_query = q(
23
+ "SELECT users.* FROM users",
24
+ "WHERE (users.admin IS NOT NULL)"
25
+ )
26
+
27
+ expect(strip(query)).to eq expected_query.to_s
28
+ end
29
+ end
30
+
31
+ it "multi where clauses" do
32
+ hash = {admin: {null: true}, verified: {null: false}}
33
+
34
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
35
+ expected_query = q(
36
+ "SELECT users.* FROM users",
37
+ "WHERE (users.admin IS NULL)",
38
+ "AND (users.verified IS NOT NULL)"
39
+ )
40
+
41
+ expect(strip(query)).to eq expected_query.to_s
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,142 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'numbers' do
5
+ it "one where clause" do
6
+ hash = {microposts_count: 10}
7
+
8
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
9
+ expected_query = q(
10
+ "SELECT users.* FROM users WHERE (users.microposts_count = 10)"
11
+ )
12
+
13
+ expect(strip(query)).to eq expected_query.to_s
14
+ end
15
+
16
+ it "multiple where clause" do
17
+ hash = {microposts_count: 3, followers_count: 5}
18
+
19
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
20
+ expected_query = q(
21
+ "SELECT users.* FROM users",
22
+ "WHERE (users.microposts_count = 3)",
23
+ "AND (users.followers_count = 5)"
24
+ )
25
+
26
+ expect(strip(query)).to eq expected_query.to_s
27
+ end
28
+
29
+ it "multiple values" do
30
+ hash = {microposts_count: [3,4,5]}
31
+
32
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
33
+ expected_query = q(
34
+ "SELECT users.* FROM users",
35
+ "WHERE (users.microposts_count IN (3, 4, 5))",
36
+ )
37
+
38
+ expect(strip(query)).to eq expected_query.to_s
39
+ end
40
+
41
+ context "queries" do
42
+ it 'eq' do
43
+ hash = {microposts_count: {eq: 10}}
44
+
45
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
46
+ expected_query = q(
47
+ "SELECT users.* FROM users WHERE (users.microposts_count = 10)"
48
+ )
49
+
50
+ expect(strip(query)).to eq expected_query.to_s
51
+ end
52
+
53
+ it 'le' do
54
+ hash = {microposts_count: {le: 10}}
55
+
56
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
57
+ expected_query = q(
58
+ "SELECT users.* FROM users WHERE (users.microposts_count < 10)"
59
+ )
60
+
61
+ expect(strip(query)).to eq expected_query.to_s
62
+ end
63
+
64
+ it 'leq' do
65
+ hash = {microposts_count: {leq: 10}}
66
+
67
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
68
+ expected_query = q(
69
+ "SELECT users.* FROM users WHERE (users.microposts_count <= 10)"
70
+ )
71
+
72
+ expect(strip(query)).to eq expected_query.to_s
73
+ end
74
+
75
+ it 'ge' do
76
+ hash = {microposts_count: {ge: 10}}
77
+
78
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
79
+ expected_query = q(
80
+ "SELECT users.* FROM users WHERE (users.microposts_count > 10)"
81
+ )
82
+
83
+ expect(strip(query)).to eq expected_query.to_s
84
+ end
85
+
86
+ it 'geq' do
87
+ hash = {microposts_count: {geq: 10}}
88
+
89
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
90
+ expected_query = q(
91
+ "SELECT users.* FROM users WHERE (users.microposts_count >= 10)"
92
+ )
93
+
94
+ expect(strip(query)).to eq expected_query.to_s
95
+ end
96
+
97
+ context 'combined' do
98
+ it 'with a single column' do
99
+ hash = {microposts_count: {geq: 10, le: 20}}
100
+
101
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
102
+ expected_query = q(
103
+ "SELECT users.* FROM users",
104
+ "WHERE (users.microposts_count < 20)",
105
+ "AND (users.microposts_count >= 10)"
106
+ )
107
+
108
+ expect(strip(query)).to eq expected_query.to_s
109
+ end
110
+
111
+ it 'with multiple columns' do
112
+ hash = {
113
+ microposts_count: {geq: 10, le: 20},
114
+ followers_count: {leq: 50, ge: 0}
115
+ }
116
+
117
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
118
+ expected_query = q(
119
+ "SELECT users.* FROM users",
120
+ "WHERE (users.microposts_count < 20)",
121
+ "AND (users.microposts_count >= 10)",
122
+ "AND (users.followers_count <= 50)",
123
+ "AND (users.followers_count > 0)"
124
+ )
125
+
126
+ expect(strip(query)).to eq expected_query.to_s
127
+ end
128
+ end
129
+
130
+ it 'rails enum' do
131
+ hash = {status: 0}
132
+
133
+ query = HelperClass.new.apply_filters(Micropost.all, hash).to_sql
134
+ expected_query = q(
135
+ "SELECT microposts.* FROM microposts WHERE (microposts.status = 0)"
136
+ )
137
+
138
+ expect(strip(query)).to eq expected_query.to_s
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,98 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ if ActiveRecord::VERSION::MAJOR < 5
5
+ context 'OR filter' do
6
+ it "one OR clause" do
7
+ logger = double('logger')
8
+ allow(logger).to receive(:warn)
9
+ allow(Rails).to receive(:logger).and_return(logger)
10
+
11
+ hash = {or: [{name: 'Filippos'}, {name: 'Vasilis'}]}
12
+
13
+ HelperClass.new.apply_filters(User.all, hash).to_sql
14
+ expect(logger).to have_received(:warn)
15
+ end
16
+ end
17
+
18
+ else
19
+ context 'OR filter' do
20
+ it "one OR clause" do
21
+ hash = {or: [{name: 'Filippos'}, {name: 'Vasilis'}]}
22
+
23
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
24
+ expected_query = q(
25
+ "SELECT users.* FROM users",
26
+ "WHERE ((users.name = 'Filippos') OR (users.name = 'Vasilis'))"
27
+ )
28
+
29
+ expect(strip(query)).to eq expected_query.to_s
30
+ end
31
+
32
+ it "multiple OR clauses" do
33
+ hash = {or: [{or: [{name: 'Filippos'}, {name: 'Vasilis'}]}, {or: [{id: 1}, {id: 2}]}]}
34
+
35
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
36
+ expected_query = q(
37
+ "SELECT users.* FROM users",
38
+ "WHERE",
39
+ "(",
40
+ "((users.name = 'Filippos') OR (users.name = 'Vasilis'))",
41
+ "OR",
42
+ "((users.id = 1) OR (users.id = 2))",
43
+ ")"
44
+ )
45
+
46
+ expect(strip(query)).to eq expected_query.to_s
47
+ end
48
+
49
+ it "one complex OR clause" do
50
+ hash = {or: [{name: 'Filippos', token: '123'}, {name: 'Vasilis'}]}
51
+
52
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
53
+ expected_query = q(
54
+ "SELECT users.* FROM users",
55
+ "WHERE",
56
+ "(",
57
+ "(users.name = 'Filippos') AND (users.token = '123')",
58
+ "OR",
59
+ "(users.name = 'Vasilis')",
60
+ ")"
61
+ )
62
+
63
+ expect(strip(query)).to eq expected_query.to_s
64
+ end
65
+
66
+ it "nested OR clause" do
67
+ hash = {or: [{or: [{name: 'Filippos'}, {token: '123'}]}, {name: 'Vasilis'}]}
68
+
69
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
70
+ expected_query = q(
71
+ "SELECT users.* FROM users",
72
+ "WHERE",
73
+ "(",
74
+ "((users.name = 'Filippos') OR (users.token = '123'))",
75
+ "OR",
76
+ "(users.name = 'Vasilis')",
77
+ ")"
78
+ )
79
+
80
+ expect(strip(query)).to eq expected_query.to_s
81
+ end
82
+
83
+ it "OR clause on associations" do
84
+ hash = {microposts: {or: [{content: 'Sveavägen 4'}, {id: 1}]}}
85
+
86
+ query = HelperClass.new.apply_filters(User.all, hash, include_associations: true).to_sql
87
+ expected_query = q(
88
+ "SELECT users.* FROM users",
89
+ "INNER JOIN microposts ON microposts.user_id = users.id",
90
+ "WHERE ((microposts.content = 'Sveavägen 4') OR (microposts.id = 1))"
91
+ )
92
+
93
+ expect(strip(query)).to eq expected_query.to_s
94
+ end
95
+ end
96
+ end
97
+ end
98
+
@@ -0,0 +1,29 @@
1
+ describe ActiveHashRelation do
2
+ include Helpers
3
+
4
+ context 'primary_key' do
5
+ it "one key" do
6
+ hash = {id: 1}
7
+
8
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
9
+ expected_query = q(
10
+ "SELECT users.* FROM users WHERE (users.id = 1)"
11
+ )
12
+
13
+ expect(strip(query)).to eq expected_query.to_s
14
+ end
15
+
16
+ it "multiple keys" do
17
+ hash = {id: [1,2,3,4]}
18
+
19
+ query = HelperClass.new.apply_filters(User.all, hash).to_sql
20
+ expected_query = q(
21
+ "SELECT users.* FROM users WHERE (users.id IN (1, 2, 3, 4))"
22
+ )
23
+
24
+ expect(strip(query)).to eq expected_query.to_s
25
+ end
26
+ end
27
+ end
28
+
29
+