diff options
Diffstat (limited to 'spec/tasks/gitlab/db/cells/bump_cell_sequences_rake_spec.rb')
-rw-r--r-- | spec/tasks/gitlab/db/cells/bump_cell_sequences_rake_spec.rb | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/spec/tasks/gitlab/db/cells/bump_cell_sequences_rake_spec.rb b/spec/tasks/gitlab/db/cells/bump_cell_sequences_rake_spec.rb new file mode 100644 index 00000000000..a5dd7c0ff09 --- /dev/null +++ b/spec/tasks/gitlab/db/cells/bump_cell_sequences_rake_spec.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require 'rake_helper' + +RSpec.describe 'gitlab:db:cells:bump_cell_sequences', :silence_stdout, + :suppress_gitlab_schemas_validate_connection, feature_category: :cell, query_analyzers: false do + before_all do + Rake.application.rake_require 'tasks/gitlab/db/cells/bump_cell_sequences' + + # empty task as env is already loaded + Rake::Task.define_task :environment + end + + let(:main_sequence_name) { 'users_id_seq' } + let(:main_cell_sequence_name) { 'namespaces_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]) + end + + context 'when run in production environment' do + let(:expected_error_message) do + <<~HEREDOC + This rake task cannot be run in production environment + HEREDOC + end + + it 'will print error message and exit' do + allow(Gitlab).to receive(:dev_or_test_env?).and_return(false) + + expect do + run_rake_task('gitlab:db:cells:bump_cell_sequences', '10') + end.to raise_error(SystemExit) { |error| expect(error.status).to eq(1) } + .and output(expected_error_message).to_stdout + end + end + + context 'when passing wrong argument' do + let(:expected_error_message) do + <<~HEREDOC + Please specify a positive integer `increase_by` value + Example: rake gitlab:db:cells:bump_cell_sequences[100000] + HEREDOC + end + + it 'will print an error message and exit when passing no argument' do + expect do + run_rake_task('gitlab:db:cells:bump_cell_sequences') + end.to raise_error(SystemExit) { |error| expect(error.status).to eq(1) } + .and output(expected_error_message).to_stdout + end + + it 'will print an error message and exit when passing a non positive integer value' do + expect do + run_rake_task('gitlab:db:cells:bump_cell_sequences', '-5') + end.to raise_error(SystemExit) { |error| expect(error.status).to eq(1) } + .and output(expected_error_message).to_stdout + end + end + + context 'when bumping the sequences' do + it 'increments the sequence of the tables in the given schema, but not in other schemas' do + expect do + run_rake_task('gitlab:db:cells:bump_cell_sequences', '10') + end.to change { + last_value_of_sequence(ApplicationRecord.connection, main_sequence_name) + }.by(0) + .and change { + last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name) + }.by(11) # the +1 is because the sequence has is_called = true + end + end +end + +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 |