second_level_cache 2.3.3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +29 -22
  3. data/Gemfile +4 -2
  4. data/README.md +7 -1
  5. data/Rakefile +6 -4
  6. data/lib/second_level_cache.rb +7 -5
  7. data/lib/second_level_cache/active_record.rb +15 -10
  8. data/lib/second_level_cache/active_record/base.rb +2 -0
  9. data/lib/second_level_cache/active_record/belongs_to_association.rb +2 -0
  10. data/lib/second_level_cache/active_record/core.rb +2 -0
  11. data/lib/second_level_cache/active_record/fetch_by_uniq_key.rb +5 -3
  12. data/lib/second_level_cache/active_record/finder_methods.rb +3 -1
  13. data/lib/second_level_cache/active_record/has_one_association.rb +2 -0
  14. data/lib/second_level_cache/active_record/persistence.rb +2 -0
  15. data/lib/second_level_cache/active_record/preloader.rb +7 -4
  16. data/lib/second_level_cache/config.rb +3 -1
  17. data/lib/second_level_cache/mixin.rb +3 -1
  18. data/lib/second_level_cache/record_marshal.rb +2 -0
  19. data/lib/second_level_cache/record_relation.rb +2 -0
  20. data/lib/second_level_cache/version.rb +1 -1
  21. data/second_level_cache.gemspec +4 -4
  22. data/test/active_record_test_case_helper.rb +7 -5
  23. data/test/base_test.rb +6 -4
  24. data/test/belongs_to_association_test.rb +4 -2
  25. data/test/enum_attr_test.rb +6 -4
  26. data/test/fetch_by_uniq_key_test.rb +15 -13
  27. data/test/finder_methods_test.rb +6 -4
  28. data/test/has_one_association_test.rb +10 -8
  29. data/test/model/account.rb +2 -0
  30. data/test/model/animal.rb +2 -0
  31. data/test/model/book.rb +2 -0
  32. data/test/model/image.rb +2 -0
  33. data/test/model/order.rb +2 -0
  34. data/test/model/order_item.rb +2 -0
  35. data/test/model/post.rb +2 -0
  36. data/test/model/topic.rb +2 -0
  37. data/test/model/user.rb +6 -4
  38. data/test/persistence_test.rb +12 -10
  39. data/test/polymorphic_association_test.rb +4 -2
  40. data/test/preloader_non_integer_test.rb +17 -14
  41. data/test/preloader_test.rb +13 -10
  42. data/test/record_marshal_test.rb +17 -15
  43. data/test/require_test.rb +7 -5
  44. data/test/second_level_cache_test.rb +5 -3
  45. data/test/single_table_inheritance_test.rb +3 -1
  46. data/test/test_helper.rb +19 -17
  47. metadata +19 -19
@@ -1,17 +1,19 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class BaseTest < ActiveSupport::TestCase
4
6
  def setup
5
- @user = User.create name: 'csdn', email: 'test@csdn.com'
7
+ @user = User.create name: "csdn", email: "test@csdn.com"
6
8
  end
7
9
 
8
10
  def test_should_update_cache_when_update_attributes
9
- @user.update_attributes name: 'change'
11
+ @user.update_attributes name: "change"
10
12
  assert_equal @user.name, User.read_second_level_cache(@user.id).name
11
13
  end
12
14
 
13
15
  def test_should_update_cache_when_update_attribute
14
- @user.update_attribute :name, 'change'
16
+ @user.update_attribute :name, "change"
15
17
  assert_equal @user.name, User.read_second_level_cache(@user.id).name
16
18
  end
17
19
 
@@ -1,8 +1,10 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class BelongsToAssociationTest < ActiveSupport::TestCase
4
6
  def setup
5
- @user = User.create name: 'csdn', email: 'test@csdn.com'
7
+ @user = User.create name: "csdn", email: "test@csdn.com"
6
8
  end
7
9
 
8
10
  def test_should_get_cache_when_use_belongs_to_association
@@ -1,13 +1,15 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class EnumAttrTest < ActiveSupport::TestCase
4
6
  def setup
5
- @user = User.create name: 'csdn', email: 'test@csdn.com'
7
+ @user = User.create name: "csdn", email: "test@csdn.com"
6
8
  end
7
9
 
8
10
  def test_enum_attr
9
11
  @user.archived!
10
- assert_equal 'archived', @user.status
11
- assert_equal 'archived', User.find(@user.id).status
12
+ assert_equal "archived", @user.status
13
+ assert_equal "archived", User.find(@user.id).status
12
14
  end
13
15
  end
