spec/lib/gdk/diagnostic/gitlab_spec.rb (173 lines of code) (raw):
# frozen_string_literal: true
RSpec.describe GDK::Diagnostic::Gitlab do
let(:not_ok_log_dir_size) { described_class::GitlabLogDirDiagnostic::LOG_DIR_SIZE_NOT_OK_MB + 1 }
let(:ok_log_dir_size) { described_class::GitlabLogDirDiagnostic::LOG_DIR_SIZE_NOT_OK_MB - 1 }
describe '#success?' do
context 'for .gitlab_shell_secret' do
before do
allow(subject).to receive_message_chain(:gitlab_log_dir_diagnostic, :success?).and_return(true)
end
context 'for .gitlab_shell_secret existence' do
before do
stub_existence('gitlab', 'gitlab', false)
end
context "when both .gitlab_shell_secret files don't not exist" do
it 'returns false' do
stub_existence('gitlab_shell', 'gitlab-shell', false)
expect(subject.success?).to be_falsey
end
end
context 'when only the gitlab-shell .gitlab_shell_secret file exists' do
it 'returns false' do
stub_existence('gitlab_shell', 'gitlab-shell', true)
expect(subject.success?).to be_falsey
end
end
context 'when both .gitlab_shell_secret files exist' do
it 'returns true' do
stub_existence('gitlab', 'gitlab', true)
stub_existence('gitlab_shell', 'gitlab-shell', true)
expect(subject.success?).to be_truthy
end
end
end
context 'for .gitlab_shell_secret contents' do
before do
stub_content('gitlab', 'gitlab', 'abc')
end
context "when both .gitlab_shell_secret files don't match" do
it 'returns false' do
stub_content('gitlab_shell', 'gitlab-shell', 'def')
expect(subject.success?).to be_falsey
end
end
context 'when both .gitlab_shell_secret files match' do
it 'returns true' do
stub_content('gitlab_shell', 'gitlab-shell', 'abc')
expect(subject.success?).to be_truthy
end
end
end
end
context 'for gitlab/log/ dir size' do
let(:gitlab_log_dir_exists) { nil }
before do
allow(subject).to receive_message_chain(:gitlab_shell_secret_diagnostic, :success?).and_return(true)
stub_file(%i[gitlab log_dir], '/home/git/gdk/gitlab/log', exist: gitlab_log_dir_exists)
end
context "when /home/git/gdk/gitlab/log doesn't exist" do
let(:gitlab_log_dir_exists) { false }
it 'returns true' do
expect(subject.success?).to be_truthy
end
end
context 'when /home/git/gdk/gitlab/log does exist' do
let(:gitlab_log_dir_exists) { true }
let(:log_dir_size) { nil }
before do
stub_gitlab_log_dir_size(log_dir_size)
end
context 'when the size is not OK' do
let(:log_dir_size) { not_ok_log_dir_size }
it 'returns false' do
expect(subject.success?).to be_falsey
end
end
context 'when the size is OK' do
let(:log_dir_size) { ok_log_dir_size }
it 'returns true' do
expect(subject.success?).to be_truthy
end
end
end
end
end
describe '#detail' do
context 'for .gitlab_shell_secret' do
before do
allow(subject).to receive_message_chain(:gitlab_log_dir_diagnostic, :success?).and_return(true)
end
context 'for .gitlab_shell_secret existence' do
before do
stub_existence('gitlab', 'gitlab', false)
end
context "when both .gitlab_shell_secret files don't exist" do
it 'returns detail content' do
stub_existence('gitlab_shell', 'gitlab-shell', false)
match = %r{ /home/git/gdk/gitlab/.gitlab_shell_secret\n /home/git/gdk/gitlab-shell/.gitlab_shell_secret}
expect(subject.detail).to match(match)
end
end
context 'when only the gitlab-shell .gitlab_shell_secret file exists' do
it 'returns detail content' do
stub_existence('gitlab_shell', 'gitlab-shell', true)
match = %r{ /home/git/gdk/gitlab/.gitlab_shell_secret}
expect(subject.detail).to match(match)
end
end
context 'when both .gitlab_shell_secret files exist' do
it 'returns nil' do
stub_existence('gitlab', 'gitlab', true)
stub_existence('gitlab_shell', 'gitlab-shell', true)
expect(subject.detail).to be_nil
end
end
end
context 'for .gitlab_shell_secret contents' do
before do
stub_content('gitlab', 'gitlab', 'abc')
end
context "when both .gitlab_shell_secret files don't match" do
it 'returns detail content' do
stub_content('gitlab_shell', 'gitlab-shell', 'def')
expect(subject.detail).to match(/The gitlab-shell secret files need to match but they don't/)
end
end
context 'when both .gitlab_shell_secret files match' do
it 'returns nil' do
stub_content('gitlab_shell', 'gitlab-shell', 'abc')
expect(subject.detail).to be_nil
end
end
end
end
context 'for gitlab/log/ dir size' do
let(:log_dir_size) { nil }
before do
allow(subject).to receive_message_chain(:gitlab_shell_secret_diagnostic, :success?).and_return(true)
stub_file(%i[gitlab log_dir], '/home/git/gdk/gitlab/log', exist: true)
stub_gitlab_log_dir_size(log_dir_size)
end
context 'when the size is not OK' do
let(:log_dir_size) { not_ok_log_dir_size }
it 'returns detail content' do
expect(subject.detail).to match(%r{^Your gitlab/log/ directory is #{log_dir_size}MB.*You can truncate the log files if you wish.*rake gitlab:truncate_logs$}m)
end
end
context 'when the size is OK' do
let(:log_dir_size) { ok_log_dir_size }
it 'returns nil' do
expect(subject.detail).to be_nil
end
end
end
end
def stub_existence(key, project_dir, exist)
stub_gitlab_shell_secret_file_with([key, :dir], project_dir, exist: exist)
end
def stub_content(key, project_dir, content)
stub_gitlab_shell_secret_file_with([key, :dir], project_dir, content: content)
end
def stub_file(config_key, file, exist: true, content: '')
double = instance_double(Pathname, exist?: exist, to_s: file, read: content)
allow_any_instance_of(GDK::Config).to receive_message_chain(*config_key).and_return(double)
double
end
def stub_gitlab_shell_secret_file_with(config_key, project_dir, content: 'abc', exist: true)
file = '.gitlab_shell_secret'
double = stub_file(config_key, "/home/git/gdk/#{project_dir}/#{file}", exist: exist, content: content)
allow(double).to receive(:join).with(file).and_return(double)
end
def stub_gitlab_log_dir_size(size)
double = instance_double(Pathname, exist?: true, size: size * described_class::GitlabLogDirDiagnostic::BYTES_TO_MEGABYTES)
double_array = [double]
allow(double).to receive(:glob).with('*').and_return(double_array)
allow(double_array).to receive(:sum).and_yield(double)
allow_any_instance_of(GDK::Config).to receive_message_chain(:gitlab, :log_dir).and_return(double)
end
end