torque-postgresql 3.4.1 → 4.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.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/torque/function_generator.rb +13 -0
  3. data/lib/generators/torque/templates/function.sql.erb +4 -0
  4. data/lib/generators/torque/templates/type.sql.erb +2 -0
  5. data/lib/generators/torque/templates/view.sql.erb +3 -0
  6. data/lib/generators/torque/type_generator.rb +13 -0
  7. data/lib/generators/torque/view_generator.rb +16 -0
  8. data/lib/torque/postgresql/adapter/database_statements.rb +111 -94
  9. data/lib/torque/postgresql/adapter/oid/array.rb +17 -0
  10. data/lib/torque/postgresql/adapter/oid/line.rb +2 -6
  11. data/lib/torque/postgresql/adapter/oid/range.rb +4 -4
  12. data/lib/torque/postgresql/adapter/oid.rb +1 -23
  13. data/lib/torque/postgresql/adapter/quoting.rb +13 -7
  14. data/lib/torque/postgresql/adapter/schema_creation.rb +7 -28
  15. data/lib/torque/postgresql/adapter/schema_definitions.rb +58 -0
  16. data/lib/torque/postgresql/adapter/schema_dumper.rb +136 -34
  17. data/lib/torque/postgresql/adapter/schema_overrides.rb +45 -0
  18. data/lib/torque/postgresql/adapter/schema_statements.rb +109 -49
  19. data/lib/torque/postgresql/arel/infix_operation.rb +15 -28
  20. data/lib/torque/postgresql/arel/nodes.rb +16 -2
  21. data/lib/torque/postgresql/arel/operations.rb +7 -1
  22. data/lib/torque/postgresql/arel/visitors.rb +7 -9
  23. data/lib/torque/postgresql/associations/association_scope.rb +23 -31
  24. data/lib/torque/postgresql/associations/belongs_to_many_association.rb +25 -0
  25. data/lib/torque/postgresql/associations/builder/belongs_to_many.rb +16 -0
  26. data/lib/torque/postgresql/attributes/builder/enum.rb +12 -9
  27. data/lib/torque/postgresql/attributes/builder/full_text_search.rb +109 -0
  28. data/lib/torque/postgresql/attributes/builder/period.rb +21 -21
  29. data/lib/torque/postgresql/attributes/builder.rb +49 -11
  30. data/lib/torque/postgresql/attributes/enum.rb +7 -7
  31. data/lib/torque/postgresql/attributes/enum_set.rb +7 -7
  32. data/lib/torque/postgresql/attributes/full_text_search.rb +19 -0
  33. data/lib/torque/postgresql/attributes/period.rb +2 -2
  34. data/lib/torque/postgresql/attributes.rb +0 -4
  35. data/lib/torque/postgresql/auxiliary_statement/recursive.rb +3 -3
  36. data/lib/torque/postgresql/base.rb +5 -11
  37. data/lib/torque/postgresql/collector.rb +1 -1
  38. data/lib/torque/postgresql/config.rb +129 -5
  39. data/lib/torque/postgresql/function.rb +94 -0
  40. data/lib/torque/postgresql/inheritance.rb +52 -36
  41. data/lib/torque/postgresql/predicate_builder/arel_attribute_handler.rb +33 -0
  42. data/lib/torque/postgresql/predicate_builder/array_handler.rb +47 -0
  43. data/lib/torque/postgresql/predicate_builder/enumerator_lazy_handler.rb +37 -0
  44. data/lib/torque/postgresql/predicate_builder/regexp_handler.rb +21 -0
  45. data/lib/torque/postgresql/predicate_builder.rb +35 -0
  46. data/lib/torque/postgresql/railtie.rb +137 -30
  47. data/lib/torque/postgresql/reflection/abstract_reflection.rb +12 -44
  48. data/lib/torque/postgresql/reflection/belongs_to_many_reflection.rb +4 -0
  49. data/lib/torque/postgresql/reflection/has_many_reflection.rb +4 -0
  50. data/lib/torque/postgresql/reflection/runtime_reflection.rb +1 -1
  51. data/lib/torque/postgresql/relation/auxiliary_statement.rb +7 -2
  52. data/lib/torque/postgresql/relation/buckets.rb +124 -0
  53. data/lib/torque/postgresql/relation/distinct_on.rb +7 -2
  54. data/lib/torque/postgresql/relation/inheritance.rb +22 -15
  55. data/lib/torque/postgresql/relation/join_series.rb +112 -0
  56. data/lib/torque/postgresql/relation/merger.rb +17 -3
  57. data/lib/torque/postgresql/relation.rb +24 -38
  58. data/lib/torque/postgresql/schema_cache.rb +6 -12
  59. data/lib/torque/postgresql/version.rb +1 -1
  60. data/lib/torque/postgresql/versioned_commands/command_migration.rb +146 -0
  61. data/lib/torque/postgresql/versioned_commands/generator.rb +57 -0
  62. data/lib/torque/postgresql/versioned_commands/migration_context.rb +83 -0
  63. data/lib/torque/postgresql/versioned_commands/migrator.rb +39 -0
  64. data/lib/torque/postgresql/versioned_commands/schema_table.rb +101 -0
  65. data/lib/torque/postgresql/versioned_commands.rb +161 -0
  66. data/lib/torque/postgresql.rb +2 -1
  67. data/spec/fixtures/migrations/20250101000001_create_users.rb +0 -0
  68. data/spec/fixtures/migrations/20250101000002_create_function_count_users_v1.sql +0 -0
  69. data/spec/fixtures/migrations/20250101000003_create_internal_users.rb +0 -0
  70. data/spec/fixtures/migrations/20250101000004_update_function_count_users_v2.sql +0 -0
  71. data/spec/fixtures/migrations/20250101000005_create_view_all_users_v1.sql +0 -0
  72. data/spec/fixtures/migrations/20250101000006_create_type_user_id_v1.sql +0 -0
  73. data/spec/fixtures/migrations/20250101000007_remove_function_count_users_v2.sql +0 -0
  74. data/spec/initialize.rb +67 -0
  75. data/spec/mocks/cache_query.rb +21 -21
  76. data/spec/mocks/create_table.rb +6 -26
  77. data/spec/schema.rb +17 -12
  78. data/spec/spec_helper.rb +11 -2
  79. data/spec/tests/arel_spec.rb +32 -7
  80. data/spec/tests/auxiliary_statement_spec.rb +3 -3
  81. data/spec/tests/belongs_to_many_spec.rb +72 -5
  82. data/spec/tests/enum_set_spec.rb +12 -11
  83. data/spec/tests/enum_spec.rb +4 -2
  84. data/spec/tests/full_text_seach_test.rb +280 -0
  85. data/spec/tests/function_spec.rb +42 -0
  86. data/spec/tests/has_many_spec.rb +21 -8
  87. data/spec/tests/interval_spec.rb +1 -7
  88. data/spec/tests/period_spec.rb +61 -61
  89. data/spec/tests/predicate_builder_spec.rb +132 -0
  90. data/spec/tests/relation_spec.rb +229 -0
  91. data/spec/tests/schema_spec.rb +6 -9
  92. data/spec/tests/table_inheritance_spec.rb +25 -26
  93. data/spec/tests/versioned_commands_spec.rb +513 -0
  94. metadata +64 -39
