about summary refs log tree commit diff
path: root/spec/lib/status_cache_hydrator_spec.rb
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2022-11-04 19:33:16 +0100
committerGitHub <noreply@github.com>2022-11-04 19:33:16 +0100
commit03b991de6c5874f3e7d1b6f6ff70b853b8daf639 (patch)
tree5c03f388cb425a9d59f78c80c53a703b56efd751 /spec/lib/status_cache_hydrator_spec.rb
parent0165449e3a062238511489a8b23f3facd98258b6 (diff)
Fix various issues with store hydration (#19746)
- Improve tests
- Fix possible crash when application of a reblogged post isn't set
- Fix discrepancies around favourited and reblogged attributes
- Fix discrepancies around pinned attribute
- Fix polls not being hydrated
Diffstat (limited to 'spec/lib/status_cache_hydrator_spec.rb')
-rw-r--r--spec/lib/status_cache_hydrator_spec.rb111
1 files changed, 84 insertions, 27 deletions
diff --git a/spec/lib/status_cache_hydrator_spec.rb b/spec/lib/status_cache_hydrator_spec.rb
index ad9940a85..873d58464 100644
--- a/spec/lib/status_cache_hydrator_spec.rb
+++ b/spec/lib/status_cache_hydrator_spec.rb
@@ -7,48 +7,105 @@ describe StatusCacheHydrator do
   let(:account) { Fabricate(:account) }
 
   describe '#hydrate' do
-    subject { described_class.new(status).hydrate(account.id) }
-
     let(:compare_to_hash) { InlineRenderer.render(status, account, :status) }
 
-    context 'when cache is warm' do
-      before do
-        Rails.cache.write("fan-out/#{status.id}", InlineRenderer.render(status, nil, :status))
+    shared_examples 'shared behavior' do
+      context 'when handling a new status' do
+        it 'renders the same attributes as a full render' do
+          expect(subject).to include(compare_to_hash)
+        end
       end
 
-      it 'renders the same attributes as a full render' do
-        expect(subject).to include(compare_to_hash)
-      end
-    end
+      context 'when handling a reblog' do
+        let(:reblog) { Fabricate(:status) }
+        let(:status) { Fabricate(:status, reblog: reblog) }
 
-    context 'when cache is cold' do
-      before do
-        Rails.cache.delete("fan-out/#{status.id}")
-      end
+        context 'that has been favourited' do
+          before do
+            FavouriteService.new.call(account, reblog)
+          end
+
+          it 'renders the same attributes as a full render' do
+            expect(subject).to include(compare_to_hash)
+          end
+        end
+
+        context 'that has been reblogged' do
+          before do
+            ReblogService.new.call(account, reblog)
+          end
+
+          it 'renders the same attributes as a full render' do
+            expect(subject).to include(compare_to_hash)
+          end
+        end
+
+        context 'that has been pinned' do
+          let(:reblog) { Fabricate(:status, account: account) }
+
+          before do
+            StatusPin.create!(account: account, status: reblog)
+          end
+
+          it 'renders the same attributes as a full render' do
+            expect(subject).to include(compare_to_hash)
+          end
+        end
 
-      it 'renders the same attributes as a full render' do
-        expect(subject).to include(compare_to_hash)
+        context 'that has been followed tags' do
+          let(:followed_tag) { Fabricate(:tag) }
+
+          before do
+            reblog.tags << Fabricate(:tag)
+            reblog.tags << followed_tag
+            TagFollow.create!(tag: followed_tag, account: account, rate_limit: false)
+          end
+
+          it 'renders the same attributes as a full render' do
+            expect(subject).to include(compare_to_hash)
+          end
+        end
+
+        context 'that has a poll authored by the user' do
+          let(:poll) { Fabricate(:poll, account: account) }
+          let(:reblog) { Fabricate(:status, poll: poll, account: account) }
+
+          it 'renders the same attributes as a full render' do
+            expect(subject).to include(compare_to_hash)
+          end
+        end
+
+        context 'that has been voted in' do
+          let(:poll) { Fabricate(:poll, options: %w(Yellow Blue)) }
+          let(:reblog) { Fabricate(:status, poll: poll) }
+
+          before do
+            VoteService.new.call(account, poll, [0])
+          end
+
+          it 'renders the same attributes as a full render' do
+            expect(subject).to include(compare_to_hash)
+          end
+        end
       end
     end
 
-    context 'when account has favourited status' do
-      before do
-        FavouriteService.new.call(account, status)
+    context 'when cache is warm' do
+      subject do
+        Rails.cache.write("fan-out/#{status.id}", InlineRenderer.render(status, nil, :status))
+        described_class.new(status).hydrate(account.id)
       end
 
-      it 'renders the same attributes as a full render' do
-        expect(subject).to include(compare_to_hash)
-      end
+      it_behaves_like 'shared behavior'
     end
 
-    context 'when account has reblogged status' do
-      before do
-        ReblogService.new.call(account, status)
+    context 'when cache is cold' do
+      subject do
+        Rails.cache.delete("fan-out/#{status.id}")
+        described_class.new(status).hydrate(account.id)
       end
 
-      it 'renders the same attributes as a full render' do
-        expect(subject).to include(compare_to_hash)
-      end
+      it_behaves_like 'shared behavior'
     end
   end
 end