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/collections_controller_spec.rb25
-rw-r--r--spec/controllers/admin/action_logs_controller_spec.rb14
-rw-r--r--spec/controllers/admin/dashboard_controller_spec.rb14
-rw-r--r--spec/controllers/admin/invites_controller_spec.rb16
-rw-r--r--spec/controllers/admin/suspensions_controller_spec.rb7
-rw-r--r--spec/controllers/admin/tags_controller_spec.rb71
-rw-r--r--spec/controllers/remote_interaction_controller_spec.rb39
-rw-r--r--spec/controllers/settings/exports_controller_spec.rb21
-rw-r--r--spec/controllers/settings/profiles_controller_spec.rb22
-rw-r--r--spec/fixtures/files/4096x4097.pngbin0 -> 58859 bytes
-rw-r--r--spec/models/custom_emoji_spec.rb9
-rw-r--r--spec/validators/email_mx_validator_spec.rb75
12 files changed, 313 insertions, 0 deletions
diff --git a/spec/controllers/activitypub/collections_controller_spec.rb b/spec/controllers/activitypub/collections_controller_spec.rb
new file mode 100644
index 000000000..34114cc85
--- /dev/null
+++ b/spec/controllers/activitypub/collections_controller_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe ActivityPub::CollectionsController, type: :controller do
+  describe 'POST #show' do
+    let(:account) { Fabricate(:account) }
+
+    context 'id is "featured"' do
+      it 'returns 200 with "application/activity+json"' do
+        post :show, params: { id: 'featured', account_username: account.username }
+
+        expect(response).to have_http_status(200)
+        expect(response.content_type).to eq 'application/activity+json'
+      end
+    end
+
+    context 'id is not "featured"' do
+      it 'returns 404' do
+        post :show, params: { id: 'hoge', account_username: account.username }
+        expect(response).to have_http_status(404)
+      end
+    end
+  end
+end
diff --git a/spec/controllers/admin/action_logs_controller_spec.rb b/spec/controllers/admin/action_logs_controller_spec.rb
new file mode 100644
index 000000000..4720ed2e2
--- /dev/null
+++ b/spec/controllers/admin/action_logs_controller_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Admin::ActionLogsController, type: :controller do
+  describe 'GET #index' do
+    it 'returns 200' do
+      sign_in Fabricate(:user, admin: true)
+      get :index, params: { page: 1 }
+
+      expect(response).to have_http_status(200)
+    end
+  end
+end
diff --git a/spec/controllers/admin/dashboard_controller_spec.rb b/spec/controllers/admin/dashboard_controller_spec.rb
new file mode 100644
index 000000000..73b50e721
--- /dev/null
+++ b/spec/controllers/admin/dashboard_controller_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Admin::DashboardController, type: :controller do
+  describe 'GET #index' do
+    it 'returns 200' do
+      sign_in Fabricate(:user, admin: true)
+      get :index
+
+      expect(response).to have_http_status(200)
+    end
+  end
+end
diff --git a/spec/controllers/admin/invites_controller_spec.rb b/spec/controllers/admin/invites_controller_spec.rb
index 34b51a6aa..449a699e4 100644
--- a/spec/controllers/admin/invites_controller_spec.rb
+++ b/spec/controllers/admin/invites_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe Admin::InvitesController do
@@ -40,4 +42,18 @@ describe Admin::InvitesController do
       expect(invite.reload).to be_expired
     end
   end
+
+  describe 'POST #deactivate_all' do
+    it 'expires all invites, then redirects to admin_invites_path' do
+      invites = Fabricate.times(2, :invite, expires_at: nil)
+
+      post :deactivate_all
+
+      invites.each do |invite|
+        expect(invite.reload).to be_expired
+      end
+
+      expect(response).to redirect_to admin_invites_path
+    end
+  end
 end
diff --git a/spec/controllers/admin/suspensions_controller_spec.rb b/spec/controllers/admin/suspensions_controller_spec.rb
index babb1ed96..1bc33e490 100644
--- a/spec/controllers/admin/suspensions_controller_spec.rb
+++ b/spec/controllers/admin/suspensions_controller_spec.rb
@@ -7,6 +7,13 @@ describe Admin::SuspensionsController do
     sign_in Fabricate(:user, admin: true), scope: :user
   end
 
+  describe 'GET #new' do
+    it 'returns 200' do
+      get :new, params: { account_id: Fabricate(:account).id, report_id: Fabricate(:report).id }
+      expect(response).to have_http_status(200)
+    end
+  end
+
   describe 'POST #create' do
     it 'redirects to admin accounts page' do
       account = Fabricate(:account, suspended: false)