@@ -54,4 +54,233 @@ RSpec.describe 'Relation', type: :helper do
54
54
  end
55
55
  end
56
56
 
57
+ context 'on joining series' do
58
+ let(:source) { Video.all }
59
+
60
+ it 'works' do
61
+ list = create_list(:video, 5)[1..4]
62
+ range = list.first.id..list.last.id
63
+ expect(source.join_series(range, with: :id).to_a).to eq(list)
64
+ expect(source.join_series(range, with: :id, step: 3).to_a).to eq([list.first, list.last])
65
+ end
66
+
67
+ it 'produces the right SQL' do
68
+ sql = 'SELECT "videos".* FROM "videos"'
69
+ sql += ' INNER JOIN GENERATE_SERIES(1::integer, 10::integer)'
70
+ sql += ' AS series ON "series" = "videos"."id"'
71
+ expect(source.join_series(1..10, with: :id).to_sql).to eq(sql)
72
+ end
73
+
74
+ it 'can be renamed' do
75
+ sql = 'SELECT "videos".* FROM "videos"'
76
+ sql += ' INNER JOIN GENERATE_SERIES(1::integer, 10::integer)'
77
+ sql += ' AS seq ON "seq" = "videos"."id"'
78
+ expect(source.join_series(1..10, with: :id, as: :seq).to_sql).to eq(sql)
79
+ end
80
+
81
+ it 'can contain the step' do
82
+ sql = 'SELECT "videos".* FROM "videos"'
83
+ sql += ' INNER JOIN GENERATE_SERIES(1::integer, 10::integer, 2::integer)'
84
+ sql += ' AS series ON "series" = "videos"."id"'
85
+ expect(source.join_series(1..10, with: :id, step: 2).to_sql).to eq(sql)
86
+ end
87
+
88
+ it 'works with float values' do
89
+ sql = 'SELECT "videos".* FROM "videos"'
90
+ sql += ' INNER JOIN GENERATE_SERIES(1.0::numeric, 10.0::numeric, 0.5::numeric)'
91
+ sql += ' AS series ON "series" = "videos"."id"'
92
+ expect(source.join_series(1.0..10.0, with: :id, step: 0.5).to_sql).to eq(sql)
93
+ end
94
+
95
+ it 'works with time values' do
96
+ sql = 'SELECT "videos".* FROM "videos"'
97
+ sql += ' INNER JOIN GENERATE_SERIES('
98
+ sql += "'2025-01-01 00:00:00'::timestamp, '2025-01-01 01:00:00'::timestamp"
99
+ sql += ", 'PT1M'::interval"
100
+ sql += ') AS series ON "series" = "videos"."created_at"'
101
+ range = (Time.utc(2025, 1, 1, 0)..Time.utc(2025, 1, 1, 1))
102
+ expect(source.join_series(range, with: :created_at, step: 1.minute).to_sql).to eq(sql)
103
+ end
104
+
105
+ it 'works with date values' do
106
+ sql = 'SELECT "videos".* FROM "videos"'
107
+ sql += ' INNER JOIN GENERATE_SERIES('
108
+ sql += "'2025-01-01 00:00:00'::timestamp, '2025-01-02 00:00:00'::timestamp"
109
+ sql += ", 'P1D'::interval"
110
+ sql += ') AS series ON "series" = "videos"."created_at"'
111
+ range = (Date.new(2025, 1, 1)..Date.new(2025, 1, 2))
112
+ expect(source.join_series(range, with: :created_at, step: 1.day).to_sql).to eq(sql)
113
+ end
114
+
115
+ it 'works with time with zones values' do
116
+ sql = 'SELECT "videos".* FROM "videos"'
117
+ sql += ' INNER JOIN GENERATE_SERIES('
118
+ sql += "'2025-01-01 00:00:00'::timestamptz, '2025-01-01 01:00:00'::timestamptz"
119
+ sql += ", 'PT1M'::interval"
120
+ sql += ') AS series ON "series" = "videos"."id"'
121
+ left = ActiveSupport::TimeZone['UTC'].local(2025, 1, 1, 0)
122
+ right = ActiveSupport::TimeZone['UTC'].local(2025, 1, 1, 1)
123
+ expect(source.join_series(left..right, with: :id, step: 1.minute).to_sql).to eq(sql)
124
+ end
125
+
126
+ it 'can provide the additional time zone value' do
127
+ sql = 'SELECT "videos".* FROM "videos"'
128
+ sql += ' INNER JOIN GENERATE_SERIES('
129
+ sql += "'2025-01-01 00:00:00'::timestamptz, '2025-01-01 01:00:00'::timestamptz"
130
+ sql += ", 'PT1M'::interval, 'UTC'::text"
131
+ sql += ') AS series ON "series" = "videos"."id"'
132
+ left = ActiveSupport::TimeZone['UTC'].local(2025, 1, 1, 0)
133
+ right = ActiveSupport::TimeZone['UTC'].local(2025, 1, 1, 1)
134
+
135
+ query = source.join_series(left..right, with: :id, step: 1.minute, time_zone: 'UTC')
136
+ expect(query.to_sql).to eq(sql)
137
+ end
138
+
139
+ it 'can use other types of joins' do
140
+ sql = ' LEFT OUTER JOIN GENERATE_SERIES(1::integer, 10::integer)'
141
+ expect(source.join_series(1..10, with: :id, mode: :left).to_sql).to include(sql)
142
+
143
+ sql = ' RIGHT OUTER JOIN GENERATE_SERIES(1::integer, 10::integer)'
144
+ expect(source.join_series(1..10, with: :id, mode: :right).to_sql).to include(sql)
145
+
146
+ sql = ' FULL OUTER JOIN GENERATE_SERIES(1::integer, 10::integer)'
147
+ expect(source.join_series(1..10, with: :id, mode: :full).to_sql).to include(sql)
148
+ end
149
+
150
+ it 'supports a complex way of joining' do
151
+ query = source.join_series(1..10) do |series, table|
152
+ table['id'].lteq(series)
153
+ end
154
+
155
+ sql = 'SELECT "videos".* FROM "videos"'
156
+ sql += ' INNER JOIN GENERATE_SERIES(1::integer, 10::integer)'
157
+ sql += ' AS series ON "videos"."id" <= "series"'
158
+ expect(query.to_sql).to eq(sql)
159
+ end
160
+
161
+ it 'properly binds all provided values' do
162
+ query = source.join_series(1..10, with: :id, step: 2)
163
+ sql, binds = get_query_with_binds { query.load }
164
+
165
+ expect(sql).to include('GENERATE_SERIES($1::integer, $2::integer, $3::integer)')
166
+ expect(binds.map(&:value)).to eq([1, 10, 2])
167
+ end
168
+
169
+ context 'on errors' do
170
+ it 'does not support non-range values' do
171
+ expect do
172
+ source.join_series(1, with: :id)
173
+ end.to raise_error(ArgumentError, /Range/)
174
+ end
175
+
176
+ it 'does not support beginless ranges' do
177
+ expect do
178
+ source.join_series(..10, with: :id)
179
+ end.to raise_error(ArgumentError, /Beginless/)
180
+ end
181
+
182
+ it 'does not support endless ranges' do
183
+ expect do
184
+ source.join_series(1.., with: :id)
185
+ end.to raise_error(ArgumentError, /Endless/)
186
+ end
187
+
188
+ it 'requires a step when using non-numeric ranges' do
189
+ range = Date.new(2025, 1, 1)..Date.new(2025, 1, 10)
190
+ expect do
191
+ source.join_series(range, with: :id)
192
+ end.to raise_error(ArgumentError, /:step/)
193
+ end
194
+
195
+ it 'has strict type of join support' do
196
+ expect do
197
+ source.join_series(1..10, with: :id, mode: :cross)
198
+ end.to raise_error(ArgumentError, /join type/)
199
+ end
200
+
201
+ it 'requires a :with keyword' do
202
+ expect do
203
+ source.join_series(1..10)
204
+ end.to raise_error(ArgumentError, /:with/)
205
+ end
206
+
207
+ it 'does not support unexpected values' do
208
+ expect do
209
+ source.join_series(1..10, step: :other)
210
+ end.to raise_error(ArgumentError, /value type/)
211
+ end
212
+ end
213
+ end
214
+
215
+ context 'on buckets' do
216
+ let(:source) { User.all }
217
+
218
+ it 'produces the right query' do
219
+ query = source.buckets(:age, 0..50, count: 5)
220
+ sql, binds = get_query_with_binds { query.load }
221
+
222
+ expect(sql).to include(<<~SQL.squish)
223
+ WIDTH_BUCKET("users"."age", $1::numeric, $2::numeric, $3::integer) AS bucket
224
+ SQL
225
+ expect(binds.map(&:value)).to eq([0, 50, 5])
226
+ end
227
+
228
+ it 'can query records by buckets' do
229
+ list = [create(:user, age: 5), create(:user, age: 5), create(:user, age: 15)]
230
+ query = source.buckets(:age, 0..50, count: 5).records
231
+
232
+ expect(query).to be_a(Hash)
233
+ expect(query.keys).to match_array([0...10, 10...20])
234
+ expect(query[0...10]).to match_array([list[0], list[1]])
235
+ expect(query[10...20]).to match_array([list[2]])
236
+ end
237
+
238
+ it 'can query buckets of roles' do
239
+ list = [create(:user, role: :visitor)]
240
+ list << create(:user, role: :assistant)
241
+ list << create(:user, role: :manager)
242
+ query = source.buckets(:role, %w[assistant manager], cast: :roles).records
243
+
244
+ expect(query).to be_a(Hash)
245
+ expect(query.keys).to match_array([nil, 'assistant', 'manager'])
246
+ expect(query[nil]).to eq([list[0]])
247
+ expect(query['assistant']).to eq([list[1]])
248
+ expect(query['manager']).to eq([list[2]])
249
+ end
250
+
251
+ it 'works with calculations' do
252
+ list = [create(:user, age: 5), create(:user, age: 5), create(:user, age: 15)]
253
+ query = source.buckets(:age, 0..50, count: 5).count
254
+
255
+ expect(query).to be_a(Hash)
256
+ expect(query.keys).to match_array([0...10, 10...20])
257
+ expect(query[0...10]).to eq(2)
258
+ expect(query[10...20]).to eq(1)
259
+ end
260
+
261
+ it 'works with other types of calculations' do
262
+ list = [create(:user, age: 5), create(:user, age: 5), create(:user, age: 15)]
263
+ query = source.buckets(:age, 0..50, count: 5).sum(:age)
264
+
265
+ expect(query).to be_a(Hash)
266
+ expect(query.keys).to match_array([0...10, 10...20])
267
+ expect(query[0...10]).to eq(10)
268
+ expect(query[10...20]).to eq(15)
269
+ end
270
+
271
+ it 'work with joins and merge' do
272
+ list = [create(:user, age: 5), create(:user, age: 5), create(:user, age: 15)]
273
+ records = [create(:comment, user: list[0], content: 'Hello')]
274
+ records << create(:comment, user: list[1], content: 'World')
275
+ records << create(:comment, user: list[2], content: 'Test')
276
+
277
+ query = Comment.joins(:user).merge(source.buckets(:age, 0..50, count: 5)).records
278
+
279
+ expect(query).to be_a(Hash)
280
+ expect(query.keys).to match_array([0...10, 10...20])
281
+ expect(query[0...10]).to match_array([records[0], records[1]])
282
+ expect(query[10...20]).to match_array([records[2]])
283
+ end
284
+ end
285
+
57
286
  end
