about summary refs log tree commit diff
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/activitypub/follows_controller_spec.rb43
-rw-r--r--spec/controllers/auth/confirmations_controller_spec.rb40
-rw-r--r--spec/fixtures/requests/oembed_json_xml.html8
-rw-r--r--spec/fixtures/requests/oembed_xml.html8
-rw-r--r--spec/lib/activitypub/activity/accept_spec.rb53
-rw-r--r--spec/lib/formatter_spec.rb20
-rw-r--r--spec/mailers/user_mailer_spec.rb26
-rw-r--r--spec/models/follow_request_spec.rb8
-rw-r--r--spec/models/user_spec.rb8
9 files changed, 172 insertions, 42 deletions
diff --git a/spec/controllers/activitypub/follows_controller_spec.rb b/spec/controllers/activitypub/follows_controller_spec.rb
new file mode 100644
index 000000000..6026cd353
--- /dev/null
+++ b/spec/controllers/activitypub/follows_controller_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe ActivityPub::FollowsController, type: :controller do
+  let(:follow_request) { Fabricate(:follow_request, account: account) }
+
+  render_views
+
+  context 'with local account' do
+    let(:account) { Fabricate(:account, domain: nil) }
+
+    it 'returns follow request' do
+      signed_request = Request.new(:get, account_follow_url(account, follow_request))
+      signed_request.on_behalf_of(follow_request.target_account)
+      request.headers.merge! signed_request.headers
+
+      get :show, params: { id: follow_request, account_username: account.username }
+
+      expect(body_as_json[:id]).to eq ActivityPub::TagManager.instance.uri_for(follow_request)
+      expect(response).to have_http_status :success
+    end
+
+    it 'returns http 404 without signature' do
+      get :show, params: { id: follow_request, account_username: account.username }
+      expect(response).to have_http_status 404
+    end
+  end
+
+  context 'with remote account' do
+    let(:account) { Fabricate(:account, domain: Faker::Internet.domain_name) }
+
+    it 'returns http 404' do
+      signed_request = Request.new(:get, account_follow_url(account, follow_request))
+      signed_request.on_behalf_of(follow_request.target_account)
+      request.headers.merge! signed_request.headers
+
+      get :show, params: { id: follow_request, account_username: account.username }
+
+      expect(response).to have_http_status 404
+    end
+  end
+end
diff --git a/spec/controllers/auth/confirmations_controller_spec.rb b/spec/controllers/auth/confirmations_controller_spec.rb
index 2ec36c060..80a06c43a 100644
--- a/spec/controllers/auth/confirmations_controller_spec.rb
+++ b/spec/controllers/auth/confirmations_controller_spec.rb
@@ -12,20 +12,40 @@ describe Auth::ConfirmationsController, type: :controller do
   end
 
   describe 'GET #show' do
-    let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil) }
+    context 'when user is unconfirmed' do
+      let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil) }
 
-    before do
-      allow(BootstrapTimelineWorker).to receive(:perform_async)
-      @request.env['devise.mapping'] = Devise.mappings[:user]
-      get :show, params: { confirmation_token: 'foobar' }
-    end
+      before do
+        allow(BootstrapTimelineWorker).to receive(:perform_async)
+        @request.env['devise.mapping'] = Devise.mappings[:user]
+        get :show, params: { confirmation_token: 'foobar' }
+      end
+
+      it 'redirects to login' do
+        expect(response).to redirect_to(new_user_session_path)
+      end
 
-    it 'redirects to login' do
-      expect(response).to redirect_to(new_user_session_path)
+      it 'queues up bootstrapping of home timeline' do
+        expect(BootstrapTimelineWorker).to have_received(:perform_async).with(user.account_id)
+      end
     end
 
-    it 'queues up bootstrapping of home timeline' do
-      expect(BootstrapTimelineWorker).to have_received(:perform_async).with(user.account_id)
+    context 'when user is updating email' do
+      let!(:user) { Fabricate(:user, confirmation_token: 'foobar', unconfirmed_email: 'new-email@example.com') }
+
+      before do
+        allow(BootstrapTimelineWorker).to receive(:perform_async)
+        @request.env['devise.mapping'] = Devise.mappings[:user]
+        get :show, params: { confirmation_token: 'foobar' }
+      end
+
+      it 'redirects to login' do
+        expect(response).to redirect_to(new_user_session_path)
+      end
+
+      it 'does not queue up bootstrapping of home timeline' do
+        expect(BootstrapTimelineWorker).to_not have_received(:perform_async)
+      end
     end
   end
 end
diff --git a/spec/fixtures/requests/oembed_json_xml.html b/spec/fixtures/requests/oembed_json_xml.html
index b5fc9bed0..8afd8e997 100644
--- a/spec/fixtures/requests/oembed_json_xml.html
+++ b/spec/fixtures/requests/oembed_json_xml.html
@@ -1,8 +1,14 @@
 <!DOCTYPE html>
 <html>
   <head>
+    <!--
+      oEmbed
+      https://oembed.com/
+      > The type attribute must contain either application/json+oembed for JSON
+      > responses, or text/xml+oembed for XML.
+    -->
     <link href='https://host/provider.json' rel='alternate' type='application/json+oembed'>
