dwf 0.1.10 → 0.1.11

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.
@@ -2,22 +2,23 @@
2
2
 
3
3
  require 'spec_helper'
4
4
  require 'mock_redis'
5
- class AItem < Dwf::Item; end
6
-
7
- class BItem < Dwf::Item; end
8
-
9
- class CItem < Dwf::Item; end
5
+ AItem = Class.new(Dwf::Item)
6
+ BItem = Class.new(Dwf::Item)
7
+ CItem = Class.new(Dwf::Item)
8
+ SWorkflow = Class.new(Dwf::Workflow)
10
9
 
11
10
  describe Dwf::Workflow, workflow: true do
12
11
  let(:workflow_id) { SecureRandom.uuid }
13
12
  let(:item_id) { SecureRandom.uuid }
13
+ let(:item) { nil }
14
14
  let(:client) do
15
15
  double(
16
16
  persist_workflow: nil,
17
17
  persist_job: nil,
18
18
  build_workflow_id: workflow_id,
19
19
  build_job_id: item_id,
20
- find_workflow: nil
20
+ find_workflow: nil,
21
+ find_node: item
21
22
  )
22
23
  end
23
24
  before do
@@ -90,6 +91,7 @@ describe Dwf::Workflow, workflow: true do
90
91
 
91
92
  before do
92
93
  workflow.run AItem, after: BItem, before: CItem
94
+ workflow.run SWorkflow, after: AItem
93
95
  end
94
96
 
95
97
  it do
@@ -102,6 +104,10 @@ describe Dwf::Workflow, workflow: true do
102
104
  {
103
105
  from: "AItem|#{item_id}",
104
106
  to: CItem.to_s
107
+ },
108
+ {
109
+ from: AItem.to_s,
110
+ to: "SWorkflow|#{workflow_id}"
105
111
  }
106
112
  ]
107
113
  expect(workflow.dependencies).to match_array expected
@@ -134,25 +140,26 @@ describe Dwf::Workflow, workflow: true do
134
140
  before do
135
141
  workflow.run AItem
136
142
  workflow.run BItem, after: AItem
137
- workflow.run CItem, after: BItem
143
+ workflow.run SWorkflow, after: BItem
144
+ workflow.run CItem, after: SWorkflow
138
145
 
139
146
  workflow.send(:setup)
140
147
  end
141
148
 
142
149
  it do
143
- job_a = workflow.find_job('AItem')
150
+ job_a = workflow.find_job("AItem")
144
151
 
145
152
  expect(job_a.incoming).to be_empty
146
153
  expect(job_a.outgoing).to eq ["BItem|#{item_id}"]
147
154
 
148
155
  job_b = workflow.find_job('BItem')
149
156
 
150
- expect(job_b.incoming).to eq ['AItem']
151
- expect(job_b.outgoing).to eq ["CItem|#{item_id}"]
157
+ expect(job_b.incoming).to eq ["AItem|#{item_id}"]
158
+ expect(job_b.outgoing).to eq ["SWorkflow|#{workflow_id}"]
152
159
 
153
160
  job_c = workflow.find_job('CItem')
154
161
 
155
- expect(job_c.incoming).to eq ['BItem']
162
+ expect(job_c.incoming).to eq ["SWorkflow|#{workflow_id}"]
156
163
  expect(job_c.outgoing).to be_empty
157
164
  end
158
165
  end
@@ -160,11 +167,11 @@ describe Dwf::Workflow, workflow: true do
160
167
  describe '#callback_type' do
161
168
  let!(:workflow) { described_class.new }
162
169
 
163
- it {
170
+ it do
164
171
  expect(workflow.callback_type).to eq described_class::BUILD_IN
165
172
  workflow.callback_type = described_class::SK_BATCH
166
173
  expect(workflow.callback_type).to eq described_class::SK_BATCH
167
- }
174
+ end
168
175
  end
169
176
 
170
177
  describe '#reload' do
@@ -181,4 +188,162 @@ describe Dwf::Workflow, workflow: true do
181
188
 
182
189
  it { expect(client).to have_received(:find_workflow).with(workflow_id) }
183
190
  end
