thoughtbot--shoulda-matchers/spec/unit/shoulda/matchers/active_record/have_secure_token_matcher_s...

170 lines
5.6 KiB
Ruby

require 'unit_spec_helper'
# rubocop:disable Metrics/BlockLength
describe Shoulda::Matchers::ActiveRecord::HaveSecureTokenMatcher,
type: :model do
if active_record_supports_has_secure_token?
describe '#description' do
it 'returns the message including the name of the default column' do
matcher = have_secure_token
expect(matcher.description).
to eq('have :token as a secure token')
end
it 'returns the message including the name of a provided column' do
matcher = have_secure_token(:special_token)
expect(matcher.description).
to eq('have :special_token as a secure token')
end
end
it 'matches when the subject configures has_secure_token with the db' do
create_table(:users) do |t|
t.string :token
t.index :token, unique: true
end
valid_model = define_model_class(:User) { has_secure_token }
expect(valid_model.new).to have_secure_token
end
it 'matches when the subject configures has_secure_token with the db for ' \
'a custom attribute' do
create_table(:users) do |t|
t.string :auth_token
t.index :auth_token, unique: true
end
valid_model = define_model_class(:User) { has_secure_token(:auth_token) }
expect(valid_model.new).to have_secure_token(:auth_token)
end
it 'does not match when missing an token index' do
create_table(:users) do |t|
t.string :token
end
invalid_model = define_model_class(:User) { has_secure_token }
expected_message =
'Expected User to have :token as a secure token but the following ' \
'errors were found: missing unique index for users.token'
aggregate_failures do
expect(invalid_model.new).not_to have_secure_token
expect { expect(invalid_model.new).to have_secure_token }.
to fail_with_message(expected_message)
end
end
it 'does not match when missing a token column' do
create_table(:users)
invalid_model = define_model_class(:User) { has_secure_token }
expected_message =
'Expected User to have :token as a secure token but the following ' \
'errors were found: missing expected class and instance methods, ' \
'missing correct column token:string, missing unique index for ' \
'users.token'
aggregate_failures do
expect(invalid_model.new).not_to have_secure_token
expect { expect(invalid_model.new).to have_secure_token }.
to fail_with_message(expected_message)
end
end
it 'does not match when when lacking has_secure_token' do
create_table(:users) do |t|
t.string :token
t.index :token
end
invalid_model = define_model_class(:User)
expected_message =
'Expected User to have :token as a secure token but the following ' \
'errors were found: missing expected class and instance methods, ' \
'missing unique index for users.token'
aggregate_failures do
expect(invalid_model.new).not_to have_secure_token
expect { expect(invalid_model.new).to have_secure_token }.
to fail_with_message(expected_message)
end
end
it 'does not match when missing an index for a custom attribute' do
create_table(:users) do |t|
t.string :auth_token
end
invalid_model = define_model_class(:User) do
has_secure_token(:auth_token)
end
expected_message =
'Expected User to have :auth_token as a secure token but the ' \
'following errors were found: missing unique index for ' \
'users.auth_token'
aggregate_failures do
expect(invalid_model.new).not_to have_secure_token(:auth_token)
expect { expect(invalid_model.new).to have_secure_token(:auth_token) }.
to fail_with_message(expected_message)
end
end
it 'does not match when missing a column for a custom attribute' do
create_table(:users)
invalid_model = define_model_class(:User) do
has_secure_token(:auth_token)
end
expected_message =
'Expected User to have :auth_token as a secure token but the ' \
'following errors were found: missing expected class and instance ' \
'methods, missing correct column auth_token:string, missing unique ' \
'index for users.auth_token'
aggregate_failures do
expect(invalid_model.new).not_to have_secure_token(:auth_token)
expect { expect(invalid_model.new).to have_secure_token(:auth_token) }.
to fail_with_message(expected_message)
end
end
it 'does not match when when lacking has_secure_token for the attribute' do
create_table(:users) do |t|
t.string :auth_token
t.index :auth_token, unique: true
end
invalid_model = define_model_class(:User)
expected_message =
'Expected User to have :auth_token as a secure token but the ' \
'following errors were found: missing expected class and instance ' \
'methods'
aggregate_failures do
expect(invalid_model.new).not_to have_secure_token(:auth_token)
expect { expect(invalid_model.new).to have_secure_token(:auth_token) }.
to fail_with_message(expected_message)
end
end
it 'fails with the appropriate message when negated' do
create_table(:users) do |t|
t.string :token
t.index :token, unique: true
end
valid_model = define_model_class(:User) { has_secure_token }
expect { expect(valid_model.new).not_to have_secure_token }.
to fail_with_message('Did not expect User to have secure token :token')
end
end
end