@@ -1,42 +1,44 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class FetchByUinqKeyTest < ActiveSupport::TestCase
4
6
  def setup
5
- @user = User.create name: 'hooopo', email: 'hoooopo@gmail.com'
6
- @post = Post.create slug: 'foobar', topic_id: 2
7
+ @user = User.create name: "hooopo", email: "hoooopo@gmail.com"
8
+ @post = Post.create slug: "foobar", topic_id: 2
7
9
  end
8
10
 
9
11
  def test_cache_uniq_key
10
- assert_equal User.send(:cache_uniq_key, name: 'hooopo'), 'uniq_key_User_name_hooopo'
11
- assert_equal User.send(:cache_uniq_key, foo: 1, bar: 2), 'uniq_key_User_foo_1,bar_2'
12
- assert_equal User.send(:cache_uniq_key, foo: 1, bar: nil), 'uniq_key_User_foo_1,bar_'
13
- long_val = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
12
+ assert_equal User.send(:cache_uniq_key, name: "hooopo"), "uniq_key_User_name_hooopo"
13
+ assert_equal User.send(:cache_uniq_key, foo: 1, bar: 2), "uniq_key_User_foo_1,bar_2"
14
+ assert_equal User.send(:cache_uniq_key, foo: 1, bar: nil), "uniq_key_User_foo_1,bar_"
15
+ long_val = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14
16
  assert_equal User.send(:cache_uniq_key, foo: 1, bar: long_val), "uniq_key_User_foo_1,bar_#{Digest::MD5.hexdigest(long_val)}"
15
17
  end
16
18
 
17
19
  def test_should_query_from_db_using_primary_key
18
- Post.fetch_by_uniq_keys(topic_id: 2, slug: 'foobar')
20
+ Post.fetch_by_uniq_keys(topic_id: 2, slug: "foobar")
19
21
  @post.expire_second_level_cache
20
22
  assert_sql(/SELECT\s+"posts".* FROM "posts"\s+WHERE "posts"."id" = \? LIMIT ?/) do
21
- Post.fetch_by_uniq_keys(topic_id: 2, slug: 'foobar')
23
+ Post.fetch_by_uniq_keys(topic_id: 2, slug: "foobar")
22
24
  end
23
25
  end
24
26
 
25
27
  def test_should_not_hit_db_using_fetch_by_uniq_key_twice
26
- post = Post.fetch_by_uniq_keys(topic_id: 2, slug: 'foobar')
28
+ post = Post.fetch_by_uniq_keys(topic_id: 2, slug: "foobar")
27
29
  assert_equal post, @post
28
30
  assert_no_queries do
29
- Post.fetch_by_uniq_keys(topic_id: 2, slug: 'foobar')
31
+ Post.fetch_by_uniq_keys(topic_id: 2, slug: "foobar")
30
32
  end
31
33
  end
32
34
 
33
35
  def test_should_fail_when_fetch_by_uniq_key_with_bang_method
34
36
  assert_raises(ActiveRecord::RecordNotFound) do
35
- Post.fetch_by_uniq_keys!(topic_id: 2, slug: 'foobar1')
37
+ Post.fetch_by_uniq_keys!(topic_id: 2, slug: "foobar1")
36
38
  end
37
39
 
38
40
  assert_raises(ActiveRecord::RecordNotFound) do
39
- User.fetch_by_uniq_key!('xxxxx', :name)
41
+ User.fetch_by_uniq_key!("xxxxx", :name)
40
42
  end
41
43
  end
42
44
 
@@ -1,8 +1,10 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class FinderMethodsTest < ActiveSupport::TestCase
4
6
  def setup
5
- @user = User.create name: 'csdn', email: 'test@csdn.com'
7
+ @user = User.create name: "csdn", email: "test@csdn.com"
6
8
  end
7
9
 
8
10
  def test_should_find_without_cache
@@ -34,14 +36,14 @@ class FinderMethodsTest < ActiveSupport::TestCase
34
36
 
35
37
  def test_should_not_find_from_cache_when_select_speical_columns
36
38
  @user.write_second_level_cache
37
- only_id_user = User.select('id').find(@user.id)
39
+ only_id_user = User.select("id").find(@user.id)
38
40
  assert_raises(ActiveModel::MissingAttributeError) do
39
41
  only_id_user.name
40
42
  end
41
43
  end
42
44
 
43
45
  def test_without_second_level_cache
44
- @user.name = 'NewName'
46
+ @user.name = "NewName"
45
47
  @user.write_second_level_cache
46
48
  User.without_second_level_cache do
47
49
  @from_db = User.find(@user.id)
