describe Appsignal::Utils::QueryParamsSanitizer do describe ".sanitize" do context "when only_top_level = true" do subject { described_class.sanitize(value, true) } context "when value is a hash" do let(:value) { {'foo' => 'bar'} } it "should only return the first level of the object" do expect(subject).to eq('foo' => '?') end it "should not modify source value" do subject expect(value).to eq('foo' => 'bar') end end context "when value is a nested hash" do let(:value) { {'foo' => { 'bar' => 'baz' }} } it "should only return the first level of the object" do expect(subject).to eq('foo' => '?') end it "should not modify source value" do subject expect(value).to eq('foo' => { 'bar' => 'baz' }) end end context "when value is an array of hashes" do let(:value) { ['foo' => 'bar'] } it "should sanitize all hash values with a questionmark" do expect(subject).to eq('foo' => '?') end it "should not modify source value" do subject expect(value).to eq(['foo' => 'bar']) end end context "when value is an array" do let(:value) { ['foo', 'bar'] } it "should only return the first level of the object" do expect(subject).to eq('?') end it "should not modify source value" do subject expect(value).to eq(['foo', 'bar']) end end context "when value is a mixed array" do let(:value) { [nil, 'foo', 'bar'] } it "should sanitize all hash values with a single questionmark" do expect(subject).to eq('?') end end context "when value is a string" do let(:value) { 'foo' } it "should sanitize all hash values with a questionmark" do expect(subject).to eq('?') end end end context "when only_top_level = false" do subject { described_class.sanitize(value, false) } context "when value is a hash" do let(:value) { {'foo' => 'bar'} } it "should sanitize all hash values with a questionmark" do expect(subject).to eq('foo' => '?') end it "should not modify source value" do subject expect(value).to eq('foo' => 'bar') end end context "when value is a nested hash" do let(:value) { {'foo' => { 'bar' => 'baz' }} } it "should replaces values" do expect(subject).to eq('foo' => {'bar' => '?'}) end it "should not modify source value" do subject expect(value).to eq('foo' => {'bar' => 'baz'}) end end context "when value is an array of hashes" do let(:value) { ['foo' => 'bar'] } it "should sanitize all hash values with a questionmark" do expect(subject).to eq(['foo' => '?']) end it "should not modify source value" do subject expect(value).to eq(['foo' => 'bar']) end end context "when value is an array" do let(:value) { ['foo', 'bar'] } it "should sanitize all hash values with a single questionmark" do expect(subject).to eq(['?']) end end context "when value is a mixed array" do let(:value) { [nil, 'foo', 'bar'] } it "should sanitize all hash values with a single questionmark" do expect(subject).to eq(['?']) end end context "when value is a string" do let(:value) { 'bar' } it "should sanitize all hash values with a questionmark" do expect(subject).to eq('?') end end end end describe "key_sanitizer option" do context "without key_sanitizer" do subject { described_class.sanitize(value) } context "when dots are in the key" do let(:value) { {'foo.bar' => 'bar'} } it "should not sanitize the key" do expect(subject).to eql('foo.bar' => '?') end end context "when key is a symbol" do let(:value) { {:ismaster => 'bar'} } it "should sanitize the key" do expect(subject).to eql(:ismaster => '?') end end end context "with mongodb key_sanitizer" do subject { described_class.sanitize(value, false, :mongodb) } context "when no dots are in the key" do let(:value) { {'foo' => 'bar'} } it "should not sanitize the key" do expect(subject).to eql('foo' => '?') end end context "when dots are in the key" do let(:value) { {'foo.bar' => 'bar'} } it "should sanitize the key" do expect(subject).to eql('foo.?' => '?') end end context "when key is a symbol" do let(:value) { {:ismaster => 'bar'} } it "should sanitize the key" do expect(subject).to eql('ismaster' => '?') end end end end end