@ -1,33 +1,83 @@
require 'rails_helper'
RSpec . describe HomeFeed , type : :model do
let ( :account ) { Fabricate ( :account ) }
let ( :account ) { Fabricate ( :account ) }
let ( :followed ) { Fabricate ( :account ) }
let ( :other ) { Fabricate ( :account ) }
subject { described_class . new ( account ) }
describe '#get' do
before do
Fabricate ( :status , account : account , id : 1 )
Fabricate ( :status , account : account , id : 2 )
Fabricate ( :status , account : account , id : 3 )
Fabricate ( :status , account : account , id : 10 )
account . follow! ( followed )
Fabricate ( :status , account : account , id : 1 )
Fabricate ( :status , account : account , id : 2 )
status = Fabricate ( :status , account : followed , id : 3 )
Fabricate ( :mention , account : account , status : status )
Fabricate ( :status , account : account , id : 10 )
Fabricate ( :status , account : other , id : 11 )
Fabricate ( :status , account : followed , id : 12 , visibility : :private )
Fabricate ( :status , account : followed , id : 13 , visibility : :direct )
Fabricate ( :status , account : account , id : 14 , visibility : :direct )
dm = Fabricate ( :status , account : followed , id : 15 , visibility : :direct )
Fabricate ( :mention , account : account , status : dm )
end
context 'when feed is generated' do
before do
FeedManager . instance . populate_home ( account )
# Add direct messages because populate_home does not do that
Redis . current . zadd (
FeedManager . instance . key ( :home , account . id ) ,
[ [ 4 , 4 ] , [ 3 , 3 ] , [ 2 , 2 ] , [ 1 , 1 ] ]
[ [ 1 4, 1 4] , [ 15 , 1 5 ] ]
)
end
it 'gets statuses with ids in the range from redis with database' do
results = subject . get ( 3 )
results = subject . get ( 5 )
expect ( results . map ( & :id ) ) . to eq [ 15 , 14 , 12 , 10 , 3 ]
expect ( results . first . attributes . keys ) . to eq %w( id updated_at )
end
it 'with since_id present' do
results = subject . get ( 5 , nil , 3 , nil )
expect ( results . map ( & :id ) ) . to eq [ 15 , 14 , 12 , 10 ]
end
it 'with min_id present' do
results = subject . get ( 3 , nil , nil , 0 )
expect ( results . map ( & :id ) ) . to eq [ 3 , 2 , 1 ]
end
end
context 'when feed is only partial' do
before do
FeedManager . instance . populate_home ( account )
# Add direct messages because populate_home does not do that
Redis . current . zadd (
FeedManager . instance . key ( :home , account . id ) ,
[ [ 14 , 14 ] , [ 15 , 15 ] ]
)
Redis . current . zremrangebyrank ( FeedManager . instance . key ( :home , account . id ) , 0 , - 2 )
end
it 'gets statuses with ids in the range from redis with database' do
results = subject . get ( 5 )
expect ( results . map ( & :id ) ) . to eq [ 15 , 14 , 12 , 10 , 3 ]
expect ( results . first . attributes . keys ) . to eq %w( id updated_at )
end
it 'with since_id present' do
results = subject . get ( 5 , nil , 3 , nil )
expect ( results . map ( & :id ) ) . to eq [ 15 , 14 , 12 , 10 ]
end
it 'with min_id present' do
results = subject . get ( 3 , nil , nil , 0 )
expect ( results . map ( & :id ) ) . to eq [ 3 , 2 , 1 ]
@ -40,9 +90,14 @@ RSpec.describe HomeFeed, type: :model do
end
it 'returns from database' do
results = subject . get ( 3 )
results = subject . get ( 5 )
expect ( results . map ( & :id ) ) . to eq [ 15 , 14 , 12 , 10 , 3 ]
end
expect ( results . map ( & :id ) ) . to eq [ 10 , 3 , 2 ]
it 'with since_id present' do
results = subject . get ( 5 , nil , 3 , nil )
expect ( results . map ( & :id ) ) . to eq [ 15 , 14 , 12 , 10 ]
end
it 'with min_id present' do