Merge upstream (#111)
This commit is contained in:
@@ -4,7 +4,7 @@ describe Api::V1::Accounts::CredentialsController do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -4,7 +4,7 @@ describe Api::V1::Accounts::FollowerAccountsController do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
|
||||
before do
|
||||
Fabricate(:follow, target_account: user.account)
|
||||
|
@@ -4,7 +4,7 @@ describe Api::V1::Accounts::FollowingAccountsController do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
|
||||
before do
|
||||
Fabricate(:follow, account: user.account)
|
||||
|
@@ -4,7 +4,7 @@ describe Api::V1::Accounts::RelationshipsController do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::Accounts::SearchController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -4,7 +4,7 @@ describe Api::V1::Accounts::StatusesController do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow read') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::BlocksController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
|
||||
|
||||
before do
|
||||
Fabricate(:block, account: user.account)
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::DomainBlocksController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
|
||||
|
||||
before do
|
||||
user.account.block_domain!('example.com')
|
||||
|
@@ -3,19 +3,77 @@ require 'rails_helper'
|
||||
RSpec.describe Api::V1::FavouritesController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
|
||||
before do
|
||||
Fabricate(:favourite, account: user.account)
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
end
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
|
||||
describe 'GET #index' do
|
||||
it 'returns http success' do
|
||||
get :index, params: { limit: 1 }
|
||||
context 'without token' do
|
||||
it 'returns http unauthorized' do
|
||||
get :index
|
||||
expect(response).to have_http_status :unauthorized
|
||||
end
|
||||
end
|
||||
|
||||
expect(response).to have_http_status(:success)
|
||||
context 'with token' do
|
||||
context 'without read scope' do
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) do
|
||||
Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: '')
|
||||
end
|
||||
end
|
||||
|
||||
it 'returns http forbidden' do
|
||||
get :index
|
||||
expect(response).to have_http_status :forbidden
|
||||
end
|
||||
end
|
||||
|
||||
context 'without valid resource owner' do
|
||||
before do
|
||||
token = Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read')
|
||||
user.destroy!
|
||||
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
end
|
||||
|
||||
it 'returns http unprocessable entity' do
|
||||
get :index
|
||||
expect(response).to have_http_status :unprocessable_entity
|
||||
end
|
||||
end
|
||||
|
||||
context 'with read scope and valid resource owner' do
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) do
|
||||
Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read')
|
||||
end
|
||||
end
|
||||
|
||||
it 'shows favourites owned by the user' do
|
||||
favourite_by_user = Fabricate(:favourite, account: user.account)
|
||||
favourite_by_others = Fabricate(:favourite)
|
||||
|
||||
get :index
|
||||
|
||||
expect(assigns(:statuses)).to match_array [favourite_by_user.status]
|
||||
end
|
||||
|
||||
it 'adds pagination headers if necessary' do
|
||||
favourite = Fabricate(:favourite, account: user.account)
|
||||
|
||||
get :index, params: { limit: 1 }
|
||||
|
||||
expect(response.headers['Link'].find_link(['rel', 'next']).href).to eq "http://test.host/api/v1/favourites?limit=1&max_id=#{favourite.id}"
|
||||
expect(response.headers['Link'].find_link(['rel', 'prev']).href).to eq "http://test.host/api/v1/favourites?limit=1&since_id=#{favourite.id}"
|
||||
end
|
||||
|
||||
it 'does not add pagination headers if not necessary' do
|
||||
get :index
|
||||
|
||||
expect(response.headers['Link'].find_link(['rel', 'next'])).to eq nil
|
||||
expect(response.headers['Link'].find_link(['rel', 'prev'])).to eq nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice', locked: true)) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
|
||||
let(:follower) { Fabricate(:account, username: 'bob') }
|
||||
|
||||
before do
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::FollowsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -6,7 +6,7 @@ RSpec.describe Api::V1::InstancesController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id) }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::MutesController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
|
||||
|
||||
before do
|
||||
Fabricate(:mute, account: user.account)
|
||||
|
@@ -4,7 +4,7 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
let(:other) { Fabricate(:user, account: Fabricate(:account, username: 'bob')) }
|
||||
|
||||
before do
|
||||
|
@@ -6,7 +6,7 @@ RSpec.describe Api::V1::ReportsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -6,7 +6,7 @@ RSpec.describe Api::V1::SearchController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:doorkeeper_token) { token }
|
||||
|
@@ -5,7 +5,7 @@ RSpec.describe Api::V1::Statuses::FavouritedByAccountsController, type: :control
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id, application: app }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app) }
|
||||
|
||||
context 'with an oauth token' do
|
||||
before do
|
||||
|
@@ -7,7 +7,7 @@ describe Api::V1::Statuses::FavouritesController do
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id, application: app }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) }
|
||||
|
||||
context 'with an oauth token' do
|
||||
before do
|
||||
|
@@ -7,7 +7,7 @@ describe Api::V1::Statuses::MutesController do
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id, application: app }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) }
|
||||
|
||||
context 'with an oauth token' do
|
||||
before do
|
||||
|
@@ -5,7 +5,7 @@ RSpec.describe Api::V1::Statuses::RebloggedByAccountsController, type: :controll
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id, application: app }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app) }
|
||||
|
||||
context 'with an oauth token' do
|
||||
before do
|
||||
|
@@ -7,7 +7,7 @@ describe Api::V1::Statuses::ReblogsController do
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id, application: app }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) }
|
||||
|
||||
context 'with an oauth token' do
|
||||
before do
|
||||
|
@@ -5,7 +5,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller do
|
||||
|
||||
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
|
||||
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id, application: app }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'write') }
|
||||
|
||||
context 'with an oauth token' do
|
||||
before do
|
||||
|
@@ -12,7 +12,7 @@ describe Api::V1::Timelines::HomeController do
|
||||
end
|
||||
|
||||
context 'with a user context' do
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
|
||||
|
||||
describe 'GET #show' do
|
||||
before do
|
||||
@@ -30,7 +30,7 @@ describe Api::V1::Timelines::HomeController do
|
||||
end
|
||||
|
||||
context 'without a user context' do
|
||||
let(:token) { double acceptable?: true, resource_owner_id: nil }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: nil, scopes: 'read') }
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'returns http unprocessable entity' do
|
||||
|
@@ -12,7 +12,7 @@ describe Api::V1::Timelines::PublicController do
|
||||
end
|
||||
|
||||
context 'with a user context' do
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id) }
|
||||
|
||||
describe 'GET #show' do
|
||||
before do
|
||||
@@ -42,7 +42,7 @@ describe Api::V1::Timelines::PublicController do
|
||||
end
|
||||
|
||||
context 'without a user context' do
|
||||
let(:token) { double acceptable?: true, resource_owner_id: nil }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: nil) }
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'returns http success' do
|
||||
|
@@ -12,7 +12,7 @@ describe Api::V1::Timelines::TagController do
|
||||
end
|
||||
|
||||
context 'with a user context' do
|
||||
let(:token) { double acceptable?: true, resource_owner_id: user.id }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id) }
|
||||
|
||||
describe 'GET #show' do
|
||||
before do
|
||||
@@ -28,7 +28,7 @@ describe Api::V1::Timelines::TagController do
|
||||
end
|
||||
|
||||
context 'without a user context' do
|
||||
let(:token) { double acceptable?: true, resource_owner_id: nil }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: nil) }
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'returns http success' do
|
||||
|
2
spec/fabricators/access_token_fabricator.rb
Normal file
2
spec/fabricators/access_token_fabricator.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
Fabricator :access_token, from: 'Doorkeeper::AccessToken' do
|
||||
end
|
4
spec/fabricators/accessible_access_token_fabricator.rb
Normal file
4
spec/fabricators/accessible_access_token_fabricator.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
Fabricator :accessible_access_token, from: :access_token do
|
||||
expires_in { nil }
|
||||
revoked_at { nil }
|
||||
end
|
@@ -7,6 +7,11 @@ RSpec.describe EmojiHelper, type: :helper do
|
||||
expect(emojify(text)).to eq '📖 Book'
|
||||
end
|
||||
|
||||
it 'converts composite emoji shortcodes to unicode' do
|
||||
text = ':couple_ww:'
|
||||
expect(emojify(text)).to eq '👩❤👩'
|
||||
end
|
||||
|
||||
it 'does not convert shortcodes that are part of a string into unicode' do
|
||||
text = ':see_no_evil::hear_no_evil::speak_no_evil:'
|
||||
expect(emojify(text)).to eq text
|
||||
|
@@ -19,7 +19,7 @@ describe InstanceHelper do
|
||||
it 'returns empty string when Setting.site_title is nil' do
|
||||
Setting.site_title = nil
|
||||
|
||||
expect(helper.site_title).to eq ''
|
||||
expect(helper.site_title).to eq 'cb6e6126.ngrok.io'
|
||||
end
|
||||
end
|
||||
|
||||
|
@@ -5,16 +5,24 @@ import React from 'react';
|
||||
import DropdownMenu from '../../../app/javascript/mastodon/components/dropdown_menu';
|
||||
import Dropdown, { DropdownTrigger, DropdownContent } from 'react-simple-dropdown';
|
||||
|
||||
const isTrue = () => true;
|
||||
|
||||
describe('<DropdownMenu />', () => {
|
||||
const icon = 'my-icon';
|
||||
const size = 123;
|
||||
const action = sinon.spy();
|
||||
let items;
|
||||
let wrapper;
|
||||
let action;
|
||||
|
||||
const items = [
|
||||
{ text: 'first item', action: action, href: '/some/url' },
|
||||
{ text: 'second item', action: 'noop' },
|
||||
];
|
||||
const wrapper = shallow(<DropdownMenu icon={icon} items={items} size={size} />);
|
||||
beforeEach(() => {
|
||||
action = sinon.spy();
|
||||
|
||||
items = [
|
||||
{ text: 'first item', action: action, href: '/some/url' },
|
||||
{ text: 'second item', action: 'noop' },
|
||||
];
|
||||
wrapper = shallow(<DropdownMenu icon={icon} items={items} size={size} />);
|
||||
});
|
||||
|
||||
it('contains one <Dropdown />', () => {
|
||||
expect(wrapper).to.have.exactly(1).descendants(Dropdown);
|
||||
@@ -28,6 +36,16 @@ describe('<DropdownMenu />', () => {
|
||||
expect(wrapper.find(Dropdown)).to.have.exactly(1).descendants(DropdownContent);
|
||||
});
|
||||
|
||||
it('does not contain a <DropdownContent /> if isUserTouching', () => {
|
||||
const touchingWrapper = shallow(<DropdownMenu icon={icon} items={items} size={size} isUserTouching={isTrue} />);
|
||||
expect(touchingWrapper.find(Dropdown)).to.have.exactly(0).descendants(DropdownContent);
|
||||
});
|
||||
|
||||
it('does not contain a <DropdownContent /> if isUserTouching', () => {
|
||||
const touchingWrapper = shallow(<DropdownMenu icon={icon} items={items} size={size} isUserTouching={isTrue} />);
|
||||
expect(touchingWrapper.find(Dropdown)).to.have.exactly(0).descendants(DropdownContent);
|
||||
});
|
||||
|
||||
it('uses props.size for <DropdownTrigger /> style values', () => {
|
||||
['font-size', 'width', 'line-height'].map((property) => {
|
||||
expect(wrapper.find(DropdownTrigger)).to.have.style(property, `${size}px`);
|
||||
@@ -53,6 +71,23 @@ describe('<DropdownMenu />', () => {
|
||||
expect(wrapper.state('expanded')).to.be.equal(true);
|
||||
});
|
||||
|
||||
it('calls onModalOpen when clicking the trigger if isUserTouching', () => {
|
||||
const onModalOpen = sinon.spy();
|
||||
const touchingWrapper = mount(<DropdownMenu icon={icon} items={items} status={3.14} size={size} onModalOpen={onModalOpen} isUserTouching={isTrue} />);
|
||||
touchingWrapper.find(DropdownTrigger).first().simulate('click');
|
||||
expect(onModalOpen.calledOnce).to.be.equal(true);
|
||||
expect(onModalOpen.args[0][0]).to.be.deep.equal({ status: 3.14, actions: items, onClick: touchingWrapper.node.handleClick });
|
||||
});
|
||||
|
||||
it('calls onModalClose when clicking an action if isUserTouching and isModalOpen', () => {
|
||||
const onModalOpen = sinon.spy();
|
||||
const onModalClose = sinon.spy();
|
||||
const touchingWrapper = mount(<DropdownMenu icon={icon} items={items} status={3.14} size={size} isModalOpen onModalOpen={onModalOpen} onModalClose={onModalClose} isUserTouching={isTrue} />);
|
||||
touchingWrapper.find(DropdownTrigger).first().simulate('click');
|
||||
touchingWrapper.node.handleClick({ currentTarget: { getAttribute: () => '0' }, preventDefault: () => null });
|
||||
expect(onModalClose.calledOnce).to.be.equal(true);
|
||||
});
|
||||
|
||||
// Error: ReactWrapper::state() can only be called on the root
|
||||
/*it('sets expanded to false when clicking outside', () => {
|
||||
const wrapper = mount((
|
||||
|
@@ -3,7 +3,7 @@ require 'rails_helper'
|
||||
RSpec.describe Status, type: :model do
|
||||
let(:alice) { Fabricate(:account, username: 'alice') }
|
||||
let(:bob) { Fabricate(:account, username: 'bob') }
|
||||
let(:other) { Fabricate(:status, account: bob, text: 'Skulls for the skull god! The enemy\'s gates are sideways!')}
|
||||
let(:other) { Fabricate(:status, account: bob, text: 'Skulls for the skull god! The enemy\'s gates are sideways!') }
|
||||
|
||||
subject { Fabricate(:status, account: alice) }
|
||||
|
||||
|
44
spec/validators/status_length_validator_spec.rb
Normal file
44
spec/validators/status_length_validator_spec.rb
Normal file
@@ -0,0 +1,44 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe StatusLengthValidator do
|
||||
describe '#validate' do
|
||||
it 'does not add errors onto remote statuses'
|
||||
it 'does not add errors onto local reblogs'
|
||||
|
||||
it 'adds an error when content warning is over 500 characters' do
|
||||
status = double(spoiler_text: 'a' * 520, text: '', errors: double(add: nil), local?: true, reblog?: false)
|
||||
subject.validate(status)
|
||||
expect(status.errors).to have_received(:add)
|
||||
end
|
||||
|
||||
it 'adds an error when text is over 500 characters' do
|
||||
status = double(spoiler_text: '', text: 'a' * 520, errors: double(add: nil), local?: true, reblog?: false)
|
||||
subject.validate(status)
|
||||
expect(status.errors).to have_received(:add)
|
||||
end
|
||||
|
||||
it 'adds an error when text and content warning are over 500 characters total' do
|
||||
status = double(spoiler_text: 'a' * 250, text: 'b' * 251, errors: double(add: nil), local?: true, reblog?: false)
|
||||
subject.validate(status)
|
||||
expect(status.errors).to have_received(:add)
|
||||
end
|
||||
|
||||
it 'counts URLs as 23 characters flat' do
|
||||
text = ('a' * 476) + " http://#{'b' * 30}.com/example"
|
||||
status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false)
|
||||
|
||||
subject.validate(status)
|
||||
expect(status.errors).to_not have_received(:add)
|
||||
end
|
||||
|
||||
it 'counts only the front part of remote usernames' do
|
||||
text = ('a' * 475) + " @alice@#{'b' * 30}.com"
|
||||
status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false)
|
||||
|
||||
subject.validate(status)
|
||||
expect(status.errors).to_not have_received(:add)
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user