resque_jobs_tree 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,12 +5,12 @@ class ResourcesSerializerTest < MiniTest::Unit::TestCase
5
5
  def test_serialization_deserialization
6
6
  model = Model.new 42
7
7
  input = [model, :pdf, [1,2]]
8
- serialized_input = ResqueJobsTree::ResourcesSerializer.to_args(input)
9
- result = [['Model', model.id], :pdf, [1,2]]
10
- assert_equal serialized_input, result
11
- deserialized = ResqueJobsTree::ResourcesSerializer.
12
- to_resources(serialized_input)
13
- assert_equal deserialized, [Model.new(42), :pdf, [1,2]]
8
+ serialized_input = ResqueJobsTree::ResourcesSerializer.argumentize(input)
9
+
10
+ assert_equal [['Model', model.id], :pdf, [1,2]], serialized_input
11
+
12
+ assert_equal [Model.new(42), :pdf, [1,2]],
13
+ ResqueJobsTree::ResourcesSerializer.instancize(serialized_input)
14
14
  end
15
15
 
16
16
  end
@@ -0,0 +1,117 @@
1
+ require 'test_helper'
2
+
3
+ class StorageNodeTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ create_tree
7
+ @resources = [1, 2, 3]
8
+ @root = @tree_definition.find(:job1).spawn @resources
9
+ @leaf = @tree_definition.find(:job2).spawn @resources, @root
10
+ end
11
+
12
+ def test_serialize
13
+ assert_equal '["tree1","job2",1,2,3]', @leaf.send(:serialize)
14
+ end
15
+
16
+ def test_storing
17
+ @leaf.store
18
+ assert_parent_key(
19
+ 'ResqueJobsTree:Node:["tree1","job2",1,2,3]' => 'ResqueJobsTree:Node:["tree1","job1",1,2,3]')
20
+ assert_equal ['ResqueJobsTree:Node:["tree1","job2",1,2,3]'], redis.smembers(@root.childs_key)
21
+ @leaf.unstore
22
+ assert_parent_key({})
23
+ assert_equal [], redis.smembers(@root.childs_key)
24
+ end
25
+
26
+ def test_cleanup_for_root
27
+ create_3_nodes
28
+ @spawn1.cleanup
29
+ assert_equal [], redis.keys
30
+ end
31
+
32
+ def test_cleanup_for_leaf
33
+ create_3_nodes
34
+ @spawn3.cleanup
35
+ assert_equal [ 'ResqueJobsTree:Tree:Launched',
36
+ 'ResqueJobsTree:Node:Parents',
37
+ 'ResqueJobsTree:Node:["tree1","job1",1]:childs',
38
+ 'ResqueJobsTree:Node:["tree1","job2"]:childs'], redis.keys
39
+ assert_parent_key( 'ResqueJobsTree:Node:["tree1","job2"]' => 'ResqueJobsTree:Node:["tree1","job1",1]',
40
+ 'ResqueJobsTree:Node:["tree1","job3",2]' => 'ResqueJobsTree:Node:["tree1","job2"]')
41
+ assert_trees_key ['ResqueJobsTree:Tree:["tree1",1]']
42
+ end
43
+
44
+ def test_cleanup_for_not_root_nor_leaf
45
+ create_3_nodes
46
+ @spawn2.cleanup
47
+ assert_equal [ 'ResqueJobsTree:Tree:Launched',
48
+ 'ResqueJobsTree:Node:["tree1","job1",1]:childs'], redis.keys
49
+ assert_parent_key({})
50
+ assert_trees_key ['ResqueJobsTree:Tree:["tree1",1]']
51
+ end
52
+
53
+ def test_parent
54
+ @leaf.store
55
+ @leaf.instance_variable_set :@parent, nil
56
+ assert_equal @root.name, @leaf.parent.name
57
+ assert_equal @root.resources, @leaf.parent.resources
58
+ end
59
+
60
+ def test_only_stored_child
61
+ assert @leaf.only_stored_child?
62
+ @leaf.store
63
+ assert @leaf.only_stored_child?
64
+ resources2 = [4,5,6]
65
+ leaf2 = @tree_definition.find(:job2).spawn resources2, @root
66
+ leaf2.store
67
+ assert !@leaf.only_stored_child?
68
+ end
69
+
70
+ def test_stored_childs
71
+ @leaf.store
72
+ resources2 = [4,5,6]
73
+ leaf2 = @tree_definition.find(:job2).spawn resources2, @root
74
+ leaf2.store
75
+ assert_equal %w(job2 job2), @root.stored_childs.map(&:name)
76
+ assert_equal [[4,5,6],[1,2,3]], @root.stored_childs.map(&:resources)
77
+ end
78
+
79
+ def test_node_info_from_key
80
+ key = %Q{ResqueJobsTree:Node:["tree1","job1",1,2,3]}
81
+ result = ['job1', [1, 2, 3]]
82
+ assert_equal result, @root.send(:node_info_from_key, key)
83
+ end
84
+
85
+ private
86
+
87
+ def assert_parent_key expected
88
+ assert_equal expected, redis.hgetall(ResqueJobsTree::Storage::PARENTS_KEY)
89
+ end
90
+
91
+ def assert_trees_key expected
92
+ assert_equal expected, redis.smembers(ResqueJobsTree::Storage::LAUNCHED_TREES)
93
+ end
94
+
95
+ def create_3_nodes
96
+ @tree_definition = ResqueJobsTree::Factory.create :tree1 do
97
+ root :job1 do
98
+ perform {}
99
+ childs { [[:job2]] }
100
+ node :job2 do
101
+ perform {}
102
+ childs { [[:job3, 1],[:job3, 2]] }
103
+ node :job3 do
104
+ perform {|n|}
105
+ end
106
+ end
107
+ end
108
+ end
109
+ @tree = @tree_definition.spawn [1]
110
+ @spawn1 = @tree_definition.root.spawn [1]
111
+ @spawn2 = @tree_definition.find(:job2).spawn [], @spawn1
112
+ @spawn3 = @tree_definition.find(:job3).spawn [1], @spawn2
113
+ @spawn4 = @tree_definition.find(:job3).spawn [2], @spawn2
114
+ [@tree, @spawn2, @spawn3, @spawn4].each &:store
115
+ end
116
+
117
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ class StorageTreeTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ create_tree
7
+ @resources = [Model.new(42), 2, 3]
8
+ @tree = @tree_definition.spawn @resources
9
+ end
10
+
11
+ def test_serialize
12
+ assert_equal '["tree1",["Model",42],2,3]', @tree.send(:serialize)
13
+ end
14
+
15
+ def test_key
16
+ assert_equal 'ResqueJobsTree:Tree:["tree1",["Model",42],2,3]', @tree.key
17
+ end
18
+
19
+ def test_storing
20
+ @tree.store
21
+ assert_equal ["ResqueJobsTree:Tree:[\"tree1\",[\"Model\",42],2,3]"],
22
+ redis.smembers(ResqueJobsTree::Storage::LAUNCHED_TREES)
23
+ @tree.unstore
24
+ assert_equal [], redis.smembers(ResqueJobsTree::Storage::LAUNCHED_TREES)
25
+ end
26
+
27
+ end
data/test/test_helper.rb CHANGED
@@ -12,8 +12,6 @@ $TESTING = true
12
12
  require 'mock_redis'
