rf_logger 0.0.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +5 -13
  2. data/.rspec +1 -1
  3. data/.travis.yml +3 -0
  4. data/README.md +99 -2
  5. data/lib/rf_logger/active_record/logger.rb +35 -0
  6. data/lib/rf_logger/active_record.rb +1 -0
  7. data/lib/rf_logger/configuration.rb +1 -1
  8. data/lib/rf_logger/notifications/error_notification_environment_constraints.rb +2 -1
  9. data/lib/rf_logger/rails/initialize_request_middleware.rb +9 -0
  10. data/lib/rf_logger/rails/key_value_tagged_logging.rb +58 -0
  11. data/lib/rf_logger/rails/rails_compatibility.rb +33 -0
  12. data/lib/rf_logger/rails.rb +5 -0
  13. data/lib/rf_logger/request/request_headers.rb +34 -0
  14. data/lib/rf_logger/request/request_middleware.rb +30 -0
  15. data/lib/rf_logger/request/request_tags.rb +9 -0
  16. data/lib/rf_logger/rory/initialize_request_middleware.rb +7 -0
  17. data/lib/rf_logger/rory.rb +2 -0
  18. data/lib/rf_logger/sequel/base.rb +46 -0
  19. data/lib/rf_logger/sequel/logger.rb +53 -0
  20. data/lib/rf_logger/sequel.rb +2 -0
  21. data/lib/rf_logger/version.rb +1 -1
  22. data/lib/rf_logger.rb +13 -42
  23. data/rf_logger.gemspec +5 -5
  24. data/spec/lib/rf_logger/active_record/logger_spec.rb +49 -0
  25. data/spec/lib/rf_logger/configuration_spec.rb +19 -14
  26. data/spec/lib/rf_logger/log_for_notification_spec.rb +3 -3
  27. data/spec/lib/rf_logger/notifications/error_notification_environment_constraints_spec.rb +26 -12
  28. data/spec/lib/rf_logger/notifications/error_notification_spec.rb +9 -9
  29. data/spec/lib/rf_logger/rails/rails_compatibility_spec.rb +42 -0
  30. data/spec/lib/rf_logger/request/request_headers_spec.rb +83 -0
  31. data/spec/lib/rf_logger/request/request_middleware_spec.rb +35 -0
  32. data/spec/lib/rf_logger/{sequel_logger_spec.rb → sequel/logger_spec.rb} +46 -16
  33. data/spec/lib/rf_logger/simple_logger_spec.rb +8 -8
  34. data/spec/lib/rf_logger_spec.rb +8 -6
  35. data/spec/spec_helper.rb +2 -1
  36. data/spec/support/request_id_shared_examples.rb +21 -0
  37. metadata +63 -37
  38. data/lib/rf_logger/sequel_logger.rb +0 -41
@@ -1,4 +1,8 @@
1
- describe RfLogger::Configuration do
1
+ require "rf_logger/notifications/error_notification"
2
+ require "rf_logger/configuration"
3
+ require "rf_logger/levels"
4
+
5
+ RSpec.describe RfLogger::Configuration do
2
6
  class SomeNotifier; end
3
7
  let(:configuration) {described_class.new}
4
8
  before :each do
@@ -10,6 +14,7 @@ describe RfLogger::Configuration do
10
14
  Object.send(:remove_const, :Rory) if defined?(Rory)
11
15
  Object.send(:remove_const, :Padrino) if defined?(Padrino)
12
16
  Object.send(:remove_const, :Sinatra) if defined?(Sinatra::Application)
17
+ configuration.clear!
13
18
  end
14
19
 
15
20
  describe "#environment" do
@@ -19,7 +24,7 @@ describe RfLogger::Configuration do
19
24
 
20
25
  it 'returns environment set by user' do
21
26
  configuration.environment = 'test'
22
- configuration.environment.should == 'test'
27
+ expect(configuration.environment).to eq('test')
23
28
  end
24
29
 
25
30
  it 'uses Rails.env if Rails is defined' do
