spec/gdk/config_redactor_spec.rb (76 lines of code) (raw):
# frozen_string_literal: true
RSpec.describe GDK::ConfigRedactor do
describe '.redact' do
redacted = '[redacted]'
home_path_redact = '$HOME'
shared_examples 'redacts' do |input, output|
it 'redacts input' do
output.freeze
expect(described_class.redact(input)).to eq(output)
end
end
shared_examples 'does not redact' do |input|
it 'does not redact' do
output.freeze
expect(described_class.redact(input)).to eq(input)
end
end
include_examples 'does not redact', {}
include_examples 'does not redact', { a: 'A' }
include_examples 'does not redact', { a: %w[A B] }
include_examples 'does not redact', { a: { b: 'A' } }
include_examples 'does not redact', { key: '1' }
include_examples 'does not redact', { secret_key: 1 }
include_examples 'does not redact', { secret_key: '' }
include_examples 'redacts', { secret_key: '1' }, { secret_key: redacted }
include_examples 'redacts', { secret_key: '1234' }, { secret_key: redacted }
include_examples 'redacts', { secret_key: '12345' }, { secret_key: redacted }
include_examples 'redacts', { secret_key: '123456' }, { secret_key: redacted }
# By Key
include_examples 'redacts', { my_password: '1' }, { my_password: redacted }
include_examples 'redacts', { my_pass: '1' }, { my_pass: redacted }
include_examples 'redacts', { my_secret: '1' }, { my_secret: redacted }
include_examples 'redacts', { my_token: '1' }, { my_token: redacted }
include_examples 'redacts', { token: '1' }, { token: redacted }
include_examples 'redacts', { sectoken: '1' }, { sectoken: redacted }
include_examples 'redacts', { SECRET_KEY: '1' }, { SECRET_KEY: redacted }
# Allow keys
include_examples 'does not redact', { cookie_key: '1' }
include_examples 'does not redact', { version: '1' }
# By value
include_examples 'redacts', { a: 'glpat-1234' }, { a: redacted }
include_examples 'redacts', { a: 'glsoat-1234' }, { a: redacted }
include_examples 'does not redact', { a: 'glpat_1234' }
include_examples 'does not redact', { a: 'Glpat-1234' }
include_examples 'redacts', { a: 'ghp_1234' }, { a: redacted }
include_examples 'redacts', { a: 'gho_1234' }, { a: redacted }
include_examples 'does not redact', { a: 'ghp-1234' }
include_examples 'does not redact', { a: 'ghP-1234' }
include_examples 'redacts', { a: '741b4ba7c176900c9a2e18f46dcf6ae0' }, { a: redacted }
include_examples 'redacts', { a: '012345689ABCEDEF' }, { a: redacted }
include_examples 'does not redact', { a: '0123456' }
include_examples 'redacts', { a: 'a3530de6-495d-495a-a6d0-50d8d18d17cf' }, { a: redacted }
include_examples 'redacts', { example_dir: "#{Dir.home}/git/gdk" }, { example_dir: "#{home_path_redact}/git/gdk" }
# Nested
include_examples 'does not redact', { secret_key: %w[1 2] }
include_examples 'redacts',
{ list: [{ secret_key: '1' }, { secret_key: '2' }] },
{ list: [{ secret_key: redacted }, { secret_key: redacted }] }
include_examples 'redacts',
{ list: [{ secret_key: '1', plain: 'A' }, { secret_key: '2' }] },
{ list: [{ secret_key: redacted, plain: 'A' }, { secret_key: redacted }] }
include_examples 'redacts',
{ deep: { nested: { secret_key: '1' }, my_pass: '1' } },
{ deep: { nested: { secret_key: redacted }, my_pass: redacted } }
end
describe '.redact_logfile' do
it 'redacts the home path' do
expect(Dir).to receive(:home).and_return('/home/gdkuser1')
redacted = subject.redact_logfile <<~LOGFILE
Running 'make install' in /Users/test/project1
Updating stuff in /home/dog/projects/gdk...
error in /home/gdkuser1/gdk
LOGFILE
expect(redacted).to eq <<~LOGFILE
Running 'make install' in /Users/test/project1
Updating stuff in /home/dog/projects/gdk...
error in $HOME/gdk
LOGFILE
end
end
end