13
13
  Resque.redis = MockRedis.new
14
14
 
15
- Resque.inline = true
16
-
17
15
  #
18
16
  # Fixtures
19
17
  #
@@ -36,12 +34,22 @@ class ExpectedException < Exception ; end
36
34
 
37
35
  class MiniTest::Unit::TestCase
38
36
 
37
+ def setup
38
+ Resque.inline = true
39
+ end
40
+
41
+ private
42
+
39
43
  def teardown
40
44
  redis.keys.each{ |key| redis.del key }
41
45
  end
42
46
 
47
+ def redis
48
+ Resque.redis
49
+ end
50
+
43
51
  def create_tree
44
- @tree = ResqueJobsTree::Factory.create :tree1 do
52
+ @tree_definition = ResqueJobsTree::Factory.create :tree1 do
45
53
  root :job1 do
46
54
  perform do |*args|
47
55
  Resque.redis.rpush 'history', 'tree1 job1'
@@ -62,12 +70,8 @@ class MiniTest::Unit::TestCase
62
70
  end
63
71
  end
64
72
 
65
- def redis
66
- Resque.redis
67
- end
68
-
69
73
  def create_nested_tree
70
- @tree = ResqueJobsTree::Factory.create :tree1 do
74
+ @tree_definition = ResqueJobsTree::Factory.create :tree1 do
71
75
  root :job1 do
