dispatch-rider 1.5.3 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/lib/dispatch-rider.rb +1 -0
  4. data/lib/dispatch-rider/configuration.rb +12 -5
  5. data/lib/dispatch-rider/demultiplexer.rb +3 -27
  6. data/lib/dispatch-rider/logging.rb +10 -0
  7. data/lib/dispatch-rider/logging/base_formatter.rb +30 -0
  8. data/lib/dispatch-rider/logging/json_formatter.rb +75 -0
  9. data/lib/dispatch-rider/logging/lifecycle_logger.rb +53 -0
  10. data/lib/dispatch-rider/logging/text_formatter.rb +48 -0
  11. data/lib/dispatch-rider/queue_services/file_system/queue.rb +13 -2
  12. data/lib/dispatch-rider/version.rb +1 -1
  13. data/spec/lib/dispatch-rider/airbrake_error_handler_spec.rb +10 -3
  14. data/spec/lib/dispatch-rider/callbacks/access_spec.rb +16 -18
  15. data/spec/lib/dispatch-rider/callbacks/storage_spec.rb +4 -9
  16. data/spec/lib/dispatch-rider/configuration_spec.rb +3 -3
  17. data/spec/lib/dispatch-rider/default_error_handler_spec.rb +2 -2
  18. data/spec/lib/dispatch-rider/demultiplexer_spec.rb +14 -14
  19. data/spec/lib/dispatch-rider/dispatcher_spec.rb +10 -8
  20. data/spec/lib/dispatch-rider/handlers/base_spec.rb +27 -22
  21. data/spec/lib/dispatch-rider/handlers/inheritance_tracking_spec.rb +6 -6
  22. data/spec/lib/dispatch-rider/logging/json_formatter_spec.rb +72 -0
  23. data/spec/lib/dispatch-rider/logging/lifecycle_logger_spec.rb +73 -0
  24. data/spec/lib/dispatch-rider/logging/text_formatter_spec.rb +61 -0
  25. data/spec/lib/dispatch-rider/message_spec.rb +11 -11
  26. data/spec/lib/dispatch-rider/notification_services/aws_sns_spec.rb +14 -13
  27. data/spec/lib/dispatch-rider/notification_services/base_spec.rb +18 -13
  28. data/spec/lib/dispatch-rider/notification_services/file_system/channel_spec.rb +2 -3
  29. data/spec/lib/dispatch-rider/notification_services/file_system/notifier_spec.rb +1 -3
  30. data/spec/lib/dispatch-rider/notification_services/file_system_spec.rb +3 -4
  31. data/spec/lib/dispatch-rider/publisher/configuration/destination_spec.rb +30 -21
  32. data/spec/lib/dispatch-rider/publisher/configuration/notification_service_spec.rb +22 -16
  33. data/spec/lib/dispatch-rider/publisher/configuration_reader_spec.rb +11 -10
  34. data/spec/lib/dispatch-rider/publisher/configuration_spec.rb +12 -12
  35. data/spec/lib/dispatch-rider/publisher/configuration_support_spec.rb +11 -11
  36. data/spec/lib/dispatch-rider/publisher_spec.rb +22 -15
  37. data/spec/lib/dispatch-rider/queue_services/aws_sqs_spec.rb +44 -36
  38. data/spec/lib/dispatch-rider/queue_services/base_spec.rb +41 -28
  39. data/spec/lib/dispatch-rider/queue_services/file_system_spec.rb +15 -14
  40. data/spec/lib/dispatch-rider/queue_services/received_message_spec.rb +3 -3
  41. data/spec/lib/dispatch-rider/queue_services/simple_spec.rb +9 -9
  42. data/spec/lib/dispatch-rider/registrars/base_spec.rb +5 -5
  43. data/spec/lib/dispatch-rider/registrars/file_system_channel_spec.rb +3 -3
  44. data/spec/lib/dispatch-rider/registrars/handler_spec.rb +1 -1
  45. data/spec/lib/dispatch-rider/registrars/notification_service_spec.rb +1 -1
  46. data/spec/lib/dispatch-rider/registrars/publishing_destination_spec.rb +2 -2
  47. data/spec/lib/dispatch-rider/registrars/queue_service_spec.rb +1 -1
  48. data/spec/lib/dispatch-rider/registrars/sns_channel_spec.rb +5 -5
  49. data/spec/lib/dispatch-rider/runner_spec.rb +1 -1
  50. data/spec/lib/dispatch-rider/subscriber_spec.rb +45 -29
  51. data/spec/lib/dispatch-rider_spec.rb +3 -3
  52. data/spec/spec_helper.rb +3 -1
  53. metadata +13 -2
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe DispatchRider::Logging::TextFormatter do
4
+ let(:fs_message) { DispatchRider::Message.new(subject: 'test', body: { 'key' => 'value', 'guid' => 123 }) }
5
+ let(:item) { double :item }
6
+ let(:queue) { double :queue }
7
+ let(:message) { DispatchRider::QueueServices::FileSystem::FsReceivedMessage.new(fs_message, item, queue) }
8
+
9
+ let(:string_to_log) { "string to log" }
10
+ let(:exception) { StandardError.new }
11
+ let(:reason) { "Stop reason" }
12
+
13
+ before do
14
+ allow(subject).to receive(:message_info_fragment).and_return(string_to_log)
15
+ allow(subject).to receive(:exception_info_fragment).and_return(string_to_log)
16
+ end
17
+
18
+ context "format_error_handler_fail" do
19
+ let(:formatted_message) { "Failed error handling of: string to log" }
20
+ example do
21
+ expect(subject.format_error_handler_fail(message, exception)).to eq(formatted_message)
22
+ end
23
+ end
24
+
25
+ context "format_got_stop" do
26
+ let(:formatted_message) { "Got stop (Stop reason) while executing: string to log" }
27
+ example do
28
+ expect(subject.format_got_stop(message, reason)).to eq(formatted_message)
29
+ end
30
+ end
31
+
32
+ context "format_handling" do
33
+ context "start" do
34
+ let(:formatted_message) { "Starting execution of: string to log" }
35
+ example do
36
+ expect(subject.format_handling(:start, message)).to eq(formatted_message)
37
+ end
38
+ end
39
+
40
+ context "success" do
41
+ let(:formatted_message) { "Succeeded execution of: string to log" }
42
+ example do
43
+ expect(subject.format_handling(:success, message)).to eq(formatted_message)
44
+ end
45
+ end
46
+
47
+ context "complete" do
48
+ let(:formatted_message) { "Completed execution of: string to log in 2.12 seconds" }
49
+ example do
50
+ expect(subject.format_handling(:complete, message, duration: 2.12)).to eq(formatted_message)
51
+ end
52
+ end
53
+
54
+ context "fail" do
55
+ let(:formatted_message) { "Failed execution of: string to log" }
56
+ example do
57
+ expect(subject.format_handling(:fail, message, exception: exception)).to eq(formatted_message)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,23 +1,23 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DispatchRider::Message do
4
- subject(:message) {DispatchRider::Message.new(:subject => 'test', :body => 'test_handler')}
4
+ subject(:message) { DispatchRider::Message.new(subject: 'test', body: 'test_handler') }
5
5
 