@@ -29,7 +34,7 @@ describe RfLogger::Configuration do
29
34
  end
30
35
  end
31
36
 
32
- configuration.environment.should == 'monkey'
37
+ expect(configuration.environment).to eq('monkey')
33
38
  end
34
39
 
35
40
  it 'uses Padrino.environment if defined' do
@@ -39,7 +44,7 @@ describe RfLogger::Configuration do
39
44
  end
40
45
  end
41
46
 
42
- configuration.environment.should == 'padrino'
47
+ expect(configuration.environment).to eq('padrino')
43
48
  end
44
49
 
45
50
  it 'uses Sinatra::Application.environment if defined' do
@@ -51,7 +56,7 @@ describe RfLogger::Configuration do
51
56
  end
52
57
  end
53
58
 
54
- configuration.environment.should == 'sinatra'
59
+ expect(configuration.environment).to eq('sinatra')
55
60
  end
56
61
 
57
62
  it 'uses ENV["RORY_STAGE"] if Rory is defined' do
@@ -59,7 +64,7 @@ describe RfLogger::Configuration do
59
64
  end
60
65
  ENV['RORY_STAGE'] = 'rory'
61
66
 
62
- configuration.environment.should == 'rory'
67
+ expect(configuration.environment).to eq('rory')
63
68
  ENV['RORY_STAGE'] = nil
64
69
  end
65
70
 
@@ -84,22 +89,22 @@ describe RfLogger::Configuration do
84
89
  it 'resets notification subject' do
85
90
  configuration.notification_subject = 'foo'
86
91
  configuration.clear!
87
- configuration.notification_subject.should be_nil
92
+ expect(configuration.notification_subject).to be_nil
88
93
  end
89
94
 
90
95
  it 'resets environmental error notifier settings' do
91
- RfLogger.configuration.stub(:environment => 'test')
96
+ allow(RfLogger.configuration).to receive_messages(:environment => 'test')
92
97
  configuration.set_notifier_list { |n| n.add_notifier SomeNotifier }
93
98
  configuration.clear!
94
- configuration.notifiers.keys.should =~ RfLogger::LEVELS
95
- configuration.notifiers.values.uniq.should == [[]]
99
+ expect(configuration.notifiers.keys).to match_array(RfLogger::LEVELS)
100
+ expect(configuration.notifiers.values.uniq).to eq([[]])
96
101
  end
97
102
  end
98
103
 
99
104
  describe 'notification_subject' do
100
105
  it 'sets the value' do
101
106
  configuration.notification_subject = 'Foo!'
102
- configuration.notification_subject.should == 'Foo!'
107
+ expect(configuration.notification_subject).to eq('Foo!')
103
108
  end
104
109
  end
105
110
 
@@ -107,7 +112,7 @@ describe RfLogger::Configuration do
107
112
  class SomeOtherNotifier; end
108
113
  class AThirdNotifier; end
109
114
  it 'calls add_notifier on ErrorNotification and adds the notifier to config list' do
110
- RfLogger.configuration.stub(:environment => 'test')
115
+ allow(RfLogger.configuration).to receive_messages(:environment => 'test')
111
116
 
112
117
  configuration.set_notifier_list do |n|
113
118
  n.add_notifier SomeNotifier, :only => ['test'], :levels => [:fatal]
@@ -115,9 +120,9 @@ describe RfLogger::Configuration do
115
120
  n.add_notifier AThirdNotifier, :levels => [:fatal]
116
121
  end
117
122
 
118
- configuration.notifiers.delete(:fatal).should =~ [SomeNotifier, AThirdNotifier]
123
+ expect(configuration.notifiers.delete(:fatal)).to match_array([SomeNotifier, AThirdNotifier])
119
124
  # all other levels shouldn't have notifiers
120
- configuration.notifiers.values.uniq.should == [[]]
125
+ expect(configuration.notifiers.values.uniq).to eq([[]])
121
126
  end
122
127
  end
123
128
  end
@@ -12,18 +12,18 @@ describe RfLogger::LogForNotification do
12
12
 
13
13
  describe 'subject' do