72
76
  perform { raise ExpectedException, 'job1' }
73
77
  childs { [ [:job2] ] }
data/test/tree_test.rb CHANGED
@@ -7,130 +7,35 @@ class TreeTest < MiniTest::Unit::TestCase
7
7
  end
8
8
 
9
9
  def test_name
10
- assert_equal @tree.name, 'tree1'
10
+ assert_equal @tree_definition.name, 'tree1'
11
11
  end
12
12
 
13
- def test_jobs
14
- assert_equal @tree.jobs, []
13
+ def test_leaves
14
+ assert_equal @tree_definition.spawn([]).leaves, []
15
15
  end
16
16
 
17
17
  def test_root
18
- assert @tree.root.kind_of? ResqueJobsTree::Node
18
+ assert @tree_definition.root.kind_of? ResqueJobsTree::Definitions::Node
19
19
  end
20
20
 
21
- def test_enqueue
22
- job_args = [:job4, ['Model', 1], 123]
23
- @tree.enqueue *job_args
24
- assert_equal @tree.jobs.first, ['tree1', :job4, ['Model', 1], 123]
21
+ def test_register_a_leaf
22
+ leaf = 'leaf'
23
+ tree = @tree_definition.spawn []
24
+ tree.register_a_leaf leaf
25
+ assert_equal tree.leaves, [leaf]
25
26
  end
26
27
 
27
- def test_find_node_by_name
28
- assert_equal 'job2', @tree.find_node_by_name('job2').name
29
- create_nested_tree
30
- assert_equal 'job4', @tree.find_node_by_name('job4').name
31
- end
32
-
33
- def test_launch
34
- resources = [1, 2, 3]
35
- @tree.launch *resources
36
- history = ['tree1 job2']*3+['tree1 job1']
37
- assert_equal history, redis.lrange('history', 0, -1)
38
- end
39
-
40
- def test_launch_with_no_resources
41
- @tree.launch
28
+ def test_find
29
+ assert_equal 'job2', @tree_definition.find(:job2).name
30
+ tree_definition = create_nested_tree
31
+ assert_equal 'job4', tree_definition.find(:job4).name
42
32
  end
43
33
 
44
34
  def test_should_have_root
45
- assert_raises ResqueJobsTree::TreeInvalid do
35
+ assert_raises ResqueJobsTree::TreeDefinitionInvalid do
46
36
  ResqueJobsTree::Factory.create :tree1 do
47
37
  end
48
38
  end
49
39
  end
50
40
 
51
- def test_on_failure
52
- create_tree_with_on_failure_hook
53
- assert_raises ExpectedException do
54
- @tree.launch
55
- end
56
- end
57
-
58
- def test_tree_with_resource
59
- create_tree_with_resources
60
- @tree.launch Model.new(1)
61
- end
62
-
63
- def test_nested_tree
64
- create_nested_tree
65
- assert_raises RuntimeError do # job4 error !
66
- @tree.launch
67
- end
68
- assert_raises NoMethodError do # job3 error !
69
- Resque.enqueue_to 'tree1', ResqueJobsTree::Job, 'tree1', 'job3'
70
- end
71
- end
72
-
73
- def test_async_tree
74
- tree = ResqueJobsTree::Factory.create :tree1 do
75
- root :job1 do
76
- perform { raise 'should not arrive here' }
77
- childs { [ [:job2], [:job3] ] }
78
- node :job2, async: true do
79
- perform {}
80
- end
81
- node :job3 do
82
- perform {}
83
- end
84
- end
85
- end
86
- tree.launch
87
- assert_equal ["ResqueJobsTree:Node:[\"tree1\",\"job2\"]"],
88
- Resque.redis.smembers("ResqueJobsTree:Node:[\"tree1\",\"job1\"]:childs")
89
- parents_hash = { 'ResqueJobsTree:Node:["tree1","job2"]'=>'ResqueJobsTree:Node:["tree1","job1"]' }
90
- assert_equal parents_hash, Resque.redis.hgetall(ResqueJobsTree::Storage::PARENTS_KEY)
91
- end
92
-
93
- def test_async_tree_with_fail
94
- tree = ResqueJobsTree::Factory.create :tree1 do
95
- root :job1 do
96
- perform { raise 'should not arrive here' }
97
- childs { [ [:job2], [:job3] ] }
98
- node :job2, async: true do
99
- perform {}
100
- end
101
- node :job3, continue_on_failure: true do
102
- perform { raise ExpectedException, 'an expected failure' }
103
- end
104
- end
105
- end
106
- assert_raises ExpectedException do
107
- tree.launch
108
- end
109
- assert_equal ["ResqueJobsTree:Node:[\"tree1\",\"job2\"]"],
110
- Resque.redis.smembers("ResqueJobsTree:Node:[\"tree1\",\"job1\"]:childs")
111
- end
112
-
113
- private
114
-
115
- def create_tree_with_on_failure_hook
116
- @tree = ResqueJobsTree::Factory.create :tree1 do
117
- root :job1 do
118
- perform { raise ExpectedException, 'job1' }
119
- end
120
- on_failure do
121
- raise ExpectedException, 'called from on_failure block'
122
- end
123
- end
124
- end
125
-
126
- def create_tree_with_resources
127
- @tree = ResqueJobsTree::Factory.create :tree1 do
128
- root :job1 do
129
- perform do |resources|
130
- raise 'unknown resource' unless resources.first.kind_of?(Model)
131
- end
132
- end
133
- end
134
- end
135
-
136
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque_jobs_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-11 00:00:00.000000000 Z
12
+ date: 2013-04-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -105,19 +105,26 @@ files:
105
105
  - README.md