@@ -2,13 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe 'Schema' do
4
4
  let(:connection) { ActiveRecord::Base.connection }
5
- let(:source) do
6
- if Torque::PostgreSQL::AR720
7
- ActiveRecord::Base.connection_pool
8
- else
9
- ActiveRecord::Base.connection
10
- end
11
- end
5
+ let(:source) { ActiveRecord::Base.connection_pool }
12
6
 
13
7
  before do
14
8
  connection.instance_variable_set(:@schemas_blacklist, nil)
@@ -16,7 +10,7 @@ RSpec.describe 'Schema' do
16
10
  end
17
11
 
18
12
  context 'on migration' do
19
- it 'can check for existance' do
13
+ it 'can check for existence' do
20
14
  expect(connection.schema_exists?(:information_schema)).to be_falsey
21
15
  expect(connection.schema_exists?(:information_schema, filtered: false)).to be_truthy
22
16
  end
@@ -51,7 +45,10 @@ RSpec.describe 'Schema' do
51
45
  context 'reverting' do
52
46
  let(:migration) { ActiveRecord::Migration::Current.new('Testing') }
53
47
 
54
- before { connection.create_schema(:legacy) }
48
+ before do
49
+ allow_any_instance_of(ActiveRecord::Migration).to receive(:puts) # Disable messages
50
+ connection.create_schema(:legacy)
51
+ end
55
52
 