14
14
  it 'reports log level, actor, and action of the error' do
15
- subject.subject.should =~ /ERROR.*fruit_cocktail.*finding_maraschino_cherries/
15
+ expect(subject.subject).to match(/ERROR.*fruit_cocktail.*finding_maraschino_cherries/)
16
16
  end
17
17
 
18
18
  it 'uses the configured subject, if given' do
19
19
  RfLogger.configuration.notification_subject = "Help! {{level}} for {{actor}}/{{action}}"
20
- subject.subject.should == "Help! ERROR for fruit_cocktail/finding_maraschino_cherries"
20
+ expect(subject.subject).to eq("Help! ERROR for fruit_cocktail/finding_maraschino_cherries")
21
21
  end
22
22
  end
23
23
 
24
24
  describe 'details' do
25
25
  it 'should include metadata' do
26
- subject.details.should =~ /something_is_wrong.*with_the_refrigerator/
26
+ expect(subject.details).to match(/something_is_wrong.*with_the_refrigerator/)
27
27
  end
28
28
  end
29
29
  end
@@ -3,48 +3,62 @@ require 'spec_helper'
3
3
  describe RfLogger::ErrorNotification::EnvironmentConstraints do
4
4
  describe '#included?' do
5
5
  it 'returns true if no constraints for :only are given' do
6
- described_class.new('alpha', {}).included?.should be_true
6
+ expect(described_class.new('alpha', {}).included?).to be(true)
7
7
  end
8
8
 
9
9
  it 'returns true if the environment is included in :only' do
10
- described_class.new('alpha', {:only => ['alpha', 'beta']}).included?.should be_true
10
+ expect(
11
+ described_class.new('alpha', {:only => ['alpha', 'beta']}).included?
12
+ ).to be(true)
11
13
  end
12
14
 
13
15
  it 'returns false if the environment is not in :only' do
14
- described_class.new('alpha', {:only => ['beta']}).included?.should be_false
16
+ expect(
17
+ described_class.new('alpha', {:only => ['beta']}).included?
18
+ ).to be(false)
15
19
  end
16
20
  end
17
21
 
18
22
  describe '#excluded?' do
19
23
  it 'returns false if no constraints for :except are given' do
20
- described_class.new('alpha', {}).excluded?.should be_false
24
+ expect(described_class.new('alpha', {}).excluded?).to be(false)
21
25
  end
22
26
 
23
27
  it 'returns true if the environment is included in :except' do
24
- described_class.new('alpha', {:except => ['alpha', 'beta']}).excluded?.should be_true
28
+ expect(
29
+ described_class.new('alpha', {:except => ['alpha', 'beta']}).excluded?
30
+ ).to be(true)
25
31
  end
26
32
 
27
33
  it 'returns false if the environment is not in :except' do
28
- described_class.new('alpha', {:except => ['beta']}).excluded?.should be_false
34
+ expect(
35
+ described_class.new('alpha', {:except => ['beta']}).excluded?
36
+ ).to be(false)
29
37
  end
30
38
  end
31
39
 
32
40
  describe '#valid_notifier?' do
33
41
  it 'returns true if there are no constraints' do
34
- described_class.new('alpha', nil).valid_notifier?.should be_true
35
- described_class.new('alpha', {}).valid_notifier?.should be_true
42
+ expect(described_class.new('alpha', nil).valid_notifier?).to be(true)
43
+ expect(described_class.new('alpha', {}).valid_notifier?).to be(true)
36
44
  end
37
45
 
38
46
  it 'returns true if the environment is included in :only and not included in :except' do
39
- described_class.new('alpha', {:only => ['alpha'], :except => []}).valid_notifier?.should be_true
47
+ expect(
48
+ described_class.new('alpha', {:only => ['alpha'], :except => []}).valid_notifier?
49
+ ).to be(true)
40
50
  end
41
51
 
42
52
  it 'returns false if the environment is included in :except' do
