2021-12-27 09:53:59 -08:00
# frozen_string_literal: true
require 'rails_helper'
describe ShareWorker do
let ( :user ) { FactoryBot . create ( :user ) }
let ( :answer ) { FactoryBot . create ( :answer , user : user ) }
2021-12-27 14:02:32 -08:00
let! ( :service ) { Services :: Twitter . create! ( type : 'Services::Twitter' ,
user : user ) }
2021-12-27 09:53:59 -08:00
2021-12-27 18:03:59 -08:00
before do
stub_const ( " APP_CONFIG " , {
'hostname' = > 'example.com' ,
'anonymous_name' = > 'Anonymous' ,
'https' = > true ,
'items_per_page' = > 5 ,
'sharing' = > {
'twitter' = > {
'consumer_key' = > '' ,
}
}
} )
end
2021-12-27 09:53:59 -08:00
describe " # perform " do
2021-12-27 14:02:32 -08:00
subject {
Sidekiq :: Testing . fake! do
ShareWorker . perform_async ( user . id , answer . id , 'twitter' )
end
}
2021-12-27 09:53:59 -08:00
context 'when answer doesn\'t exist' do
it 'prevents the job from retrying and logs a message' do
answer . destroy!
2021-12-27 18:59:45 -08:00
Sidekiq . logger . should_receive ( :info ) . with ( " Tried to post answer # #{ answer . id } for user # #{ user . id } to Twitter but the user/answer/service did not exist (likely deleted), will not retry. " )
2021-12-27 14:02:32 -08:00
expect { subject } . to change ( ShareWorker . jobs , :size ) . by ( 1 )
expect { ShareWorker . drain } . to change ( ShareWorker . jobs , :size ) . by ( - 1 )
end
end
context 'when answer exists' do
2021-12-27 18:59:45 -08:00
it 'handles Twitter::Error::DuplicateStatus' do
allow_any_instance_of ( Services :: Twitter ) . to receive ( :post ) . with ( answer ) . and_raise ( Twitter :: Error :: DuplicateStatus )
Sidekiq . logger . should_receive ( :info ) . with ( " Tried to post answer # #{ answer . id } from user # #{ user . id } to Twitter but the status was already posted. " )
subject
ShareWorker . drain
end
it 'handles Twitter::Error::Unauthorized' do
allow_any_instance_of ( Services :: Twitter ) . to receive ( :post ) . with ( answer ) . and_raise ( Twitter :: Error :: Unauthorized )
Sidekiq . logger . should_receive ( :info ) . with ( " Tried to post answer # #{ answer . id } from user # #{ user . id } to Twitter but the token has exired or been revoked. " )
subject
ShareWorker . drain
end
2021-12-27 14:02:32 -08:00
it 'retries on unhandled exceptions' do
expect { subject } . to change ( ShareWorker . jobs , :size ) . by ( 1 )
2021-12-27 18:59:45 -08:00
Sidekiq . logger . should_receive ( :info )
2021-12-27 18:03:59 -08:00
expect { ShareWorker . drain } . to raise_error ( Twitter :: Error :: BadRequest )
2021-12-27 09:53:59 -08:00
end
end
end
end