zeebe_bpmn_rspec 0.1.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21f042c1e3d81e8f0bc9096924685cdd8c436de1a5a68e1cef9857e3f4e87a58
4
- data.tar.gz: fe32bf072bc3677667e1ed6ac49c92e2cd48647ad5adfabd546a7a94ea253eef
3
+ metadata.gz: a8ab5c676ef52ca21100add177726c7443298348603c89e8a53e1692b2876e21
4
+ data.tar.gz: a9a7acca330b1377991b524cb9e31d91ccd7599ef0391ca58aef6700dc7da168
5
5
  SHA512:
6
- metadata.gz: 34a5334740649b53d9199e74009fb6e233ac34667b33c8e012f9c30fa168f470626c5d199a83f83032deae764a3408a33b6df3ce620ee427895d0d9bcc60f7c7
7
- data.tar.gz: 1688746402718b8d1d38868f8271782af51be446bc3ba4d62b953ca9c049afa1933d4614ce9203294aa46286efaa74a54fd88b377c8df32f09e9c932acea8179
6
+ metadata.gz: aae2aa7d081b9dd5cc342f955f060b0a605f23c680b3a7b9368857fc08ada31a58fb047cdd41e419d8394127786b29b76486c8feb0ce5aef1925e9ee3f88237d
7
+ data.tar.gz: 5639b3ee712ea0af3b961e3402d5c606d3b26f55279785d844909030557fa8054c2ab344c62d10afcf020408055c58491eba9dcfc288eef673d37fd5d3eca799
@@ -1,4 +1,26 @@
1
1
  # zeebe_bpmn_rspec
2
2
 
3
+ ## v0.4.1
4
+ - Allow `with_workflow_instance` to be called without a block.
5
+ - Allow `worker` to be specified when activating a job.
6
+ - Expose `workflow_instance_key` for activated jobs.
7
+
8
+ ## v0.4.0
9
+ - Add `ttl_ms` option for `publish_message`.
10
+ - Add `update_retries` method to `ActivatedJob` class.
11
+ - Add `set_variables` helper.
12
+ - Add support for `:fetch_variables` option when activating jobs.
13
+
14
+ ## v0.3.1
15
+ - Use consistent activate request timeout.
16
+ - Provide a better error when a job is not activated.
17
+
18
+ ## v0.3.0
19
+ - Add custom matchers, `have_variables`, `have_headers`, and `have_activated`.
20
+
21
+ ## v0.2.0
22
+ - Add `retries` option to `ActivatedJob#and_fail`.
23
+ - Add method aliases: `and_complete` (`complete`), `and_fail` (`fail`), `and_throw_error` (`throw_error`).
24
+
3
25
  ## v0.1.0
4
26
  - Initial version
data/README.md CHANGED
@@ -39,6 +39,8 @@ end
39
39
 
40
40
  The gem adds the following helper methods to RSpec.
41
41
 
