diff --git a/lib/rackstash/message.rb b/lib/rackstash/message.rb index 2d788e6..a26d877 100644 --- a/lib/rackstash/message.rb +++ b/lib/rackstash/message.rb @@ -42,18 +42,19 @@ module Rackstash @time = dup_freeze(time) @progname = dup_freeze(progname) @formatter = formatter + + # Freeze the newly created message to ensure it can't be changed. + # All passed values are also effectively frozen, making the Message an + # immutable object. + freeze end def severity_label SEVERITY_LABEL[@severity] || SEVERITY_LABEL.last end - def frozen? - true - end - def to_s - @to_s ||= @formatter.call(severity_label, @time, @progname, @message) + @formatter.call(severity_label, @time, @progname, @message) end alias_method :to_str, :to_s alias_method :as_json, :to_s diff --git a/spec/rackstash/message_spec.rb b/spec/rackstash/message_spec.rb index 4563548..0a0db5f 100644 --- a/spec/rackstash/message_spec.rb +++ b/spec/rackstash/message_spec.rb @@ -139,7 +139,7 @@ describe Rackstash::Message do message = 'Hello World' formatter = double('formatter') - expect(formatter).to receive(:call).once + expect(formatter).to receive(:call) .with('DEBUG', time, progname, message) .and_return('Formatted Message') @@ -152,8 +152,12 @@ describe Rackstash::Message do ) expect(message.to_s).to eql 'Formatted Message' - # Same result, but no additional call to the formatter - expect(message.to_s).to eql 'Formatted Message' + end + end + + describe '#frozen?' do + it 'is always true' do + expect(Rackstash::Message.new('Beep boop')).to be_frozen end end end