@@ -1,8 +1,10 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class HasOneAssociationTest < ActiveSupport::TestCase
4
6
  def setup
5
- @user = User.create name: 'hooopo', email: 'hoooopo@gmail.com'
7
+ @user = User.create name: "hooopo", email: "hoooopo@gmail.com"
6
8
  @account = @user.create_account
7
9
  end
8
10
 
@@ -14,7 +16,7 @@ class HasOneAssociationTest < ActiveSupport::TestCase
14
16
  end
15
17
 
16
18
  def test_should_fetch_has_one_through
17
- user = User.create name: 'hooopo', email: 'hoooopo@gmail.com', forked_from_user: @user
19
+ user = User.create name: "hooopo", email: "hoooopo@gmail.com", forked_from_user: @user
18
20
  clean_user = user.reload
19
21
  assert_equal User, clean_user.forked_from_user.class
20
22
  assert_equal @user.id, user.forked_from_user.id
@@ -25,13 +27,13 @@ class HasOneAssociationTest < ActiveSupport::TestCase
25
27
  end
26
28
 
27
29
  def test_has_one_with_conditions
28
- user = User.create name: 'hooopo', email: 'hoooopo@gmail.com'
29
- Namespace.create(user_id: user.id, name: 'ruby-china', kind: 'group')
30
- user.create_namespace(name: 'hooopo')
31
- Namespace.create(user_id: user.id, name: 'rails', kind: 'group')
30
+ user = User.create name: "hooopo", email: "hoooopo@gmail.com"
31
+ Namespace.create(user_id: user.id, name: "ruby-china", kind: "group")
32
+ user.create_namespace(name: "hooopo")
33
+ Namespace.create(user_id: user.id, name: "rails", kind: "group")
32
34
  assert_not_equal user.namespace, nil
33
35
  clear_user = User.find(user.id)
34
- assert_equal clear_user.namespace.name, 'hooopo'
36
+ assert_equal clear_user.namespace.name, "hooopo"
35
37
  end
36
38
 
37
39
  def test_assign_relation
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:accounts, force: true) do |t|
2
4
  t.integer :age
3
5
  t.string :site
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:animals, force: true) do |t|
2
4
  t.string :type
3
5
  t.string :name
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:books, force: true) do |t|
2
4
  t.string :title
3
5
  t.string :body
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:images, force: true) do |t|
2
4
  t.string :url
3
5
  t.string :imagable_type
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:orders, force: true, id: :uuid) do |t|
2
4
  t.text :body
3
5
  t.string :title
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:order_items, force: true, id: :uuid) do |t|
2
4
  t.text :body
3
5
  t.string :slug
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:posts, force: true) do |t|
2
4
  t.text :body
3
5
  t.string :slug
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:topics, force: true) do |t|
2
4
  t.string :title
3
5
  t.text :body
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.create_table(:users, force: true) do |t|
2
4
  t.text :options
3
5
  t.text :json_options
@@ -28,11 +30,11 @@ class User < ActiveRecord::Base
28
30
  second_level_cache(version: CACHE_VERSION, expires_in: 3.days)
29
31
 
30
32
  serialize :options, Array
31
- serialize :json_options, JSON if ::ActiveRecord::VERSION::STRING >= '4.1.0'
33
+ serialize :json_options, JSON if ::ActiveRecord::VERSION::STRING >= "4.1.0"
32
34
  store :extras, accessors: %i[tagline gender]
33
35
 
34
36
  has_one :account
35
- has_one :forked_user_link, foreign_key: 'forked_to_user_id'
37
+ has_one :forked_user_link, foreign_key: "forked_to_user_id"
36
38
  has_one :forked_from_user, through: :forked_user_link
37
39
  has_many :namespaces
38
40
  has_one :namespace, -> { where(kind: nil) }
@@ -49,6 +51,6 @@ class Namespace < ActiveRecord::Base
49
51
  end
50
52
 
51
53
  class ForkedUserLink < ActiveRecord::Base
52
- belongs_to :forked_from_user, class_name: 'User'
53
- belongs_to :forked_to_user, class_name: 'User'
54
+ belongs_to :forked_from_user, class_name: "User"
55
+ belongs_to :forked_to_user, class_name: "User"
54
56
  end
@@ -1,14 +1,16 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class PersistenceTest < ActiveSupport::TestCase
4
6
  def setup
5
- @user = User.create name: 'csdn', email: 'test@csdn.com'
6
- @topic = Topic.create title: 'csdn'
7
+ @user = User.create name: "csdn", email: "test@csdn.com"
8
+ @topic = Topic.create title: "csdn"
7
9
  end
