spec/loggability/formatter_spec.rb in loggability-0.14.0 vs spec/loggability/formatter_spec.rb in loggability-0.15.0.pre20190714094638

- old
+ new

@@ -1,53 +1,66 @@ -# -*- rspec -*- +# -*- ruby -*- +# vim: set nosta noet ts=4 sw=4: +# frozen_string_literal: true require_relative '../helpers' -require 'tempfile' -require 'rspec' - -require 'loggability/logger' require 'loggability/formatter' -require 'loggability/formatter/default' describe Loggability::Formatter do - it "formats messages with the pattern it's constructed with" do - formatter = described_class.new( '[%5$s] %7$s' ) - result = formatter.call( 'INFO', Time.at(1336286481), nil, 'Foom.' ) - expect( result ).to match(/\[INFO\] Foom./i) + before( :all ) do + @actual_derivatives = described_class.derivatives.dup end + after( :all ) do + described_class.derivatives.replace( @actual_derivatives ) + end - it "formats exceptions into useful messages" do - formatter = described_class.new( '[%5$s] %7$s' ) - msg = nil - begin - raise ArgumentError, "invalid argument" - rescue => err - msg = formatter.call( 'INFO', Time.at(1336286481), nil, err ) + describe "concrete subclasses" do + + class Test < described_class end - expect( msg ).to match(/\[INFO\] ArgumentError: invalid argument/i) - end + it "must implement #call" do + expect { + Test.new.call( 'INFO', Time.now, nil, "A message." ) + }.to raise_error( /doesn't implement required method/i ) + end - it "formats regular objects into useful messages" do - formatter = described_class.new( '[%5$s] %7$s' ) - result = formatter.call( 'INFO', Time.at(1336286481), nil, Object.new ) - expect( result ).to match(/\[INFO\] #<Object:0x[[:xdigit:]]+>/i) - end + it "is tracked by the base class" do + expect( described_class.derivatives ).to include( test: Test ) + end - it "includes the thread ID if logging from a thread other than the main thread" do - formatter = described_class.new( '%4$d' ) - thr = Thread.new do - formatter.call( 'INFO', Time.now, nil, 'Foom.' ) + it "is tracked if its anonymous" do + subclass = Class.new( described_class ) + expect( described_class.derivatives.values ).to include( subclass ) end - expect( thr.value ).to eq( thr.object_id.to_s ) + + + it "can be loaded by name" do + expect( described_class ).to receive( :require ). + with( "loggability/formatter/test" ) + + expect( described_class.create(:test) ).to be_an_instance_of( Test ) + end + + + it "raises a LoadError if loading doesn't work" do + expect( described_class ).to receive( :require ). + with( "loggability/formatter/circus" ) + + expect { + described_class.create( :circus ) + }.to raise_error( LoadError, /didn't load a class/i ) + end + + end end