spec/integration/rails_spec.rb in vault-rails-0.5.0 vs spec/integration/rails_spec.rb in vault-rails-0.6.0

- old
+ new

@@ -190,10 +190,135 @@ person.name = "Cinderella" person.save! end end + context "lazy single decrypt" do + before(:all) do + Vault::Rails.logical.write("transit/keys/dummy_people_ssn") + end + + it "encrypts attributes" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + expect(person.ssn_encrypted.length).to eq(61) + expect(person.ssn_encrypted).to start_with("vault:v1:") + expect(person.ssn_encrypted.encoding).to eq(Encoding::UTF_8) + end + + it "decrypts attributes" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + person.reload + + expect(person.ssn).to eq("123-45-6789") + expect(person.ssn.encoding).to eq(Encoding::UTF_8) + end + + it "does not decrypt on initialization" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + person.reload + + p2 = LazySinglePerson.find(person.id) + + expect(p2.instance_variable_get("@ssn")).to eq(nil) + expect(p2.ssn).to eq("123-45-6789") + end + + it "does not decrypt all attributes on single read" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + person.update_attributes!(credit_card: "abcd-efgh-hijk-lmno") + expect(person.credit_card).to eq("abcd-efgh-hijk-lmno") + + person.reload + + p2 = LazySinglePerson.find(person.id) + + expect(p2.instance_variable_get("@ssn")).to eq(nil) + expect(p2.ssn).to eq("123-45-6789") + expect(p2.instance_variable_get("@credit_card")).to eq(nil) + expect(p2.credit_card).to eq("abcd-efgh-hijk-lmno") + end + + it "does not decrypt all attributes on single write" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + person.update_attributes!(credit_card: "abcd-efgh-hijk-lmno") + expect(person.credit_card).to eq("abcd-efgh-hijk-lmno") + + person.reload + + p2 = LazySinglePerson.find(person.id) + + expect(p2.instance_variable_get("@ssn")).to eq(nil) + expect(p2.ssn).to eq("123-45-6789") + person.ssn = "111-11-1111" + expect(p2.instance_variable_get("@credit_card")).to eq(nil) + expect(p2.credit_card).to eq("abcd-efgh-hijk-lmno") + end + + it "tracks dirty attributes" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + + expect(person.ssn_changed?).to be(false) + expect(person.ssn_change).to be(nil) + expect(person.ssn_was).to eq("123-45-6789") + + person.ssn = "111-11-1111" + + expect(person.ssn_changed?).to be(true) + expect(person.ssn_change).to eq(["123-45-6789", "111-11-1111"]) + expect(person.ssn_was).to eq("123-45-6789") + end + + it "allows attributes to be unset" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + person.update_attributes!(ssn: nil) + person.reload + + expect(person.ssn).to be(nil) + end + + it "allows saving without validations" do + person = LazySinglePerson.new(ssn: "123-456-7890") + expect(person.save(validate: false)).to be(true) + expect(person.ssn_encrypted).to match("vault:") + end + + it "allows attributes to be unset after reload" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + person.reload + person.update_attributes!(ssn: nil) + person.reload + + expect(person.ssn).to be(nil) + end + + it "allows attributes to be blank" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + person.update_attributes!(ssn: "") + person.reload + + expect(person.ssn).to eq("") + end + + it "reloads instance variables on reload" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + expect(person.instance_variable_get(:@ssn)).to eq("123-45-6789") + + person.ssn = "111-11-1111" + person.reload + + expect(person.ssn).to eq("123-45-6789") + end + + it "does not try to encrypt unchanged attributes" do + person = LazySinglePerson.create!(ssn: "123-45-6789") + + expect(Vault::Rails).to_not receive(:encrypt) + person.name = "Cinderella" + person.save! + end + end + context "with custom options" do before(:all) do Vault::Rails.sys.mount("credit-secrets", :transit) Vault::Rails.logical.write("credit-secrets/keys/people_credit_cards") end @@ -506,8 +631,23 @@ context 'with errors' do it 'raises the appropriate exception' do expect { Vault::Rails.encrypt('/bogus/path', 'bogus', 'bogus') }.to raise_error(Vault::HTTPClientError) + end + end + + context "without a server" do + it "encrypts attributes with a dev prefix" do + allow(Vault::Rails).to receive(:enabled?).and_return(false) + person = Person.create!(credit_card: "1234567890111213") + expect(person.cc_encrypted).to start_with(Vault::Rails::DEV_PREFIX) + end + + it "decrypts attributes" do + allow(Vault::Rails).to receive(:enabled?).and_return(false) + person = Person.create!(credit_card: "1234567890111213") + person.reload + expect(person.credit_card).to eq("1234567890111213") end end end