8
10
 
9
11
  def test_should_reload_object
10
- User.where(id: @user.id).update_all(email: 'different@csdn.com')
11
- assert_equal 'different@csdn.com', @user.reload.email
12
+ User.where(id: @user.id).update_all(email: "different@csdn.com")
13
+ assert_equal "different@csdn.com", @user.reload.email
12
14
  end
13
15
 
14
16
  def test_should_reload_object_associations
@@ -26,31 +28,31 @@ class PersistenceTest < ActiveSupport::TestCase
26
28
  end
27
29
 
28
30
  def test_should_update_cache_after_update_column
29
- @user.update_column :name, 'new_name'
31
+ @user.update_column :name, "new_name"
30
32
  new_user = User.find @user.id
31
33
  assert_equal new_user, @user
32
34
  end
33
35
 
34
36
  def test_should_update_cache_after_update_columns
35
- @user.update_columns name: 'new_name1'
37
+ @user.update_columns name: "new_name1"
36
38
  new_user = User.find @user.id
37
39
  assert_equal new_user, @user
38
40
  end
39
41
 
40
42
  def test_should_update_cache_after_update_attribute
41
- @user.update_attribute :name, 'new_name'
43
+ @user.update_attribute :name, "new_name"
42
44
  new_user = User.find @user.id
43
45
  assert_equal new_user, @user
44
46
  end
45
47
 
46
48
  def test_should_update_cache_after_update
47
- @user.update name: 'new_name'
49
+ @user.update name: "new_name"
48
50
  new_user = User.find @user.id
49
51
  assert_equal new_user, @user
50
52
  end
51
53
 
52
54
  def test_should_update_cache_after_update!
53
- @user.update! name: 'new_name'
55
+ @user.update! name: "new_name"
54
56
  new_user = User.find @user.id
55
57
  assert_equal new_user, @user
56
58
  end
@@ -1,8 +1,10 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class PolymorphicAssociationTest < ActiveSupport::TestCase
4
6
  def setup
5
- @user = User.create name: 'csdn', email: 'test@csdn.com'
7
+ @user = User.create name: "csdn", email: "test@csdn.com"
6
8
  end
7
9
 
8
10
  def test_should_get_cache_when_use_polymorphic_association
@@ -1,26 +1,28 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class PreloaderNonIntegerTest < ActiveSupport::TestCase
4
6
  def test_belongs_to_preload_caches_includes_uuid
5
7
  orders = [
6
- Order.create(id: '15944214-e4df-4e46-8d56-1f5864a0b90c', title: 'title1', body: 'body1'),
7
- Order.create(id: '25944214-e4df-4e46-8d56-1f5864a0b90c', title: 'title2', body: 'body2'),
8
- Order.create(id: '35944214-e4df-4e46-8d56-1f5864a0b90c', title: 'title3', body: 'body3')
8
+ Order.create(id: "15944214-e4df-4e46-8d56-1f5864a0b90c", title: "title1", body: "body1"),
9
+ Order.create(id: "25944214-e4df-4e46-8d56-1f5864a0b90c", title: "title2", body: "body2"),
10
+ Order.create(id: "35944214-e4df-4e46-8d56-1f5864a0b90c", title: "title3", body: "body3")
9
11
  ]
10
12
  orders.each_with_index { |order, i| order.order_items.create(body: "order_item#{order.id}", id: "1#{i}944214-e4df-4e46-8d56-1f5864a0b90c") }
11
13
 
12
14
  results = nil
13
15
  assert_queries(1) do
14
- results = OrderItem.includes(:order).order('id ASC').to_a
16
+ results = OrderItem.includes(:order).order("id ASC").to_a
15
17
  end
16
18
  assert_equal orders, results.map(&:order)
17
19
  end
18
20
 
19
21
  def test_belongs_to_when_read_multi_missed_from_cache_ar_will_fetch_missed_records_from_db_uuid
20
22
  orders = [
21
- Order.create(id: '15944214-e4df-4e46-8d56-1f5864a0b90c', title: 'title1', body: 'body1'),
22
- Order.create(id: '25944214-e4df-4e46-8d56-1f5864a0b90c', title: 'title2', body: 'body2'),
23
- Order.create(id: '35944214-e4df-4e46-8d56-1f5864a0b90c', title: 'title3', body: 'body3')
23
+ Order.create(id: "15944214-e4df-4e46-8d56-1f5864a0b90c", title: "title1", body: "body1"),
24
+ Order.create(id: "25944214-e4df-4e46-8d56-1f5864a0b90c", title: "title2", body: "body2"),
25
+ Order.create(id: "35944214-e4df-4e46-8d56-1f5864a0b90c", title: "title3", body: "body3")
24
26
  ]