42
+ The gem also defines [Custom Matchers](#custom-matchers).
43
+
42
44
  ### Deploy Workflow
43
45
 
44
46
  The `deploy_workflow` method requires a path to a BPMN file and deploys it to Zeebe. There is no support for
@@ -118,7 +120,7 @@ activate_job("my_job").
118
120
 
119
121
  #### Complete Job
120
122
 
121
- Jobs can be completed by calling `and_complete`. Variables can optionally be returned with the
123
+ Jobs can be completed by calling `and_complete` (also aliased as `complete`). Variables can optionally be returned with the
122
124
  completed job.
123
125
 
124
126
  ```ruby
@@ -134,7 +136,7 @@ project_job("my_job").
134
136
 
135
137
  #### Fail Job
136
138
 
137
- Jobs can be failed by calling `and_fail`. An optional message can be specified when failing a job.
139
+ Jobs can be failed by calling `and_fail` (also aliased as `fail`). An optional message can be specified when failing a job.
138
140
 
139
141
  ```ruby
140
142
  # Failing a job can be chanined with expectations
@@ -147,9 +149,27 @@ activate_job("my_job").
147
149
  and_fail("something didn't go right")
148
150
  ```
149
151
 
152
+ By default retries are set to zero when a job is failed but the remaining retries can optionally be specified:
153
+
154
+ ```ruby
155
+ job = activate_job("my_job")
156
+
157
+ job.fail(retries: 1)
158
+ ```
159
+
160
+ #### Update Retries
161
+
162
+ The retries for a job can also be modified using the `update_retries` method:
163
+
164
+ ```ruby
165
+ job = activate_job("my_job")
166
+
167
+ job.update_retries(3)
168
+ ```
169
+
150
170
  #### Throw Error
151
171
 
152
- The `and_throw_error` method can be used to throw an error for a job. The error code is required and an
172
+ The `and_throw_error` (also aliased as `throw_error`) method can be used to throw an error for a job. The error code is required and an
153
173
  optional message may be specified:
154
174
 
155
175
  ```ruby
@@ -165,7 +185,18 @@ activate_job("my_job").
165
185
 
166
186
  #### Activating Multiple Jobs
167
187
 
168
- TODO
188
+ Multiple jobs can be activated using the `activate_jobs` method.
189
+
190
+ ```ruby
191
+ activate_jobs("my_job")
192
+ ```
193
+
194
+ The call to `activate_jobs` returns an Enumerator that returns `ActivatedJob` instance.
195
+ The maximum number of jobs to return can be specified:
196
+
197
+ ```ruby
198
+ jobs = activate_jobs("my_job", max_jobs: 2).to_a
199
+ ```
169
200
 
170
201
  ### Workflow Complete
171
202
 
@@ -198,6 +229,143 @@ publish_message("message_name", correlation_key: expected_value,
198
229
  variables: { foo: "bar" })
199
230
  ```
200
231
 
232
+ The time-to-live (in milliseconds) cna also be specified for a message.
233
+ It defaults to 5000 milliseconds if unspecified.
234
+
235
+ ```ruby
236
+ publish_message("message_name", correlation_key: expected_value, ttl_ms: 1000)
237
+ ```
238
+
239
+ ### Set Variables
240
+
241
+ The `set_variables` method can be used to set variables for a specified
242
+ scope in Zeebe:
243
+
244
+ ```ruby
245
+ # workflow_instance_key is a method that returns the key for the current workflow instance
246
+ set_variables(workflow_instance_key, { foo: "bar" })
247
+ ```
248
+
249
+ An activated job can be used to determine the key for the task that it is associated with:
250
+
251
+ ```ruby
252
+ job = job_with_type("my_type")
253
+ set_variables(job.task_key, { foo: "baz"})
254
+ ```
255
+
256
+ Variables default to being local to the scope on which they are set. This
257
+ can be overridden by specifying the `:local` option:
258
+
259
+ ```ruby
260
+ set_variables(job.task_key, { foo: "baz"}, local: false)
261
+ ```
262
+
263
+ ### Custom Matchers
264
+
265
+ In addition to the helpers documented above, this gem defines custom RSpec matchers to provide a more typical
266
+ experience of expectations and matchers.
267
+
268
+ #### expect_job_of_type
269
+
270
+ The `expect_job_of_type` helper is a convenient wrapper to activate a job and set an expectation target.
271
+
272
+ ```ruby
273
+ expect_job_of_type("my_type")
274
+ ```
275
+
276
+ Similar to the `activate_job` helper, it activates a job and wraps the result in an `ActivatedJob` object.
277
+ That object is then passed to `expect()`. Unlike `activate_job`, this helper does not raise if there is no job activated.
278
+
279
+ This is equivalent to `expect(job_with_type("my_type")` or `expect(activate_job("my_type", validate: false))`.
280
+
281
+ `expect_job_of_type` is expected to be used with the matchers below.
282
+
283
+ #### have_activated
284
+
285
+ The `have_activated` matcher checks that the target represents an activated job. It will raise an error if no job
286
+ was activated.
287
+
288
+ ```ruby
289
+ expect_job_of_type("my_type").to have_activated
290
+ ```
291
+
292
+ Various additional methods can be chained on the `have_activated` matcher.
293
+
294
+ The `with_variables` method can be used to check the input variables that the job was activated with:
295
+
296
+ ```ruby
297
+ expect_job_of_type("my_type").to have_activated.with_variables(user_id: 123)
298
+ ```
299
+
300
+ The `with_headers` method can be used to check the headers that the job was activated with:
301
+
302
+ ```ruby
303
+ expect_job_of_type("my_type").to have_activated.with_headers(id_type: "user")
304
+ ```
305
+
306
+ The `with_variables` and `with_headers` methods can be chained on the same expectation:
307
+
308
+ ```ruby
309
+ expect_job_of_type("my_type").to have_activated.
310
+ with_variables(user_id: 123).
311
+ with_headers(id_type: "user")
312
+ ```
313
+
314
+ The matcher also supports methods to complete, fail, or throw an error for a job:
315
+
316
+ ```ruby
317
+ # Complete
318
+ expect_job_of_type("my_type").to have_activated.and_complete
319
+
320
+ # Complete with new variables
321
+ expect_job_of_type("my_type").to have_activated.and_complete(result_code: 456)
322
+
323
+ # Fail (sets retries to 0 by default)
324
+ expect_job_of_type("my_type").to have_activated.and_fail
325
+
326
+ # Fail and specify retries
327
+ expect_job_of_type("my_type").to have_activated.and_fail(retries: 1)
328
+
329
+ # Fail with an error message
330
+ expect_job_of_type("my_type").to have_activated.and_fail("boom!")
331
+
332
+ # Fail with an error message and specify retries
333
+ expect_job_of_type("my_type").to have_activated.and_fail("boom!", retries: 2)
334
+
335
+ # Throw an error (error code is required)
336
+ expect_job_of_type("my_type").to have_activated.and_throw_error("MY_ERROR")
337
+
338
+ # Throw an error with an error message
339
+ expect_job_of_type("my_type").to have_activated.and_throw_error("MY_ERROR", "went horribly wrong")
340
+ ```
341
+
342
+ Only one of `and_complete`, `and_fail`, or `and_throw_error` can be specified for a single expectation.
343
+
344
+ #### have_variables and have_headers
345
+
346
+ In addition to the `with_variables` and `with_headers` methods that can be chained onto the `have_activated`
347
+ matcher, there are matchers that can be used directly to set expectations on the variables or
348
+ headers for an `ActivatedJob`.
349
+
350
+ ```ruby
351
+ job = activate_job("my_type")
352
+
353
+ expect(job).to have_variables(user: 123)
354
+ expect(job).to have_headers(id_type: "user")
355
+ ```
356
+
357
+ ## Tips & Tricks
358
+
359
+ ### Enumerator for Multiple Jobs
360
+
361
+ When activating multiple jobs, call `to_a` on the result of `activate_jobs` to get
362
+ an array of activated jobs objects.
363
+
364
+ ### Timer Duration
365
+
366
+ Specify timer durations using a variable so that tests can easily set the variable
367
+ to specify a short duration.
368
+
201
369
  ## Limitations
202
370
 
203
371
  The current gem and approach have some limitations:
@@ -6,7 +6,7 @@ x-environment: &default-environment
6
6
  PRYRC: /usr/src/app/.docker-pryrc
7
7
  BUNDLE_IGNORE_CONFIG: 1
8
8
  BUNDLE_DISABLE_SHARED_GEMS: "true"
9
- ZEEBE_ADDRESS: zeebe-bpmn-gateway:26500
9
+ ZEEBE_ADDRESS: zeebe:26500
10
10
  x-service: &default-service
11
11
  image: ruby:2.6.6
12
12
  volumes:
@@ -18,7 +18,7 @@ x-service: &default-service
18
18
  stdin_open: true
19
19
  services:
20
20
  zeebe:
21
- image: camunda/zeebe:0.23.2
21
+ image: camunda/zeebe:${ZEEBE_VERSION:-0.24.1}
22
22
  environment:
23
23
  ZEEBE_LOG_LEVEL: debug
24
24
  volumes:
@@ -28,8 +28,8 @@ services:
28
28
  monitor:
29
29
  image: camunda/zeebe-simple-monitor:0.19.0
30
30
  environment:
31
- - zeebe.client.broker.contactPoint=zeebe-bpmn-gateway:26500
32
- - zeebe.client.worker.hazelcast.connection=zeebe-bpmn-gateway:5701
31
+ - zeebe.client.broker.contactPoint=zeebe:26500
32
+ - zeebe.client.worker.hazelcast.connection=zeebe:5701
33
33
  ports:
34
34
  - "8082:8082"
35
35
  depends_on:
@@ -4,11 +4,12 @@ require "rspec"
4
4
  require "zeebe/client"
5
5
  require "zeebe_bpmn_rspec/helpers"
6
6
  require "zeebe_bpmn_rspec/version"
7
+ require "zeebe_bpmn_rspec/matchers/have_activated"
7
8
 
8
9
  # Top-level gem module
9
10
  module ZeebeBpmnRspec
10
11
  class << self
11
- attr_writer :client, :zeebe_address
12
+ attr_writer :client, :zeebe_address, :activate_request_timeout
12
13
 
13
14
  def configure
14
15
  yield(self)
@@ -23,6 +24,10 @@ module ZeebeBpmnRspec
23
24
  def zeebe_address
24
25
  @zeebe_address || ENV["ZEEBE_ADDRESS"] || (raise "zeebe_address must be set")
25
26
  end
27
+
28
+ def activate_request_timeout
29
+ @activate_request_timeout || 1000
30
+ end
26
31
  end
27
32
  end
28
33
 
@@ -8,27 +8,50 @@ module ZeebeBpmnRspec
8
8
  class ActivatedJob
9
9
  include ::Zeebe::Client::GatewayProtocol # for direct reference of request classes
10
10
 
11
- attr_reader :job, :type, :workflow_instance_key
11
+ attr_reader :job, :type
12
12
 
13
- def initialize(job, type:, workflow_instance_key:, client:, context:)
13
+ def initialize(job, type:, workflow_instance_key:, client:, context:, validate:) # rubocop:disable Metrics/ParameterLists
14
14
  @job = job
15
15
  @type = type
16
16
  @workflow_instance_key = workflow_instance_key
17
17
  @client = client
18
18
  @context = context
19
19
 
20
- context.instance_eval do
21
- aggregate_failures do
22
- expect(job.workflowInstanceKey).to eq(workflow_instance_key)
23
- expect(job.type).to eq(type)
20
+ if validate
21
+ context.instance_eval do
22
+ expect(job).not_to be_nil, "expected to receive job of type '#{type}' but received none"
23
+ aggregate_failures do
24
+ expect(job.workflowInstanceKey).to eq(workflow_instance_key)
25
+ expect(job.type).to eq(type)
26
+ end
24
27
  end
25
28
  end
26
29
  end
27
30
 
31
+ def raw
32
+ job
33
+ end
34
+
28
35
  def key
29
36
  job.key
30
37
  end
31
38
 
39
+ def workflow_instance_key
40
+ job.workflowInstanceKey
41
+ end
42
+
43
+ def retries
44
+ job.retries
45
+ end
46
+
47
+ def task_key
48
+ job.elementInstanceKey
49
+ end
50
+
51
+ def to_s
52
+ raw.to_s
53
+ end
54
+
32
55
  def variables
33
56
  @_variables ||= JSON.parse(job.variables)
34
57
  end
@@ -66,16 +89,18 @@ module ZeebeBpmnRspec
66
89
  }.compact
67
90
  ))
68
91
  end
92
+ alias throw_error and_throw_error
69
93
 
70
- def and_fail(message = nil)
94
+ def and_fail(message = nil, retries: nil)
71
95
  client.fail_job(FailJobRequest.new(
72
96
  {
73
97
  jobKey: job.key,
74
- retries: 0,
98
+ retries: retries || 0,
75
99
  errorMessage: message,
76
100
  }.compact
77
101
  ))
78
102
  end
103
+ alias fail and_fail
79
104
 
80
105
  def and_complete(variables = {})
81
106
  client.complete_job(CompleteJobRequest.new(
@@ -83,6 +108,14 @@ module ZeebeBpmnRspec
83
108
  variables: variables.to_json
84
109
  ))
85
110
  end
111
+ alias complete and_complete
112
+
113
+ def update_retries(retries = 1)
114
+ client.update_job_retries(UpdateJobRetriesRequest.new(
115
+ jobKey: job.key,
116
+ retries: retries
117
+ ))
118
+ end
86
119
 
87
120
  private
88
121
 
@@ -26,7 +26,7 @@ module ZeebeBpmnRspec
26
26
  variables: variables.to_json
27
27
  ))
28
28
  @__workflow_instance_key = workflow.workflowInstanceKey
29
- yield(workflow.workflowInstanceKey)
29
+ yield(workflow.workflowInstanceKey) if block_given?
30
30
  rescue Exception => e # rubocop:disable Lint/RescueException
31
31
  # exceptions are rescued to ensure that instances are cancelled
32
32
  # any error is re-raised below
@@ -64,37 +64,46 @@ module ZeebeBpmnRspec
64
64
  @__workflow_instance_key
65
65
  end
66
66
 
67
- def activate_job(type)
68
- stream = _zeebe_client.activate_jobs(ActivateJobsRequest.new(
69
- type: type,
70
- worker: "#{type}-#{SecureRandom.hex}",
71
- maxJobsToActivate: 1,
72
- timeout: 5000, # TODO: configure
73
- requestTimeout: 5000
74
- ))
67
+ def activate_job(type, fetch_variables: nil, validate: true, worker: "#{type}-#{SecureRandom.hex}")
68
+ stream = _zeebe_client.activate_jobs(ActivateJobsRequest.new({
69
+ type: type,
70
+ worker: worker,
71
+ maxJobsToActivate: 1,
72
+ timeout: 1000,
73
+ fetchVariable: fetch_variables&.then { |v| Array(v) },
74
+ requestTimeout: ZeebeBpmnRspec.activate_request_timeout,
75
+ }.compact))
75
76
 
76
77
  job = nil
77
78
  stream.find { |response| job = response.jobs.first }
78
- raise "No job with type #{type.inspect} found" if job.nil?
79
-
80
79
  # puts job.inspect # support debug logging?
81
80
 
82
81
  ActivatedJob.new(job,
83
82
  type: type,
84
83
  workflow_instance_key: workflow_instance_key,
85
84
  client: _zeebe_client,
86
- context: self)
85
+ context: self,
86
+ validate: validate)
87
87
  end
88
88
  alias process_job activate_job
89
89
  # TODO: deprecate process_job
90
90
 
91
- def activate_jobs(type, max_jobs: nil)
91
+ def job_with_type(type, fetch_variables: nil)
92
+ activate_job(type, fetch_variables: fetch_variables, validate: false)
93
+ end
94
+
95
+ def expect_job_of_type(type, fetch_variables: nil)
96
+ expect(job_with_type(type, fetch_variables: fetch_variables))
97
+ end
98
+
99
+ def activate_jobs(type, max_jobs: nil, fetch_variables: nil)
92
100
  stream = _zeebe_client.activate_jobs(ActivateJobsRequest.new({
93
101
  type: type,
94
102
  worker: "#{type}-#{SecureRandom.hex}",
95
103
  maxJobsToActivate: max_jobs,
96
- timeout: 5000, # TODO: configure
97
- requestTimeout: 5000,
104
+ timeout: 1000,
105
+ fetchVariable: fetch_variables&.then { |v| Array(v) },
106
+ requestTimeout: ZeebeBpmnRspec.activate_request_timeout,
98
107
  }.compact))
99
108
 
100
109
  Enumerator.new do |yielder|
@@ -104,23 +113,32 @@ module ZeebeBpmnRspec
104
113
  type: type,
105
114
  workflow_instance_key: workflow_instance_key,
106
115
  client: _zeebe_client,
107
- context: self)
116
+ context: self,
117
+ validate: true)
108
118
  end
109
119
  end
110
120
  end
111
121
  end
112
122
 
113
- def publish_message(name, correlation_key:, variables: nil)
123
+ def publish_message(name, correlation_key:, variables: nil, ttl_ms: 5000)
114
124
  _zeebe_client.publish_message(PublishMessageRequest.new(
115
125
  {
116
126
  name: name,
117
127
  correlationKey: correlation_key,
118
- timeToLive: 5000,
128
+ timeToLive: ttl_ms,
119
129
  variables: variables&.to_json,
120
130
  }.compact
121
131
  ))
122
132
  end
123
133
 
134
+ def set_variables(key, variables, local: true)
135
+ _zeebe_client.set_variables(SetVariablesRequest.new(
136
+ elementInstanceKey: key,
137
+ variables: variables.to_json,
138
+ local: local
139
+ ))
140
+ end
141
+
124
142
  def reset_zeebe!
125
143
  @__workflow_instance_key = nil
126
144
  end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeebe_bpmn_rspec/matchers/have_variables"
4
+ require "zeebe_bpmn_rspec/matchers/have_headers"
5
+
6
+ module ZeebeBpmnRspec
7
+ class HaveActivatedMatcherError < StandardError
8
+ def initialize
9
+ super("Only one of complete, fail, and throw error can be specified")
10
+ end
11
+ end
12
+ end
13
+
14
+ # rubocop:disable Metrics/BlockLength
15
+ RSpec::Matchers.define :have_activated do
16
+ match do |job|
17
+ @job = job
18
+
19
+ @matcher_error = nil
20
+ begin
21
+ aggregate_failures "activated job#{of_type(job)}" do
22
+ unless job.is_a?(ZeebeBpmnRspec::ActivatedJob)
23
+ raise ArgumentError.new("expectation target must be a "\
24
+ "#{ZeebeBpmnRspec::ActivatedJob.name}, got #{job.inspect}")
25
+ end
26
+
27
+ if job.raw.nil?
28
+ raise RSpec::Expectations::ExpectationNotMetError.new("expected activated job#{of_type(job)}, got nil")
29
+ end
30
+
31
+ expect(job).to have_variables(@variables) if @variables
32
+ expect(job).to have_headers(@headers) if @headers
33
+ end
34
+ rescue Exception => e # rubocop:disable Lint/RescueException
35
+ @matcher_error = e
36
+ end
37
+ return false if @matcher_error
38
+
39
+ if @complete
40
+ job.complete(@output || {})
41
+ elsif @fail
42
+ job.fail(@fail_message, retries: @retries)
43
+ elsif @throw
44
+ job.throw_error(@error_code, @throw_message)
45
+ end
46
+
47
+ true
48
+ end
49
+
50
+ def of_type(job)
51
+ job.respond_to?(:type) ? " of type #{job.type}" : nil
52
+ end
53
+
54
+ failure_message do |_job|
55
+ raise matcher_error
56
+ end
57
+
58
+ attr_reader :job, :matcher_error
59
+
60
+ def predestined?
61
+ @complete || @fail || @throw
62
+ end
63
+
64
+ def check_predestined!
65
+ raise ZeebeBpmnRspec::HaveActivatedMatcherError.new if predestined?
66
+ end
67
+
68
+ chain :with_variables do |variables|
69
+ @variables = variables.is_a?(Hash) ? variables.stringify_keys : variables
70
+ end
71
+
72
+ chain :with_headers do |headers|
73
+ @headers = headers.is_a?(Hash) ? headers.stringify_keys : headers
74
+ end
75
+
76
+ chain :and_complete do |output = nil|
77
+ check_predestined!
78
+
79
+ @output = output
80
+ @complete = true
81
+ end
82
+
83
+ chain :and_fail do |message = nil, retries: 0|
84
+ check_predestined!
85
+
86
+ @fail_message = message
87
+ @retries = retries
88
+ @fail = true
89
+ end
90
+
91
+ chain :and_throw_error do |error_code, message = nil|
92
+ check_predestined!
93
+
94
+ @error_code = error_code
95
+ @throw_message = message
96
+ @throw = true
97
+ end
98
+ end
99
+ # rubocop:enable Metrics/BlockLength
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec::Matchers.define :have_headers do
4
+ match do |actual|
5
+ @job = actual
6
+ @actual = @job.headers
7
+ values_match?(expected, @actual)
8
+ end
9
+
10
+ failure_message do |_actual|
11
+ "expected that job:\n #{@job}\n\nwould have headers #{expected}"
12
+ end
13
+
14
+ diffable
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec::Matchers.define :have_variables do |expected|
4
+ match do |actual|
5
+ @job = actual
6
+ @actual = @job.variables
7
+ values_match?(expected, @actual)
8
+ end
9
+
10
+ failure_message do |_actual|
11
+ "expected that job:\n #{@job}\n\nwould have variables #{expected}"
12
+ end
13
+
14
+ diffable
15
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ZeebeBpmnRspec
4
- VERSION = "0.1.0"
4
+ VERSION = "0.4.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zeebe_bpmn_rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ezCater, Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-21 00:00:00.000000000 Z
11
+ date: 2020-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -152,6 +152,9 @@ files:
152
152
  - lib/zeebe_bpmn_rspec.rb
153
153
  - lib/zeebe_bpmn_rspec/activated_job.rb
154
154
  - lib/zeebe_bpmn_rspec/helpers.rb
155
+ - lib/zeebe_bpmn_rspec/matchers/have_activated.rb
156
+ - lib/zeebe_bpmn_rspec/matchers/have_headers.rb
157
+ - lib/zeebe_bpmn_rspec/matchers/have_variables.rb
155
158
  - lib/zeebe_bpmn_rspec/version.rb
156
159
  - zeebe_bpmn_rspec.gemspec
157
160
  homepage: https://github.com/ezcater/zeebe_bpmn_rspec
@@ -174,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
177
  - !ruby/object:Gem::Version
175
178
  version: '0'
176
179
  requirements: []
177
- rubygems_version: 3.1.4
180
+ rubygems_version: 3.0.3
178
181
  signing_key:
179
182
  specification_version: 4
180
183
  summary: Zeebe BPMN testing using RSpec