gitlab-org--gitlab-foss/spec/support_specs/database/without_check_constraint_sp...

86 lines
2.5 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Database::WithoutCheckConstraint' do
include MigrationsHelpers
describe '.without_check_constraint' do
let(:connection) { ApplicationRecord.connection }
let(:table_name) { '_test_table' }
let(:constraint_name) { 'check_1234' }
let(:model) { table(table_name) }
before do
# Drop test table in case it's left from a previous execution.
connection.exec_query("DROP TABLE IF EXISTS #{table_name}")
# Model has an attribute called 'name' that can't be NULL.
connection.exec_query(<<-SQL)
CREATE TABLE #{table_name} (
name text
CONSTRAINT #{constraint_name} CHECK (name IS NOT NULL)
);
SQL
end
context 'with invalid table' do
subject do
without_check_constraint('no_such_table', constraint_name, connection: connection) {}
end
it 'raises exception' do
msg = "'no_such_table' does not exist"
expect { subject }.to raise_error(msg)
end
end
context 'with invalid constraint name' do
subject do
without_check_constraint(table_name, 'no_such_constraint', connection: connection) {}
end
it 'raises exception' do
msg = "'#{table_name}' table does not contain constraint called 'no_such_constraint'"
expect { subject }.to raise_error(msg)
end
end
context 'with constraint' do
subject { connection.check_constraints(table_name) }
it 'removes inside block' do
without_check_constraint(table_name, constraint_name, connection: connection) do
expect(subject).to be_empty
end
end
it 'restores outside block' do
saved_constraints = subject
without_check_constraint(table_name, constraint_name, connection: connection) do
end
expect(subject).to eq(saved_constraints)
end
end
context 'when creating an invalid record' do
subject(:invalid_record) { model.create!(name: nil) }
it 'enables invalid record creation inside block' do
without_check_constraint(table_name, constraint_name, connection: connection) do
expect(invalid_record).to be_persisted
expect(invalid_record.name).to be_nil
end
end
it 'rolls back changes made within the block' do
without_check_constraint(table_name, constraint_name, connection: connection) do
invalid_record
end
expect(model.all).to be_empty
end
end
end
end