journaled 4.2.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +130 -46
- data/app/models/journaled/event.rb +1 -1
- data/app/models/journaled/writer.rb +7 -3
- data/lib/journaled/rspec.rb +86 -0
- data/lib/journaled/version.rb +1 -1
- data/spec/models/concerns/journaled/changes_spec.rb +1 -1
- data/spec/models/journaled/writer_spec.rb +48 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc6d5adec8f9ee32ba34d1ba8dae8cb3da062e39dd1b67d5fc3e219be116d675
|
4
|
+
data.tar.gz: ae77057a26203e90fbb8770e1b41864edcff69058cd80b65011eb414ddf2365a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05a99d3d5d530bca784fb44fa290d0ff661430263fbde8fa882f8c98a9dda2eabe76c82df142b6477e68439066cba52d66d875c035a7af6e9d6a2938c8985b82
|
7
|
+
data.tar.gz: 7726aa5152e545cdba1a50ef475f8df0ce37fb97edc2d4fa146c74f73b41c7096434948afeecbe61bc042138cae9c3b94dda475adbf9c74d42892b1d6286e069
|
data/README.md
CHANGED
@@ -179,52 +179,6 @@ journaling. Note that the less-frequently-used methods `toggle`,
|
|
179
179
|
`increment*`, `decrement*`, and `update_counters` are not intercepted at
|
180
180
|
this time.
|
181
181
|
|
182
|
-
### Tagged Events
|
183
|
-
|
184
|
-
Events may be optionally marked as "tagged." This will add a `tags` field, intended for tracing and
|
185
|
-
auditing purposes.
|
186
|
-
|
187
|
-
```ruby
|
188
|
-
class MyEvent
|
189
|
-
include Journaled::Event
|
190
|
-
|
191
|
-
journal_attributes :attr_1, :attr_2, tagged: true
|
192
|
-
end
|
193
|
-
```
|
194
|
-
|
195
|
-
You may then use `Journaled.tag!` and `Journaled.tagged` inside of your
|
196
|
-
`ApplicationController` and `ApplicationJob` classes (or anywhere else!) to tag
|
197
|
-
all events with request and job metadata:
|
198
|
-
|
199
|
-
```ruby
|
200
|
-
class ApplicationController < ActionController::Base
|
201
|
-
before_action do
|
202
|
-
Journaled.tag!(request_id: request.request_id, current_user_id: current_user&.id)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
class ApplicationJob < ActiveJob::Base
|
207
|
-
around_perform do |job, perform|
|
208
|
-
Journaled.tagged(job_id: job.id) { perform.call }
|
209
|
-
end
|
210
|
-
end
|
211
|
-
```
|
212
|
-
|
213
|
-
This feature relies on `ActiveSupport::CurrentAttributes` under the hood, so these tags are local to
|
214
|
-
the current thread, and will be cleared at the end of each request request/job.
|
215
|
-
|
216
|
-
#### Testing
|
217
|
-
|
218
|
-
If you use RSpec (and have required `journaled/rspec` in your
|
219
|
-
`spec/rails_helper.rb`), you can regression-protect important journaling
|
220
|
-
config with the `journal_changes_to` matcher:
|
221
|
-
|
222
|
-
```ruby
|
223
|
-
it "journals exactly these things or there will be heck to pay" do
|
224
|
-
expect(User).to journal_changes_to(:email, :first_name, :last_name, as: :identity_change)
|
225
|
-
end
|
226
|
-
```
|
227
|
-
|
228
182
|
### Custom Journaling
|
229
183
|
|
230
184
|
For every custom implementation of journaling in your application, define the JSON schema for the attributes in your event.
|
@@ -309,6 +263,40 @@ An event like the following will be journaled to kinesis:
|
|
309
263
|
}
|
310
264
|
```
|
311
265
|
|
266
|
+
### Tagged Events
|
267
|
+
|
268
|
+
Events may be optionally marked as "tagged." This will add a `tags` field, intended for tracing and
|
269
|
+
auditing purposes.
|
270
|
+
|
271
|
+
```ruby
|
272
|
+
class MyEvent
|
273
|
+
include Journaled::Event
|
274
|
+
|
275
|
+
journal_attributes :attr_1, :attr_2, tagged: true
|
276
|
+
end
|
277
|
+
```
|
278
|
+
|
279
|
+
You may then use `Journaled.tag!` and `Journaled.tagged` inside of your
|
280
|
+
`ApplicationController` and `ApplicationJob` classes (or anywhere else!) to tag
|
281
|
+
all events with request and job metadata:
|
282
|
+
|
283
|
+
```ruby
|
284
|
+
class ApplicationController < ActionController::Base
|
285
|
+
before_action do
|
286
|
+
Journaled.tag!(request_id: request.request_id, current_user_id: current_user&.id)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
class ApplicationJob < ActiveJob::Base
|
291
|
+
around_perform do |job, perform|
|
292
|
+
Journaled.tagged(job_id: job.id) { perform.call }
|
293
|
+
end
|
294
|
+
end
|
295
|
+
```
|
296
|
+
|
297
|
+
This feature relies on `ActiveSupport::CurrentAttributes` under the hood, so these tags are local to
|
298
|
+
the current thread, and will be cleared at the end of each request request/job.
|
299
|
+
|
312
300
|
### Helper methods for custom events
|
313
301
|
|
314
302
|
Journaled provides a couple helper methods that may be useful in your
|
@@ -352,6 +340,102 @@ Returns one of the following in order of preference:
|
|
352
340
|
In order for this to be most useful, you must configure your controller
|
353
341
|
as described in [Change Journaling](#change-journaling) above.
|
354
342
|
|
343
|
+
### Testing
|
344
|
+
|
345
|
+
If you use RSpec, you can test for journaling behaviors with the
|
346
|
+
`journal_event(s)_including` and `journal_changes_to` matchers. First, make
|
347
|
+
sure to require `journaled/rspec` in your spec setup (e.g.
|
348
|
+
`spec/rails_helper.rb`):
|
349
|
+
|
350
|
+
```ruby
|
351
|
+
require 'journaled/rspec'
|
352
|
+
```
|
353
|
+
|
354
|
+
#### Checking for specific events
|
355
|
+
|
356
|
+
The `journal_event_including` and `journal_events_including` matchers allow you
|
357
|
+
to check for one or more matching event being journaled:
|
358
|
+
|
359
|
+
```ruby
|
360
|
+
expect { my_code }
|
361
|
+
.to journal_event_including(name: 'foo')
|
362
|
+
expect { my_code }
|
363
|
+
.to journal_events_including({ name: 'foo', value: 1 }, { name: 'foo', value: 2 })
|
364
|
+
```
|
365
|
+
|
366
|
+
This will only perform matches on the specified fields (and will not match one
|
367
|
+
way or the other against unspecified fields). These matchers will also ignore
|
368
|
+
any extraneous events that are not positively matched (as they may be unrelated
|
369
|
+
to behavior under test).
|
370
|
+
|
371
|
+
When writing tests, pairing every positive assertion with a negative assertion
|
372
|
+
is a good practice, and so negative matching is also supported (via both
|
373
|
+
`.not_to` and `.to not_`):
|
374
|
+
|
375
|
+
```ruby
|
376
|
+
expect { my_code }
|
377
|
+
.not_to journal_events_including({ name: 'foo' }, { name: 'bar' })
|
378
|
+
expect { my_code }
|
379
|
+
.to raise_error(SomeError)
|
380
|
+
.and not_journal_event_including(name: 'foo') # the `not_` variant can chain off of `.and`
|
381
|
+
```
|
382
|
+
|
383
|
+
Several chainable modifiers are also available:
|
384
|
+
|
385
|
+
```ruby
|
386
|
+
expect { my_code }.to journal_event_including(name: 'foo')
|
387
|
+
.with_schema_name('my_event_schema')
|
388
|
+
.with_partition_key(user.id)
|
389
|
+
.with_stream_name('my_stream_name')
|
390
|
+
.with_enqueue_opts(run_at: future_time)
|
391
|
+
.with_priority(999)
|
392
|
+
```
|
393
|
+
|
394
|
+
All of this can be chained together to test for multiple sets of events with
|
395
|
+
multiple sets of options:
|
396
|
+
|
397
|
+
```ruby
|
398
|
+
expect { subject.journal! }
|
399
|
+
.to journal_events_including({ name: 'event1', value: 300 }, { name: 'event2', value: 200 })
|
400
|
+
.with_priority(10)
|
401
|
+
.and journal_event_including(name: 'event3', value: 100)
|
402
|
+
.with_priority(20)
|
403
|
+
.and not_journal_event_including(name: 'other_event')
|
404
|
+
```
|
405
|
+
|
406
|
+
#### Checking for `Journaled::Changes` declarations
|
407
|
+
|
408
|
+
The `journal_changes_to` matcher checks against the list of attributes specified
|
409
|
+
on the model. It does not actually test that an event is emitted within a given
|
410
|
+
codepath, and is instead intended to guard against accidental regressions that
|
411
|
+
may impact external consumers of these events:
|
412
|
+
|
413
|
+
```ruby
|
414
|
+
it "journals exactly these things or there will be heck to pay" do
|
415
|
+
expect(User).to journal_changes_to(:email, :first_name, :last_name, as: :identity_change)
|
416
|
+
end
|
417
|
+
```
|
418
|
+
|
419
|
+
### Instrumentation
|
420
|
+
|
421
|
+
When an event is enqueued, an `ActiveSupport::Notification` titled
|
422
|
+
`journaled.event.enqueue` is emitted. Its payload will include the `:event` and
|
423
|
+
its background job `:priority`.
|
424
|
+
|
425
|
+
This can be forwarded along to your preferred monitoring solution via a Rails
|
426
|
+
initializer:
|
427
|
+
|
428
|
+
```ruby
|
429
|
+
ActiveSupport::Notifications.subscribe('journaled.event.enqueue') do |*args|
|
430
|
+
payload = ActiveSupport::Notifications::Event.new(*args).payload
|
431
|
+
journaled_event = payload[:event]
|
432
|
+
|
433
|
+
tags = { priority: payload[:priority], event_type: journaled_event.journaled_attributes[:event_type] }
|
434
|
+
|
435
|
+
Statsd.increment('journaled.event.enqueue', tags: tags.map { |k,v| "#{k.to_s[0..64]}:#{v.to_s[0..255]}" })
|
436
|
+
end
|
437
|
+
```
|
438
|
+
|
355
439
|
## Upgrades
|
356
440
|
|
357
441
|
Since this gem relies on background jobs (which can remain in the queue across
|
@@ -26,9 +26,9 @@ class Journaled::Writer
|
|
26
26
|
|
27
27
|
def journal!
|
28
28
|
validate!
|
29
|
-
|
30
|
-
.set(
|
31
|
-
|
29
|
+
ActiveSupport::Notifications.instrument('journaled.event.enqueue', event: journaled_event, priority: job_opts[:priority]) do
|
30
|
+
Journaled::DeliveryJob.set(job_opts).perform_later(**delivery_perform_args)
|
31
|
+
end
|
32
32
|
end
|
33
33
|
|
34
34
|
private
|
@@ -43,6 +43,10 @@ class Journaled::Writer
|
|
43
43
|
schema_validator(journaled_schema_name).validate! serialized_event
|
44
44
|
end
|
45
45
|
|
46
|
+
def job_opts
|
47
|
+
journaled_enqueue_opts.reverse_merge(priority: Journaled.job_priority)
|
48
|
+
end
|
49
|
+
|
46
50
|
def delivery_perform_args
|
47
51
|
{
|
48
52
|
serialized_event: serialized_event,
|
data/lib/journaled/rspec.rb
CHANGED
@@ -16,3 +16,89 @@ RSpec::Matchers.define :journal_changes_to do |*attribute_names, as:|
|
|
16
16
|
"expected #{model_class} not to journal changes to #{attribute_names.map(&:inspect).join(', ')} as #{as.inspect}"
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
RSpec::Matchers.define_negated_matcher :not_journal_changes_to, :journal_changes_to
|
21
|
+
|
22
|
+
RSpec::Matchers.define :journal_events_including do |*expected_events|
|
23
|
+
raise "Please specify at least one expected event. RSpec argument matchers are supported." if expected_events.empty?
|
24
|
+
|
25
|
+
attr_accessor :expected, :actual, :matches, :nonmatches
|
26
|
+
|
27
|
+
chain :with_schema_name, :expected_schema_name
|
28
|
+
chain :with_partition_key, :expected_partition_key
|
29
|
+
chain :with_stream_name, :expected_stream_name
|
30
|
+
chain :with_enqueue_opts, :expected_enqueue_opts
|
31
|
+
chain :with_priority, :expected_priority
|
32
|
+
|
33
|
+
def supports_block_expectations?
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def hash_including_recursive(hash)
|
38
|
+
hash_including(
|
39
|
+
hash.transform_values { |v| v.is_a?(Hash) ? hash_including_recursive(v) : v },
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
match do |block|
|
44
|
+
expected_events = [expected_events.first].flatten(1) unless expected_events.length > 1
|
45
|
+
|
46
|
+
self.expected = expected_events.map { |e| { journaled_attributes: e } }
|
47
|
+
expected.each { |e| e.merge!(journaled_schema_name: expected_schema_name) } if expected_schema_name
|
48
|
+
expected.each { |e| e.merge!(journaled_partition_key: expected_partition_key) } if expected_partition_key
|
49
|
+
expected.each { |e| e.merge!(journaled_stream_name: expected_stream_name) } if expected_stream_name
|
50
|
+
expected.each { |e| e.merge!(journaled_enqueue_opts: expected_enqueue_opts) } if expected_enqueue_opts
|
51
|
+
expected.each { |e| e.merge!(priority: expected_priority) } if expected_priority
|
52
|
+
self.actual = []
|
53
|
+
|
54
|
+
callback = ->(_name, _started, _finished, _unique_id, payload) do
|
55
|
+
event = payload[:event]
|
56
|
+
a = { journaled_attributes: event.journaled_attributes }
|
57
|
+
a[:journaled_schema_name] = event.journaled_schema_name if expected_schema_name
|
58
|
+
a[:journaled_partition_key] = event.journaled_partition_key if expected_partition_key
|
59
|
+
a[:journaled_stream_name] = event.journaled_stream_name if expected_stream_name
|
60
|
+
a[:journaled_enqueue_opts] = event.journaled_enqueue_opts if expected_enqueue_opts
|
61
|
+
a[:priority] = payload[:priority] if expected_priority
|
62
|
+
actual << a
|
63
|
+
end
|
64
|
+
|
65
|
+
ActiveSupport::Notifications.subscribed(callback, 'journaled.event.enqueue', &block)
|
66
|
+
|
67
|
+
self.matches = actual.select do |a|
|
68
|
+
expected.any? { |e| values_match?(hash_including_recursive(e), a) }
|
69
|
+
end
|
70
|
+
|
71
|
+
self.nonmatches = actual - matches
|
72
|
+
|
73
|
+
exact_matches = matches.dup
|
74
|
+
matches.count == expected.count && expected.all? do |e|
|
75
|
+
match, index = exact_matches.each_with_index.find { |a, _| values_match?(hash_including_recursive(e), a) }
|
76
|
+
exact_matches.delete_at(index) if match
|
77
|
+
end && exact_matches.empty?
|
78
|
+
end
|
79
|
+
|
80
|
+
failure_message do
|
81
|
+
<<~MSG
|
82
|
+
Expected the code block to journal exactly one matching event per expected event.
|
83
|
+
|
84
|
+
Expected Events (#{expected.count}):
|
85
|
+
===============================================================================
|
86
|
+
#{expected.map(&:to_json).join("\n ")}
|
87
|
+
===============================================================================
|
88
|
+
|
89
|
+
Matching Events (#{matches.count}):
|
90
|
+
===============================================================================
|
91
|
+
#{matches.map(&:to_json).join("\n ")}
|
92
|
+
===============================================================================
|
93
|
+
|
94
|
+
Non-Matching Events (#{nonmatches.count}):
|
95
|
+
===============================================================================
|
96
|
+
#{nonmatches.map(&:to_json).join("\n ")}
|
97
|
+
===============================================================================
|
98
|
+
MSG
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
RSpec::Matchers.alias_matcher :journal_event_including, :journal_events_including
|
103
|
+
RSpec::Matchers.define_negated_matcher :not_journal_events_including, :journal_events_including
|
104
|
+
RSpec::Matchers.define_negated_matcher :not_journal_event_including, :journal_event_including
|
data/lib/journaled/version.rb
CHANGED
@@ -44,7 +44,7 @@ RSpec.describe Journaled::Changes do
|
|
44
44
|
|
45
45
|
subject { klass.new }
|
46
46
|
|
47
|
-
let(:change_writer) {
|
47
|
+
let(:change_writer) { instance_double(Journaled::ChangeWriter, create: true, update: true, delete: true) }
|
48
48
|
|
49
49
|
before do
|
50
50
|
allow(Journaled::ChangeWriter).to receive(:new) do |opts|
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
3
|
RSpec.describe Journaled::Writer do
|
4
|
+
let(:event_class) { Class.new { include Journaled::Event } }
|
4
5
|
subject { described_class.new journaled_event: journaled_event }
|
5
6
|
|
6
7
|
describe '#initialize' do
|
7
8
|
context 'when the Journaled Event does not implement all the necessary methods' do
|
8
|
-
let(:journaled_event) {
|
9
|
+
let(:journaled_event) { instance_double(event_class) }
|
9
10
|
|
10
11
|
it 'raises on initialization' do
|
11
12
|
expect { subject }.to raise_error RuntimeError, /An enqueued event must respond to/
|
@@ -14,7 +15,8 @@ RSpec.describe Journaled::Writer do
|
|
14
15
|
|
15
16
|
context 'when the Journaled Event returns non-present values for some of the required methods' do
|
16
17
|
let(:journaled_event) do
|
17
|
-
|
18
|
+
instance_double(
|
19
|
+
event_class,
|
18
20
|
journaled_schema_name: nil,
|
19
21
|
journaled_attributes: {},
|
20
22
|
journaled_partition_key: '',
|
@@ -30,7 +32,8 @@ RSpec.describe Journaled::Writer do
|
|
30
32
|
|
31
33
|
context 'when the Journaled Event complies with the API' do
|
32
34
|
let(:journaled_event) do
|
33
|
-
|
35
|
+
instance_double(
|
36
|
+
event_class,
|
34
37
|
journaled_schema_name: :fake_schema_name,
|
35
38
|
journaled_attributes: { foo: :bar },
|
36
39
|
journaled_partition_key: 'fake_partition_key',
|
@@ -71,8 +74,9 @@ RSpec.describe Journaled::Writer do
|
|
71
74
|
|
72
75
|
let(:journaled_enqueue_opts) { {} }
|
73
76
|
let(:journaled_event) do
|
74
|
-
|
75
|
-
|
77
|
+
instance_double(
|
78
|
+
event_class,
|
79
|
+
journaled_schema_name: 'fake_schema_name',
|
76
80
|
journaled_attributes: journaled_event_attributes,
|
77
81
|
journaled_partition_key: 'fake_partition_key',
|
78
82
|
journaled_stream_name: 'my_app_events',
|
@@ -85,7 +89,9 @@ RSpec.describe Journaled::Writer do
|
|
85
89
|
let(:journaled_event_attributes) { { foo: 1 } }
|
86
90
|
|
87
91
|
it 'raises an error and does not enqueue anything' do
|
88
|
-
expect { subject.journal! }
|
92
|
+
expect { subject.journal! }
|
93
|
+
.to raise_error(JSON::Schema::ValidationError)
|
94
|
+
.and not_journal_event_including(anything)
|
89
95
|
expect(enqueued_jobs.count).to eq 0
|
90
96
|
end
|
91
97
|
end
|
@@ -95,7 +101,9 @@ RSpec.describe Journaled::Writer do
|
|
95
101
|
let(:journaled_event_attributes) { { id: 'FAKE_UUID', event_type: 'fake_event', created_at: Time.zone.now, foo: 1 } }
|
96
102
|
|
97
103
|
it 'raises an error and does not enqueue anything' do
|
98
|
-
expect { subject.journal! }
|
104
|
+
expect { subject.journal! }
|
105
|
+
.to raise_error(JSON::Schema::ValidationError)
|
106
|
+
.and not_journal_event_including(anything)
|
99
107
|
expect(enqueued_jobs.count).to eq 0
|
100
108
|
end
|
101
109
|
end
|
@@ -104,7 +112,13 @@ RSpec.describe Journaled::Writer do
|
|
104
112
|
let(:journaled_event_attributes) { { id: 'FAKE_UUID', event_type: 'fake_event', created_at: Time.zone.now, foo: :bar } }
|
105
113
|
|
106
114
|
it 'creates a delivery with the app name passed through' do
|
107
|
-
expect { subject.journal! }
|
115
|
+
expect { subject.journal! }
|
116
|
+
.to change { enqueued_jobs.count }.from(0).to(1)
|
117
|
+
.and journal_event_including(journaled_event_attributes)
|
118
|
+
.with_schema_name('fake_schema_name')
|
119
|
+
.with_partition_key('fake_partition_key')
|
120
|
+
.with_stream_name('my_app_events')
|
121
|
+
.with_enqueue_opts({})
|
108
122
|
expect(enqueued_jobs.first[:args].first).to include('stream_name' => 'my_app_events')
|
109
123
|
end
|
110
124
|
|
@@ -124,6 +138,13 @@ RSpec.describe Journaled::Writer do
|
|
124
138
|
enqueued_jobs.count { |j| j['job_class'] == 'Journaled::DeliveryJob' && j['priority'] == 999 }
|
125
139
|
end
|
126
140
|
}.from(0).to(1)
|
141
|
+
.and journal_event_including(journaled_event_attributes)
|
142
|
+
.with_schema_name('fake_schema_name')
|
143
|
+
.with_partition_key('fake_partition_key')
|
144
|
+
.with_stream_name('my_app_events')
|
145
|
+
.with_priority(999)
|
146
|
+
.and not_journal_event_including(anything)
|
147
|
+
.with_enqueue_opts(priority: 999) # with_enqueue_opts looks at event itself
|
127
148
|
end
|
128
149
|
end
|
129
150
|
|
@@ -138,6 +159,12 @@ RSpec.describe Journaled::Writer do
|
|
138
159
|
enqueued_jobs.count { |j| j['job_class'] == 'Journaled::DeliveryJob' && j['priority'] == 13 }
|
139
160
|
end
|
140
161
|
}.from(0).to(1)
|
162
|
+
.and journal_event_including(journaled_event_attributes)
|
163
|
+
.with_schema_name('fake_schema_name')
|
164
|
+
.with_partition_key('fake_partition_key')
|
165
|
+
.with_stream_name('my_app_events')
|
166
|
+
.with_priority(13)
|
167
|
+
.with_enqueue_opts(priority: 13)
|
141
168
|
end
|
142
169
|
end
|
143
170
|
end
|
@@ -154,7 +181,9 @@ RSpec.describe Journaled::Writer do
|
|
154
181
|
end
|
155
182
|
|
156
183
|
it 'raises an error and does not enqueue anything' do
|
157
|
-
expect { subject.journal! }
|
184
|
+
expect { subject.journal! }
|
185
|
+
.to not_journal_events_including(anything)
|
186
|
+
.and raise_error JSON::Schema::ValidationError
|
158
187
|
expect(enqueued_jobs.count).to eq 0
|
159
188
|
end
|
160
189
|
end
|
@@ -165,7 +194,16 @@ RSpec.describe Journaled::Writer do
|
|
165
194
|
end
|
166
195
|
|
167
196
|
it 'creates a delivery with the app name passed through' do
|
168
|
-
expect { subject.journal! }
|
197
|
+
expect { subject.journal! }
|
198
|
+
.to change { enqueued_jobs.count }.from(0).to(1)
|
199
|
+
.and journal_event_including(journaled_event_attributes)
|
200
|
+
.with_schema_name('fake_schema_name')
|
201
|
+
.with_partition_key('fake_partition_key')
|
202
|
+
.with_stream_name('my_app_events')
|
203
|
+
.with_enqueue_opts({})
|
204
|
+
.with_priority(Journaled.job_priority)
|
205
|
+
.and not_journal_event_including(anything)
|
206
|
+
.with_enqueue_opts(priority: Journaled.job_priority)
|
169
207
|
expect(enqueued_jobs.first[:args].first).to include('stream_name' => 'my_app_events')
|
170
208
|
end
|
171
209
|
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: 4.
|
4
|
+
version: 4.3.0
|
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: 2022-
|
14
|
+
date: 2022-04-07 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activejob
|