journaled 2.0.0 → 2.0.1

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.
@@ -4,6 +4,7 @@ RSpec.describe Journaled::Delivery do
4
4
  let(:stream_name) { 'test_events' }
5
5
  let(:partition_key) { 'fake_partition_key' }
6
6
  let(:serialized_event) { '{"foo":"bar"}' }
7
+ let(:kinesis_client) { Aws::Kinesis::Client.new(stub_responses: true) }
7
8
 
8
9
  around do |example|
9
10
  with_env(JOURNALED_STREAM_NAME: stream_name) { example.run }
@@ -12,29 +13,60 @@ RSpec.describe Journaled::Delivery do
12
13
  subject { described_class.new serialized_event: serialized_event, partition_key: partition_key, app_name: nil }
13
14
 
14
15
  describe '#perform' do
15
- let!(:stubbed_request) do
16
- stub_request(:post, 'https://kinesis.us-east-1.amazonaws.com').to_return(status: return_status_code, body: return_status_body)
17
- end
18
- let(:return_status_code) { 200 }
19
- let(:return_status_body) { return_status_body_hash.to_json }
20
- let(:return_status_body_hash) { { RecordId: '101' } }
21
-
22
- let(:stubbed_body) do
23
- {
24
- 'StreamName' => stream_name,
25
- 'Data' => Base64.encode64(serialized_event).strip,
26
- 'PartitionKey' => 'fake_partition_key'
27
- }
28
- end
16
+ let(:return_status_body) { { shard_id: '101', sequence_number: '101123' } }
17
+ let(:return_object) { instance_double Aws::Kinesis::Types::PutRecordOutput, return_status_body }
29
18
 
30
19
  before do
20
+ allow(Aws::AssumeRoleCredentials).to receive(:new).and_call_original
21
+ allow(Aws::Kinesis::Client).to receive(:new).and_return kinesis_client
22
+ kinesis_client.stub_responses(:put_record, return_status_body)
23
+
31
24
  allow(Journaled).to receive(:enabled?).and_return(true)
32
25
  end
33
26
 
34
27
  it 'makes requests to AWS to put the event on the Kinesis with the correct body' do
35
- subject.perform
28
+ event = subject.perform
36
29
 
37
- expect(stubbed_request.with(body: stubbed_body.to_json)).to have_been_requested.once
30
+ expect(event.shard_id).to eq '101'
31
+ expect(event.sequence_number).to eq '101123'
32
+ end
33
+
34
+ context 'when JOURNALED_IAM_ROLE_NAME is defined' do
35
+ let(:aws_sts_client) { Aws::STS::Client.new(stub_responses: true) }
36
+
37
+ around do |example|
38
+ with_env(JOURNALED_IAM_ROLE_NAME: 'iam-role-arn-for-assuming-kinesis-access') { example.run }
39
+ end
40
+
41
+ before do
42
+ allow(Aws::STS::Client).to receive(:new).and_return aws_sts_client
43
+ aws_sts_client.stub_responses(:assume_role, assume_role_response)
44
+ end
45
+
46
+ let(:assume_role_response) do
47
+ {
48
+ assumed_role_user: {
49
+ arn: 'iam-role-arn-for-assuming-kinesis-access',
50
+ assumed_role_id: "ARO123EXAMPLE123:Bob"
51
+ },
52
+ credentials: {
53
+ access_key_id: "AKIAIOSFODNN7EXAMPLE",
54
+ secret_access_key: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
55
+ session_token: "EXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI",
56
+ expiration: Time.zone.parse("2011-07-15T23:28:33.359Z")
57
+ }
58
+ }
59
+ end
60
+
61
+ it 'initializes a Kinesis client with assume role credentials' do
62
+ subject.perform
63
+
64
+ expect(Aws::AssumeRoleCredentials).to have_received(:new).with(
65
+ client: aws_sts_client,
66
+ role_arn: "iam-role-arn-for-assuming-kinesis-access",
67
+ role_session_name: "JournaledAssumeRoleAccess"
68
+ )
69
+ end
38
70
  end
39
71
 
40
72
  context 'when the stream name env var is NOT set' do
@@ -46,57 +78,58 @@ RSpec.describe Journaled::Delivery do
46
78
  end
47
79
 
48
80
  context 'when Amazon responds with an InternalFailure' do