43
- described_class.new('alpha', {:except => ['alpha']}).valid_notifier?.should be_false
53
+ expect(
54
+ described_class.new('alpha', {:except => ['alpha']}).valid_notifier?
55
+ ).to be(false)
44
56
  end
45
57
 
46
58
  it 'returns false if the environment is not in :only' do
47
- described_class.new('alpha', {:only => ['beta']}).valid_notifier?.should be_false
59
+ expect(
60
+ described_class.new('alpha', {:only => ['beta']}).valid_notifier?
61
+ ).to be(false)
48
62
  end
49
- end
63
+ end
50
64
  end
@@ -17,9 +17,9 @@ describe RfLogger::ErrorNotification do
17
17
  c.add_notifier 'swiftly clean', :levels => [:fatal]
18
18
  end
19
19
 
20
- described_class.notifiers.delete(:error).should =~ ['perfectly refined']
21
- described_class.notifiers.delete(:fatal).should =~ ['perfectly refined', 'swiftly clean']
22
- described_class.notifiers.values.uniq.should == [[]]
20
+ expect(described_class.notifiers.delete(:error)).to match_array(['perfectly refined'])
21
+ expect(described_class.notifiers.delete(:fatal)).to match_array(['perfectly refined', 'swiftly clean'])
22
+ expect(described_class.notifiers.values.uniq).to eq([[]])
23
23
  end
24
24
 
25
25
  it 'allows multiple types of notification' do
@@ -27,10 +27,10 @@ describe RfLogger::ErrorNotification do
27
27
  c.add_notifier 'gravy_pie'
28
28
  c.add_notifier 'assiduous_hedgehog'
29
29
  end
30
- described_class.notifiers.keys.should == RfLogger::LEVELS
30
+ expect(described_class.notifiers.keys).to eq(RfLogger::LEVELS)
31
31
  described_class.notifiers.values.uniq.tap do |unique_notifiers|
32
- unique_notifiers.count.should == 1
33
- unique_notifiers[0].should =~ ['assiduous_hedgehog', 'gravy_pie']
32
+ expect(unique_notifiers.count).to eq(1)
33
+ expect(unique_notifiers[0]).to match_array(['assiduous_hedgehog', 'gravy_pie'])
34
34
  end
35
35
  end
36
36
 
@@ -43,8 +43,8 @@ describe RfLogger::ErrorNotification do
43
43
  end
44
44
 
45
45
  described_class.notifiers.values.uniq.tap do |unique_notifiers|
46
- unique_notifiers.count.should == 1
47
- unique_notifiers[0].should == ['terribly sweet']
46
+ expect(unique_notifiers.count).to eq(1)
47
+ expect(unique_notifiers[0]).to eq(['terribly sweet'])
48
48
  end
49
49
  end
50
50
  end
@@ -60,7 +60,7 @@ describe RfLogger::ErrorNotification do
60
60
  it 'calls error_notification on all configured notifiers' do
61
61
  log = double(:log, :level => :warn)
62
62
  described_class.notifiers[:warn].each do |n|
63
- n.should_receive(:send_notification).with(log)
63
+ expect(n).to receive(:send_notification).with(log)
64
64
  end
65
65
  described_class.dispatch_error(log)
66
66
  end
