@ -1,11 +1,10 @@ | |||||
# frozen_string_literal: true | # frozen_string_literal: true | ||||
class Mention < ApplicationRecord | class Mention < ApplicationRecord | ||||
belongs_to :account, inverse_of: :mentions | |||||
belongs_to :status | |||||
belongs_to :account, inverse_of: :mentions, required: true | |||||
belongs_to :status, required: true | |||||
has_one :notification, as: :activity, dependent: :destroy | has_one :notification, as: :activity, dependent: :destroy | ||||
validates :account, :status, presence: true | |||||
validates :account, uniqueness: { scope: :status } | validates :account, uniqueness: { scope: :status } | ||||
end | end |
@ -1,3 +1,3 @@ | |||||
Fabricator(:account) do | Fabricator(:account) do | ||||
username "alice" | |||||
username { Faker::Internet.user_name(nil, %w(_)) } | |||||
end | end |
@ -1,3 +1,4 @@ | |||||
Fabricator(:block) do | Fabricator(:block) do | ||||
account | |||||
target_account { Fabricate(:account) } | |||||
end | end |
@ -1,3 +1,4 @@ | |||||
Fabricator(:follow) do | Fabricator(:follow) do | ||||
account | |||||
target_account { Fabricate(:account) } | |||||
end | end |
@ -1,3 +1,4 @@ | |||||
Fabricator(:follow_request) do | Fabricator(:follow_request) do | ||||
account | |||||
target_account { Fabricate(:account) } | |||||
end | end |
@ -0,0 +1,4 @@ | |||||
Fabricator(:mention) do | |||||
account | |||||
status | |||||
end |
@ -1,6 +1,6 @@ | |||||
Fabricator(:user) do | Fabricator(:user) do | ||||
account | account | ||||
email "alice@example.com" | |||||
email { Faker::Internet.email } | |||||
password "123456789" | password "123456789" | ||||
confirmed_at { Time.now } | confirmed_at { Time.now } | ||||
end | end |
@ -1,5 +1,22 @@ | |||||
require 'rails_helper' | require 'rails_helper' | ||||
RSpec.describe Block, type: :model do | RSpec.describe Block, type: :model do | ||||
describe 'validations' do | |||||
it 'has a valid fabricator' do | |||||
block = Fabricate.build(:block) | |||||
expect(block).to be_valid | |||||
end | |||||
it 'is invalid without an account' do | |||||
block = Fabricate.build(:block, account: nil) | |||||
block.valid? | |||||
expect(block).to model_have_error_on_field(:account) | |||||
end | |||||
it 'is invalid without a target_account' do | |||||
block = Fabricate.build(:block, target_account: nil) | |||||
block.valid? | |||||
expect(block).to model_have_error_on_field(:target_account) | |||||
end | |||||
end | |||||
end | end |
@ -1,5 +1,23 @@ | |||||
require 'rails_helper' | require 'rails_helper' | ||||
RSpec.describe DomainBlock, type: :model do | RSpec.describe DomainBlock, type: :model do | ||||
describe 'validations' do | |||||
it 'has a valid fabricator' do | |||||
domain_block = Fabricate.build(:domain_block) | |||||
expect(domain_block).to be_valid | |||||
end | |||||
it 'is invalid without a domain' do | |||||
domain_block = Fabricate.build(:domain_block, domain: nil) | |||||
domain_block.valid? | |||||
expect(domain_block).to model_have_error_on_field(:domain) | |||||
end | |||||
it 'is invalid if the domain already exists' do | |||||
domain_block_1 = Fabricate(:domain_block, domain: 'dalek.com') | |||||
domain_block_2 = Fabricate.build(:domain_block, domain: 'dalek.com') | |||||
domain_block_2.valid? | |||||
expect(domain_block_2).to model_have_error_on_field(:domain) | |||||
end | |||||
end | |||||
end | end |
@ -1,5 +1,22 @@ | |||||
require 'rails_helper' | require 'rails_helper' | ||||
RSpec.describe Mention, type: :model do | RSpec.describe Mention, type: :model do | ||||
describe 'validations' do | |||||
it 'has a valid fabricator' do | |||||
mention = Fabricate.build(:mention) | |||||
expect(mention).to be_valid | |||||
end | |||||
it 'is invalid without an account' do | |||||
mention = Fabricate.build(:mention, account: nil) | |||||
mention.valid? | |||||
expect(mention).to model_have_error_on_field(:account) | |||||
end | |||||
it 'is invalid without a status' do | |||||
mention = Fabricate.build(:mention, status: nil) | |||||
mention.valid? | |||||
expect(mention).to model_have_error_on_field(:status) | |||||
end | |||||
end | |||||
end | end |
@ -1,5 +1,49 @@ | |||||
require 'rails_helper' | require 'rails_helper' | ||||
RSpec.describe User, type: :model do | RSpec.describe User, type: :model do | ||||
describe 'validations' do | |||||
it 'is invalid without an account' do | |||||
user = Fabricate.build(:user, account: nil) | |||||
user.valid? | |||||
expect(user).to model_have_error_on_field(:account) | |||||
end | |||||
it 'is invalid without a valid locale' do | |||||
user = Fabricate.build(:user, locale: 'toto') | |||||
user.valid? | |||||
expect(user).to model_have_error_on_field(:locale) | |||||
end | |||||
it 'is invalid without a valid email' do | |||||
user = Fabricate.build(:user, email: 'john@') | |||||
user.valid? | |||||
expect(user).to model_have_error_on_field(:email) | |||||
end | |||||
end | |||||
describe 'scopes' do | |||||
describe 'recent' do | |||||
it 'returns an array of recent users ordered by id' do | |||||
user_1 = Fabricate(:user) | |||||
user_2 = Fabricate(:user) | |||||
expect(User.recent).to match_array([user_2, user_1]) | |||||
end | |||||
end | |||||
describe 'admins' do | |||||
it 'returns an array of users who are admin' do | |||||
user_1 = Fabricate(:user, admin: false) | |||||
user_2 = Fabricate(:user, admin: true) | |||||
expect(User.admins).to match_array([user_2]) | |||||
end | |||||
end | |||||
describe 'confirmed' do | |||||
it 'returns an array of users who are confirmed' do | |||||
user_1 = Fabricate(:user, confirmed_at: nil) | |||||
user_2 = Fabricate(:user, confirmed_at: Time.now) | |||||
expect(User.confirmed).to match_array([user_2]) | |||||
end | |||||
end | |||||
end | |||||
end | end |
@ -0,0 +1,15 @@ | |||||
RSpec::Matchers.define :model_have_error_on_field do |expected| | |||||
match do |record| | |||||
if record.errors.empty? | |||||
record.valid? | |||||
end | |||||
record.errors.has_key?(expected) | |||||
end | |||||
failure_message do |record| | |||||
keys = record.errors.keys | |||||
"expect record.errors(#{keys}) to include #{expected}" | |||||
end | |||||
end |