49
- let(:return_status_code) { 500 }
50
- let(:return_status_body_hash) { { __type: 'InternalFailure' } }
81
+ before do
82
+ kinesis_client.stub_responses(:put_record, 'InternalFailure')
83
+ end
51
84
 
52
85
  it 'catches the error and re-raises a subclass of NotTrulyExceptionalError and logs about the failure' do
53
86
  expect(Rails.logger).to receive(:error).with("Kinesis Error - Server Error occurred - Aws::Kinesis::Errors::InternalFailure").once
54
87
  expect { subject.perform }.to raise_error described_class::KinesisTemporaryFailure
55
- expect(stubbed_request).to have_been_requested.once
56
88
  end
57
89
  end
58
90
 
59
91
  context 'when Amazon responds with a ServiceUnavailable' do
60
- let(:return_status_code) { 503 }
61
- let(:return_status_body_hash) { { __type: 'ServiceUnavailable' } }
92
+ before do
93
+ kinesis_client.stub_responses(:put_record, 'ServiceUnavailable')
94
+ end
62
95
 
63
96
  it 'catches the error and re-raises a subclass of NotTrulyExceptionalError and logs about the failure' do
64
97
  allow(Rails.logger).to receive(:error)
65
98
  expect { subject.perform }.to raise_error described_class::KinesisTemporaryFailure
66
- expect(stubbed_request).to have_been_requested.once
67
99
  expect(Rails.logger).to have_received(:error).with(/\AKinesis Error/).once
68
100
  end
69
101
  end
70
102
 
71
103
  context 'when we receive a 504 Gateway timeout' do
72
- let(:return_status_code) { 504 }
73
- let(:return_status_body) { nil }
104
+ before do
105
+ kinesis_client.stub_responses(:put_record, 'Aws::Kinesis::Errors::ServiceError')
106
+ end
74
107
 
75
108
  it 'raises an error that subclasses Aws::Kinesis::Errors::ServiceError' do
76
109
  expect { subject.perform }.to raise_error Aws::Kinesis::Errors::ServiceError
77
- expect(stubbed_request).to have_been_requested.once
78
110
  end
79
111
  end
80
112
 
81
113
  context 'when the IAM user does not have permission to put_record to the specified stream' do
82
- let(:return_status_code) { 400 }
83
- let(:return_status_body_hash) { { __type: 'AccessDeniedException' } }
114
+ before do
115
+ kinesis_client.stub_responses(:put_record, 'AccessDeniedException')
116
+ end
84
117
 
85
118
  it 'raises an AccessDeniedException error' do
86
119
  expect { subject.perform }.to raise_error Aws::Kinesis::Errors::AccessDeniedException
87
- expect(stubbed_request).to have_been_requested.once
88
120
  end
89
121
  end
90
122
 
91
123
  context 'when the request timesout' do
92
- let!(:stubbed_request) do
93
- stub_request(:post, 'https://kinesis.us-east-1.amazonaws.com').to_timeout
124
+ before do
125
+ kinesis_client.stub_responses(:put_record, Seahorse::Client::NetworkingError.new(Timeout::Error.new))
94
126
  end
95
127
 
96
128
  it 'catches the error and re-raises a subclass of NotTrulyExceptionalError and logs about the failure' do
97
- expect(Rails.logger).to receive(:error).with("Kinesis Error - Networking Error occurred - Seahorse::Client::NetworkingError").once
129
+ expect(Rails.logger).to receive(:error).with(
130
+ "Kinesis Error - Networking Error occurred - Seahorse::Client::NetworkingError"
131
+ ).once
98
132
  expect { subject.perform }.to raise_error described_class::KinesisTemporaryFailure
99
- expect(stubbed_request).to have_been_requested.once
100
133
  end
101
134
  end
102
135
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: journaled
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Lipson
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2019-02-12 00:00:00.000000000 Z
14
+ date: 2019-06-07 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: aws-sdk-resources
@@ -295,8 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
295
295
  - !ruby/object:Gem::Version
296
296
  version: '0'
297
297
  requirements: []
298
- rubyforge_project:
299
- rubygems_version: 2.5.1
298
+ rubygems_version: 3.0.1
300
299
  signing_key:
301
300
  specification_version: 4
302
301
  summary: Journaling for Betterment apps.