6
6
  describe "#initialize" do
7
7
  context "when all the required attributes are passed" do
8
8
  context "when the attributes hash has keys as strings" do
9
- subject(:message) {DispatchRider::Message.new('subject' => 'test', 'body' => 'test_handler')}
9
+ subject(:message) { DispatchRider::Message.new('subject' => 'test', 'body' => 'test_handler') }
10
10
 
11
11
  it "should initiate a new message" do
12
- message.subject.should eq('test')
13
- message.body.should eq('test_handler')
12
+ expect(message.subject).to eq('test')
13
+ expect(message.body).to eq('test_handler')
14
14
  end
15
15
  end
16
16
 
17
17
  context "when the attributes hash has keys as symbols" do
18
18
  it "should initiate a new message" do
19
- message.subject.should eq('test')
20
- message.body.should eq('test_handler')
19
+ expect(message.subject).to eq('test')
20
+ expect(message.body).to eq('test_handler')
21
21
  end
22
22
  end
23
23
  end
@@ -31,28 +31,28 @@ describe DispatchRider::Message do
31
31
 
32
32
  describe "#attributes" do
33
33
  it "should return the attributes hash of the message" do
34
- message.attributes.should eq({:subject => 'test', :body => 'test_handler'})
34
+ expect(message.attributes).to eq(subject: 'test', body: 'test_handler')
35
35
  end
