1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# frozen_string_literal: true
require 'spec_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'
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
|