diff --git a/spec/controllers/admin/tags_controller_spec.rb b/spec/controllers/admin/tags_controller_spec.rb
new file mode 100644
index 000000000..3af994071
--- /dev/null
+++ b/spec/controllers/admin/tags_controller_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe Admin::TagsController, type: :controller do
+  render_views
+
+  before do
+    sign_in Fabricate(:user, admin: true)
+  end
+
+  describe 'GET #index' do
+    before do
+      account_tag_stat = Fabricate(:tag).account_tag_stat
+      account_tag_stat.update(hidden: hidden, accounts_count: 1)
+      get :index, params: { hidden: hidden }
+    end
+
+    context 'with hidden tags' do
+      let(:hidden) { true }
+
+      it 'returns status 200' do
+        expect(response).to have_http_status(200)
+      end
+    end
+
+    context 'without hidden tags' do
+      let(:hidden) { false }
+
+      it 'returns status 200' do
+        expect(response).to have_http_status(200)
+      end
+    end
+  end
+
+  describe 'POST #hide' do
+    let(:tag) { Fabricate(:tag) }
+
+    before do
+      tag.account_tag_stat.update(hidden: false)
+      post :hide, params: { id: tag.id }
+    end
+
+    it 'hides tag' do
+      tag.reload
+      expect(tag).to be_hidden
+    end
+
+    it 'redirects to admin_tags_path' do
+      expect(response).to redirect_to(admin_tags_path(controller.instance_variable_get(:@filter_params)))
+    end
+  end
+
+  describe 'POST #unhide' do
+    let(:tag) { Fabricate(:tag) }
+
+    before do
+      tag.account_tag_stat.update(hidden: true)
+      post :unhide, params: { id: tag.id }
+    end
+
+    it 'unhides tag' do
+      tag.reload
+      expect(tag).not_to be_hidden
+    end
+
+    it 'redirects to admin_tags_path' do
+      expect(response).to redirect_to(admin_tags_path(controller.instance_variable_get(:@filter_params)))
+    end
+  end
+end
diff --git a/spec/controllers/remote_interaction_controller_spec.rb b/spec/controllers/remote_interaction_controller_spec.rb
new file mode 100644
index 000000000..bb0074b11
--- /dev/null
+++ b/spec/controllers/remote_interaction_controller_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe RemoteInteractionController, type: :controller do
+  render_views
+
+  let(:status) { Fabricate(:status) }
+
+  describe 'GET #new' do
+    it 'returns 200' do
+      get :new, params: { id: status.id }
+      expect(response).to have_http_status(200)
+    end
+  end
+
+  describe 'POST #create' do
+    context '@remote_follow is valid' do
+      it 'returns 302' do
+        allow_any_instance_of(RemoteFollow).to receive(:valid?) { true }
+        allow_any_instance_of(RemoteFollow).to receive(:addressable_template) do
+          Addressable::Template.new('https://hoge.com')
+        end
+
+        post :create, params: { id: status.id, remote_follow: { acct: '@hoge' } }
+        expect(response).to have_http_status(302)
+      end
+    end
+
+    context '@remote_follow is invalid' do
+      it 'returns 200' do
+        allow_any_instance_of(RemoteFollow).to receive(:valid?) { false }
+        post :create, params: { id: status.id, remote_follow: { acct: '@hoge' } }
+
+        expect(response).to have_http_status(200)
+      end
+    end
+  end
+end
diff --git a/spec/controllers/settings/exports_controller_spec.rb b/spec/controllers/settings/exports_controller_spec.rb
index b7cab4d8f..a46fe095d 100644
--- a/spec/controllers/settings/exports_controller_spec.rb
+++ b/spec/controllers/settings/exports_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe Settings::ExportsController do
@@ -28,4 +30,23 @@ describe Settings::ExportsController do
       end
     end
   end
+
+  describe 'POST #create' do
+    before do
+      sign_in Fabricate(:user), scope: :user
+    end
+
+    it 'redirects to settings_export_path' do
+      post :create
+      expect(response).to redirect_to(settings_export_path)
+    end
+
+    it 'queues BackupWorker job by 1' do
+      Sidekiq::Testing.fake! do
+        expect do
+          post :create
+        end.to change(BackupWorker.jobs, :size).by(1)
+      end
+    end
+  end
 end