36
36
  end
37
37
 
38
38
  describe "#to_json" do
39
39
  it "should return the attributes hash in json format" do
40
40
  result = JSON.parse(message.to_json)
41
- result['subject'].should eq('test')
42
- result['body'].should eq('test_handler')
41
+ expect(result['subject']).to eq('test')
42
+ expect(result['body']).to eq('test_handler')
43
43
  end
44
44
  end
45
45
 
46
46
  describe "#==" do
47
47
  context "when 2 messages have the same attribute values" do
48
48
  it "should return true" do
49
- message.should eq(DispatchRider::Message.new(:subject => 'test', :body => 'test_handler'))
49
+ expect(message).to eq(DispatchRider::Message.new(subject: 'test', body: 'test_handler'))
50
50
  end
51
51
  end
52
52
 
53
53
  context "when 2 messages do not have same attribute values" do
54
54
  it "should return false" do
55
- message.should_not eq(DispatchRider::Message.new(:subject => 'random_test', :body => 'test_handler'))
55
+ expect(message).not_to eq(DispatchRider::Message.new(subject: 'random_test', body: 'test_handler'))
56
56
  end
57
57
  end
58
58
  end
@@ -1,17 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DispatchRider::NotificationServices::AwsSns do
4
- let(:amazon_resource_name){ "arn:aws:sns:us-west-2:123456789012:GeneralTopic" }
4
+ let(:amazon_resource_name) { "arn:aws:sns:us-west-2:123456789012:GeneralTopic" }
5
5
 
6
6
  describe "#notifier_builder" do
7
7
  it "returns the notifier builder" do
8
- subject.notifier_builder.should eq(AWS::SNS)
8
+ expect(subject.notifier_builder).to eq(AWS::SNS)
9
9
  end
10
10
  end
11
11
 
12
12
  describe "#channel_registrar_builder" do
13
13
  it "returns the channel registrar builder" do
14
- subject.channel_registrar_builder.should eq(DispatchRider::Registrars::SnsChannel)
14
+ expect(subject.channel_registrar_builder).to eq(DispatchRider::Registrars::SnsChannel)
15
15
  end
16
16
  end
17
17
 
@@ -21,25 +21,26 @@ describe DispatchRider::NotificationServices::AwsSns do
21
21
 
22
22
  # @note: This is tested this way cause you don't really wanna post a message to the actual service.
23
23
  it "publishes the message to the channels" do
24
- expect(channel).to receive(:publish).with(kind_of String) { |serialized_message|
25
- expect(JSON.parse(serialized_message)).to eq(
26
- "subject" => "test_handler",
27
- "body" => { "bar" => "baz" }
28
- )
29
- }
24
+ expect(channel).to receive(:publish).with(kind_of String) do |serialized_message|
25
+ expected = {
26
+ "subject" => "test_handler",
27
+ "body" => { "bar" => "baz" }
28
+ }
29
+ expect(JSON.parse(serialized_message)).to eq(expected)
30
+ end
30
31
 
31
32
  subject.publish_to_channel(channel, message: message)
32
33
  end
33
34
  end
34
35
 
35
36
  describe "#channel" do
36
- before { subject.stub(:channel_registrar).and_return(foo: amazon_resource_name) }
37
+ before { allow(subject).to receive(:channel_registrar).and_return(foo: amazon_resource_name) }
37
38
 
38
- let(:topics){ double :sns_topics }
39
- let(:topic){ double :sns_topic }
39
+ let(:topics) { double :sns_topics }
40
+ let(:topic) { double :sns_topic }
40
41
 
41
42
  it "returns the channel" do
42
- subject.channel(:foo).arn.should == amazon_resource_name
43
+ expect(subject.channel(:foo).arn).to eq(amazon_resource_name)
43
44
  end
44
45
  end
45
46
  end
@@ -12,24 +12,25 @@ describe DispatchRider::NotificationServices::Base do
12
12
  end
13
13
 
14
14
  before :each do
