spec/lib/gdk/open_bao_spec.rb (159 lines of code) (raw):

# frozen_string_literal: true RSpec.describe GDK::OpenBao do include ShelloutHelper let(:mock_shellout) { gdk_shellout_double(run: output) } subject(:open_bao) { described_class.new } before do allow_gdk_shellout.and_return(mock_shellout) allow(mock_shellout).to receive(:run) allow(mock_shellout).to receive(:execute) allow(GDK::Output).to receive(:puts) allow(GDK::Output).to receive(:success) end describe '#configure' do subject(:configure) { open_bao.configure } it 'calls the necessary methods in order' do expect(open_bao).to receive(:initialize_server).ordered expect(open_bao).to receive(:set_unseal_key).ordered expect(open_bao).to receive(:set_root_token).ordered expect(open_bao).to receive(:unseal_vault).ordered expect(configure).to be(true) end end describe '#initialize_server' do let(:config) { GDK.config } let(:bao) { config.openbao.bin } subject(:initialize_server) { open_bao.initialize_server } context 'when vault is not initialized' do before do allow(open_bao).to receive(:vault_already_initialized?).and_return(false) end it 'initializes the server' do expect_shellout( %W[#{bao} operator init -key-shares=1 -key-threshold=1 -format=json], { env: { 'BAO_ADDR' => 'http://127.0.0.1:8200', 'BAO_TOKEN' => '' } } ) initialize_server end end context 'when vault is already initialized' do before do allow(open_bao).to receive(:vault_already_initialized?).and_return(true) end it 'does not initialize the server' do expect_no_gdk_shellout.with('bao operator init') initialize_server end end end describe '#unseal_vault' do let(:config) { GDK.config } let(:bao) { config.openbao.bin } let(:keys) { 'key1' } subject(:unseal_vault) { open_bao.unseal_vault(keys) } context 'when vault is sealed' do before do allow(open_bao).to receive(:vault_sealed?).and_return(true) end it 'unseals the vault' do expect_shellout( %W[#{bao} operator unseal key1], { env: { 'BAO_ADDR' => 'http://127.0.0.1:8200', 'BAO_TOKEN' => '' } } ) expect(GDK::Output).to receive(:success).with('OpenBao has been unsealed successfully') unseal_vault end end context 'when vault is already unsealed' do before do allow(open_bao).to receive(:vault_sealed?).and_return(false) end it 'does not unseal the vault' do expect(open_bao).not_to receive(:shellout) expect(GDK::Output).to receive(:puts).with('OpenBao is already unsealed') unseal_vault end end context 'when openbao is not running' do before do allow(open_bao).to receive(:vault_sealed?).and_raise(GDK::OpenBao::NotRunningError) end it 'raises an error' do expect { unseal_vault }.to raise_error(GDK::OpenBao::NotRunningError) end end end describe '#set_unseal_key' do subject(:set_unseal_key) { open_bao.set_unseal_key } context 'when init_output is present' do let(:init_output) { "{\"unseal_keys_hex\": [\n\"123456789\"\n ]}" } before do allow(open_bao).to receive(:init_output).and_return(init_output) allow(GDK.config).to receive(:bury!) allow(GDK.config).to receive(:save_yaml!) end it 'sets the unseal keys from init_output' do set_unseal_key expect(open_bao.instance_variable_get(:@unseal_key)).to eq('123456789') end it 'saves the keys to the config' do expect(GDK.config).to receive(:bury!).with('openbao.unseal_key', '123456789') expect(GDK.config).to receive(:save_yaml!) set_unseal_key end end context 'when init_output is not present' do before do allow(open_bao).to receive(:init_output).and_return(nil) allow(GDK.config).to receive_message_chain(:openbao, :unseal_key).and_return('123456789') end it 'sets the unseal keys from the config' do set_unseal_key expect(open_bao.instance_variable_get(:@unseal_key)).to eq('123456789') end end end describe '#set_root_token' do subject(:set_root_token) { open_bao.set_root_token } context 'when init_output is present' do let(:init_output) { "{\"root_token\": \"root_token_123\"\n}" } before do allow(open_bao).to receive(:init_output).and_return(init_output) allow(GDK.config).to receive(:bury!) allow(GDK.config).to receive(:save_yaml!) end it 'sets the root token from init_output' do set_root_token expect(open_bao.instance_variable_get(:@root_token)).to eq('root_token_123') end it 'saves the root token to the config' do expect(GDK.config).to receive(:bury!).with('openbao.root_token', 'root_token_123') expect(GDK.config).to receive(:save_yaml!) set_root_token end it 'outputs the root token' do expect(GDK::Output).to receive(:puts).with('The root token is: root_token_123') set_root_token end end context 'when init_output is not present' do before do allow(open_bao).to receive(:init_output).and_return(nil) allow(GDK.config).to receive_message_chain(:openbao, :root_token).and_return('config_root_token') end it 'sets the root token from the config' do set_root_token expect(open_bao.instance_variable_get(:@root_token)).to eq('config_root_token') end it 'outputs the root token' do expect(GDK::Output).to receive(:puts).with('The root token is: config_root_token') set_root_token end end end private def expect_shellout(cmd, args, output: '') shellout_double = gdk_shellout_double(run: output) allow(shellout_double).to receive(:read_stderr).and_return('') expect_gdk_shellout_command(cmd, args).and_return(shellout_double) end end