@@ -0,0 +1,42 @@
1
+ require "rf_logger/rails/rails_compatibility"
2
+
3
+ RSpec.describe RfLogger::RailsCompatibility do
4
+
5
+ let(:rails_gem_version) { Gem::Version.new(rails_version) }
6
+ subject { described_class.new(rails_version: rails_gem_version) }
7
+
8
+ context "far left" do
9
+ let(:rails_version) { 2.9 }
10
+ it { expect { subject.call }.to raise_error(described_class::Incompatible) }
11
+ end
12
+
13
+ context "edge left" do
14
+ let(:rails_version) { 3.1 }
15
+ it { expect { subject.call }.to raise_error(described_class::Incompatible) }
16
+ end
17
+
18
+ context "middle edge left" do
19
+ let(:rails_version) { 3.2 }
20
+ it { expect { |b| subject.call(&b) }.to yield_control }
21
+ end
22
+
23
+ context "center edge" do
24
+ let(:rails_version) { 4.0 }
25
+ it { expect { |b| subject.call(&b) }.to yield_control }
26
+ end
27
+
28
+ context "middle edge right" do
29
+ let(:rails_version) { "5.0.10" }
30
+ it { expect { |b| subject.call(&b) }.to yield_control }
31
+ end
32
+
33
+ context "edge right" do
34
+ let(:rails_version) { 5.1 }
35
+ it { expect { subject.call }.to raise_error(described_class::Incompatible) }
36
+ end
37
+
38
+ context "far right" do
39
+ let(:rails_version) {6.0}
40
+ it { expect { subject.call }.to raise_error(described_class::Incompatible) }
41
+ end
42
+ end
@@ -0,0 +1,83 @@
1
+ require "rf_logger/request/request_headers"
2
+ require "thread/inheritable_attributes"
3
+
4
+ RSpec.describe RfLogger::RequestHeaders do
5
+ before { Thread.current.set_inheritable_attribute(:rf_logger_request_tags, nil) }
6
+
7
+ describe "#to_hash" do
8
+ context "when no type is given" do
9
+ it "defaults to json" do
10
+ expect(described_class.new.content_type).to eq "application/json"
11
+ expect(described_class.new.to_hash).to eq({ "Content-Type" => "application/json" })
12
+ end
13
+ end
14
+
15
+ context "when providing additional types" do
16
+ it "returns given type" do
17
+ expect(described_class.new(type: "application/xml").content_type).to eq "application/xml"
18
+ expect(described_class.new(type: "application/xml").to_hash).to eq({ "Content-Type" => "application/xml" })
19
+ end
20
+ end
21
+
22
+ context "when api_token is not given" do
23
+ it "returns no key or value" do
24
+ expect(described_class.new.api_token).to eq nil
25
+ expect(described_class.new.to_hash).to eq({ "Content-Type" => "application/json" })
26
+ end
27
+ end
28
+
29
+ context "when api_token is given" do
30
+ it "returns given token" do
31
+ expect(described_class.new(api_token: "1090").api_token).to eq "1090"
32
+ expect(described_class.new(api_token: "1090").to_hash).to eq({ "Content-Type" => "application/json", "Api-Token" => "1090" })
33
+ end
34
+ end
35
+
36
+ context "when request_id is given" do
37
+ it "returns given request_id" do
38
+ expect(described_class.new(request_id: "21090").request_id).to eq "21090"
39
+ expect(described_class.new(request_id: "21090").to_hash).to eq({ "Content-Type" => "application/json", "X-Request-Id" => "21090" })
40
+ end
41
+ end
42
+
43
+ context "when request_id is not given" do
44
+ after { Thread.current.set_inheritable_attribute(:rf_logger_request_tags, nil) }
45
+
46
+ context "when in the context of a request" do
47
+ before { Thread.current.set_inheritable_attribute(:rf_logger_request_tags, { request_id: "41087" }) }
48
+
49
+ it "returns given request_id" do
50
+ expect(described_class.new.request_id).to eq "41087"
51
+ expect(described_class.new.to_hash).to eq({ "Content-Type" => "application/json", "X-Request-Id" => "41087" })
52
+ end
53
+ end
54
+
55
+ context "when not in the context of a request" do
56
+ it "returns given request_id" do
57
+ expect(described_class.new.request_id).to eq nil
58
+ expect(described_class.new.to_hash).to eq({ "Content-Type" => "application/json" })
59
+ end
60
+ end
61
+ end
62
+
63
+ context "given any additional symbol keys" do
64
+ it "converts them to dashes and uppercases the first letter" do
65
+ expect(described_class.new(accept: "application/json",
66
+ api_version: "2.1").to_hash).
67
+ to eq({ "Content-Type" => "application/json", "Accept" => "application/json", "Api-Version" => "2.1" })
68
+ end
69
+ end
70
+
71
+ context "given the key of other" do
72
+ it "leaves the key name as is" do
73
+ expect(described_class.new(other: { "API_Version" => "10" }).to_hash).
74
+ to eq({ "Content-Type" => "application/json", "API_Version" => "10" })
75
+ end
76
+
77
+ it "excludes any key values where the values is nil" do
78
+ expect(described_class.new(other: { "API_Version" => nil }).to_hash).
79
+ to eq({ "Content-Type" => "application/json" })
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,35 @@
1
+ require "rf_logger/request/request_middleware"
2
+
3
+ RSpec.describe RfLogger::RequestMiddleware do
4
+ subject { RfLogger::RequestMiddleware.new(*init_arguments).call(env) }
5
+ let(:env) { {} }
6
+ let(:init_arguments) { [->(_) {}] }
7
+ after { Thread.current[:rf_logger_request_id] = nil }
8
+
9
+ context "when tagged is missing" do
10
+ let(:env) { { "X-Request-Id" => "uuid-from_env" } }
11
+ it "defaults to getting the request_id" do
12
+ subject
13
+ expect(Thread.current[:inheritable_attributes][:rf_logger_request_tags]).to eq({ :request_id => "uuid-from_env" })
14
+ end
15
+ end
16
+
17
+ context "when tagged option is given that exists" do
18
+ let(:env) { { "X-OtherHeader" => "other_request_id" } }
19
+ let(:init_arguments) { [->(_) {}, tagged: { custom_env_key: "X-OtherHeader" }] }
20
+
21
+ it "sets current Thread variable" do
22
+ subject
23
+ expect(Thread.current[:inheritable_attributes][:rf_logger_request_tags]).to eq({ :custom_env_key => "other_request_id" })
24
+ end
25
+ end
26
+
27
+ context "when tagged option is given that does not exists" do
28
+ let(:init_arguments) { [->(_) {}, tagged: { custom_env_key: "X-WontFindMe" }] }
29
+
30
+ it "sets current Thread variable" do
31
+ subject
32
+ expect(Thread.current[:inheritable_attributes][:rf_logger_request_tags]).to eq({:custom_env_key=>nil})
33
+ end
34
+ end
35
+ end
@@ -1,26 +1,33 @@
1
1
  require 'sequel'
