Merge branch 'main' into glitch-soc/merge-upstream
This commit is contained in:
@@ -8,34 +8,8 @@ RSpec.describe AboutController, type: :controller do
|
||||
get :show
|
||||
end
|
||||
|
||||
it 'assigns @instance_presenter' do
|
||||
expect(assigns(:instance_presenter)).to be_kind_of InstancePresenter
|
||||
end
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #more' do
|
||||
before do
|
||||
get :more
|
||||
end
|
||||
|
||||
it 'assigns @instance_presenter' do
|
||||
expect(assigns(:instance_presenter)).to be_kind_of InstancePresenter
|
||||
end
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'helper_method :new_user' do
|
||||
it 'returns a new User' do
|
||||
user = @controller.view_context.new_user
|
||||
expect(user).to be_kind_of User
|
||||
expect(user.account).to be_kind_of Account
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -1,64 +0,0 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe AccountFollowController do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:alice) { Fabricate(:account, username: 'alice') }
|
||||
|
||||
describe 'POST #create' do
|
||||
let(:service) { double }
|
||||
|
||||
subject { post :create, params: { account_username: alice.username } }
|
||||
|
||||
before do
|
||||
allow(FollowService).to receive(:new).and_return(service)
|
||||
allow(service).to receive(:call)
|
||||
end
|
||||
|
||||
context 'when account is permanently suspended' do
|
||||
before do
|
||||
alice.suspend!
|
||||
alice.deletion_request.destroy
|
||||
subject
|
||||
end
|
||||
|
||||
it 'returns http gone' do
|
||||
expect(response).to have_http_status(410)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when account is temporarily suspended' do
|
||||
before do
|
||||
alice.suspend!
|
||||
subject
|
||||
end
|
||||
|
||||
it 'returns http forbidden' do
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when signed out' do
|
||||
before do
|
||||
subject
|
||||
end
|
||||
|
||||
it 'does not follow' do
|
||||
expect(FollowService).not_to receive(:new)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when signed in' do
|
||||
before do
|
||||
sign_in(user)
|
||||
subject
|
||||
end
|
||||
|
||||
it 'redirects to account path' do
|
||||
expect(service).to have_received(:call).with(user.account, alice, with_rate_limit: true)
|
||||
expect(response).to redirect_to(account_path(alice))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@@ -1,64 +0,0 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe AccountUnfollowController do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:alice) { Fabricate(:account, username: 'alice') }
|
||||
|
||||
describe 'POST #create' do
|
||||
let(:service) { double }
|
||||
|
||||
subject { post :create, params: { account_username: alice.username } }
|
||||
|
||||
before do
|
||||
allow(UnfollowService).to receive(:new).and_return(service)
|
||||
allow(service).to receive(:call)
|
||||
end
|
||||
|
||||
context 'when account is permanently suspended' do
|
||||
before do
|
||||
alice.suspend!
|
||||
alice.deletion_request.destroy
|
||||
subject
|
||||
end
|
||||
|
||||
it 'returns http gone' do
|
||||
expect(response).to have_http_status(410)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when account is temporarily suspended' do
|
||||
before do
|
||||
alice.suspend!
|
||||
subject
|
||||
end
|
||||
|
||||
it 'returns http forbidden' do
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when signed out' do
|
||||
before do
|
||||
subject
|
||||
end
|
||||
|
||||
it 'does not unfollow' do
|
||||
expect(UnfollowService).not_to receive(:new)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when signed in' do
|
||||
before do
|
||||
sign_in(user)
|
||||
subject
|
||||
end
|
||||
|
||||
it 'redirects to account path' do
|
||||
expect(service).to have_received(:call).with(user.account, alice)
|
||||
expect(response).to redirect_to(account_path(alice))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@@ -99,100 +99,6 @@ RSpec.describe AccountsController, type: :controller do
|
||||
end
|
||||
|
||||
it_behaves_like 'common response characteristics'
|
||||
|
||||
it 'renders public status' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status))
|
||||
end
|
||||
|
||||
it 'renders self-reply' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_self_reply))
|
||||
end
|
||||
|
||||
it 'renders status with media' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_media))
|
||||
end
|
||||
|
||||
it 'renders reblog' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_reblog.reblog))
|
||||
end
|
||||
|
||||
it 'renders pinned status' do
|
||||
expect(response.body).to include(I18n.t('stream_entries.pinned'))
|
||||
end
|
||||
|
||||
it 'does not render private status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_private))
|
||||
end
|
||||
|
||||
it 'does not render direct status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_direct))
|
||||
end
|
||||
|
||||
it 'does not render reply to someone else' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_reply))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when signed-in' do
|
||||
let(:user) { Fabricate(:user) }
|
||||
|
||||
before do
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
context 'when user follows account' do
|
||||
before do
|
||||
user.account.follow!(account)
|
||||
get :show, params: { username: account.username, format: format }
|
||||
end
|
||||
|
||||
it 'does not render private status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_private))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when user is blocked' do
|
||||
before do
|
||||
account.block!(user.account)
|
||||
get :show, params: { username: account.username, format: format }
|
||||
end
|
||||
|
||||
it 'renders unavailable message' do
|
||||
expect(response.body).to include(I18n.t('accounts.unavailable'))
|
||||
end
|
||||
|
||||
it 'does not render public status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status))
|
||||
end
|
||||
|
||||
it 'does not render self-reply' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_self_reply))
|
||||
end
|
||||
|
||||
it 'does not render status with media' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_media))
|
||||
end
|
||||
|
||||
it 'does not render reblog' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_reblog.reblog))
|
||||
end
|
||||
|
||||
it 'does not render pinned status' do
|
||||
expect(response.body).to_not include(I18n.t('stream_entries.pinned'))
|
||||
end
|
||||
|
||||
it 'does not render private status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_private))
|
||||
end
|
||||
|
||||
it 'does not render direct status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_direct))
|
||||
end
|
||||
|
||||
it 'does not render reply to someone else' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_reply))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with replies' do
|
||||
@@ -202,38 +108,6 @@ RSpec.describe AccountsController, type: :controller do
|
||||
end
|
||||
|
||||
it_behaves_like 'common response characteristics'
|
||||
|
||||
it 'renders public status' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status))
|
||||
end
|
||||
|
||||
it 'renders self-reply' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_self_reply))
|
||||
end
|
||||
|
||||
it 'renders status with media' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_media))
|
||||
end
|
||||
|
||||
it 'renders reblog' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_reblog.reblog))
|
||||
end
|
||||
|
||||
it 'does not render pinned status' do
|
||||
expect(response.body).to_not include(I18n.t('stream_entries.pinned'))
|
||||
end
|
||||
|
||||
it 'does not render private status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_private))
|
||||
end
|
||||
|
||||
it 'does not render direct status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_direct))
|
||||
end
|
||||
|
||||
it 'renders reply to someone else' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_reply))
|
||||
end
|
||||
end
|
||||
|
||||
context 'with media' do
|
||||
@@ -243,38 +117,6 @@ RSpec.describe AccountsController, type: :controller do
|
||||
end
|
||||
|
||||
it_behaves_like 'common response characteristics'
|
||||
|
||||
it 'does not render public status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status))
|
||||
end
|
||||
|
||||
it 'does not render self-reply' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_self_reply))
|
||||
end
|
||||
|
||||
it 'renders status with media' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_media))
|
||||
end
|
||||
|
||||
it 'does not render reblog' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_reblog.reblog))
|
||||
end
|
||||
|
||||
it 'does not render pinned status' do
|
||||
expect(response.body).to_not include(I18n.t('stream_entries.pinned'))
|
||||
end
|
||||
|
||||
it 'does not render private status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_private))
|
||||
end
|
||||
|
||||
it 'does not render direct status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_direct))
|
||||
end
|
||||
|
||||
it 'does not render reply to someone else' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_reply))
|
||||
end
|
||||
end
|
||||
|
||||
context 'with tag' do
|
||||
@@ -289,42 +131,6 @@ RSpec.describe AccountsController, type: :controller do
|
||||
end
|
||||
|
||||
it_behaves_like 'common response characteristics'
|
||||
|
||||
it 'does not render public status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status))
|
||||
end
|
||||
|
||||
it 'does not render self-reply' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_self_reply))
|
||||
end
|
||||
|
||||
it 'does not render status with media' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_media))
|
||||
end
|
||||
|
||||
it 'does not render reblog' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_reblog.reblog))
|
||||
end
|
||||
|
||||
it 'does not render pinned status' do
|
||||
expect(response.body).to_not include(I18n.t('stream_entries.pinned'))
|
||||
end
|
||||
|
||||
it 'does not render private status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_private))
|
||||
end
|
||||
|
||||
it 'does not render direct status' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_direct))
|
||||
end
|
||||
|
||||
it 'does not render reply to someone else' do
|
||||
expect(response.body).to_not include(ActivityPub::TagManager.instance.url_for(status_reply))
|
||||
end
|
||||
|
||||
it 'renders status with tag' do
|
||||
expect(response.body).to include(ActivityPub::TagManager.instance.url_for(status_tag))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
53
spec/controllers/admin/settings/branding_controller_spec.rb
Normal file
53
spec/controllers/admin/settings/branding_controller_spec.rb
Normal file
@@ -0,0 +1,53 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Admin::Settings::BrandingController, type: :controller do
|
||||
render_views
|
||||
|
||||
describe 'When signed in as an admin' do
|
||||
before do
|
||||
sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
|
||||
end
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'returns http success' do
|
||||
get :show
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'PUT #update' do
|
||||
before do
|
||||
allow_any_instance_of(Form::AdminSettings).to receive(:valid?).and_return(true)
|
||||
end
|
||||
|
||||
around do |example|
|
||||
before = Setting.site_short_description
|
||||
Setting.site_short_description = nil
|
||||
example.run
|
||||
Setting.site_short_description = before
|
||||
Setting.new_setting_key = nil
|
||||
end
|
||||
|
||||
it 'cannot create a setting value for a non-admin key' do
|
||||
expect(Setting.new_setting_key).to be_blank
|
||||
|
||||
patch :update, params: { form_admin_settings: { new_setting_key: 'New key value' } }
|
||||
|
||||
expect(response).to redirect_to(admin_settings_branding_path)
|
||||
expect(Setting.new_setting_key).to be_nil
|
||||
end
|
||||
|
||||
it 'creates a settings value that didnt exist before for eligible key' do
|
||||
expect(Setting.site_short_description).to be_blank
|
||||
|
||||
patch :update, params: { form_admin_settings: { site_short_description: 'New key value' } }
|
||||
|
||||
expect(response).to redirect_to(admin_settings_branding_path)
|
||||
expect(Setting.site_short_description).to eq 'New key value'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@@ -1,71 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Admin::SettingsController, type: :controller do
|
||||
render_views
|
||||
|
||||
describe 'When signed in as an admin' do
|
||||
before do
|
||||
sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
|
||||
end
|
||||
|
||||
describe 'GET #edit' do
|
||||
it 'returns http success' do
|
||||
get :edit
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'PUT #update' do
|
||||
before do
|
||||
allow_any_instance_of(Form::AdminSettings).to receive(:valid?).and_return(true)
|
||||
end
|
||||
|
||||
describe 'for a record that doesnt exist' do
|
||||
around do |example|
|
||||
before = Setting.site_extended_description
|
||||
Setting.site_extended_description = nil
|
||||
example.run
|
||||
Setting.site_extended_description = before
|
||||
Setting.new_setting_key = nil
|
||||
end
|
||||
|
||||
it 'cannot create a setting value for a non-admin key' do
|
||||
expect(Setting.new_setting_key).to be_blank
|
||||
|
||||
patch :update, params: { form_admin_settings: { new_setting_key: 'New key value' } }
|
||||
|
||||
expect(response).to redirect_to(edit_admin_settings_path)
|
||||
expect(Setting.new_setting_key).to be_nil
|
||||
end
|
||||
|
||||
it 'creates a settings value that didnt exist before for eligible key' do
|
||||
expect(Setting.site_extended_description).to be_blank
|
||||
|
||||
patch :update, params: { form_admin_settings: { site_extended_description: 'New key value' } }
|
||||
|
||||
expect(response).to redirect_to(edit_admin_settings_path)
|
||||
expect(Setting.site_extended_description).to eq 'New key value'
|
||||
end
|
||||
end
|
||||
|
||||
context do
|
||||
around do |example|
|
||||
site_title = Setting.site_title
|
||||
example.run
|
||||
Setting.site_title = site_title
|
||||
end
|
||||
|
||||
it 'updates a settings value' do
|
||||
Setting.site_title = 'Original'
|
||||
patch :update, params: { form_admin_settings: { site_title: 'New title' } }
|
||||
|
||||
expect(response).to redirect_to(edit_admin_settings_path)
|
||||
expect(Setting.site_title).to eq 'New title'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@@ -5,18 +5,64 @@ require 'rails_helper'
|
||||
RSpec.describe Api::V2::SearchController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:search') }
|
||||
context 'with token' do
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:search') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
end
|
||||
|
||||
describe 'GET #index' do
|
||||
before do
|
||||
get :index, params: { q: 'test' }
|
||||
end
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #index' do
|
||||
it 'returns http success' do
|
||||
get :index, params: { q: 'test' }
|
||||
context 'without token' do
|
||||
describe 'GET #index' do
|
||||
let(:search_params) {}
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
before do
|
||||
get :index, params: search_params
|
||||
end
|
||||
|
||||
context 'with a `q` shorter than 5 characters' do
|
||||
let(:search_params) { { q: 'test' } }
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a `q` equal to or longer than 5 characters' do
|
||||
let(:search_params) { { q: 'test1' } }
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
|
||||
context 'with truthy `resolve`' do
|
||||
let(:search_params) { { q: 'test1', resolve: '1' } }
|
||||
|
||||
it 'returns http unauthorized' do
|
||||
expect(response).to have_http_status(401)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with `offset`' do
|
||||
let(:search_params) { { q: 'test1', offset: 1 } }
|
||||
|
||||
it 'returns http unauthorized' do
|
||||
expect(response).to have_http_status(401)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -39,7 +39,7 @@ describe AuthorizeInteractionsController do
|
||||
end
|
||||
|
||||
it 'sets resource from url' do
|
||||
account = Account.new
|
||||
account = Fabricate(:account)
|
||||
service = double
|
||||
allow(ResolveURLService).to receive(:new).and_return(service)
|
||||
allow(service).to receive(:call).with('http://example.com').and_return(account)
|
||||
@@ -51,7 +51,7 @@ describe AuthorizeInteractionsController do
|
||||
end
|
||||
|
||||
it 'sets resource from acct uri' do
|
||||
account = Account.new
|
||||
account = Fabricate(:account)
|
||||
service = double
|
||||
allow(ResolveAccountService).to receive(:new).and_return(service)
|
||||
allow(service).to receive(:call).with('found@hostname').and_return(account)
|
||||
|
@@ -34,27 +34,6 @@ describe FollowerAccountsController do
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
end
|
||||
|
||||
it 'assigns follows' do
|
||||
expect(response).to have_http_status(200)
|
||||
|
||||
assigned = assigns(:follows).to_a
|
||||
expect(assigned.size).to eq 2
|
||||
expect(assigned[0]).to eq follow1
|
||||
expect(assigned[1]).to eq follow0
|
||||
end
|
||||
|
||||
it 'does not assign blocked users' do
|
||||
user = Fabricate(:user)
|
||||
user.account.block!(follower0)
|
||||
sign_in(user)
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
|
||||
assigned = assigns(:follows).to_a
|
||||
expect(assigned.size).to eq 1
|
||||
expect(assigned[0]).to eq follow1
|
||||
end
|
||||
end
|
||||
|
||||
context 'when format is json' do
|
||||
|
@@ -34,27 +34,6 @@ describe FollowingAccountsController do
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
end
|
||||
|
||||
it 'assigns follows' do
|
||||
expect(response).to have_http_status(200)
|
||||
|
||||
assigned = assigns(:follows).to_a
|
||||
expect(assigned.size).to eq 2
|
||||
expect(assigned[0]).to eq follow1
|
||||
expect(assigned[1]).to eq follow0
|
||||
end
|
||||
|
||||
it 'does not assign blocked users' do
|
||||
user = Fabricate(:user)
|
||||
user.account.block!(followee0)
|
||||
sign_in(user)
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
|
||||
assigned = assigns(:follows).to_a
|
||||
expect(assigned.size).to eq 1
|
||||
expect(assigned[0]).to eq follow1
|
||||
end
|
||||
end
|
||||
|
||||
context 'when format is json' do
|
||||
|
@@ -1,135 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe RemoteFollowController do
|
||||
render_views
|
||||
|
||||
describe '#new' do
|
||||
it 'returns success when session is empty' do
|
||||
account = Fabricate(:account)
|
||||
get :new, params: { account_username: account.to_param }
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(response).to render_template(:new)
|
||||
expect(assigns(:remote_follow).acct).to be_nil
|
||||
end
|
||||
|
||||
it 'populates the remote follow with session data when session exists' do
|
||||
session[:remote_follow] = 'user@example.com'
|
||||
account = Fabricate(:account)
|
||||
get :new, params: { account_username: account.to_param }
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(response).to render_template(:new)
|
||||
expect(assigns(:remote_follow).acct).to eq 'user@example.com'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
before do
|
||||
@account = Fabricate(:account, username: 'test_user')
|
||||
end
|
||||
|
||||
context 'with a valid acct' do
|
||||
context 'when webfinger values are wrong' do
|
||||
it 'renders new when redirect url is nil' do
|
||||
resource_with_nil_link = double(link: nil)
|
||||
allow_any_instance_of(WebfingerHelper).to receive(:webfinger!).with('acct:user@example.com').and_return(resource_with_nil_link)
|
||||
post :create, params: { account_username: @account.to_param, remote_follow: { acct: 'user@example.com' } }
|
||||
|
||||
expect(response).to render_template(:new)
|
||||
expect(response.body).to include(I18n.t('remote_follow.missing_resource'))
|
||||
end
|
||||
|
||||
it 'renders new when template is nil' do
|
||||
resource_with_link = double(link: nil)
|
||||
allow_any_instance_of(WebfingerHelper).to receive(:webfinger!).with('acct:user@example.com').and_return(resource_with_link)
|
||||
post :create, params: { account_username: @account.to_param, remote_follow: { acct: 'user@example.com' } }
|
||||
|
||||
expect(response).to render_template(:new)
|
||||
expect(response.body).to include(I18n.t('remote_follow.missing_resource'))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when webfinger values are good' do
|
||||
before do
|
||||
resource_with_link = double(link: 'http://example.com/follow_me?acct={uri}')
|
||||
allow_any_instance_of(WebfingerHelper).to receive(:webfinger!).with('acct:user@example.com').and_return(resource_with_link)
|
||||
post :create, params: { account_username: @account.to_param, remote_follow: { acct: 'user@example.com' } }
|
||||
end
|
||||
|
||||
it 'saves the session' do
|
||||
expect(session[:remote_follow]).to eq 'user@example.com'
|
||||
end
|
||||
|
||||
it 'redirects to the remote location' do
|
||||
expect(response).to redirect_to("http://example.com/follow_me?acct=https%3A%2F%2F#{Rails.configuration.x.local_domain}%2Fusers%2Ftest_user")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with an invalid acct' do
|
||||
it 'renders new when acct is missing' do
|
||||
post :create, params: { account_username: @account.to_param, remote_follow: { acct: '' } }
|
||||
|
||||
expect(response).to render_template(:new)
|
||||
end
|
||||
|
||||
it 'renders new with error when webfinger fails' do
|
||||
allow_any_instance_of(WebfingerHelper).to receive(:webfinger!).with('acct:user@example.com').and_raise(Webfinger::Error)
|
||||
post :create, params: { account_username: @account.to_param, remote_follow: { acct: 'user@example.com' } }
|
||||
|
||||
expect(response).to render_template(:new)
|
||||
expect(response.body).to include(I18n.t('remote_follow.missing_resource'))
|
||||
end
|
||||
|
||||
it 'renders new when occur HTTP::ConnectionError' do
|
||||
allow_any_instance_of(WebfingerHelper).to receive(:webfinger!).with('acct:user@unknown').and_raise(HTTP::ConnectionError)
|
||||
post :create, params: { account_username: @account.to_param, remote_follow: { acct: 'user@unknown' } }
|
||||
|
||||
expect(response).to render_template(:new)
|
||||
expect(response.body).to include(I18n.t('remote_follow.missing_resource'))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a permanently suspended account' do
|
||||
before do
|
||||
@account = Fabricate(:account)
|
||||
@account.suspend!
|
||||
@account.deletion_request.destroy
|
||||
end
|
||||
|
||||
it 'returns http gone on GET to #new' do
|
||||
get :new, params: { account_username: @account.to_param }
|
||||
|
||||
expect(response).to have_http_status(410)
|
||||
end
|
||||
|
||||
it 'returns http gone on POST to #create' do
|
||||
post :create, params: { account_username: @account.to_param }
|
||||
|
||||
expect(response).to have_http_status(410)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a temporarily suspended account' do
|
||||
before do
|
||||
@account = Fabricate(:account)
|
||||
@account.suspend!
|
||||
end
|
||||
|
||||
it 'returns http forbidden on GET to #new' do
|
||||
get :new, params: { account_username: @account.to_param }
|
||||
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
|
||||
it 'returns http forbidden on POST to #create' do
|
||||
post :create, params: { account_username: @account.to_param }
|
||||
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
end
|
||||
end
|
@@ -1,39 +0,0 @@
|
||||
# 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
|
@@ -81,20 +81,6 @@ describe Settings::DeletesController do
|
||||
expect(response).to redirect_to settings_delete_path
|
||||
end
|
||||
end
|
||||
|
||||
context 'when account deletions are disabled' do
|
||||
around do |example|
|
||||
open_deletion = Setting.open_deletion
|
||||
example.run
|
||||
Setting.open_deletion = open_deletion
|
||||
end
|
||||
|
||||
it 'redirects' do
|
||||
Setting.open_deletion = false
|
||||
delete :destroy
|
||||
expect(response).to redirect_to root_path
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when not signed in' do
|
||||
|
@@ -14,17 +14,11 @@ RSpec.describe TagsController, type: :controller do
|
||||
get :show, params: { id: 'test', max_id: late.id }
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
|
||||
it 'renders application layout' do
|
||||
get :show, params: { id: 'test', max_id: late.id }
|
||||
expect(response).to render_template layout: 'public'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when tag does not exist' do
|
||||
it 'returns http missing for non-existent tag' do
|
||||
it 'returns http not found' do
|
||||
get :show, params: { id: 'none' }
|
||||
|
||||
expect(response).to have_http_status(404)
|
||||
end
|
||||
end
|
||||
|
@@ -11,4 +11,5 @@ Fabricator(:account) do
|
||||
suspended_at { |attrs| attrs[:suspended] ? Time.now.utc : nil }
|
||||
silenced_at { |attrs| attrs[:silenced] ? Time.now.utc : nil }
|
||||
user { |attrs| attrs[:domain].nil? ? Fabricate.build(:user, account: nil) : nil }
|
||||
discoverable true
|
||||
end
|
||||
|
@@ -18,36 +18,16 @@ feature 'Profile' do
|
||||
visit account_path('alice')
|
||||
|
||||
is_expected.to have_title("alice (@alice@#{local_domain})")
|
||||
|
||||
within('.public-account-header h1') do
|
||||
is_expected.to have_content("alice @alice@#{local_domain}")
|
||||
end
|
||||
|
||||
bio_elem = first('.public-account-bio')
|
||||
expect(bio_elem).to have_content(alice_bio)
|
||||
# The bio has hashtags made clickable
|
||||
expect(bio_elem).to have_link('cryptology')
|
||||
expect(bio_elem).to have_link('science')
|
||||
# Nicknames are make clickable
|
||||
expect(bio_elem).to have_link('@alice')
|
||||
expect(bio_elem).to have_link('@bob')
|
||||
# Nicknames not on server are not clickable
|
||||
expect(bio_elem).not_to have_link('@pepe')
|
||||
end
|
||||
|
||||
scenario 'I can change my account' do
|
||||
visit settings_profile_path
|
||||
|
||||
fill_in 'Display name', with: 'Bob'
|
||||
fill_in 'Bio', with: 'Bob is silent'
|
||||
first('.btn[type=submit]').click
|
||||
|
||||
first('button[type=submit]').click
|
||||
|
||||
is_expected.to have_content 'Changes successfully saved!'
|
||||
|
||||
# View my own public profile and see the changes
|
||||
click_link "Bob @bob@#{local_domain}"
|
||||
|
||||
within('.public-account-header h1') do
|
||||
is_expected.to have_content("Bob @bob@#{local_domain}")
|
||||
end
|
||||
expect(first('.public-account-bio')).to have_content('Bob is silent')
|
||||
end
|
||||
end
|
||||
|
@@ -3,40 +3,31 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe PermalinkRedirector do
|
||||
let(:remote_account) { Fabricate(:account, username: 'alice', domain: 'example.com', url: 'https://example.com/@alice', id: 2) }
|
||||
|
||||
describe '#redirect_url' do
|
||||
before do
|
||||
account = Fabricate(:account, username: 'alice', id: 1)
|
||||
Fabricate(:status, account: account, id: 123)
|
||||
Fabricate(:status, account: remote_account, id: 123, url: 'https://example.com/status-123')
|
||||
end
|
||||
|
||||
it 'returns path for legacy account links' do
|
||||
redirector = described_class.new('web/accounts/1')
|
||||
expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice'
|
||||
redirector = described_class.new('accounts/2')
|
||||
expect(redirector.redirect_path).to eq 'https://example.com/@alice'
|
||||
end
|
||||
|
||||
it 'returns path for legacy status links' do
|
||||
redirector = described_class.new('web/statuses/123')
|
||||
expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice/123'
|
||||
end
|
||||
|
||||
it 'returns path for legacy tag links' do
|
||||
redirector = described_class.new('web/timelines/tag/hoge')
|
||||
expect(redirector.redirect_path).to be_nil
|
||||
redirector = described_class.new('statuses/123')
|
||||
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
|
||||
end
|
||||
|
||||
it 'returns path for pretty account links' do
|
||||
redirector = described_class.new('web/@alice')
|
||||
expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice'
|
||||
redirector = described_class.new('@alice@example.com')
|
||||
expect(redirector.redirect_path).to eq 'https://example.com/@alice'
|
||||
end
|
||||
|
||||
it 'returns path for pretty status links' do
|
||||
redirector = described_class.new('web/@alice/123')
|
||||
expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice/123'
|
||||
end
|
||||
|
||||
it 'returns path for pretty tag links' do
|
||||
redirector = described_class.new('web/tags/hoge')
|
||||
expect(redirector.redirect_path).to be_nil
|
||||
redirector = described_class.new('@alice/123')
|
||||
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -28,9 +28,5 @@ RSpec.describe Vacuum::PreviewCardsVacuum do
|
||||
it 'does not delete attached preview cards' do
|
||||
expect(new_preview_card.reload).to be_persisted
|
||||
end
|
||||
|
||||
it 'deletes preview cards not attached to any status' do
|
||||
expect { orphaned_preview_card.reload }.to raise_error ActiveRecord::RecordNotFound
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -8,7 +8,7 @@ class AdminMailerPreview < ActionMailer::Preview
|
||||
|
||||
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_trends
|
||||
def new_trends
|
||||
AdminMailer.new_trends(Account.first, PreviewCard.limit(3), Tag.limit(3), Status.where(reblog_of_id: nil).limit(3))
|
||||
AdminMailer.new_trends(Account.first, PreviewCard.joins(:trend).limit(3), Tag.limit(3), Status.joins(:trend).where(reblog_of_id: nil).limit(3))
|
||||
end
|
||||
|
||||
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_appeal
|
||||
|
4
spec/models/preview_card_trend_spec.rb
Normal file
4
spec/models/preview_card_trend_spec.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe PreviewCardTrend, type: :model do
|
||||
end
|
@@ -288,22 +288,6 @@ RSpec.describe Status, type: :model do
|
||||
end
|
||||
end
|
||||
|
||||
describe '.in_chosen_languages' do
|
||||
context 'for accounts with language filters' do
|
||||
let(:user) { Fabricate(:user, chosen_languages: ['en']) }
|
||||
|
||||
it 'does not include statuses in not in chosen languages' do
|
||||
status = Fabricate(:status, language: 'de')
|
||||
expect(Status.in_chosen_languages(user.account)).not_to include status
|
||||
end
|
||||
|
||||
it 'includes status with unknown language' do
|
||||
status = Fabricate(:status, language: nil)
|
||||
expect(Status.in_chosen_languages(user.account)).to include status
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '.as_direct_timeline' do
|
||||
let(:account) { Fabricate(:account) }
|
||||
let(:followed) { Fabricate(:account) }
|
||||
|
4
spec/models/status_trend_spec.rb
Normal file
4
spec/models/status_trend_spec.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe StatusTrend, type: :model do
|
||||
end
|
@@ -9,8 +9,8 @@ RSpec.describe Trends::Statuses do
|
||||
let!(:query) { subject.query }
|
||||
let!(:today) { at_time }
|
||||
|
||||
let!(:status1) { Fabricate(:status, text: 'Foo', trendable: true, created_at: today) }
|
||||
let!(:status2) { Fabricate(:status, text: 'Bar', trendable: true, created_at: today) }
|
||||
let!(:status1) { Fabricate(:status, text: 'Foo', language: 'en', trendable: true, created_at: today) }
|
||||
let!(:status2) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today) }
|
||||
|
||||
before do
|
||||
15.times { reblog(status1, today) }
|
||||
@@ -69,9 +69,9 @@ RSpec.describe Trends::Statuses do
|
||||
let!(:today) { at_time }
|
||||
let!(:yesterday) { today - 1.day }
|
||||
|
||||
let!(:status1) { Fabricate(:status, text: 'Foo', trendable: true, created_at: yesterday) }
|
||||
let!(:status2) { Fabricate(:status, text: 'Bar', trendable: true, created_at: today) }
|
||||
let!(:status3) { Fabricate(:status, text: 'Baz', trendable: true, created_at: today) }
|
||||
let!(:status1) { Fabricate(:status, text: 'Foo', language: 'en', trendable: true, created_at: yesterday) }
|
||||
let!(:status2) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today) }
|
||||
let!(:status3) { Fabricate(:status, text: 'Baz', language: 'en', trendable: true, created_at: today) }
|
||||
|
||||
before do
|
||||
13.times { reblog(status1, today) }
|
||||
@@ -95,10 +95,10 @@ RSpec.describe Trends::Statuses do
|
||||
|
||||
it 'decays scores' do
|
||||
subject.refresh(today)
|
||||
original_score = subject.score(status2.id)
|
||||
original_score = status2.trend.score
|
||||
expect(original_score).to be_a Float
|
||||
subject.refresh(today + subject.options[:score_halflife])
|
||||
decayed_score = subject.score(status2.id)
|
||||
decayed_score = status2.trend.reload.score
|
||||
expect(decayed_score).to be <= original_score / 2
|
||||
end
|
||||
end
|
||||
|
@@ -108,10 +108,6 @@ RSpec.describe StatusPolicy, type: :model do
|
||||
expect(subject).to permit(status.account, status)
|
||||
end
|
||||
|
||||
it 'grants access when account is admin' do
|
||||
expect(subject).to permit(admin.account, status)
|
||||
end
|
||||
|
||||
it 'denies access when account is not deleter' do
|
||||
expect(subject).to_not permit(bob, status)
|
||||
end
|
||||
@@ -137,27 +133,9 @@ RSpec.describe StatusPolicy, type: :model do
|
||||
end
|
||||
end
|
||||
|
||||
permissions :index? do
|
||||
it 'grants access if staff' do
|
||||
expect(subject).to permit(admin.account)
|
||||
end
|
||||
|
||||
it 'denies access unless staff' do
|
||||
expect(subject).to_not permit(alice)
|
||||
end
|
||||
end
|
||||
|
||||
permissions :update? do
|
||||
it 'grants access if staff' do
|
||||
expect(subject).to permit(admin.account, status)
|
||||
end
|
||||
|
||||
it 'grants access if owner' do
|
||||
expect(subject).to permit(status.account, status)
|
||||
end
|
||||
|
||||
it 'denies access unless staff' do
|
||||
expect(subject).to_not permit(bob, status)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -99,13 +99,6 @@ describe InstancePresenter do
|
||||
end
|
||||
end
|
||||
|
||||
describe '#hero' do
|
||||
it 'returns SiteUpload' do
|
||||
hero = Fabricate(:site_upload, var: 'hero')
|
||||
expect(instance_presenter.hero).to eq(hero)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#mascot' do
|
||||
it 'returns SiteUpload' do
|
||||
mascot = Fabricate(:site_upload, var: 'mascot')
|
||||
|
@@ -3,17 +3,6 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'The account show page' do
|
||||
it 'Has an h-feed with correct number of h-entry objects in it' do
|
||||
alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
|
||||
_status = Fabricate(:status, account: alice, text: 'Hello World')
|
||||
_status2 = Fabricate(:status, account: alice, text: 'Hello World Again')
|
||||
_status3 = Fabricate(:status, account: alice, text: 'Are You Still There World?')
|
||||
|
||||
get '/@alice'
|
||||
|
||||
expect(h_feed_entries.size).to eq(3)
|
||||
end
|
||||
|
||||
it 'has valid opengraph tags' do
|
||||
alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
|
||||
_status = Fabricate(:status, account: alice, text: 'Hello World')
|
||||
@@ -33,8 +22,4 @@ describe 'The account show page' do
|
||||
def head_section
|
||||
Nokogiri::Slop(response.body).html.head
|
||||
end
|
||||
|
||||
def h_feed_entries
|
||||
Nokogiri::HTML(response.body).search('.h-feed .h-entry')
|
||||
end
|
||||
end
|
||||
|
@@ -10,30 +10,30 @@ describe 'Localization' do
|
||||
it 'uses a specific region when provided' do
|
||||
headers = { 'Accept-Language' => 'zh-HK' }
|
||||
|
||||
get "/about", headers: headers
|
||||
get "/auth/sign_in", headers: headers
|
||||
|
||||
expect(response.body).to include(
|
||||
I18n.t('about.tagline', locale: 'zh-HK')
|
||||
I18n.t('auth.login', locale: 'zh-HK')
|
||||
)
|
||||
end
|
||||
|
||||
it 'falls back to a locale when region missing' do
|
||||
headers = { 'Accept-Language' => 'es-FAKE' }
|
||||
|
||||
get "/about", headers: headers
|
||||
get "/auth/sign_in", headers: headers
|
||||
|
||||
expect(response.body).to include(
|
||||
I18n.t('about.tagline', locale: 'es')
|
||||
I18n.t('auth.login', locale: 'es')
|
||||
)
|
||||
end
|
||||
|
||||
it 'falls back to english when locale is missing' do
|
||||
headers = { 'Accept-Language' => '12-FAKE' }
|
||||
|
||||
get "/about", headers: headers
|
||||
get "/auth/sign_in", headers: headers
|
||||
|
||||
expect(response.body).to include(
|
||||
I18n.t('about.tagline', locale: 'en')
|
||||
I18n.t('auth.login', locale: 'en')
|
||||
)
|
||||
end
|
||||
end
|
||||
|
@@ -1,31 +1,83 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'Routes under accounts/' do
|
||||
describe 'the route for accounts who are followers of an account' do
|
||||
it 'routes to the followers action with the right username' do
|
||||
expect(get('/users/name/followers')).
|
||||
to route_to('follower_accounts#index', account_username: 'name')
|
||||
context 'with local username' do
|
||||
let(:username) { 'alice' }
|
||||
|
||||
it 'routes /@:username' do
|
||||
expect(get("/@#{username}")).to route_to('accounts#show', username: username)
|
||||
end
|
||||
|
||||
it 'routes /@:username.json' do
|
||||
expect(get("/@#{username}.json")).to route_to('accounts#show', username: username, format: 'json')
|
||||
end
|
||||
|
||||
it 'routes /@:username.rss' do
|
||||
expect(get("/@#{username}.rss")).to route_to('accounts#show', username: username, format: 'rss')
|
||||
end
|
||||
|
||||
it 'routes /@:username/:id' do
|
||||
expect(get("/@#{username}/123")).to route_to('statuses#show', account_username: username, id: '123')
|
||||
end
|
||||
|
||||
it 'routes /@:username/:id/embed' do
|
||||
expect(get("/@#{username}/123/embed")).to route_to('statuses#embed', account_username: username, id: '123')
|
||||
end
|
||||
|
||||
it 'routes /@:username/following' do
|
||||
expect(get("/@#{username}/following")).to route_to('following_accounts#index', account_username: username)
|
||||
end
|
||||
|
||||
it 'routes /@:username/followers' do
|
||||
expect(get("/@#{username}/followers")).to route_to('follower_accounts#index', account_username: username)
|
||||
end
|
||||
|
||||
it 'routes /@:username/with_replies' do
|
||||
expect(get("/@#{username}/with_replies")).to route_to('accounts#show', username: username)
|
||||
end
|
||||
|
||||
it 'routes /@:username/media' do
|
||||
expect(get("/@#{username}/media")).to route_to('accounts#show', username: username)
|
||||
end
|
||||
|
||||
it 'routes /@:username/tagged/:tag' do
|
||||
expect(get("/@#{username}/tagged/foo")).to route_to('accounts#show', username: username, tag: 'foo')
|
||||
end
|
||||
end
|
||||
|
||||
describe 'the route for accounts who are followed by an account' do
|
||||
it 'routes to the following action with the right username' do
|
||||
expect(get('/users/name/following')).
|
||||
to route_to('following_accounts#index', account_username: 'name')
|
||||
end
|
||||
end
|
||||
context 'with remote username' do
|
||||
let(:username) { 'alice@example.com' }
|
||||
|
||||
describe 'the route for following an account' do
|
||||
it 'routes to the follow create action with the right username' do
|
||||
expect(post('/users/name/follow')).
|
||||
to route_to('account_follow#create', account_username: 'name')
|
||||
it 'routes /@:username' do
|
||||
expect(get("/@#{username}")).to route_to('home#index', username_with_domain: username)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'the route for unfollowing an account' do
|
||||
it 'routes to the unfollow create action with the right username' do
|
||||
expect(post('/users/name/unfollow')).
|
||||
to route_to('account_unfollow#create', account_username: 'name')
|
||||
it 'routes /@:username/:id' do
|
||||
expect(get("/@#{username}/123")).to route_to('home#index', username_with_domain: username, any: '123')
|
||||
end
|
||||
|
||||
it 'routes /@:username/:id/embed' do
|
||||
expect(get("/@#{username}/123/embed")).to route_to('home#index', username_with_domain: username, any: '123/embed')
|
||||
end
|
||||
|
||||
it 'routes /@:username/following' do
|
||||
expect(get("/@#{username}/following")).to route_to('home#index', username_with_domain: username, any: 'following')
|
||||
end
|
||||
|
||||
it 'routes /@:username/followers' do
|
||||
expect(get("/@#{username}/followers")).to route_to('home#index', username_with_domain: username, any: 'followers')
|
||||
end
|
||||
|
||||
it 'routes /@:username/with_replies' do
|
||||
expect(get("/@#{username}/with_replies")).to route_to('home#index', username_with_domain: username, any: 'with_replies')
|
||||
end
|
||||
|
||||
it 'routes /@:username/media' do
|
||||
expect(get("/@#{username}/media")).to route_to('home#index', username_with_domain: username, any: 'media')
|
||||
end
|
||||
|
||||
it 'routes /@:username/tagged/:tag' do
|
||||
expect(get("/@#{username}/tagged/foo")).to route_to('home#index', username_with_domain: username, any: 'tagged/foo')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -65,7 +65,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
|
||||
stub_request(:get, 'https://example.com/account/pinned/3').to_return(status: 404)
|
||||
stub_request(:get, 'https://example.com/account/pinned/4').to_return(status: 200, body: Oj.dump(status_json_4))
|
||||
|
||||
subject.call(actor)
|
||||
subject.call(actor, note: true, hashtag: false)
|
||||
end
|
||||
|
||||
it 'sets expected posts as pinned posts' do
|
||||
|
@@ -1,27 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'about/show.html.haml', without_verify_partial_doubles: true do
|
||||
let(:commit_hash) { '8925731c9869f55780644304e4420a1998e52607' }
|
||||
|
||||
before do
|
||||
allow(view).to receive(:site_hostname).and_return('example.com')
|
||||
allow(view).to receive(:site_title).and_return('example site')
|
||||
allow(view).to receive(:new_user).and_return(User.new)
|
||||
allow(view).to receive(:use_seamless_external_login?).and_return(false)
|
||||
allow(view).to receive(:current_account).and_return(nil)
|
||||
end
|
||||
|
||||
it 'has valid open graph tags' do
|
||||
assign(:instance_presenter, InstancePresenter.new)
|
||||
render
|
||||
|
||||
header_tags = view.content_for(:header_tags)
|
||||
|
||||
expect(header_tags).to match(%r{<meta content=".+" property="og:title" />})
|
||||
expect(header_tags).to match(%r{<meta content="website" property="og:type" />})
|
||||
expect(header_tags).to match(%r{<meta content=".+" property="og:image" />})
|
||||
expect(header_tags).to match(%r{<meta content="http://.+" property="og:url" />})
|
||||
end
|
||||
end
|
@@ -12,57 +12,10 @@ describe 'statuses/show.html.haml', without_verify_partial_doubles: true do
|
||||
allow(view).to receive(:local_time)
|
||||
allow(view).to receive(:local_time_ago)
|
||||
allow(view).to receive(:current_account).and_return(nil)
|
||||
allow(view).to receive(:single_user_mode?).and_return(false)
|
||||
assign(:instance_presenter, InstancePresenter.new)
|
||||
end
|
||||
|
||||
it 'has valid author h-card and basic data for a detailed_status' do
|
||||
alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
|
||||
bob = Fabricate(:account, username: 'bob', display_name: 'Bob')
|
||||
status = Fabricate(:status, account: alice, text: 'Hello World')
|
||||
media = Fabricate(:media_attachment, account: alice, status: status, type: :video)
|
||||
reply = Fabricate(:status, account: bob, thread: status, text: 'Hello Alice')
|
||||
|
||||
assign(:status, status)
|
||||
assign(:account, alice)
|
||||
assign(:descendant_threads, [])
|
||||
|
||||
render
|
||||
|
||||
mf2 = Microformats.parse(rendered)
|
||||
|
||||
expect(mf2.entry.url.to_s).not_to be_empty
|
||||
expect(mf2.entry.author.name.to_s).to eq alice.display_name
|
||||
expect(mf2.entry.author.url.to_s).not_to be_empty
|
||||
end
|
||||
|
||||
it 'has valid h-cites for p-in-reply-to and p-comment' do
|
||||
alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
|
||||
bob = Fabricate(:account, username: 'bob', display_name: 'Bob')
|
||||
carl = Fabricate(:account, username: 'carl', display_name: 'Carl')
|
||||
status = Fabricate(:status, account: alice, text: 'Hello World')
|
||||
media = Fabricate(:media_attachment, account: alice, status: status, type: :video)
|
||||
reply = Fabricate(:status, account: bob, thread: status, text: 'Hello Alice')
|
||||
comment = Fabricate(:status, account: carl, thread: reply, text: 'Hello Bob')
|
||||
|
||||
assign(:status, reply)
|
||||
assign(:account, alice)
|
||||
assign(:ancestors, reply.ancestors(1, bob))
|
||||
assign(:descendant_threads, [{ statuses: reply.descendants(1) }])
|
||||
|
||||
render
|
||||
|
||||
mf2 = Microformats.parse(rendered)
|
||||
|
||||
expect(mf2.entry.url.to_s).not_to be_empty
|
||||
expect(mf2.entry.comment.url.to_s).not_to be_empty
|
||||
expect(mf2.entry.comment.author.name.to_s).to eq carl.display_name
|
||||
expect(mf2.entry.comment.author.url.to_s).not_to be_empty
|
||||
|
||||
expect(mf2.entry.in_reply_to.url.to_s).not_to be_empty
|
||||
expect(mf2.entry.in_reply_to.author.name.to_s).to eq alice.display_name
|
||||
expect(mf2.entry.in_reply_to.author.url.to_s).not_to be_empty
|
||||
end
|
||||
|
||||
it 'has valid opengraph tags' do
|
||||
alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
|
||||
status = Fabricate(:status, account: alice, text: 'Hello World')
|
||||
|
Reference in New Issue
Block a user