@ -7,13 +7,22 @@ describe StatusCacheHydrator do
let ( :account ) { Fabricate ( :account ) }
let ( :account ) { Fabricate ( :account ) }
describe '#hydrate' do
describe '#hydrate' do
subject { described_class . new ( status ) . hydrate ( account . id ) }
let ( :compare_to_hash ) { InlineRenderer . render ( status , account , :status ) }
let ( :compare_to_hash ) { InlineRenderer . render ( status , account , :status ) }
context 'when cache is warm' do
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
context 'when handling a reblog' do
let ( :reblog ) { Fabricate ( :status ) }
let ( :status ) { Fabricate ( :status , reblog : reblog ) }
context 'that has been favourited' do
before do
before do
Rails . cache . write ( " fan-out/ #{ status . id } " , InlineRenderer . render ( status , nil , :status ) )
FavouriteService . new . call ( account , reblog )
end
end
it 'renders the same attributes as a full render' do
it 'renders the same attributes as a full render' do
@ -21,9 +30,9 @@ describe StatusCacheHydrator do
end
end
end
end
context 'when cache is col d' do
context 'that has been reblogge d' do
before do
before do
Rails . cache . delete ( " fan-out/ #{ status . id } " )
ReblogService . new . call ( account , reblog )
end
end
it 'renders the same attributes as a full render' do
it 'renders the same attributes as a full render' do
@ -31,9 +40,25 @@ describe StatusCacheHydrator do
end
end
end
end
context 'when account has favourited status' do
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
context 'that has been followed tags' do
let ( :followed_tag ) { Fabricate ( :tag ) }
before do
before do
FavouriteService . new . call ( account , status )
reblog . tags << Fabricate ( :tag )
reblog . tags << followed_tag
TagFollow . create! ( tag : followed_tag , account : account , rate_limit : false )
end
end
it 'renders the same attributes as a full render' do
it 'renders the same attributes as a full render' do
@ -41,9 +66,21 @@ describe StatusCacheHydrator do
end
end
end
end
context 'when account has reblogged status' do
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
before do
ReblogService . new . call ( account , status )
VoteService . new . call ( account , poll , [ 0 ] )
end
end
it 'renders the same attributes as a full render' do
it 'renders the same attributes as a full render' do
@ -52,3 +89,23 @@ describe StatusCacheHydrator do
end
end
end
end
end
end
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_behaves_like 'shared behavior'
end
context 'when cache is cold' do
subject do
Rails . cache . delete ( " fan-out/ #{ status . id } " )
described_class . new ( status ) . hydrate ( account . id )
end
it_behaves_like 'shared behavior'
end
end
end