2
- DB = Sequel.mock
3
- require File.expand_path( File.dirname( __FILE__ ) + '/../../../lib/rf_logger/sequel_logger' )
2
+ Sequel::Model.db = Sequel.mock
3
+ require "rf_logger/sequel/logger"
4
+
5
+ describe RfLogger::Sequel::Logger do
6
+ include_examples "RfLogger::RequestId", subject: described_class
7
+
8
+ it "keeps backwards compatibility" do
9
+ expect(described_class).to eq RfLogger::SequelLogger
10
+ end
4
11
 
5
- describe RfLogger::SequelLogger do
6
12
  before :each do
7
- Time.stub(:now => 'NOW')
8
- described_class.dataset =
9
- DB[:logs].columns(:actor, :action, :target_type, :target_id,
13
+ allow(Time).to receive_messages(:now => 'NOW')
14
+ described_class.dataset =
15
+ Sequel::Model.db[:logs].columns(:actor, :action, :target_type, :target_id,
10
16
  :metadata, :created_at, :updated_at, :level)
17
+ allow(described_class).to receive(:rf_logger_request_tags){{request_id: "909090"}}
11
18
  end
12
19
 
13
20
  RfLogger::LEVELS.each do |level|
14
21
  describe ".#{level}" do
15
22
  it "logs information in the database with #{level.upcase} level" do
16
- described_class.should_receive(:add).
23
+ expect(described_class).to receive(:add).
17
24
  with(level, :something => :happened)
18
25
  described_class.send(level.to_sym, :something => :happened)
19
26
  end
20
27
 
21
28
  it 'dispatches error notifications' do
22
- described_class.stub(:add)
23
- RfLogger::ErrorNotification.should_receive(:dispatch_error)
29
+ allow(described_class).to receive(:add)
30
+ expect(RfLogger::ErrorNotification).to receive(:dispatch_error)
24
31
  described_class.send(level.to_sym, :something => :happened)
25
32
  end
26
33
  end
@@ -28,7 +35,7 @@ describe RfLogger::SequelLogger do
28
35
 
29
36
  describe '.add' do
30
37
  it 'adds given object to the log at given level' do
31
- RfLogger::SequelLogger.should_receive(:create).with(
38
+ expect(described_class).to receive(:create).with(
32
39
  :actor => 'cat herder',
33
40
  :action => 'herd some cats',
34
41
  :target_type => 'Cat',
@@ -38,7 +45,8 @@ describe RfLogger::SequelLogger do
38
45
  :danger => {
39
46
  :level => 'really_high',
40
47
  :rodent => 'mouse',
41
- }
48
+ },
49
+ :request_tags => { :request_id => "909090" }
42
50
  },
43
51
  :level => RfLogger::LEVELS.index(:info),
44
52
  :created_at => 'NOW',
@@ -54,16 +62,31 @@ describe RfLogger::SequelLogger do
54
62
  :danger => {
55
63
  :level => 'really_high',
56
64
  :rodent => 'mouse',
57
- }
65
+ },
66
+ :request_tags => { :request_id => "909090" }
58
67
  }