25
27
  orders.each_with_index { |order, i| order.order_items.create(body: "order_item#{order.id}", id: "1#{i}944214-e4df-4e46-8d56-1f5864a0b90c") }
26
28
  expired_order = orders.first
@@ -28,8 +30,9 @@ class PreloaderNonIntegerTest < ActiveSupport::TestCase
28
30
 
29
31
  results = nil
30
32
  assert_queries(2) do
31
- assert_sql(/WHERE\s\"orders\"\.\"id\"\s=\s'#{expired_order.id}'/m) do
32
- results = OrderItem.includes(:order).order('id ASC').to_a
33
+ assert_sql(/WHERE\s\"orders\"\.\"id\" = ?/m) do
34
+ results = OrderItem.includes(:order).order("id ASC").to_a
35
+ assert_equal expired_order, results.first.order
33
36
  end
34
37
  end
35
38
 
@@ -37,11 +40,11 @@ class PreloaderNonIntegerTest < ActiveSupport::TestCase
37
40
  end
38
41
 
39
42
  def test_has_many_preloader_returns_correct_results
40
- order = Order.create(id: '15944214-e4df-4e46-8d56-1f5864a0b90c')
41
- OrderItem.create(id: '11944214-e4df-4e46-8d56-1f5864a0b90c')
42
- order_item = order.order_items.create(id: '12944214-e4df-4e46-8d56-1f5864a0b90c')
43
+ order = Order.create(id: "15944214-e4df-4e46-8d56-1f5864a0b90c")
44
+ OrderItem.create(id: "11944214-e4df-4e46-8d56-1f5864a0b90c")
45
+ order_item = order.order_items.create(id: "12944214-e4df-4e46-8d56-1f5864a0b90c")
43
46
 
44
- assert_equal [order_item], Order.includes(:order_items).find('15944214-e4df-4e46-8d56-1f5864a0b90c').order_items
47
+ assert_equal [order_item], Order.includes(:order_items).find("15944214-e4df-4e46-8d56-1f5864a0b90c").order_items
45
48
  end
46
49
 
47
50
  def test_has_one_preloader_returns_correct_results
@@ -1,26 +1,28 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  class PreloaderTest < ActiveSupport::TestCase
4
6
  def test_belongs_to_preload_caches_includes
5
7
  topics = [
6
- Topic.create(title: 'title1', body: 'body1'),
7
- Topic.create(title: 'title2', body: 'body2'),
8
- Topic.create(title: 'title3', body: 'body3')
8
+ Topic.create(title: "title1", body: "body1"),
9
+ Topic.create(title: "title2", body: "body2"),
10
+ Topic.create(title: "title3", body: "body3")
9
11
  ]
10
12
  topics.each { |topic| topic.posts.create(body: "post#{topic.id}") }
11
13
 
12
14
  results = nil
13
15
  assert_queries(1) do
14
- results = Post.includes(:topic).order('id ASC').to_a
16
+ results = Post.includes(:topic).order("id ASC").to_a
15
17
  end
16
18
  assert_equal topics, results.map(&:topic)
17
19
  end
18
20
 
19
21
  def test_belongs_to_when_read_multi_missed_from_cache_ar_will_fetch_missed_records_from_db
20
22
  topics = [
21
- Topic.create(title: 'title1', body: 'body1'),
22
- Topic.create(title: 'title2', body: 'body2'),
23
- Topic.create(title: 'title3', body: 'body3')
23
+ Topic.create(title: "title1", body: "body1"),
24
+ Topic.create(title: "title2", body: "body2"),
25
+ Topic.create(title: "title3", body: "body3")
24
26
  ]
25
27
  topics.each { |topic| topic.posts.create(body: "post#{topic.id}") }
26
28
  expired_topic = topics.first
@@ -28,8 +30,9 @@ class PreloaderTest < ActiveSupport::TestCase
28
30
 
29
31
  results = nil
30
32
  assert_queries(2) do
31
- assert_sql(/WHERE\s\"topics\"\.\"id\"\s=\s#{expired_topic.id}/m) do
32
- results = Post.includes(:topic).order('id ASC').to_a
33
+ assert_sql(/WHERE\s\"topics\"\.\"id\"\s=\s?/m) do
34
+ results = Post.includes(:topic).order("id ASC").to_a
35
+ assert_equal expired_topic, results.first.topic
33
36
  end
34
37
  end
35
38