-    <link href='https://host/provider.xml' rel='alternate' type='application/xml+oembed'>
+    <link href='https://host/provider.xml' rel='alternate' type='text/xml+oembed'>
   </head>
   <body></body>
 </html>
diff --git a/spec/fixtures/requests/oembed_xml.html b/spec/fixtures/requests/oembed_xml.html
index 5d7633e71..bdfcca170 100644
--- a/spec/fixtures/requests/oembed_xml.html
+++ b/spec/fixtures/requests/oembed_xml.html
@@ -1,7 +1,13 @@
 <!DOCTYPE html>
 <html>
   <head>
-    <link href='https://host/provider.xml' rel='alternate' type='application/xml+oembed'>
+    <!--
+      oEmbed
+      https://oembed.com/
+      > The type attribute must contain either application/json+oembed for JSON
+      > responses, or text/xml+oembed for XML.
+    -->
+    <link href='https://host/provider.xml' rel='alternate' type='text/xml+oembed'>
   </head>
   <body></body>
 </html>
diff --git a/spec/lib/activitypub/activity/accept_spec.rb b/spec/lib/activitypub/activity/accept_spec.rb
index 6503c83e3..9f43be35d 100644
--- a/spec/lib/activitypub/activity/accept_spec.rb
+++ b/spec/lib/activitypub/activity/accept_spec.rb
@@ -3,36 +3,49 @@ require 'rails_helper'
 RSpec.describe ActivityPub::Activity::Accept do
   let(:sender)    { Fabricate(:account) }
   let(:recipient) { Fabricate(:account) }
-
-  let(:json) do
-    {
-      '@context': 'https://www.w3.org/ns/activitystreams',
-      id: 'foo',
-      type: 'Accept',
-      actor: ActivityPub::TagManager.instance.uri_for(sender),
-      object: {
-        id: 'bar',
-        type: 'Follow',
-        actor: ActivityPub::TagManager.instance.uri_for(recipient),
-        object: ActivityPub::TagManager.instance.uri_for(sender),
-      },
-    }.with_indifferent_access
-  end
+  let!(:follow_request) { Fabricate(:follow_request, account: recipient, target_account: sender) }
 
   describe '#perform' do
     subject { described_class.new(json, sender) }
 
     before do
-      Fabricate(:follow_request, account: recipient, target_account: sender)
       subject.perform
     end
 
-    it 'creates a follow relationship' do
-      expect(recipient.following?(sender)).to be true
+    context 'with concerete object representation' do
+      let(:json) do
+        {
+          '@context': 'https://www.w3.org/ns/activitystreams',
+          id: 'foo',
+          type: 'Accept',
+          actor: ActivityPub::TagManager.instance.uri_for(sender),
+          object: {
+            type: 'Follow',
+            actor: ActivityPub::TagManager.instance.uri_for(recipient),
+            object: ActivityPub::TagManager.instance.uri_for(sender),
+          },
+        }.with_indifferent_access
+      end
+
+      it 'creates a follow relationship' do
+        expect(recipient.following?(sender)).to be true
+      end
     end
 
-    it 'removes the follow request' do
-      expect(recipient.requested?(sender)).to be false
+    context 'with object represented by id' do
+      let(:json) do
+        {
+          '@context': 'https://www.w3.org/ns/activitystreams',
+          id: 'foo',
+          type: 'Accept',
+          actor: ActivityPub::TagManager.instance.uri_for(sender),
+          object: ActivityPub::TagManager.instance.uri_for(follow_request),
+        }.with_indifferent_access
+      end
+
+      it 'creates a follow relationship' do
+        expect(recipient.following?(sender)).to be true
+      end
     end
   end
 end
diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb
index 71b6b78d2..67fbfe92d 100644
--- a/spec/lib/formatter_spec.rb
+++ b/spec/lib/formatter_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Formatter do
       let(:text) { 'http://google.com' }
 
       it 'has valid URL' do
-        is_expected.to include 'href="http://google.com/"'
+        is_expected.to include 'href="http://google.com"'
       end
     end
 
@@ -25,7 +25,7 @@ RSpec.describe Formatter do
       let(:text) { 'https://nic.みんな/' }
 
       it 'has valid URL' do
-        is_expected.to include 'href="https://nic.xn--q9jyb4c/"'
+        is_expected.to include 'href="https://nic.みんな/"'
       end
 
       it 'has display URL' do
@@ -53,7 +53,7 @@ RSpec.describe Formatter do
       let(:text) { 'http://www.google.com!' }
 
       it 'has valid URL' do
-        is_expected.to include 'href="http://www.google.com/"'
+        is_expected.to include 'href="http://www.google.com"'
       end
     end
 
@@ -61,7 +61,7 @@ RSpec.describe Formatter do
       let(:text) { "http://www.google.com'" }
 
       it 'has valid URL' do
-        is_expected.to include 'href="http://www.google.com/"'
+        is_expected.to include 'href="http://www.google.com"'
       end
     end
 