56
53
  it 'reverts the creation of a schema' do
57
54
  expect(connection.schema_exists?(:legacy, filtered: false)).to be_truthy
@@ -73,14 +73,7 @@ RSpec.describe 'TableInheritance' do
73
73
  end
74
74
 
75
75
  context 'on schema' do
76
- let(:source) do
77
- if Torque::PostgreSQL::AR720
78
- ActiveRecord::Base.connection_pool
79
- else
80
- ActiveRecord::Base.connection
81
- end
82
- end
83
-
76
+ let(:source) { ActiveRecord::Base.connection_pool }
84
77
  let(:dump_result) do
85
78
  ActiveRecord::SchemaDumper.dump(source, (dump_result = StringIO.new))
86
79
  dump_result.string
@@ -89,24 +82,24 @@ RSpec.describe 'TableInheritance' do
89
82
  it 'dumps single inheritance with body' do
90
83
  parts = '"activity_books"'
91
84
  parts << ', id: false'
92
- parts << ', force: :cascade'
93
85
  parts << ', inherits: "activities"'
86
+ parts << ', force: :cascade'
94
87
  expect(dump_result).to match(/create_table #{parts} do /)
95
88
  end
96
89
 
97
90
  it 'dumps single inheritance without body' do
98
91
  parts = '"activity_post_samples"'
99
92
  parts << ', id: false'
100
- parts << ', force: :cascade'
101
93
  parts << ', inherits: "activity_posts"'
94
+ parts << ', force: :cascade'
102
95
  expect(dump_result).to match(/create_table #{parts}(?! do \|t\|)/)
103
96
  end
104
97
 
105
98
  it 'dumps multiple inheritance' do
106
99
  parts = '"activity_posts"'
107
100
  parts << ', id: false'
108
- parts << ', force: :cascade'
109
101
  parts << ', inherits: (\["images", "activities"\]|\["activities", "images"\])'
102
+ parts << ', force: :cascade'
110
103
  expect(dump_result).to match(/create_table #{parts}/)
111
104
  end
112
105
  end
@@ -115,12 +108,9 @@ RSpec.describe 'TableInheritance' do
115
108
  let(:schema_cache) { ActiveRecord::Base.connection.schema_cache }
116
109
  let(:schema_cache_reflection) { schema_cache.instance_variable_get(:@schema_reflection) }
117
110
  let(:new_schema_cache) { schema_cache_reflection.send(:cache, schema_cache_source) }
111
+ let(:schema_cache_source) { schema_cache.instance_variable_get(:@pool) }
118
112
 
119
- let(:schema_cache_source) do
120
- schema_cache.instance_variable_get(Torque::PostgreSQL::AR720 ? :@pool : :@connection)
121
- end
122
-
123
- subject { Torque::PostgreSQL::AR710 ? new_schema_cache : schema_cache }
113
+ subject { new_schema_cache }
124
114
 
125
115
  it 'correctly defines the associations' do
126
116
  scenario = {
@@ -148,8 +138,8 @@ RSpec.describe 'TableInheritance' do
148
138
  end
149
139
 
150
140
  context 'on looking up models' do
151
- let(:prepare_arguments) { Torque::PostgreSQL::AR710 ? [schema_cache_source] : nil }
152
- let(:prepare_method) { Torque::PostgreSQL::AR720 ? :add_all : :prepare_data_sources }
141
+ let(:prepare_arguments) { [schema_cache_source] }
142
+ let(:prepare_method) { :add_all }
153
143
 
154
144
  after(:all) do
155
145
  schema_cache = ActiveRecord::Base.connection.schema_cache
@@ -375,28 +365,37 @@ RSpec.describe 'TableInheritance' do
375
365
  ActivityPost::Sample.create(title: 'Activity post')
376
366
  records = base.cast_records.order(:id).load.to_a
377
367
 
378
- expect(records[0].class).to eql(Activity)
379
- expect(records[1].class).to eql(ActivityBook)
380
- expect(records[2].class).to eql(ActivityPost)
381
- expect(records[3].class).to eql(ActivityPost::Sample)
368
+ expect(records[0]).to be_instance_of(Activity)
369
+ expect(records[1]).to be_instance_of(ActivityBook)
370
+ expect(records[2]).to be_instance_of(ActivityPost)
371
+ expect(records[3]).to be_instance_of(ActivityPost::Sample)
382
372
  end
383
373
 
384
374
  it 'does not cast unnecessary records' do
385
375
  ActivityPost.create(title: 'Activity post')
386
376
  records = base.cast_records(ActivityBook).order(:id).load.to_a
387
377
 
388
- expect(records[0].class).to eql(Activity)
389
- expect(records[1].class).to eql(ActivityBook)
390
- expect(records[2].class).to eql(Activity)
378
+ expect(records[0]).to be_instance_of(Activity)
379
+ expect(records[1]).to be_instance_of(ActivityBook)
380
+ expect(records[2]).to be_instance_of(Activity)
391
381
  end
392
382
 
393
- it 'correctly identify same name attributes' do
383
+ it 'correctly identifies same name attributes' do
394
384
  ActivityPost.create(title: 'Activity post', url: 'posturl1')
395
385
  records = base.cast_records.order(:id).load.to_a
396
386
 
397
387
  expect(records[1].url).to eql('bookurl1')
398
388
  expect(records[2].url).to eql('posturl1')
399
389
  end
390
+
391
+ # TODO: Maybe in the future
392
+ xit 'does not make internal inheritance attributes accessible' do
393
+ record = base.cast_records.order(:id).load.last
394
+
395
+ expect(record).to be_instance_of(ActivityBook)
396
+ expect(record).not_to respond_to(:_record_class)
397
+ expect(record).not_to respond_to(:_auto_cast)
398
+ end
400
399
  end
401
400
 
402
401
  context 'cast record' do