106
106
  - Rakefile
107
107
  - lib/resque_jobs_tree.rb
108
+ - lib/resque_jobs_tree/definitions.rb
109
+ - lib/resque_jobs_tree/definitions/node.rb
110
+ - lib/resque_jobs_tree/definitions/tree.rb
108
111
  - lib/resque_jobs_tree/factory.rb
109
112
  - lib/resque_jobs_tree/job.rb
110
113
  - lib/resque_jobs_tree/node.rb
111
114
  - lib/resque_jobs_tree/resources_serializer.rb
112
115
  - lib/resque_jobs_tree/storage.rb
116
+ - lib/resque_jobs_tree/storage/node.rb
117
+ - lib/resque_jobs_tree/storage/tree.rb
113
118
  - lib/resque_jobs_tree/tree.rb
114
119
  - lib/resque_jobs_tree/version.rb
115
120
  - resque_jobs_tree.gemspec
121
+ - test/definitions_test.rb
116
122
  - test/factory_test.rb
117
123
  - test/job_test.rb
118
- - test/node_test.rb
124
+ - test/process_test.rb
119
125
  - test/resources_serializer_test.rb
120
- - test/storage_test.rb
126
+ - test/storage_node_test.rb
127
+ - test/storage_tree_test.rb
121
128
  - test/test_helper.rb
122
129
  - test/tree_test.rb
123
130
  homepage: ''
@@ -146,11 +153,13 @@ signing_key:
146
153
  specification_version: 3
147
154
  summary: Organise Resque jobs as a tree.
148
155
  test_files:
156
+ - test/definitions_test.rb
149
157
  - test/factory_test.rb
150
158
  - test/job_test.rb
151
- - test/node_test.rb
159
+ - test/process_test.rb
152
160
  - test/resources_serializer_test.rb
153
- - test/storage_test.rb
161
+ - test/storage_node_test.rb
162
+ - test/storage_tree_test.rb
154
163
  - test/test_helper.rb
155
164
  - test/tree_test.rb
156
165
  has_rdoc:
