journaled 2.4.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +68 -19
  3. data/Rakefile +7 -1
  4. data/app/jobs/journaled/application_job.rb +4 -0
  5. data/app/jobs/journaled/delivery_job.rb +105 -0
  6. data/app/models/journaled/change.rb +3 -3
  7. data/app/models/journaled/change_writer.rb +5 -5
  8. data/app/models/journaled/event.rb +2 -2
  9. data/app/models/journaled/writer.rb +8 -6
  10. data/lib/journaled/engine.rb +5 -0
  11. data/lib/journaled/relation_change_protection.rb +1 -1
  12. data/lib/journaled/version.rb +1 -1
  13. data/lib/journaled.rb +23 -5
  14. data/spec/dummy/config/application.rb +1 -2
  15. data/spec/dummy/config/database.yml +4 -19
  16. data/spec/dummy/config/environments/development.rb +0 -13
  17. data/spec/dummy/config/environments/test.rb +3 -5
  18. data/spec/dummy/db/schema.rb +3 -16
  19. data/spec/{models/journaled/delivery_spec.rb → jobs/journaled/delivery_job_spec.rb} +82 -28
  20. data/spec/lib/journaled_spec.rb +39 -0
  21. data/spec/models/database_change_protection_spec.rb +19 -25
  22. data/spec/models/journaled/change_writer_spec.rb +10 -10
  23. data/spec/models/journaled/event_spec.rb +4 -4
  24. data/spec/models/journaled/writer_spec.rb +18 -15
  25. data/spec/rails_helper.rb +1 -2
  26. data/spec/spec_helper.rb +1 -3
  27. metadata +31 -74
  28. data/app/models/journaled/delivery.rb +0 -88
  29. data/config/routes.rb +0 -2
  30. data/lib/journaled/enqueue.rb +0 -13
  31. data/spec/dummy/config/environments/production.rb +0 -78
  32. data/spec/dummy/config/initializers/assets.rb +0 -8
  33. data/spec/dummy/db/migrate/20180606205114_create_delayed_jobs.rb +0 -18
  34. data/spec/support/delayed_job_spec_helper.rb +0 -11
@@ -1,16 +1,11 @@
1
1
  require 'rails_helper'
2
2
 
3
- RSpec.describe Journaled::Delivery do
3
+ RSpec.describe Journaled::DeliveryJob do
4
4
  let(:stream_name) { 'test_events' }
5
5
  let(:partition_key) { 'fake_partition_key' }
6
6
  let(:serialized_event) { '{"foo":"bar"}' }
7
7
  let(:kinesis_client) { Aws::Kinesis::Client.new(stub_responses: true) }
8
-
9
- around do |example|
10
- with_env(JOURNALED_STREAM_NAME: stream_name) { example.run }
11
- end
12
-
13
- subject { described_class.new serialized_event: serialized_event, partition_key: partition_key, app_name: nil }
8
+ let(:args) { { serialized_event: serialized_event, partition_key: partition_key, stream_name: stream_name } }
14
9
 
15
10
  describe '#perform' do
16
11
  let(:return_status_body) { { shard_id: '101', sequence_number: '101123' } }
@@ -20,15 +15,21 @@ RSpec.describe Journaled::Delivery do
20
15
  allow(Aws::AssumeRoleCredentials).to receive(:new).and_call_original
21
16
  allow(Aws::Kinesis::Client).to receive(:new).and_return kinesis_client
22
17
  kinesis_client.stub_responses(:put_record, return_status_body)
18
+ allow(kinesis_client).to receive(:put_record).and_call_original
23
19
 
24
20
  allow(Journaled).to receive(:enabled?).and_return(true)
25
21
  end
26
22
 
27
23
  it 'makes requests to AWS to put the event on the Kinesis with the correct body' do
28
- event = subject.perform
24
+ event = described_class.perform_now(args)
29
25
 
30
26
  expect(event.shard_id).to eq '101'
31
27
  expect(event.sequence_number).to eq '101123'
28
+ expect(kinesis_client).to have_received(:put_record).with(
29
+ stream_name: 'test_events',
30
+ data: '{"foo":"bar"}',
31
+ partition_key: 'fake_partition_key',
32
+ )
32
33
  end
