diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2017-05-05 02:23:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-05 02:23:01 +0200 |
commit | 81584779cb1795d2fe7827e054bbe245712528a2 (patch) | |
tree | 008186fee04307d50db7a2dc3fa50696488ed686 /spec/services | |
parent | 61c33652ad7a98f0c30fea67bc382e1306b69880 (diff) |
More robust PuSH subscription refreshes (#2799)
* Fix #2473 - Use sidekiq scheduler to refresh PuSH subscriptions instead of cron Fix an issue where / in domain would raise exception in TagManager#normalize_domain PuSH subscriptions refresh done in a round-robin way to avoid hammering a single server's hub in sequence. Correct handling of failures/retries through Sidekiq (see also #2613). Optimize Account#with_followers scope. Also, since subscriptions are now delegated to Sidekiq jobs, an uncaught exception will not stop the entire refreshing operation halfway through Fix #2702 - Correct user agent header on outgoing http requests * Add test for SubscribeService * Extract #expiring_accounts into method * Make mastodon:push:refresh no-op * Queues are now defined in sidekiq.yml * Queues are now in sidekiq.yml
Diffstat (limited to 'spec/services')
-rw-r--r-- | spec/services/follow_service_spec.rb | 7 | ||||
-rw-r--r-- | spec/services/subscribe_service_spec.rb | 38 |
2 files changed, 44 insertions, 1 deletions
diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb index 2ce0fa464..bda5daee1 100644 --- a/spec/services/follow_service_spec.rb +++ b/spec/services/follow_service_spec.rb @@ -53,10 +53,11 @@ RSpec.describe FollowService do end describe 'unlocked account' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } + let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com', hub_url: 'http://hub.example.com')).account } before do stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) + stub_request(:post, "http://hub.example.com/").to_return(status: 202) subject.call(sender, bob.acct) end @@ -70,6 +71,10 @@ RSpec.describe FollowService do xml.match(TagManager::VERBS[:follow]) }).to have_been_made.once end + + it 'subscribes to PuSH' do + expect(a_request(:post, "http://hub.example.com/")).to have_been_made.once + end end end end diff --git a/spec/services/subscribe_service_spec.rb b/spec/services/subscribe_service_spec.rb new file mode 100644 index 000000000..8cf0100c6 --- /dev/null +++ b/spec/services/subscribe_service_spec.rb @@ -0,0 +1,38 @@ +require 'rails_helper' + +RSpec.describe SubscribeService do + let(:account) { Fabricate(:account, username: 'bob', domain: 'example.com', hub_url: 'http://hub.example.com') } + subject { SubscribeService.new } + + it 'sends subscription request to PuSH hub' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 202) + subject.call(account) + expect(a_request(:post, 'http://hub.example.com/')).to have_been_made.once + end + + it 'generates and keeps PuSH secret on successful call' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 202) + subject.call(account) + expect(account.secret).to_not be_blank + end + + it 'fails silently if PuSH hub forbids subscription' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 403) + subject.call(account) + end + + it 'fails silently if PuSH hub is not found' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 404) + subject.call(account) + end + + it 'fails loudly if there is a network error' do + stub_request(:post, 'http://hub.example.com/').to_raise(HTTP::Error) + expect { subject.call(account) }.to raise_error HTTP::Error + end + + it 'fails loudly if PuSH hub is unavailable' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 503) + expect { subject.call(account) }.to raise_error + end +end |