spec/lib/gdk/command/config_spec.rb (153 lines of code) (raw):

# frozen_string_literal: true RSpec.describe GDK::Command::Config do before do stub_persisted_gdk_yaml({}) stub_pg_bindir stub_no_color_env('true') stub_backup end describe '.validate_config?' do subject { described_class.validate_config? } it { is_expected.to be(false) } end context 'with no extra argument' do it 'aborts execution and returns usage instructions' do expect { subject.run([]) }.to raise_error(SystemExit).and output(/Usage:/).to_stderr end end context 'with invalid extra arguments' do it 'aborts execution and returns usage instructions' do expect { subject.run(%w[non-existent-command]) }.to raise_error(SystemExit).and output(/Usage:/).to_stderr end end context 'get' do context 'with a missing key' do it 'aborts execution and returns an error' do expect { subject.run(%w[get]) }.to raise_error(SystemExit).and output(/Usage:/).to_stderr expect_no_error_report end end context 'with valid extra arguments' do it 'returns values retrieved from configuration store' do expect { subject.run(%w[get port]) }.to output(/3000/).to_stdout end context 'with nonexistent configuration keys' do it 'aborts execution and returns an error' do expect { subject.run(%w[get unknownkey]) }.to raise_error(SystemExit).and output(/Cannot get config for/).to_stderr expect_no_error_report end end context 'accessing an array' do it 'returns all values serialized as YAML' do expect { subject.run(%w[get praefect.__nodes]) }.to output(%r{config_file: gitaly/gitaly-0.praefect.toml}).to_stdout end context 'with a non-numeric key' do it 'abort execution and returns an error' do expect { subject.run(%w[get praefect.__nodes.first]) }.to raise_error(SystemExit).and output(/ERROR: length on praefect\.__nodes must be a positive number/).to_stderr expect_no_error_report end end context 'with an index out of bounds' do it 'abort execution and returns an error' do expect { subject.run(%w[get praefect.__nodes.100]) }.to raise_error(SystemExit).and output(/ERROR: praefect\.__nodes only has \d+ entries/).to_stderr end end end context 'accessing a value on an array' do it 'returns the value' do expect { subject.run(%w[get praefect.__nodes.0.config_file]) }.to output("gitaly/gitaly-0.praefect.toml\n").to_stdout end end end end context 'set' do context 'with a missing key' do it 'issues the usage warning' do expect { subject.run(%w[set]) }.to raise_error(SystemExit).and output(/Usage:/).to_stderr end end context 'with a missing value' do it 'issues the usage warning' do expect { subject.run(%w[set key]) }.to raise_error(SystemExit).and output(/Usage:/).to_stderr end end context 'with an invalid key' do it 'issues the usage warning' do expect { subject.run(%w[set invalidkey value]) }.to raise_error(SystemExit).and output(/ERROR: Cannot get config for 'invalidkey'/).to_stderr expect_no_error_report end end context 'with an invalid value' do it 'issues the usage warning' do expect { subject.run(%w[set port a]) }.to raise_error(SystemExit).and output(/ERROR: Value 'a' for setting 'port' is not a valid port/).to_stderr expect_no_error_report end end context 'with a valid key and value' do let(:current_port) { 3000 } context 'where the new value is different' do context "but the gdk.yml doesn't have any value set" do it 'advises the new value has been set' do new_port = 3001 expect_set("---\nport: #{new_port}\n") expect(GDK::Output).to receive(:success).with("'port' is now set to '#{new_port}' (previously using default '#{current_port}').") subject.run(%W[set port #{new_port}]) end end context "and the gdk.yml has some value set" do it 'advises the new value has been set' do new_port = 3001 stub_persisted_gdk_yaml('port' => current_port) expect_set("---\nport: #{new_port}\n") expect(GDK::Output).to receive(:success).with("'port' is now set to '#{new_port}' (previously '#{current_port}').") subject.run(%W[set port #{new_port}]) end end end context 'where the new value is the same' do context "but the gdk.yml doesn't contain the same value" do it 'advises the value has been explicitly set' do expect_set("---\nport: #{current_port}\n") expect(GDK::Output).to receive(:success).with("'port' is now set to '#{current_port}' (explicitly setting '#{current_port}').") subject.run(%W[set port #{current_port}]) end end context 'and the gdk.yml already contains the same value' do it 'advises the current value is already set' do stub_persisted_gdk_yaml('port' => current_port) expect_gdk_write(nil, negate: true) expect(GDK::Output).to receive(:warn).with("'port' is already set to '#{current_port}'") subject.run(%W[set port #{current_port}]) end end end context 'when the setting is an array' do it 'sets the value' do stub_persisted_gdk_yaml('cells' => { 'enabled' => true, 'instance_count' => 1 }) expect_set(<<~YAML) --- cells: enabled: true instance_count: 1 instances: - id: 5 YAML expect(GDK::Output).to receive(:success) .with("'cells.instances.0.id' is now set to '5' (previously using default '2').") subject.run(%w[set cells.instances.0.id 5]) end end def expect_set(yaml) expect(GDK::Output).to receive(:info).with("Don't forget to run 'gdk reconfigure'.") expect_gdk_write(yaml) expect(stub_backup).to receive(:backup!) end def expect_gdk_write(yaml, negate: false) if negate expect(File).not_to receive(:write).with(GDK::Config::FILE, yaml) else expect(File).to receive(:write).with(GDK::Config::FILE, yaml) end end end end end