33
34
 
34
35
  context 'when JOURNALED_IAM_ROLE_ARN is defined' do
@@ -59,7 +60,7 @@ RSpec.describe Journaled::Delivery do
59
60
  end
60
61
 
61
62
  it 'initializes a Kinesis client with assume role credentials' do
62
- subject.perform
63
+ described_class.perform_now(args)
63
64
 
64
65
  expect(Aws::AssumeRoleCredentials).to have_received(:new).with(
65
66
  client: aws_sts_client,
@@ -69,11 +70,64 @@ RSpec.describe Journaled::Delivery do
69
70
  end
70
71
  end
71
72
 
72
- context 'when the stream name env var is NOT set' do
73
+ context 'when the stream name is not set' do
73
74
  let(:stream_name) { nil }
74
75
 
75
76
  it 'raises an KeyError error' do
76
- expect { subject.perform }.to raise_error KeyError
77
+ expect { described_class.perform_now(args) }.to raise_error ArgumentError, 'missing keyword: stream_name'
78
+ end
79
+ end
80
+
81
+ unless Gem::Version.new(Journaled::VERSION) < Gem::Version.new('5.0.0')
82
+ raise <<~MSG
83
+ Hey! I see that you're bumping the version to 5.0!
84
+
85
+ This is a reminder to:
86
+ - remove the `app_name` argument (and related logic) from `Journaled::DeliveryJob`,
87
+ - remove the following app_name test contexts, and
88
+ - make `stream_name` a required kwarg
89
+
90
+ Thanks!
91
+ MSG
92
+ end
93
+
94
+ context 'when the legacy app_name argument is present but nil' do
95
+ let(:args) { { serialized_event: serialized_event, partition_key: partition_key, app_name: nil } }
96
+
97
+ around do |example|
98
+ with_env(JOURNALED_STREAM_NAME: 'legacy_stream_name') { example.run }
99
+ end
100
+
101
+ it 'makes requests to AWS to put the event on the Kinesis with the correct body' do
102
+ event = described_class.perform_now(args)
103
+
104
+ expect(event.shard_id).to eq '101'
105
+ expect(event.sequence_number).to eq '101123'
106
+ expect(kinesis_client).to have_received(:put_record).with(
107
+ stream_name: 'legacy_stream_name',
108
+ data: '{"foo":"bar"}',
109
+ partition_key: 'fake_partition_key',
110
+ )
111
+ end
112
+ end
113
+
114
+ context 'when the legacy app_name argument is present and has a value' do
115
+ let(:args) { { serialized_event: serialized_event, partition_key: partition_key, app_name: 'pied_piper' } }
116
+
117
+ around do |example|
118
+ with_env(PIED_PIPER_JOURNALED_STREAM_NAME: 'pied_piper_events') { example.run }
119
+ end
120
+
121
+ it 'makes requests to AWS to put the event on the Kinesis with the correct body' do
122
+ event = described_class.perform_now(args)
123
+
124
+ expect(event.shard_id).to eq '101'
125
+ expect(event.sequence_number).to eq '101123'
126
+ expect(kinesis_client).to have_received(:put_record).with(
127
+ stream_name: 'pied_piper_events',
128
+ data: '{"foo":"bar"}',
129
+ partition_key: 'fake_partition_key',
130
+ )
77
131
  end
78
132
  end
79
133
 
@@ -83,8 +137,11 @@ RSpec.describe Journaled::Delivery do
83
137
  end
84
138
 
85
139
  it 'catches the error and re-raises a subclass of NotTrulyExceptionalError and logs about the failure' do
86
- expect(Rails.logger).to receive(:error).with("Kinesis Error - Server Error occurred - Aws::Kinesis::Errors::InternalFailure").once
87
- expect { subject.perform }.to raise_error described_class::KinesisTemporaryFailure
140
+ allow(Rails.logger).to receive(:error)
141
+ expect { described_class.perform_now(args) }.to raise_error described_class::KinesisTemporaryFailure
142
+ expect(Rails.logger).to have_received(:error).with(
143
+ "Kinesis Error - Server Error occurred - Aws::Kinesis::Errors::InternalFailure",
144
+ ).once
88
145
  end
89
146
  end
90
147
 
@@ -95,7 +152,7 @@ RSpec.describe Journaled::Delivery do
95
152
 
96
153
  it 'catches the error and re-raises a subclass of NotTrulyExceptionalError and logs about the failure' do
97
154
  allow(Rails.logger).to receive(:error)
98
- expect { subject.perform }.to raise_error described_class::KinesisTemporaryFailure
155
+ expect { described_class.perform_now(args) }.to raise_error described_class::KinesisTemporaryFailure
99
156
  expect(Rails.logger).to have_received(:error).with(/\AKinesis Error/).once
100
157
  end
101
158
  end
@@ -106,7 +163,7 @@ RSpec.describe Journaled::Delivery do
106
163
  end
107
164
 
108
165
  it 'raises an error that subclasses Aws::Kinesis::Errors::ServiceError' do
109
- expect { subject.perform }.to raise_error Aws::Kinesis::Errors::ServiceError
166
+ expect { described_class.perform_now(args) }.to raise_error Aws::Kinesis::Errors::ServiceError
110
167
  end
111
168
  end
112
169
 
@@ -116,7 +173,7 @@ RSpec.describe Journaled::Delivery do
116
173
  end
117
174
 
118
175
  it 'raises an AccessDeniedException error' do
119
- expect { subject.perform }.to raise_error Aws::Kinesis::Errors::AccessDeniedException
176
+ expect { described_class.perform_now(args) }.to raise_error Aws::Kinesis::Errors::AccessDeniedException
120
177
  end
121
178
  end
122
179
 
@@ -126,31 +183,28 @@ RSpec.describe Journaled::Delivery do
126
183
  end
127
184
 
128
185
  it 'catches the error and re-raises a subclass of NotTrulyExceptionalError and logs about the failure' do
129
- expect(Rails.logger).to receive(:error).with(
186
+ allow(Rails.logger).to receive(:error)
187
+ expect { described_class.perform_now(args) }.to raise_error described_class::KinesisTemporaryFailure
188
+ expect(Rails.logger).to have_received(:error).with(
130
189
  "Kinesis Error - Networking Error occurred - Seahorse::Client::NetworkingError",
131
190
  ).once
132
- expect { subject.perform }.to raise_error described_class::KinesisTemporaryFailure
133
191
  end
134
192
  end
135
193
  end
136
194
 
137
- describe "#stream_name" do
195
+ describe ".legacy_computed_stream_name" do
138
196
  context "when app_name is unspecified" do
139
- subject { described_class.new serialized_event: serialized_event, partition_key: partition_key, app_name: nil }
140
-
141
197
  it "is fetched from a prefixed ENV var if specified" do
142
198
  allow(ENV).to receive(:fetch).and_return("expected_stream_name")
143
- expect(subject.stream_name).to eq("expected_stream_name")
199
+ expect(described_class.legacy_computed_stream_name(app_name: nil)).to eq("expected_stream_name")
144
200
  expect(ENV).to have_received(:fetch).with("JOURNALED_STREAM_NAME")
145
201
  end
146
202
  end
147
203
 
148
204
  context "when app_name is specified" do
149
- subject { described_class.new serialized_event: serialized_event, partition_key: partition_key, app_name: "my_funky_app_name" }
150
-
151
205
  it "is fetched from a prefixed ENV var if specified" do
152
206
  allow(ENV).to receive(:fetch).and_return("expected_stream_name")
153
- expect(subject.stream_name).to eq("expected_stream_name")
207
+ expect(described_class.legacy_computed_stream_name(app_name: "my_funky_app_name")).to eq("expected_stream_name")
154
208
  expect(ENV).to have_received(:fetch).with("MY_FUNKY_APP_NAME_JOURNALED_STREAM_NAME")
155
209
  end
156
210
  end
@@ -191,7 +245,7 @@ RSpec.describe Journaled::Delivery do
191
245
  end
192
246
 
193
247
  it "will set http_open_timeout by default" do
194
- expect(subject.kinesis_client_config).to include(http_open_timeout: 15)
248
+ expect(subject.kinesis_client_config).to include(http_open_timeout: 2)
195
249
  end
196
250
 
197
251
  it "will set http_read_timeout by default" do
@@ -207,8 +261,8 @@ RSpec.describe Journaled::Delivery do
207
261
 
208
262
  context "when Journaled.http_open_timeout is specified" do
209
263
  it "will set http_open_timeout by specified value" do
210
- allow(Journaled).to receive(:http_open_timeout).and_return(2)
211
- expect(subject.kinesis_client_config).to include(http_open_timeout: 2)
264
+ allow(Journaled).to receive(:http_open_timeout).and_return(1)
265
+ expect(subject.kinesis_client_config).to include(http_open_timeout: 1)
212
266
  end
213
267
  end
214
268
 
@@ -49,4 +49,43 @@ RSpec.describe Journaled do
49
49
  expect(described_class.actor_uri).to eq "my actor uri"
50
50
  end
51
51
  end
52
+
53
+ describe '.detect_queue_adapter!' do
54
+ it 'raises an error unless the queue adapter is DB-backed' do
55
+ expect { described_class.detect_queue_adapter! }.to raise_error <<~MSG
56
+ Journaled has detected an unsupported ActiveJob queue adapter: `:test`
57
+
58
+ Journaled jobs must be enqueued transactionally to your primary database.
59
+
60
+ Please install the appropriate gems and set `queue_adapter` to one of the following:
61
+ - `:delayed`
62
+ - `:delayed_job`
63
+ - `:good_job`
64
+ - `:que`
65
+
66
+ Read more at https://github.com/Betterment/journaled
67
+ MSG
68
+ end
69
+
70
+ context 'when the queue adapter is supported' do
71
+ before do
72
+ stub_const("ActiveJob::QueueAdapters::DelayedAdapter", Class.new)
73
+ ActiveJob::Base.disable_test_adapter
74
+ ActiveJob::Base.queue_adapter = :delayed
75
+ end
76
+
77
+ around do |example|
78
+ begin
79
+ example.run
80
+ ensure
81
+ ActiveJob::Base.queue_adapter = :test
82
+ ActiveJob::Base.enable_test_adapter(ActiveJob::QueueAdapters::TestAdapter.new)
83
+ end
84
+ end
85
+
86
+ it 'does not raise an error' do
87
+ expect { described_class.detect_queue_adapter! }.not_to raise_error
88
+ end
89
+ end
90
+ end
52
91
  end
@@ -4,38 +4,42 @@ if Rails::VERSION::MAJOR > 5 || (Rails::VERSION::MAJOR == 5 && Rails::VERSION::M
4
4
  # rubocop:disable Rails/SkipsModelValidations
5
5
  RSpec.describe "Raw database change protection" do
6
6
  let(:journaled_class) do
7
- Class.new(Delayed::Job) do
7
+ Class.new(ActiveRecord::Base) do
8
8
  include Journaled::Changes
9
9
 
10
- journal_changes_to :locked_at, as: :attempt
10
+ self.table_name = 'widgets'
11
+
12
+ journal_changes_to :name, as: :attempt
11
13
  end
12
14
  end
13
15
 
14
16
  let(:journaled_class_with_no_journaled_columns) do
15
- Class.new(Delayed::Job) do
17
+ Class.new(ActiveRecord::Base) do
16
18
  include Journaled::Changes
19
+
20
+ self.table_name = 'widgets'
17
21
  end
18
22
  end
19
23
 
20
24
  describe "the relation" do
21
25
  describe "#update_all" do
22
26
  it "refuses on journaled columns passed as hash" do
23
- expect { journaled_class.update_all(locked_at: nil) }.to raise_error(/aborted by Journaled/)
27
+ expect { journaled_class.update_all(name: nil) }.to raise_error(/aborted by Journaled/)
24
28
  end
25
29
 
26
30
  it "refuses on journaled columns passed as string" do
27
- expect { journaled_class.update_all("\"locked_at\" = NULL") }.to raise_error(/aborted by Journaled/)
28
- expect { journaled_class.update_all("locked_at = null") }.to raise_error(/aborted by Journaled/)
29
- expect { journaled_class.update_all("delayed_jobs.locked_at = null") }.to raise_error(/aborted by Journaled/)
30
- expect { journaled_class.update_all("last_error = 'locked_at'") }.not_to raise_error
31
+ expect { journaled_class.update_all("\"name\" = NULL") }.to raise_error(/aborted by Journaled/)
32
+ expect { journaled_class.update_all("name = null") }.to raise_error(/aborted by Journaled/)
33
+ expect { journaled_class.update_all("widgets.name = null") }.to raise_error(/aborted by Journaled/)
34
+ expect { journaled_class.update_all("other_column = 'name'") }.not_to raise_error
31
35
  end
32
36
 
33
37
  it "succeeds on unjournaled columns" do
34
- expect { journaled_class.update_all(handler: "") }.not_to raise_error
38
+ expect { journaled_class.update_all(other_column: "") }.not_to raise_error
35
39
  end
36
40
 
37
41
  it "succeeds when forced on journaled columns" do
38
- expect { journaled_class.update_all({ locked_at: nil }, force: true) }.not_to raise_error
42
+ expect { journaled_class.update_all({ name: nil }, force: true) }.not_to raise_error
39
43
  end
40
44
  end
41
45
 
@@ -69,29 +73,19 @@ if Rails::VERSION::MAJOR > 5 || (Rails::VERSION::MAJOR == 5 && Rails::VERSION::M
69
73
  end
70
74
 
71
75
  describe "an instance" do
72
- let(:job) do
73
- module TestJob
74
- def perform
75
- "foo"
76
- end
77
-
78
- module_function :perform
79
- end
80
- end
81
-
82
- subject { journaled_class.enqueue(job) }
76
+ subject { journaled_class.create!(name: 'foo') }
83
77
 
84
78
  describe "#update_columns" do
85
79
  it "refuses on journaled columns" do
86
- expect { subject.update_columns(locked_at: nil) }.to raise_error(/aborted by Journaled/)
80
+ expect { subject.update_columns(name: nil) }.to raise_error(/aborted by Journaled/)
87
81
  end
88
82
 
89
83
  it "succeeds on unjournaled columns" do
90
- expect { subject.update_columns(handler: "") }.not_to raise_error
84
+ expect { subject.update_columns(other_column: "") }.not_to raise_error
91
85
  end
92
86
 
93
87
  it "succeeds when forced on journaled columns" do
94
- expect { subject.update_columns({ locked_at: nil }, force: true) }.not_to raise_error
88
+ expect { subject.update_columns({ name: nil }, force: true) }.not_to raise_error
95
89
  end
96
90
  end
97
91
 
@@ -101,7 +95,7 @@ if Rails::VERSION::MAJOR > 5 || (Rails::VERSION::MAJOR == 5 && Rails::VERSION::M
101
95
  end
102
96
 
103
97
  it "succeeds if no journaled columns exist" do
104
- instance = journaled_class_with_no_journaled_columns.enqueue(job)
98
+ instance = journaled_class_with_no_journaled_columns.create!
105
99
  expect { instance.delete }.not_to raise_error
106
100
  end
107
101
 
@@ -138,30 +138,30 @@ RSpec.describe Journaled::ChangeWriter do
138
138
  expect(subject.journaled_change_for("update", {}).logical_operation).to eq("identity_change")
139
139
  end
140
140
 
141
- it "doesn't set journaled_app_name if model class doesn't respond to it" do
142
- expect(subject.journaled_change_for("update", {}).journaled_app_name).to eq(nil)
141
+ it "doesn't set journaled_stream_name if model class doesn't respond to it" do
142
+ expect(subject.journaled_change_for("update", {}).journaled_stream_name).to eq(nil)
143
143
  end
144
144
 
145
145
  context "with journaled default app name set" do
146
146
  around do |example|
147
- orig_app_name = Journaled.default_app_name
148
- Journaled.default_app_name = "foo"
147
+ orig_app_name = Journaled.default_stream_name
148
+ Journaled.default_stream_name = "foo"
149
149
  example.run
150
- Journaled.default_app_name = orig_app_name
150
+ Journaled.default_stream_name = orig_app_name
151
151
  end
152
152
 
153
153
  it "passes through default" do
154
- expect(subject.journaled_change_for("update", {}).journaled_app_name).to eq("foo")
154
+ expect(subject.journaled_change_for("update", {}).journaled_stream_name).to eq("foo")
155
155
  end
156
156
  end
157
157
 
158
- context "when model class defines journaled_app_name" do
158
+ context "when model class defines journaled_stream_name" do
159
159
  before do
160
- allow(model_class).to receive(:journaled_app_name).and_return("my_app")
160
+ allow(model_class).to receive(:journaled_stream_name).and_return("my_app_events")
161
161
  end
162
162
 
163
- it "sets journaled_app_name if model_class responds to it" do
164
- expect(subject.journaled_change_for("update", {}).journaled_app_name).to eq("my_app")
163
+ it "sets journaled_stream_name if model_class responds to it" do
164
+ expect(subject.journaled_change_for("update", {}).journaled_stream_name).to eq("my_app_events")
165
165
  end
166
166
  end
167
167
  end
@@ -65,14 +65,14 @@ RSpec.describe Journaled::Event do
65
65
  end
66
66
  end
67
67
 
68
- describe '#journaled_app_name' do
68
+ describe '#journaled_stream_name' do
69
69
  it 'returns nil in the base class so it can be set explicitly in apps spanning multiple app domains' do
70
- expect(sample_journaled_event.journaled_app_name).to be_nil
70
+ expect(sample_journaled_event.journaled_stream_name).to be_nil
71
71
  end
72
72
 
73
73
  it 'returns the journaled default if set' do
74
- allow(Journaled).to receive(:default_app_name).and_return("my_app")
75
- expect(sample_journaled_event.journaled_app_name).to eq("my_app")
74
+ allow(Journaled).to receive(:default_stream_name).and_return("my_app_events")
75
+ expect(sample_journaled_event.journaled_stream_name).to eq("my_app_events")
76
76
  end
77
77
  end
78
78
 
@@ -18,7 +18,7 @@ RSpec.describe Journaled::Writer do
18
18
  journaled_schema_name: nil,
19
19
  journaled_attributes: {},
20
20
  journaled_partition_key: '',
21
- journaled_app_name: nil,
21
+ journaled_stream_name: nil,
22
22
  journaled_enqueue_opts: {},
23
23
  )
24
24
  end
@@ -34,7 +34,7 @@ RSpec.describe Journaled::Writer do
34
34
  journaled_schema_name: :fake_schema_name,
35
35
  journaled_attributes: { foo: :bar },
36
36
  journaled_partition_key: 'fake_partition_key',
37
- journaled_app_name: nil,
37
+ journaled_stream_name: nil,
38
38
  journaled_enqueue_opts: {},
39
39
  )
40
40
  end
@@ -75,21 +75,17 @@ RSpec.describe Journaled::Writer do
75
75
  journaled_schema_name: :fake_schema_name,
76
76
  journaled_attributes: journaled_event_attributes,
77
77
  journaled_partition_key: 'fake_partition_key',
78
- journaled_app_name: 'my_app',
78
+ journaled_stream_name: 'my_app_events',
79
79
  journaled_enqueue_opts: journaled_enqueue_opts,
80
80
  )
81
81
  end
82
82
 
83
- around do |example|
84
- with_jobs_delayed { example.run }
85
- end
86
-
87
83
  context 'when the journaled event does NOT comply with the base_event schema' do
88
84
  let(:journaled_event_attributes) { { foo: 1 } }
89
85
 
90
86
  it 'raises an error and does not enqueue anything' do
91
87
  expect { subject.journal! }.to raise_error JSON::Schema::ValidationError
92
- expect(Delayed::Job.where('handler like ?', '%Journaled::Delivery%').count).to eq 0
88
+ expect(enqueued_jobs.count).to eq 0
93
89
  end
94
90
  end
95
91
 
@@ -99,7 +95,7 @@ RSpec.describe Journaled::Writer do
99
95
 
100
96
  it 'raises an error and does not enqueue anything' do
101
97
  expect { subject.journal! }.to raise_error JSON::Schema::ValidationError
102
- expect(Delayed::Job.where('handler like ?', '%Journaled::Delivery%').count).to eq 0
98
+ expect(enqueued_jobs.count).to eq 0
103
99
  end
104
100
  end
105
101
 
@@ -107,9 +103,8 @@ RSpec.describe Journaled::Writer do
107
103
  let(:journaled_event_attributes) { { id: 'FAKE_UUID', event_type: 'fake_event', created_at: Time.zone.now, foo: :bar } }
108
104
 
109
105
  it 'creates a delivery with the app name passed through' do
110
- allow(Journaled::Delivery).to receive(:new).and_call_original
111
- subject.journal!
112
- expect(Journaled::Delivery).to have_received(:new).with(hash_including(app_name: 'my_app'))
106
+ expect { subject.journal! }.to change { enqueued_jobs.count }.from(0).to(1)
107
+ expect(enqueued_jobs.first[:args].first).to include('stream_name' => 'my_app_events')
113
108
  end
114
109
 
115
110
  context 'when there is no job priority specified in the enqueue opts' do
@@ -122,7 +117,11 @@ RSpec.describe Journaled::Writer do
122
117
 
123
118
  it 'defaults to the global default' do
124
119
  expect { subject.journal! }.to change {
125
- Delayed::Job.where('handler like ?', '%Journaled::Delivery%').where(priority: 999).count
120
+ if Rails::VERSION::MAJOR < 6
121
+ enqueued_jobs.select { |j| j[:job] == Journaled::DeliveryJob }.count
122
+ else
123
+ enqueued_jobs.select { |j| j['job_class'] == 'Journaled::DeliveryJob' && j['priority'] == 999 }.count
124
+ end
126
125
  }.from(0).to(1)
127
126
  end
128
127
  end
@@ -130,9 +129,13 @@ RSpec.describe Journaled::Writer do
130
129
  context 'when there is a job priority specified in the enqueue opts' do
131
130
  let(:journaled_enqueue_opts) { { priority: 13 } }
132
131
 
133
- it 'enqueues a Journaled::Delivery object with the given priority' do
132
+ it 'enqueues a Journaled::DeliveryJob with the given priority' do
134
133
  expect { subject.journal! }.to change {
135
- Delayed::Job.where('handler like ?', '%Journaled::Delivery%').where(priority: 13).count
134
+ if Rails::VERSION::MAJOR < 6
135
+ enqueued_jobs.select { |j| j[:job] == Journaled::DeliveryJob }.count
136
+ else
137
+ enqueued_jobs.select { |j| j['job_class'] == 'Journaled::DeliveryJob' && j['priority'] == 13 }.count
138
+ end
136
139
  }.from(0).to(1)
137
140
  end
138
141
  end
data/spec/rails_helper.rb CHANGED
@@ -6,7 +6,6 @@ require 'rspec/rails'
6
6
  require 'timecop'
7
7
  require 'webmock/rspec'
8
8
  require 'journaled/rspec'
9
- require 'pry-rails'
10
9
 
11
10
  Dir[Rails.root.join('..', 'support', '**', '*.rb')].each { |f| require f }
12
11
 
@@ -15,6 +14,6 @@ RSpec.configure do |config|
15
14
 
16
15
  config.infer_spec_type_from_file_location!
17
16
 
18
- config.include DelayedJobSpecHelper
17
+ config.include ActiveJob::TestHelper
19
18
  config.include EnvironmentSpecHelper
20
19
  end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,7 @@
1
- require 'delayed_job_active_record'
2
1
  rails_env = ENV['RAILS_ENV'] ||= 'test'
3
- db_adapter = ENV['DB_ADAPTER'] ||= 'postgresql'
4
2
  require File.expand_path('dummy/config/environment.rb', __dir__)
5
3
 
6
- Rails.configuration.database_configuration[db_adapter][rails_env].tap do |c|
4
+ Rails.configuration.database_configuration[rails_env].tap do |c|
7
5
  ActiveRecord::Tasks::DatabaseTasks.create(c)
8
6
  ActiveRecord::Base.establish_connection(c)
9
7
  load File.expand_path('dummy/db/schema.rb', __dir__)