From 5e1767173f82672c77e4d1ce5d9f252750e5f96d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 28 Aug 2018 05:39:43 +0200 Subject: [PATCH] Display pending message on admin relays UI (#8494) * Add missing specs for relay accept/reject * Display pending message on admin relays UI --- app/views/admin/relays/_relay.html.haml | 10 +++++--- config/locales/en.yml | 1 + spec/fabricators/relay_fabricator.rb | 2 +- spec/lib/activitypub/activity/accept_spec.rb | 26 ++++++++++++++++++++ spec/lib/activitypub/activity/reject_spec.rb | 26 ++++++++++++++++++++ 5 files changed, 61 insertions(+), 4 deletions(-) diff --git a/app/views/admin/relays/_relay.html.haml b/app/views/admin/relays/_relay.html.haml index d974c80a6..667821894 100644 --- a/app/views/admin/relays/_relay.html.haml +++ b/app/views/admin/relays/_relay.html.haml @@ -2,20 +2,24 @@ %td %samp= relay.inbox_url %td - - if relay.enabled? + - if relay.accepted? %span.positive-hint = fa_icon('check') = ' ' = t 'admin.relays.enabled' + - elsif relay.pending? + = fa_icon('hourglass') + = ' ' + = t 'admin.relays.pending' - else %span.negative-hint = fa_icon('times') = ' ' = t 'admin.relays.disabled' %td - - if relay.enabled? + - if relay.accepted? = table_link_to 'power-off', t('admin.relays.disable'), disable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } - - else + - elsif !relay.pending? = table_link_to 'power-off', t('admin.relays.enable'), enable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } = table_link_to 'times', t('admin.relays.delete'), admin_relay_path(relay), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } diff --git a/config/locales/en.yml b/config/locales/en.yml index aa7efff84..4f893716b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -303,6 +303,7 @@ en: description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. inbox_url: Relay URL + pending: Waiting for relay's approval setup: Setup a relay connection status: Status title: Relays diff --git a/spec/fabricators/relay_fabricator.rb b/spec/fabricators/relay_fabricator.rb index 2c9df4ad3..3f8726f6b 100644 --- a/spec/fabricators/relay_fabricator.rb +++ b/spec/fabricators/relay_fabricator.rb @@ -1,4 +1,4 @@ Fabricator(:relay) do inbox_url "https://example.com/inbox" - enabled true + state :idle end diff --git a/spec/lib/activitypub/activity/accept_spec.rb b/spec/lib/activitypub/activity/accept_spec.rb index 6503c83e3..883bab6ac 100644 --- a/spec/lib/activitypub/activity/accept_spec.rb +++ b/spec/lib/activitypub/activity/accept_spec.rb @@ -35,4 +35,30 @@ RSpec.describe ActivityPub::Activity::Accept do expect(recipient.requested?(sender)).to be false end end + + context 'given a relay' do + let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') } + + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'foo', + type: 'Accept', + actor: ActivityPub::TagManager.instance.uri_for(sender), + object: { + id: 'https://abc-123/456', + type: 'Follow', + actor: ActivityPub::TagManager.instance.uri_for(recipient), + object: ActivityPub::TagManager.instance.uri_for(sender), + }, + }.with_indifferent_access + end + + subject { described_class.new(json, sender) } + + it 'marks the relay as accepted' do + subject.perform + expect(relay.reload.accepted?).to be true + end + end end diff --git a/spec/lib/activitypub/activity/reject_spec.rb b/spec/lib/activitypub/activity/reject_spec.rb index 7fd95bcc6..e7205df8d 100644 --- a/spec/lib/activitypub/activity/reject_spec.rb +++ b/spec/lib/activitypub/activity/reject_spec.rb @@ -35,4 +35,30 @@ RSpec.describe ActivityPub::Activity::Reject do expect(recipient.requested?(sender)).to be false end end + + context 'given a relay' do + let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') } + + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'foo', + type: 'Reject', + actor: ActivityPub::TagManager.instance.uri_for(sender), + object: { + id: 'https://abc-123/456', + type: 'Follow', + actor: ActivityPub::TagManager.instance.uri_for(recipient), + object: ActivityPub::TagManager.instance.uri_for(sender), + }, + }.with_indifferent_access + end + + subject { described_class.new(json, sender) } + + it 'marks the relay as rejected' do + subject.perform + expect(relay.reload.rejected?).to be true + end + end end