spec/lib/gdk/templates/erb_renderer_spec.rb (133 lines of code) (raw):

# frozen_string_literal: true RSpec.describe GDK::Templates::ErbRenderer do let(:protected_config_files) { [] } let(:erb_file) { fixture_path.join('example.erb') } let(:out_file) { temp_path.join('some/example.out') } let(:config) { config_klass.new(yaml: { 'gdk' => { 'protected_config_files' => protected_config_files } }) } let(:locals) do { foo: 'foobar', bar: 'barfoo' } end let(:config_klass) do Class.new(GDK::ConfigSettings) do string(:foo) { 'foo' } string(:bar) { 'bar' } settings(:gdk) do array(:protected_config_files) { [] } bool(:overwrite_changes) { false } end end end subject(:renderer) { described_class.new(erb_file.to_s, **locals) } before do allow(GDK).to receive(:config) { config } end around do |example| out_file.parent.mkpath example.run ensure out_file.parent.rmtree end describe '#safe_render!' do context 'output file does not exist' do it 'renders without a warning' do expect(GDK::Output).not_to receive(:warn) expect(renderer.safe_render!(out_file)).to be true expect(File.read(out_file)).to match('Foo is foo, and Bar is bar') end context 'with protected config file match', :hide_stdout do let(:protected_config_files) { ['some/example.out'] } it 'renders with a warning' do expect(GDK::Output).to receive(:warn).with(%r{Creating missing protected file 'some/example.out'.}) expect(renderer.safe_render!(out_file)).to be true expect(File.read(out_file)).to match('Foo is foo, and Bar is bar') end end end context 'output file exists' do before do File.write(out_file, contents) end context 'with differences' do let(:contents) { 'Foo is bar' } it 'warns about changes and overwrites content', :hide_stdout do expect(GDK::Output).to receive(:warn).with(%r{'some/example.out' has been overwritten}) expect(renderer).to receive(:display_changes!) expect(renderer.safe_render!(out_file)).to be true expect(File.read(out_file)).to match('Foo is foo, and Bar is bar') end context 'and yielded block raises an error' do before do allow(renderer).to receive(:perform_backup!).and_raise('some error') end it 'warns about changes and content', :hide_stdout do expect(GDK::Output).not_to receive(:warn).with(%r{'some/example.out' has been overwritten}) expect(renderer).to receive(:display_changes!) expect { renderer.safe_render!(out_file) }.to raise_error('some error') expect(File.read(out_file)).to match('Foo is foo, and Bar is bar') end end context 'with protected config file match', :hide_stdout do let(:protected_config_files) { ['some/*.out'] } it 'warns about changes and does not overwrite content' do expect(GDK::Output).to receive(:warn).with(%r{Changes to 'some/example.out' not applied because it's protected in gdk.yml.}) expect(renderer.safe_render!(out_file)).to be false expect(File.read(out_file)).to match('Foo is bar') end end end context 'without differences' do let(:contents) { renderer.render_to_string } it 'renders without a warning' do expect(renderer).not_to receive(:display_changes!) expect(renderer.safe_render!(out_file)).to be false expect(File.read(out_file)).to match('Foo is foo, and Bar is bar') end end end end describe '#render' do context 'output file does not exist' do it 'renders without a warning' do expect(GDK::Output).not_to receive(:warn) renderer.render(out_file) expect(File.read(out_file)).to match('Foo is foo, and Bar is bar') end context 'with protected config file match', :hide_stdout do let(:protected_config_files) { ['some/example.out'] } it 'renders with a warning' do expect(GDK::Output).to receive(:warn).with(%r{Creating missing protected file 'some/example.out'.}) renderer.render(out_file) expect(File.read(out_file)).to match('Foo is foo, and Bar is bar') end end end context 'output file exists' do before do File.write(out_file, contents) end context 'with differences' do let(:contents) { 'Foo is bar' } it 'renders without a warning' do expect(GDK::Output).not_to receive(:warn) renderer.render(out_file) expect(File.read(out_file)).to match('Foo is foo, and Bar is bar') end context 'with protected config file match', :hide_stdout do let(:protected_config_files) { ['some/*.out'] } it 'warns about changes and does not overwrite content' do expect(GDK::Output).to receive(:warn).with(%r{Changes to 'some/example.out' not applied because it's protected in gdk.yml.}) renderer.render(out_file) expect(File.read(out_file)).to match('Foo is bar') end end end end end describe '#render_to_string' do it 'renders the template with correct assigned config values' do expect(renderer.render_to_string).to match('Foo is foo, and Bar is bar') end it 'renders the template with correct assigned local values' do expect(renderer.render_to_string).to match('Local var foo is foobar and bar is barfoo') end end end