59
68
  })
60
69
  end
61
70
 
71
+ context "when rf_logger_request_tags is empty" do
72
+ it "return a metadata with no request_tags key" do
73
+ allow(described_class).to receive(:rf_logger_request_tags){nil}
74
+
75
+ expect(described_class).to receive(:create).with(
76
+ ({ :level => 1,
77
+ :actor => "",
78
+ :metadata => { },
79
+ :created_at => "NOW" })
80
+ )
81
+ described_class.add(:info, {})
82
+ end
83
+ end
84
+
62
85
  it 'sets actor to blank string if not provided' do
63
- described_class.should_receive(:create).with(
86
+ expect(described_class).to receive(:create).with(
64
87
  :actor => '',
65
88
  :action => 'palpitate',
66
- :metadata => {},
89
+ :metadata => {:request_tags=>{:request_id=>"909090"}},
67
90
  :created_at => 'NOW',
68
91
  :level => RfLogger::LEVELS.index(:info))
69
92
 
@@ -71,21 +94,28 @@ describe RfLogger::SequelLogger do
71
94
  end
72
95
 
73
96
  it 'sets metadata to empty hash if not provided' do
74
- described_class.should_receive(:create).with(
97
+ expect(described_class).to receive(:create).with(
75
98
  :actor => '',
76
99
  :action => 'palpitate',
77
- :metadata => {},
100
+ :metadata => {:request_tags=>{:request_id=>"909090"}},
78
101
  :created_at => 'NOW',
79
102
  :level => RfLogger::LEVELS.index(:info)
80
103
  )
81
104
 
82
105
  described_class.add(:info, { :action => 'palpitate' })
83
106
  end
107
+ end
84
108
 
109
+ describe "#metadata" do
85
110
  it 'returns a hash for metadata even though it is stored as JSON' do
86
111
  subject.metadata = {'foo' => 'bar'}
87
112
  expect(subject.metadata).to eq({'foo' => 'bar'})
88
113
  end
114
+
115
+ it 'returns nil if column is null' do
116
+ subject.metadata = nil
117
+ expect(subject.metadata).to be_nil
118
+ end
89
119
  end
90
120
 
91
121
  describe 'display_level' do
@@ -6,7 +6,7 @@ describe RfLogger::SimpleLogger do
6
6
  RfLogger::LEVELS.each do |level|
7
7
  describe ".#{level}" do
8
8
  it "adds given object to the log with '#{level}' level" do
9
- described_class.should_receive(:add).
9
+ expect(described_class).to receive(:add).
10
10
  with(level, :something => :happened)
11
11
  described_class.send(level.to_sym, :something => :happened)
12
12
  end
@@ -17,10 +17,10 @@ describe RfLogger::SimpleLogger do
17
17
  it 'adds given object to the log at given level' do
18
18
  described_class.add(:info, :super_serious_occurrence)
19
19
  described_class.add(:debug, :weird_thing)
20
- described_class.entries.should == [
20
+ expect(described_class.entries).to eq([
21
21
  { :level => 1, :level_name => :info, :entry => :super_serious_occurrence },
22
22
  { :level => 0, :level_name => :debug, :entry => :weird_thing }
23
- ]
23
+ ])
24
24
  end
25
25
  end
26
26
 
@@ -30,22 +30,22 @@ describe RfLogger::SimpleLogger do
30
30
  described_class.debug 'other thing'
31
31
  described_class.info 'third thing'
32
32
  described_class.fatal 'final thing'
33
- described_class.entries.should == [
33
+ expect(described_class.entries).to eq([
34
34
  { :level => 1, :level_name => :info, :entry => 'thing' },
35
35
  { :level => 0, :level_name => :debug, :entry => 'other thing' },
36
36
  { :level => 1, :level_name => :info, :entry => 'third thing' },
37
37
  { :level => 4, :level_name => :fatal, :entry => 'final thing' }
38
- ]
38
+ ])
39
39
  end
40
40
  end
41
41
 
42
42
  describe '.clear!' do
43
43
  it 'deletes all entries' do
44
- described_class.entries.should be_empty
44
+ expect(described_class.entries).to be_empty
45
45
  described_class.info 'thing'
46
- described_class.entries.should_not be_empty
46
+ expect(described_class.entries).not_to be_empty
47
47
  described_class.clear!
48
- described_class.entries.should be_empty
48
+ expect(described_class.entries).to be_empty
49
49
  end
50
50
  end
51
51
  end
@@ -1,3 +1,5 @@
1
+ require "rf_logger/sequel/base"
2
+
1
3
  describe RfLogger do
2
4
  describe ".configure" do
3
5
  it 'yields the current configuration' do
@@ -16,8 +18,8 @@ describe RfLogger do
16
18
  c.environment = 'production'
17
19
  end
18
20
 
19
- described_class.configuration.notification_subject.should == 'Foo'
20
- described_class.configuration.environment.should == 'production'
21
+ expect(described_class.configuration.notification_subject).to eq('Foo')
22
+ expect(described_class.configuration.environment).to eq('production')
21
23
  end
22
24
 
23
25
  it 'requires a block' do
@@ -45,25 +47,25 @@ describe RfLogger do
45
47
  it 'resets configuration' do
46
48
  old_config = described_class.configuration
47
49
  described_class.clear_configuration!
48
- described_class.configuration.should_not == old_config
50
+ expect(described_class.configuration).not_to eq(old_config)
49
51
  end
50
52
  end
51
53
 
52
54
  describe '.environment' do
53
55
  it 'can set directly' do
54
56
  described_class.environment = 'foo'
55
- described_class.configuration.environment.should == 'foo'
57
+ expect(described_class.configuration.environment).to eq('foo')
56
58
  end
57
59
  end
58
60
 
59
61
  describe '.configuration' do
60
62
  it 'creates an instance of RfLogger::Configuration' do
61
- described_class.configuration.should be_an_instance_of(RfLogger::Configuration)
63
+ expect(described_class.configuration).to be_an_instance_of(RfLogger::Configuration)
62
64
  end
63
65
 
64
66
  it 'returns the same instance when called multiple times' do
65
67
  configuration = described_class.configuration
66
- described_class.configuration.should == configuration
68
+ expect(described_class.configuration).to eq(configuration)
67
69
  end
68
70
  end
69
71
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'simplecov'
2
2
  SimpleCov.start
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
 
4
6
  # Requires supporting ruby files with custom matchers and macros, etc,
5
7
  # in spec/support/ and its subdirectories.
@@ -8,7 +10,6 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
8
10
  require './lib/rf_logger'
9
11
 
10
12
  RSpec.configure do |config|
11
- config.treat_symbols_as_metadata_keys_with_true_values = true
12
13
  config.run_all_when_everything_filtered = true
13
14
  config.order = 'random'
14
15
  end