data/test/node_test.rb DELETED
@@ -1,188 +0,0 @@
1
- require 'test_helper'
2
-
3
- class NodeTest < MiniTest::Unit::TestCase
4
-
5
- def setup
6
- @tree = ResqueJobsTree::Tree.new :tree1
7
- @root = ResqueJobsTree::Node.new :node1, @tree
8
- @leaf = ResqueJobsTree::Node.new :node2, @tree, @root
9
- end
10
-
11
- def test_ressources
12
- variable = 1
13
- @root.resources do |n|
14
- variable = n
15
- end
16
- @root.resources.call 2
17
- assert_equal variable, 2
18
- end
19
-
20
- def test_perform
21
- variable = 1
22
- @root.perform do |n|
23
- variable = n
24
- end
25
- @root.perform.call 2
26
- assert_equal variable, 2
27
- end
28
-
29
- def test_childs
30
- variable = 1
31
- @leaf.childs do |n|
32
- variable = n
33
- end
34
- @leaf.childs.call 2
35
- assert_equal variable, 2
36
- end
37
-
38
- def test_node
39
- node3 = @root.node :node3
40
- assert_equal @root.find_node_by_name('node3').object_id, node3.object_id
41
- end
42
-
43
- def test_leaf
44
- resources = []
45
- assert @leaf.leaf?(resources)
46
- @root.childs do |resources|
47
- [:node2, resources]
48
- end
49
- assert !@root.leaf?(resources)
50
- end
51
-
52
- def test_root
53
- assert @root.root?
54
- assert !@leaf.root?
55
- end
56
-
57
- def test_siblings
58
- node3 = ResqueJobsTree::Node.new :node3, @tree, @root
59
- assert @leaf.siblings, [node3]
60
- end
61
-
62
- def test_launch
63
- resources = [1, 2, 3]
64
- @leaf.launch resources, resources
65
- assert_equal @tree.jobs.first, ['tree1', 'node2', 1, 2, 3]
66
- end
67
-
68
- def test_childs_validation
69
- assert_raises ResqueJobsTree::NodeInvalid do
70
- ResqueJobsTree::Factory.create :tree1 do
71
- root :job1 do
72
- perform {}
73
- childs {}
74
- end
75
- end
76
- end
77
- ResqueJobsTree::Factory.create :tree1 do
78
- root :job1 do
79
- perform {}
80
- end
81
- end
82
- end
83
-
84
- def test_perform_validation
85
- assert_raises ResqueJobsTree::NodeInvalid do
86
- ResqueJobsTree::Factory.create :tree1 do
87
- root :job1 do
88
- end
89
- end
90
- end
91
- end
92
-
93
- def test_perform_validation
94
- assert_raises ResqueJobsTree::NodeInvalid do
95
- ResqueJobsTree::Factory.create :tree1 do
96
- root :job1 do
97
- perform {}
98
- childs {}
99
- node :job2 do
100
- perform {}
101
- end
102
- node :job2 do
103
- perform {}
104
- end
105
- end
106
- end
107
- end
108
- end
109
-
110
- def test_options
111
- create_async_tree
112
- options = { async: true }
113
- assert_equal options, @tree.find_node_by_name(:job2).options
114
- end
115
-
116
- def test_launch_async
117
- create_async_tree
118
- resources = [1, 2, 3]
119
- @tree.launch resources
120
- assert @tree.jobs.empty?
121
- end
122
-
123
- def test_launch_continue_on_failure
124
- tree = ResqueJobsTree::Factory.create :tree1 do
125
- root :job1 do
126
- perform { raise ExpectedException, 'an expected failure' }
127
- childs { [:job2] }
128
- node :job2, continue_on_failure: true do
129
- perform { raise 'an expected failure' }
130
- end
131
- end
132
- end
133
- resources = [1, 2, 3]
134
- assert_raises ExpectedException do
135
- tree.launch resources
136
- end
137
- assert_equal [], Resque.keys
138
- end
139
-
140
- def test_leaf_failure
141
- tree = ResqueJobsTree::Factory.create :tree1 do
142
- root :job1 do
143
- perform {}
144
- childs { [:job2] }
145
- node :job2 do
146
- perform { raise ExpectedException, 'an expected exception'}
147
- end
148
- end
149
- end
150
- resources = [1, 2, 3]
151
- assert_raises ExpectedException do
152
- tree.launch *resources
153
- end
154
- assert_equal [], Resque.keys
155
- end
156
-
157
- def test_root_failure
158
- tree = ResqueJobsTree::Factory.create :tree1 do
159
- root :job1 do
160
- perform { raise ExpectedException, 'an expected exception' }
161
- childs { [:job2] }
162
- node :job2 do
163
- perform {}
164
- end
165
- end
166
- end
167
- resources = [1, 2, 3]
168
- assert_raises ExpectedException do
169
- tree.launch resources
170
- end
171
- assert_equal [], Resque.keys
172
- end
173
-
174
- private
175
-
176
- def create_async_tree
177
- @tree = ResqueJobsTree::Factory.create :tree1 do
178
- root :job1 do
179
- perform { raise 'should not arrive here' }
180
- childs { [:job2] }
181
- node :job2, async: true do
182
- perform {}
183
- end
184
- end
185
- end
186
- end
187
-
188
- end