15
- DispatchRider::NotificationServices::Base.any_instance.stub(:notifier_builder).and_return(OpenStruct)
16
- DispatchRider::NotificationServices::Base.any_instance.stub(:channel_registrar_builder).and_return(DispatchRider::Registrars::SnsChannel)
17
- DispatchRider::NotificationServices::Base.any_instance.stub(:channel) do |name|
15
+ allow_any_instance_of(described_class).to receive(:notifier_builder).and_return(OpenStruct)
16
+ channel = DispatchRider::Registrars::SnsChannel
17
+ allow_any_instance_of(described_class).to receive(:channel_registrar_builder).and_return(channel)
18
+ allow_any_instance_of(described_class).to receive(:channel) do |name|
18
19
  subject.notifier.topics[subject.fetch(name)] if name == :foo
19
20
  end
20
21
  end
21
22
 
22
23
  subject do
23
- DispatchRider::NotificationServices::Base.new({:topics => {}})
24
+ DispatchRider::NotificationServices::Base.new(topics: {})
24
25
  end
25
26
 
26
27
  describe "#initialize" do
27
28
  it "assigns the notifier" do
28
- subject.notifier.should respond_to(:topics)
29
+ expect(subject.notifier).to respond_to(:topics)
29
30
  end
30
31
 
31
32
  it "assigns the channel registrar" do
32
- subject.channel_registrar.store.should be_empty
33
+ expect(subject.channel_registrar.store).to be_empty
33
34
  end
34
35
  end
35
36
 
@@ -42,7 +43,7 @@ describe DispatchRider::NotificationServices::Base do
42
43
  let(:message) { DispatchRider::Message.new(subject: :test_handler, body: { "bar" => "baz" }) }
43
44
 
44
45
  it "publishes the message to the channels" do
45
- catch(:published) { subject.publish to: :foo, message: message }.should eq("baz")
46
+ expect(catch(:published) { subject.publish to: :foo, message: message }).to eq("baz")
46
47
  end
47
48
  end
48
49
 
@@ -50,15 +51,19 @@ describe DispatchRider::NotificationServices::Base do
50
51
  let(:channel) { double(:channel) }
51
52
 
52
53
  let(:message) { DispatchRider::Message.new(subject: :test_handler, body: { "bar" => "baz" }) }
54
+ let(:expected_message) do
55
+ {
56
+ "subject" => "test_handler",
57
+ "body" => { "bar" => "baz" }
58
+ }
59
+ end
53
60
 
54
61
  # @note: This is tested this way cause you don't really wanna post a message to the actual service.
55
62
  it "publishes the message to the channels" do
56
63
  expect(channel).to receive(:publish).with(kind_of String) { |serialized_message|
57
- expect(JSON.parse(serialized_message)).to eq(
58
- "subject" => "test_handler",
59
- "body" => { "bar" => "baz" }
60
- )
61
- }
64
+ parsed_message = JSON.parse(serialized_message)
65
+ expect(parsed_message).to eq(expected_message)
66
+ }
62
67
 
63
68
  subject.publish_to_channel(channel, message: message)
64
69
  end
@@ -71,7 +76,7 @@ describe DispatchRider::NotificationServices::Base do
71
76
  end
72
77
 
73
78
  it "returns an array of channels" do
74
- subject.channels(:foo).should eq([channel])
79
+ expect(subject.channels(:foo)).to eq([channel])
75
80
  end
76
81
  end
77
82
  end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DispatchRider::NotificationServices::FileSystem::Channel do
4
-
5
4
  let(:path) { File.expand_path("tmp/test/channel") }
6
5
  let(:published_message) { File.new(Dir["#{path}/*.ready"].first).read }
7
6
 
@@ -11,7 +10,7 @@ describe DispatchRider::NotificationServices::FileSystem::Channel do
11
10
  subject { described_class.new(path) }
12
11
 
13
12
  describe "#publish" do
14
- let(:message){ {:subject => "foo", :body => "bar"}.to_json }
13
+ let(:message) { { subject: "foo", body: "bar" }.to_json }
15
14
 
16
15
  it "adds a file to the path folder" do
