Files
Dalan/spec/services/encryption_service_spec.rb
2026-08-13 19:56:46 +03:30

155 lines
5.7 KiB
Ruby

# frozen_string_literal: true
describe EncryptionService do
context 'current_salt' do
before(:each) do
EncryptionService.instance_variable_set(:@cache, {})
end
it { expect(EncryptionService.current_salt).to eq Time.now.strftime('%Y%W') }
it do
allow(Time).to receive(:now).and_return(1.week.ago)
expect(EncryptionService.current_salt).to eq Time.now.strftime('%Y%W')
end
end
context 'pack' do
before(:each) do
EncryptionService.instance_variable_set(:@cache, {})
end
it { expect(EncryptionService.pack('salt', 'value')).to eq 'salt.value' }
it { expect(EncryptionService.pack('salt', nil)).to eq 'salt.' }
it { expect(EncryptionService.pack('salt', '')).to eq 'salt.' }
end
context 'unpack' do
before(:each) do
EncryptionService.instance_variable_set(:@cache, {})
end
it { expect(EncryptionService.unpack('salt.value')).to eq ['salt', 'value'] }
it { expect(EncryptionService.unpack('salt.value.value')).to eq ['salt', 'value.value'] }
it { expect(EncryptionService.unpack(' salt.value')).to eq ['salt', 'value'] }
it { expect(EncryptionService.unpack(' salt_underscore.value')).to eq ['salt_underscore', 'value'] }
it { expect(EncryptionService.unpack('salt.')).to eq ['salt', ''] }
it { expect { EncryptionService.unpack('salt') }.to raise_error('Invalid encrypted value: salt') }
end
context 'encrypt' do
before(:each) do
EncryptionService.instance_variable_set(:@cache, {})
end
let(:time) { Time.now.strftime('%Y%W') }
it { expect(EncryptionService.encrypt('value')).to match(/#{time}/) }
end
context 'decrypt' do
before(:each) do
EncryptionService.instance_variable_set(:@cache, {})
end
let(:encrypted_key) { EncryptionService.encrypt('value') }
it { expect(EncryptionService.decrypt(encrypted_key)).to eq 'value' }
end
context 'private methods' do
context 'delete_expired_keys' do
context 'ivalid cases' do
context 'cache as number' do
it 'shouldnt delete expired hash when hash is invalid' do
EncryptionService.instance_variable_set(:@cache, 5)
EncryptionService.send(:delete_expired_keys)
expect(EncryptionService.instance_variable_get(:@cache)).to eq 5
end
end
context 'empty hash' do
it 'shouldnt delete expired hash when hash is invalid' do
EncryptionService.instance_variable_set(:@cache, {})
EncryptionService.send(:delete_expired_keys)
expect(EncryptionService.instance_variable_get(:@cache)).to eq ({})
end
end
context 'invalid hash' do
it 'shouldnt delete expired hash when hash is invalid' do
EncryptionService.instance_variable_set(:@cache, {'test': 'value'})
EncryptionService.send(:delete_expired_keys)
expect(EncryptionService.instance_variable_get(:@cache)).to eq ({'test': 'value'})
end
end
context 'hash without expire date' do
it 'shouldnt delete expired hash when hash is invalid' do
EncryptionService.instance_variable_set(:@cache, {'test': {'key': 'generated_key'}})
EncryptionService.send(:delete_expired_keys)
expect(EncryptionService.instance_variable_get(:@cache)).to eq ({'test': {'key': 'generated_key'}})
end
end
end
context 'valid cases' do
context 'should not delete keys' do
it 'shouldnt delete hash keys' do
EncryptionService.instance_variable_set(:@cache,
{
'test1': {key: 'generated_key', expire_date: Time.now + 3.hours },
'test2': {key: 'generated_key', expire_date: Time.now + 2.hours },
'test3': {key: 'generated_key', expire_date: Time.now + 1.hours },
}.with_indifferent_access
)
EncryptionService.send(:delete_expired_keys)
expect(EncryptionService.instance_variable_get(:@cache).keys).to match_array %w[test1 test2 test3]
end
end
context 'should delete keys' do
it 'should delete hash keys' do
EncryptionService.instance_variable_set(:@cache,
{
'test1': {key: 'generated_key', expire_date: Time.now - 3.hours },
'test2': {key: 'generated_key', expire_date: Time.now - 2.hours },
'test3': {key: 'generated_key', expire_date: Time.now - 1.hours },
}.with_indifferent_access
)
EncryptionService.send(:delete_expired_keys)
expect(EncryptionService.instance_variable_get(:@cache)).to eq({})
end
end
end
end
context 'get_master_key' do
context 'empty cache' do
it 'should generate key by salt' do
EncryptionService.instance_variable_set(:@cache, {})
key = EncryptionService.send(:get_master_key, 'salt')
expect(EncryptionService.instance_variable_get(:@cache)['salt']['key']).to eq key
expect(EncryptionService.instance_variable_get(:@cache)['salt']['expire_date'].to_date).to eq 1.week.from_now.to_date
end
end
context 'non empty hash' do
let(:values) {
{
"salt":{
"key": "\xD5\xD8e\\N{1}\xEB\x9DP\x033)\x10{X\x91\xA1V\xB7\xCC\xE1L2\xDF\xC5,\f\x1Fh\xC6",
"expire_date": 1.week.from_now
}
}
}
it 'should get key from hash' do
EncryptionService.instance_variable_set(:@cache, values)
allow(Time).to receive(:now).and_return(1.week.ago)
key = EncryptionService.send(:get_master_key, 'salt')
expect(key).to eq values['salt']['key']
end
end
end
end
end