debian-mirror-gitlab/spec/rubocop/cop/migration/add_limit_to_string_columns_spec.rb
2019-12-04 20:38:33 +05:30

269 lines
6.9 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
require 'rubocop'
require 'rubocop/rspec/support'
require_relative '../../../../rubocop/cop/migration/add_limit_to_string_columns'
describe RuboCop::Cop::Migration::AddLimitToStringColumns do
include CopHelper
subject(:cop) { described_class.new }
context 'in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
inspect_source(migration)
end
context 'when creating a table' do
context 'with string columns and limit' do
let(:migration) do
%q(
class CreateUsers < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
create_table :users do |t|
t.string :username, null: false, limit: 255
t.timestamps_with_timezone null: true
end
end
end
)
end
it 'register no offense' do
expect(cop.offenses.size).to eq(0)
end
context 'with limit in a different position' do
let(:migration) do
%q(
class CreateUsers < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
create_table :users do |t|
t.string :username, limit: 255, null: false
t.timestamps_with_timezone null: true
end
end
end
)
end
it 'registers an offense' do
expect(cop.offenses.size).to eq(0)
end
end
end
context 'with string columns and no limit' do
let(:migration) do
%q(
class CreateUsers < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
create_table :users do |t|
t.string :username, null: false
t.timestamps_with_timezone null: true
end
end
end
)
end
it 'registers an offense' do
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.first.message)
.to eq('String columns should have a limit constraint. 255 is suggested')
end
end
context 'with no string columns' do
let(:migration) do
%q(
class CreateMilestoneReleases < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
create_table :milestone_releases do |t|
t.integer :milestone_id
t.integer :release_id
end
end
end
)
end
it 'register no offense' do
expect(cop.offenses.size).to eq(0)
end
end
end
context 'when adding columns' do
context 'with string columns with limit' do
let(:migration) do
%q(
class AddEmailToUsers < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
add_column :users, :email, :string, limit: 255
end
end
)
end
it 'registers no offense' do
expect(cop.offenses.size).to eq(0)
end
context 'with limit in a different position' do
let(:migration) do
%q(
class AddEmailToUsers < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
add_column :users, :email, :string, limit: 255, default: 'example@email.com'
end
end
)
end
it 'registers no offense' do
expect(cop.offenses.size).to eq(0)
end
end
end
context 'with string columns with no limit' do
let(:migration) do
%q(
class AddEmailToUsers < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
add_column :users, :email, :string
end
end
)
end
it 'registers offense' do
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.first.message)
.to eq('String columns should have a limit constraint. 255 is suggested')
end
end
context 'with no string columns' do
let(:migration) do
%q(
class AddEmailToUsers < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
add_column :users, :active, :boolean, default: false
end
end
)
end
it 'registers no offense' do
expect(cop.offenses.size).to eq(0)
end
end
end
context 'with add_column_with_default' do
context 'with a limit' do
let(:migration) do
%q(
class AddRuleTypeToApprovalMergeRequestRules < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
add_column_with_default(:approval_merge_request_rules, :rule_type, :string, limit: 2, default: 1)
end
end
)
end
it 'registers no offense' do
expect(cop.offenses.size).to eq(0)
end
end
context 'without a limit' do
let(:migration) do
%q(
class AddRuleTypeToApprovalMergeRequestRules < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
add_column_with_default(:approval_merge_request_rules, :rule_type, :string, default: 1)
end
end
)
end
it 'registers an offense' do
expect(cop.offenses.size).to eq(1)
end
end
end
context 'with methods' do
let(:migration) do
%q(
class AddEmailToUsers < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
add_column_if_table_not_exists :users, :first_name, :string, limit: 255
search_namespace(user_name)
end
def add_column_if_not_exists(table, name, *args)
add_column(table, name, *args) unless column_exists?(table, name)
end
def search_namespace(username)
Uniquify.new.string(username) do |str|
query = "SELECT id FROM namespaces WHERE parent_id IS NULL AND path='#{str}' LIMIT 1"
connection.exec_query(query)
end
end
end
)
end
it 'registers no offense' do
expect(cop.offenses.size).to eq(0)
end
end
end
context 'outside of migrations' do
let(:active_record_model) do
%q(
class User < ApplicationRecord
end
)
end
it 'registers no offense' do
inspect_source(active_record_model)
expect(cop.offenses.size).to eq(0)
end
end
end