17
16
  expect {
@@ -22,7 +21,7 @@ describe DispatchRider::NotificationServices::FileSystem::Channel do
22
21
  it "writes the message to the file" do
23
22
  subject.publish(message)
24
23
 
25
- published_message.should == message
24
+ expect(published_message).to eq(message)
26
25
  end
27
26
  end
28
27
  end
@@ -1,14 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DispatchRider::NotificationServices::FileSystem::Notifier do
4
-
5
4
  subject { described_class.new({}) }
6
5
 
7
6
  describe "#channel" do
8
7
  it "returns a channel object" do
9
- subject.channel("tmp/some/path").should be_a(DispatchRider::NotificationServices::FileSystem::Channel)
8
+ expect(subject.channel("tmp/some/path")).to be_a(DispatchRider::NotificationServices::FileSystem::Channel)
10
9
  end
11
10
  end
12
-
13
11
  end
14
12
 
@@ -1,23 +1,22 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DispatchRider::NotificationServices::FileSystem do
4
-
5
4
  describe "#notifier_builder" do
6
5
  it "returns the notifier builder" do
7
- subject.notifier_builder.should eq(DispatchRider::NotificationServices::FileSystem::Notifier)
6
+ expect(subject.notifier_builder).to eq(DispatchRider::NotificationServices::FileSystem::Notifier)
8
7
  end
9
8
  end
10
9
 
11
10
  describe "#channel_registrar_builder" do
12
11
  it "returns the channel registrar builder" do
13
- subject.channel_registrar_builder.should eq(DispatchRider::Registrars::FileSystemChannel)
12
+ expect(subject.channel_registrar_builder).to eq(DispatchRider::Registrars::FileSystemChannel)
14
13
  end
15
14
  end
16
15
 
17
16
  describe "#channel" do
18
17
  it "returns the channel" do
19
18
  subject.channel_registrar.register(:foo, :path => "tmp/test/channel")
20
- subject.channel(:foo).should be_a(DispatchRider::NotificationServices::FileSystem::Channel)
19
+ expect(subject.channel(:foo)).to be_a(DispatchRider::NotificationServices::FileSystem::Channel)
21
20
  end
22
21
  end
23
22
  end
@@ -1,8 +1,6 @@
1
1
  require 'spec_helper'
2
- require 'rspec/its'
3
2
 
4
3
  describe DispatchRider::Publisher::Configuration::Destination do
5
-
6
4
  let(:attributes) do
7
5
  {
8
6
  "service" => "aws_sns",
@@ -19,43 +17,55 @@ describe DispatchRider::Publisher::Configuration::Destination do
19
17
  }
20
18
  end
21
19
 
22
- subject{ described_class.new("employee", attributes) }
20
+ subject { described_class.new("employee", attributes) }
23
21
 
24
22
  describe "#name" do
25
- its(:name) { is_expected.to eq("employee") }
23
+ describe '#name' do
24
+ subject { super().name }
25
+ it { is_expected.to eq("employee") }
26
+ end
26
27
  end
27
28
 
28
29
  describe "#service" do
29
- its(:service) { is_expected.to eq("aws_sns") }
30
+ describe '#service' do
31
+ subject { super().service }
32
+ it { is_expected.to eq("aws_sns") }
33
+ end
30
34
  end
31
35
 
32
36
  describe "#channel" do
33
- its(:channel) { is_expected.to eq("employee_updates") }
37
+ describe '#channel' do
38
+ subject { super().channel }
39
+ it { is_expected.to eq("employee_updates") }
40
+ end
34
41
  end
35
42
 
36
43
  describe "#options" do
37
- its(:options) { is_expected.to eq(options) }
44
+ describe '#options' do
45
+ subject { super().options }
46
+ it { is_expected.to eq(options) }
47
+ end
38
48
  end
39
49
 
40
50
  describe "#==" do
41
- let(:other){ described_class.new(name, other_attributes) }
51
+ let(:other) { described_class.new(name, other_attributes) }
42
52
 
43
53
  context "when the destinations' name, service, channel and options are the same" do
44
- let(:name){ subject.name }
45
- let(:other_attributes){ attributes }
54
+ let(:name) { subject.name }
55
+ let(:other_attributes) { attributes }
46
56
 
47
- it{ should eq other }
57
+ it { is_expected.to eq other }
48
58
  end
49
59
 
50
60
  context "when the destinations' name is different" do
51
- let(:name){ "account" }
52
- let(:other_attributes){ attributes }
61
+ let(:name) { "account" }
62
+ let(:other_attributes) { attributes }
53
63
 
54
- it{ should_not eq other }
64
+ it { is_expected.not_to eq other }
55
65
  end
56
66
 
57
67
  context "when the destinations' service is different" do
58
- let(:name){ subject.name }
68
+ let(:name) { subject.name }
59
69
 
60
70
  let(:other_attributes) do
61
71
  {
@@ -65,11 +75,11 @@ describe DispatchRider::Publisher::Configuration::Destination do
65
75
  }
66
76
  end
67
77
 
68
- it{ should_not eq other }
78
+ it { is_expected.not_to eq other }
69
79
  end
70
80
 
71
81
  context "when the destinations' channel is different" do
72
- let(:name){ subject.name }
82
+ let(:name) { subject.name }
73
83
 
74
84
  let(:other_attributes) do
75
85
  {
@@ -79,11 +89,11 @@ describe DispatchRider::Publisher::Configuration::Destination do
79
89
  }
80
90
  end
81
91
 
82
- it{ should_not eq other }
92
+ it { is_expected.not_to eq other }
83
93
  end
84
94
 
85
95
  context "when the destinations' options are different" do
86
- let(:name){ subject.name }
96
+ let(:name) { subject.name }
87
97
 
88
98
  let(:other_attributes) do
89
99
  {
@@ -93,8 +103,7 @@ describe DispatchRider::Publisher::Configuration::Destination do
93
103
  }
94
104
  end
95
105
 
96
- it{ should_not eq other }
106
+ it { is_expected.not_to eq other }
97
107
  end
98
108
  end
99
-
100
109
  end
@@ -8,45 +8,51 @@ describe DispatchRider::Publisher::Configuration::NotificationService do
8
8
  }
