gitlab-ce/spec/lib/gitlab/database/bump_sequences_spec.rb

84 lines
3.5 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::Database::BumpSequences, feature_category: :cell, query_analyzers: false do
let!(:gitlab_schema) { :gitlab_main_cell }
let!(:increment_by) { 1000 }
let!(:main_cell_sequence_name) { 'namespaces_id_seq' }
let!(:main_sequence_name) { 'vulnerabilities_id_seq' }
let!(:main_clusterwide_sequence_name) { 'users_id_seq' }
let!(:ci_sequence_name) { 'ci_build_needs_id_seq' }
# This is just to make sure that all of the sequences start with `is_called=True`
# which means that the next call to nextval() is going to increment the sequence.
# To give predictable test results.
before do
ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_cell_sequence_name])
ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_sequence_name])
ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_clusterwide_sequence_name])
ApplicationRecord.connection.select_value("select nextval($1)", nil, [ci_sequence_name])
end
describe '#execute' do
subject { described_class.new(gitlab_schema, increment_by).execute }
context 'when bumping the sequences' do
it 'changes sequences by the passed argument `increase_by` value on the main database' do
expect do
subject
end.to change {
last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name)
}.by(1001) # the +1 is because the sequence has is_called = true
end
it 'will still increase the value of sequences that have is_called = False' do
# see `is_called`: https://www.postgresql.org/docs/12/functions-sequence.html
# choosing a new arbitrary value for the sequence
new_value = last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name) + 1000
ApplicationRecord.connection.select_value(
"select setval($1, $2, false)", nil, [main_cell_sequence_name, new_value]
)
expect do
subject
end.to change {
last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name)
}.by(1000)
end
it 'resets the INCREMENT value of the sequences back to 1 for the following calls to nextval()' do
subject
value_1 = ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_cell_sequence_name])
value_2 = ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_cell_sequence_name])
expect(value_2 - value_1).to eq(1)
end
it 'increments the sequence of the tables in the given schema, but not in other schemas' do
expect do
subject
end.to change {
last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name)
}.by(1001)
.and change {
last_value_of_sequence(ApplicationRecord.connection, main_sequence_name)
}.by(0)
.and change {
last_value_of_sequence(ApplicationRecord.connection, main_clusterwide_sequence_name)
}.by(0)
.and change {
last_value_of_sequence(ApplicationRecord.connection, ci_sequence_name)
}.by(0)
end
end
end
private
def last_value_of_sequence(connection, sequence_name)
allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/408220') do
connection.select_value("select last_value from #{sequence_name}")
end
end
end