@@ -69,7 +69,7 @@ RSpec.describe Formatter do
       let(:text) { 'http://www.google.com>' }
 
       it 'has valid URL' do
-        is_expected.to include 'href="http://www.google.com/"'
+        is_expected.to include 'href="http://www.google.com"'
       end
     end
 
@@ -93,7 +93,7 @@ RSpec.describe Formatter do
       let(:text) { 'https://ja.wikipedia.org/wiki/日本' }
 
       it 'has valid URL' do
-        is_expected.to include 'href="https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC"'
+        is_expected.to include 'href="https://ja.wikipedia.org/wiki/日本"'
       end
     end
 
@@ -101,7 +101,7 @@ RSpec.describe Formatter do
       let(:text) { 'https://ko.wikipedia.org/wiki/대한민국' }
 
       it 'has valid URL' do
-        is_expected.to include 'href="https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD"'
+        is_expected.to include 'href="https://ko.wikipedia.org/wiki/대한민국"'
       end
     end
 
@@ -109,7 +109,7 @@ RSpec.describe Formatter do
       let(:text) { 'https://baike.baidu.com/item/中华人民共和国' }
 
       it 'has valid URL' do
-        is_expected.to include 'href="https://baike.baidu.com/item/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD"'
+        is_expected.to include 'href="https://baike.baidu.com/item/中华人民共和国"'
       end
     end
 
@@ -117,7 +117,7 @@ RSpec.describe Formatter do
       let(:text) { 'https://zh.wikipedia.org/wiki/臺灣' }
 
       it 'has valid URL' do
-        is_expected.to include 'href="https://zh.wikipedia.org/wiki/%E8%87%BA%E7%81%A3"'
+        is_expected.to include 'href="https://zh.wikipedia.org/wiki/臺灣"'
       end
     end
 
@@ -332,7 +332,7 @@ RSpec.describe Formatter do
     end
 
     context 'contains malicious classes' do
-      let(:text) { '<span class="status__content__spoiler-link">Show more</span>' }
+      let(:text) { '<span class="mention	status__content__spoiler-link">Show more</span>' }
 
       it 'strips malicious classes' do
         is_expected.to_not include 'status__content__spoiler-link'
diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb
index 1f6d44015..9f17993e0 100644
--- a/spec/mailers/user_mailer_spec.rb
+++ b/spec/mailers/user_mailer_spec.rb
@@ -33,6 +33,20 @@ describe UserMailer, type: :mailer do
                      instance: Rails.configuration.x.local_domain
   end
 
+  describe 'reconfirmation_instructions' do
+    let(:mail) { UserMailer.confirmation_instructions(receiver, 'spec') }
+
+    it 'renders reconfirmation instructions' do
+      receiver.update!(email: 'new-email@example.com', locale: nil)
+      expect(mail.body.encoded).to include 'new-email@example.com'
+      expect(mail.body.encoded).to include 'spec'
+      expect(mail.body.encoded).to include Rails.configuration.x.local_domain
+      expect(mail.subject).to eq I18n.t('devise.mailer.reconfirmation_instructions.subject',
+                                        instance: Rails.configuration.x.local_domain,
+                                        locale: I18n.default_locale)
+    end
+  end
+
   describe 'reset_password_instructions' do
     let(:mail) { UserMailer.reset_password_instructions(receiver, 'spec') }
 
@@ -57,4 +71,16 @@ describe UserMailer, type: :mailer do
     include_examples 'localized subject',
                      'devise.mailer.password_change.subject'
   end
+
+  describe 'email_changed' do
+    let(:mail) { UserMailer.email_changed(receiver) }
+
+    it 'renders email change notification' do
+      receiver.update!(locale: nil)
+      expect(mail.body.encoded).to include receiver.email
+    end
+
+    include_examples 'localized subject',
+                     'devise.mailer.email_changed.subject'
+  end
 end
diff --git a/spec/models/follow_request_spec.rb b/spec/models/follow_request_spec.rb
index 7bc93a2aa..18f61e7cb 100644
--- a/spec/models/follow_request_spec.rb
+++ b/spec/models/follow_request_spec.rb
@@ -34,4 +34,12 @@ RSpec.describe FollowRequest, type: :model do
       expect(follow_request.account.muting_reblogs?(target)).to be true
     end
   end
+
+  describe '#object_type' do
+    let(:follow_request) { Fabricate(:follow_request) }
+
+    it 'equals to :follow' do
+      expect(follow_request.object_type).to eq :follow
+    end
+  end
 end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 5ed7ed88b..8171c939a 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -148,6 +148,14 @@ RSpec.describe User, type: :model do
     end
   end
 
+  describe '#confirm' do
+    it 'sets email to unconfirmed_email' do
+      user = Fabricate.build(:user, confirmed_at: Time.now.utc, unconfirmed_email: 'new-email@example.com')
+      user.confirm
+      expect(user.email).to eq 'new-email@example.com'
+    end
+  end
+
   describe '#disable_two_factor!' do
     it 'saves false for otp_required_for_login' do
       user = Fabricate.build(:user, otp_required_for_login: true)