9
9
  end
10
10
 
11
- subject{ described_class.new("file_system", options) }
11
+ subject { described_class.new("file_system", options) }
12
12
 
13
13
  describe "#name" do
14
- its(:name){ should == "file_system" }
14
+ describe '#name' do
15
+ subject { super().name }
16
+ it { is_expected.to eq("file_system") }
17
+ end
15
18
  end
16
19
 
17
20
  describe "#options" do
18
- its(:options){ should == options }
21
+ describe '#options' do
22
+ subject { super().options }
23
+ it { is_expected.to eq(options) }
24
+ end
19
25
  end
20
26
 
21
27
  describe "#==" do
22
- let(:other){ described_class.new(name, other_options) }
28
+ let(:other) { described_class.new(name, other_options) }
23
29
 
24
30
  context "two notification services with the same name and options" do
25
- let(:name){ subject.name }
26
- let(:other_options){ options }
31
+ let(:name) { subject.name }
32
+ let(:other_options) { options }
27
33
 
28
- it{ should eq other }
34
+ it { is_expected.to eq other }
29
35
  end
30
36
 
31
37
  context "two notification services with different names but the same options" do
32
- let(:name){ "aws_sns" }
33
- let(:other_options){ options }
38
+ let(:name) { "aws_sns" }
39
+ let(:other_options) { options }
34
40
 
35
- it{ should_not eq other }
41
+ it { is_expected.not_to eq other }
36
42
  end
37
43
 
38
44
  context "two notificaiton services with the same name but different options" do
39
- let(:name){ subject.name }
40
- let(:other_options){ { "topic" => "employee_updates" } }
45
+ let(:name) { subject.name }
46
+ let(:other_options) { { "topic" => "employee_updates" } }
41
47
 
42
- it{ should_not eq other }
48
+ it { is_expected.not_to eq other }
43
49
  end
44
50
 
45
51
  context "two notification services with different names and options" do
46
- let(:name){ "aws_sns" }
47
- let(:other_options){ { "topic" => "employee_updates" } }
52
+ let(:name) { "aws_sns" }
53
+ let(:other_options) { { "topic" => "employee_updates" } }
48
54
 
49
- it{ should_not eq other }
55
+ it { is_expected.not_to eq other }
50
56
  end
51
57
  end
52
58