191
+
192
+ describe '#parents_succeeded?' do
193
+ let(:incoming) { ["A|#{SecureRandom.uuid}"] }
194
+ let!(:workflow) do
195
+ flow = described_class.new
196
+ flow.parent_id = SecureRandom.uuid
197
+ flow.incoming = incoming
198
+ flow
199
+ end
200
+ let(:item) do
201
+ Dwf::Item.new(
202
+ workflow_id: SecureRandom.uuid,
203
+ id: SecureRandom.uuid,
204
+ finished_at: finished_at
205
+ )
206
+ end
207
+
208
+ context 'parent jobs already finished' do
209
+ let(:finished_at) { Time.now.to_i }
210
+
211
+ it do
212
+ expect(workflow.parents_succeeded?).to be_truthy
213
+ expect(client).to have_received(:find_node)
214
+ .with(incoming.first, workflow.parent_id)
215
+ end
216
+ end
217
+
218
+ context 'parent jobs havent finished yet' do
219
+ let(:finished_at) { nil }
220
+
221
+ it do
222
+ expect(workflow.parents_succeeded?).to be_falsy
223
+ expect(client)
224
+ .to have_received(:find_node)
225
+ .with(incoming.first, workflow.parent_id)
226
+ end
227
+ end
228
+ end
229
+
230
+ describe '#sub_workflow?' do
231
+ let!(:workflow) { described_class.new }
232
+ let!(:sub_workflow) do
233
+ flow = described_class.new
234
+ flow.parent_id = workflow.id
235
+ flow
236
+ end
237
+
238
+ specify do
239
+ expect(workflow.sub_workflow?).to be_falsy
240
+ expect(sub_workflow.sub_workflow?).to be_truthy
241
+ end
242
+ end
243
+
244
+ describe '#payloads' do
245
+ let!(:item) do
246
+ Dwf::Item.new(
247
+ workflow_id: SecureRandom.uuid,
248
+ id: SecureRandom.uuid,
249
+ output_payload: 1
250
+ )
251
+ end
252
+ let(:workflow) { described_class.new }
253
+
254
+ context 'when workflow is main flow' do
255
+ it { expect(workflow.payloads).to be_nil }
256
+ end
257
+
258
+ context 'when workflow is sub flow' do
259
+ before do
260
+ workflow.incoming = incoming
261
+ workflow.parent_id = SecureRandom.uuid
262
+ end
263
+
264
+ context 'when incoming blank' do
265
+ let(:incoming) { [] }
266
+ it { expect(workflow.payloads).to be_nil }
267
+ end
268
+
269
+ context 'when incoming present' do
270
+ let(:incoming) { ["Dwf::Item|#{SecureRandom.uuid}", "Dwf::Workflow|#{workflow_id}"] }
271
+ it do
272
+ expected_payload = [
273
+ {
274
+ class: item.class.name,
275
+ id: item.name,
276
+ output: 1
277
+ }
278
+ ]
279
+ expect(workflow.payloads).to eq expected_payload
280
+ expect(client).to have_received(:find_node).with(incoming.first, workflow.parent_id)
281
+ end
282
+ end
283
+ end
284
+ end
285
+
286
+ describe '#left?' do
287
+ let(:workflow) { described_class.new }
288
+ before { workflow.outgoing = outgoing }
289
+
290
+ context 'when item has outgoing item' do
291
+ let(:outgoing) { ["Dwf::Item|#{SecureRandom.uuid}"] }
292
+ it { expect(workflow.leaf?).to be_falsy }
293
+ end
294
+
295
+ context 'when item does not have outgoing item' do
296
+ let(:outgoing) { [] }
297
+ it { expect(workflow.leaf?).to be_truthy }
298
+ end
299
+ end
300
+
301
+ describe '#leaf_nodes' do
302
+ let!(:workflow) { described_class.new }
303
+ before do
304
+ workflow.run AItem
305
+ workflow.run BItem, after: AItem
306
+ workflow.run SWorkflow, after: BItem
307
+ workflow.run CItem, after: SWorkflow
308
+
309
+ workflow.send(:setup)
310
+ end
311
+
312
+ specify do
313
+ expect(workflow.leaf_nodes.count).to eq 1
314
+ expect(workflow.leaf_nodes.first).to be_kind_of CItem
315
+ end
316
+ end
317
+
318
+ describe '#output_payloads' do
319
+ let!(:workflow) { described_class.new }
320
+ before do
321
+ allow_any_instance_of(CItem).to receive(:output_payload).and_return 1
322
+ workflow.run AItem
323
+ workflow.run BItem, after: AItem
324
+ workflow.run SWorkflow, after: BItem
325
+ workflow.run CItem, after: SWorkflow
326
+
327
+ workflow.send(:setup)
328
+ end
329
+
330
+ it { expect(workflow.output_payload).to eq [1] }
331
+ end
332
+
333
+ describe '#callback_type=' do
334
+ let!(:workflow) { described_class.new }
335
+ before do
336
+ workflow.run AItem
337
+ workflow.run BItem, after: AItem
338
+
339
+ workflow.send(:setup)
340
+ workflow.callback_type = described_class::SK_BATCH
341
+ end
342
+
343
+ specify do
344
+ expect(workflow.callback_type).to eq described_class::SK_BATCH
345
+ job_callback_types = workflow.jobs.map(&:callback_type).uniq
346
+ expect(job_callback_types).to eq [described_class::SK_BATCH]
347
+ end
348
+ end
184
349
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  require 'dwf'
2
+ require 'simplecov'
3
+
4
+ SimpleCov.start
2
5
  # This file was generated by the `rspec --init` command. Conventionally, all
3
6
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
7
  # The generated `.rspec` file contains `--require spec_helper` which will cause
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dwf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - dthtien
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-12 00:00:00.000000000 Z
11
+ date: 2021-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 11.1.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: mock_redis
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.27.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.27.2
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: redis
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -53,33 +67,33 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '3.2'
55
69
  - !ruby/object:Gem::Dependency
56
- name: mock_redis
70
+ name: sidekiq
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: 0.27.2
62
- type: :development
75
+ version: 6.2.0
76
+ type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: 0.27.2
82
+ version: 6.2.0
69
83
  - !ruby/object:Gem::Dependency
70
- name: sidekiq
84
+ name: simplecov
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: 6.2.0
76
- type: :runtime
89
+ version: '0'
90
+ type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: 6.2.0
96
+ version: '0'
83
97
  description: Workflow
84
98
  email:
85
99
  - tiendt2311@gmail.com
@@ -100,6 +114,7 @@ files:
100
114
  - lib/dwf.rb
101
115
  - lib/dwf/callback.rb
102
116
  - lib/dwf/client.rb
117
+ - lib/dwf/concerns/checkable.rb
103
118
  - lib/dwf/configuration.rb
104
119
  - lib/dwf/errors.rb
105
120
  - lib/dwf/item.rb