diff --git a/spec/controllers/settings/profiles_controller_spec.rb b/spec/controllers/settings/profiles_controller_spec.rb
index a453200af..5b1fe3aca 100644
--- a/spec/controllers/settings/profiles_controller_spec.rb
+++ b/spec/controllers/settings/profiles_controller_spec.rb
@@ -26,4 +26,26 @@ RSpec.describe Settings::ProfilesController, type: :controller do
       expect(ActivityPub::UpdateDistributionWorker).to have_received(:perform_async).with(account.id)
     end
   end
+
+  describe 'PUT #update with new profile image' do
+    it 'updates profile image' do
+      allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async)
+      account = Fabricate(:account, user: @user, display_name: 'AvatarTest')
+      expect(account.avatar.instance.avatar_file_name).to be_nil
+
+      put :update, params: { account: { avatar: fixture_file_upload('files/avatar.gif', 'image/gif') } }
+      expect(response).to redirect_to(settings_profile_path)
+      expect(account.reload.avatar.instance.avatar_file_name).not_to be_nil
+      expect(ActivityPub::UpdateDistributionWorker).to have_received(:perform_async).with(account.id)
+    end
+  end
+
+  describe 'PUT #update with oversized image' do
+    it 'gives the user an error message' do
+      allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async)
+      account = Fabricate(:account, user: @user, display_name: 'AvatarTest')
+      put :update, params: { account: { avatar: fixture_file_upload('files/4096x4097.png', 'image/png') } }
+      expect(response.body).to include('images are not supported')
+    end
+  end
 end
diff --git a/spec/fixtures/files/4096x4097.png b/spec/fixtures/files/4096x4097.png
new file mode 100644
index 000000000..d1110cc2d
--- /dev/null
+++ b/spec/fixtures/files/4096x4097.png
Binary files differdiff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb
index 320a258d3..9de218b4f 100644
--- a/spec/models/custom_emoji_spec.rb
+++ b/spec/models/custom_emoji_spec.rb
@@ -75,4 +75,13 @@ RSpec.describe CustomEmoji, type: :model do
       end
     end
   end
+
+  describe 'pre_validation' do
+    let(:custom_emoji) { Fabricate(:custom_emoji, domain: 'wWw.MaStOdOn.CoM') }
+
+    it 'should downcase' do
+      custom_emoji.valid?
+      expect(custom_emoji.domain).to eq('www.mastodon.com')
+    end
+  end
 end
diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb
new file mode 100644
index 000000000..bc68f63cf
--- /dev/null
+++ b/spec/validators/email_mx_validator_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe EmailMxValidator do
+  describe '#validate' do
+    let(:user) { double(email: 'foo@example.com', errors: double(add: nil)) }
+
+    it 'adds an error if there are no DNS records for the e-mail domain' do
+      resolver = double
+
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:timeouts=).and_return(nil)
+      allow(Resolv::DNS).to receive(:open).and_yield(resolver)
+
+      subject.validate(user)
+      expect(user.errors).to have_received(:add)
+    end
+
+    it 'adds an error if a MX record exists but does not lead to an IP' do
+      resolver = double
+
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:timeouts=).and_return(nil)
+      allow(Resolv::DNS).to receive(:open).and_yield(resolver)
+
+      subject.validate(user)
+      expect(user.errors).to have_received(:add)
+    end
+
+    it 'adds an error if the A record is blacklisted' do
+      EmailDomainBlock.create!(domain: '1.2.3.4')
+      resolver = double
+
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '1.2.3.4')])
+      allow(resolver).to receive(:timeouts=).and_return(nil)
+      allow(Resolv::DNS).to receive(:open).and_yield(resolver)
+
+      subject.validate(user)
+      expect(user.errors).to have_received(:add)
+    end
+
+    it 'adds an error if the MX record is blacklisted' do
+      EmailDomainBlock.create!(domain: '2.3.4.5')
+      resolver = double
+
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')])
+      allow(resolver).to receive(:timeouts=).and_return(nil)
+      allow(Resolv::DNS).to receive(:open).and_yield(resolver)
+
+      subject.validate(user)
+      expect(user.errors).to have_received(:add)
+    end
+
+    it 'adds an error if the MX hostname is blacklisted' do
+      EmailDomainBlock.create!(domain: 'mail.example.com')
+      resolver = double
+
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')])
+      allow(resolver).to receive(:timeouts=).and_return(nil)
+      allow(Resolv::DNS).to receive(:open).and_yield(resolver)
+
+      subject.validate(user)
+      expect(user.errors).to have_received(:add)
+    end
+  end
+end