diff options
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/account_spec.rb | 1 | ||||
-rw-r--r-- | spec/models/concerns/account_interactions_spec.rb | 40 | ||||
-rw-r--r-- | spec/models/custom_emoji_spec.rb | 25 | ||||
-rw-r--r-- | spec/models/import_spec.rb | 19 | ||||
-rw-r--r-- | spec/models/report_spec.rb | 14 | ||||
-rw-r--r-- | spec/models/site_upload_spec.rb | 5 | ||||
-rw-r--r-- | spec/models/status_pin_spec.rb | 41 | ||||
-rw-r--r-- | spec/models/status_spec.rb | 56 | ||||
-rw-r--r-- | spec/models/user_spec.rb | 20 |
9 files changed, 209 insertions, 12 deletions
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 17e2d8499..361577eff 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -642,7 +642,6 @@ RSpec.describe Account, type: :model do it 'returns remote accounts with followers whose subscription expiration date is past or not given' do local = Fabricate(:account, domain: nil) matches = [ - { domain: 'remote', subscription_expires_at: nil }, { domain: 'remote', subscription_expires_at: '2000-01-01T00:00:00Z' }, ].map(&method(:Fabricate).curry(2).call(:account)) matches.each(&local.method(:follow!)) diff --git a/spec/models/concerns/account_interactions_spec.rb b/spec/models/concerns/account_interactions_spec.rb new file mode 100644 index 000000000..ef957fc1d --- /dev/null +++ b/spec/models/concerns/account_interactions_spec.rb @@ -0,0 +1,40 @@ +require 'rails_helper' + +describe AccountInteractions do + describe 'muting an account' do + before do + @me = Fabricate(:account, username: 'Me') + @you = Fabricate(:account, username: 'You') + end + + context 'with the notifications option unspecified' do + before do + @me.mute!(@you) + end + + it 'defaults to muting notifications' do + expect(@me.muting_notifications?(@you)).to be(true) + end + end + + context 'with the notifications option set to false' do + before do + @me.mute!(@you, notifications: false) + end + + it 'does not mute notifications' do + expect(@me.muting_notifications?(@you)).to be(false) + end + end + + context 'with the notifications option set to true' do + before do + @me.mute!(@you, notifications: true) + end + + it 'does mute notifications' do + expect(@me.muting_notifications?(@you)).to be(true) + end + end + end +end diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb new file mode 100644 index 000000000..cb51e9519 --- /dev/null +++ b/spec/models/custom_emoji_spec.rb @@ -0,0 +1,25 @@ +require 'rails_helper' + +RSpec.describe CustomEmoji, type: :model do + describe '.from_text' do + let!(:emojo) { Fabricate(:custom_emoji) } + + subject { described_class.from_text(text, nil) } + + context 'with plain text' do + let(:text) { 'Hello :coolcat:' } + + it 'returns records used via shortcodes in text' do + is_expected.to include(emojo) + end + end + + context 'with html' do + let(:text) { '<p>Hello :coolcat:</p>' } + + it 'returns records used via shortcodes in text' do + is_expected.to include(emojo) + end + end + end +end diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb index fa52077cd..321761166 100644 --- a/spec/models/import_spec.rb +++ b/spec/models/import_spec.rb @@ -1,5 +1,24 @@ require 'rails_helper' RSpec.describe Import, type: :model do + let (:account) { Fabricate(:account) } + let (:type) { 'following' } + let (:data) { attachment_fixture('imports.txt') } + describe 'validations' do + it 'has a valid parameters' do + import = Import.create(account: account, type: type, data: data) + expect(import).to be_valid + end + + it 'is invalid without an type' do + import = Import.create(account: account, data: data) + expect(import).to model_have_error_on_field(:type) + end + + it 'is invalid without a data' do + import = Import.create(account: account, type: type) + expect(import).to model_have_error_on_field(:data) + end + end end diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb index 6c2723845..d40ebf6dc 100644 --- a/spec/models/report_spec.rb +++ b/spec/models/report_spec.rb @@ -21,4 +21,18 @@ describe Report do expect(report.media_attachments).to eq [media_attachment] end end + + describe 'validatiions' do + it 'has a valid fabricator' do + report = Fabricate(:report) + report.valid? + expect(report).to be_valid + end + + it 'is invalid if comment is longer than 1000 characters' do + report = Fabricate.build(:report, comment: Faker::Lorem.characters(1001)) + report.valid? + expect(report).to model_have_error_on_field(:comment) + end + end end diff --git a/spec/models/site_upload_spec.rb b/spec/models/site_upload_spec.rb new file mode 100644 index 000000000..8745d54b8 --- /dev/null +++ b/spec/models/site_upload_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe SiteUpload, type: :model do + +end diff --git a/spec/models/status_pin_spec.rb b/spec/models/status_pin_spec.rb new file mode 100644 index 000000000..6f54f80f9 --- /dev/null +++ b/spec/models/status_pin_spec.rb @@ -0,0 +1,41 @@ +require 'rails_helper' + +RSpec.describe StatusPin, type: :model do + describe 'validations' do + it 'allows pins of own statuses' do + account = Fabricate(:account) + status = Fabricate(:status, account: account) + + expect(StatusPin.new(account: account, status: status).save).to be true + end + + it 'does not allow pins of statuses by someone else' do + account = Fabricate(:account) + status = Fabricate(:status) + + expect(StatusPin.new(account: account, status: status).save).to be false + end + + it 'does not allow pins of reblogs' do + account = Fabricate(:account) + status = Fabricate(:status, account: account) + reblog = Fabricate(:status, reblog: status) + + expect(StatusPin.new(account: account, status: reblog).save).to be false + end + + it 'does not allow pins of private statuses' do + account = Fabricate(:account) + status = Fabricate(:status, account: account, visibility: :private) + + expect(StatusPin.new(account: account, status: status).save).to be false + end + + it 'does not allow pins of direct statuses' do + account = Fabricate(:account) + status = Fabricate(:status, account: account, visibility: :direct) + + expect(StatusPin.new(account: account, status: status).save).to be false + end + end +end diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 626fc3f98..9cb71d715 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -13,9 +13,15 @@ RSpec.describe Status, type: :model do end it 'returns false if a remote URI is set' do - subject.uri = 'a' + alice.update(domain: 'example.com') + subject.save expect(subject.local?).to be false end + + it 'returns true if a URI is set and `local` is true' do + subject.update(uri: 'example.com', local: true) + expect(subject.local?).to be true + end end describe '#reblog?' do @@ -167,16 +173,19 @@ RSpec.describe Status, type: :model do end end - describe '.local_only' do - it 'returns only statuses from local accounts' do - local_account = Fabricate(:account, domain: nil) - remote_account = Fabricate(:account, domain: 'test.com') - local_status = Fabricate(:status, account: local_account) - remote_status = Fabricate(:status, account: remote_account) + describe '.not_in_filtered_languages' do + context 'for accounts with language filters' do + let(:user) { Fabricate(:user, filtered_languages: ['en']) } + + it 'does not include statuses in filtered languages' do + status = Fabricate(:status, language: 'en') + expect(Status.not_in_filtered_languages(user.account)).not_to include status + end - results = described_class.local_only - expect(results).to include(local_status) - expect(results).not_to include(remote_status) + it 'includes status with unknown language' do + status = Fabricate(:status, language: nil) + expect(Status.not_in_filtered_languages(user.account)).to include status + end end end @@ -495,7 +504,7 @@ RSpec.describe Status, type: :model do end end - describe 'before_create' do + describe 'before_validation' do it 'sets account being replied to correctly over intermediary nodes' do first_status = Fabricate(:status, account: bob) intermediary = Fabricate(:status, thread: first_status, account: alice) @@ -512,5 +521,30 @@ RSpec.describe Status, type: :model do parent = Fabricate(:status, text: 'First') expect(Status.create(account: alice, thread: parent, text: 'Response').conversation_id).to eq parent.conversation_id end + + it 'sets `local` to true for status by local account' do + expect(Status.create(account: alice, text: 'foo').local).to be true + end + + it 'sets `local` to false for status by remote account' do + alice.update(domain: 'example.com') + expect(Status.create(account: alice, text: 'foo').local).to be false + end + end + + describe 'validation' do + it 'disallow empty uri for remote status' do + alice.update(domain: 'example.com') + status = Fabricate.build(:status, uri: '', account: alice) + expect(status).to model_have_error_on_field(:uri) + end + end + + describe 'after_create' do + it 'saves ActivityPub uri as uri for local status' do + status = Status.create(account: alice, text: 'foo') + status.reload + expect(status.uri).to start_with('https://') + end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index ef45818b9..99aeca01b 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -286,4 +286,24 @@ RSpec.describe User, type: :model do Fabricate(:user) end end + + describe 'token_for_app' do + let(:user) { Fabricate(:user) } + let(:app) { Fabricate(:application, owner: user) } + + it 'returns a token' do + expect(user.token_for_app(app)).to be_a(Doorkeeper::AccessToken) + end + + it 'persists a token' do + t = user.token_for_app(app) + expect(user.token_for_app(app)).to eql(t) + end + + it 'is nil if user does not own app' do + app.update!(owner: nil) + + expect(user.token_for_app(app)).to be_nil + end + end end |