ruote-kit 2.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.document +0 -0
  2. data/.gitignore +8 -0
  3. data/Gemfile +10 -0
  4. data/README.rdoc +132 -0
  5. data/Rakefile +57 -0
  6. data/config.ru +21 -0
  7. data/lib/ruote-kit/application.rb +50 -0
  8. data/lib/ruote-kit/configuration.rb +52 -0
  9. data/lib/ruote-kit/helpers/engine_helpers.rb +24 -0
  10. data/lib/ruote-kit/helpers/form_helpers.rb +11 -0
  11. data/lib/ruote-kit/helpers/launch_item_parser.rb +59 -0
  12. data/lib/ruote-kit/helpers/navigation_helpers.rb +54 -0
  13. data/lib/ruote-kit/helpers/render_helpers.rb +103 -0
  14. data/lib/ruote-kit/helpers.rb +9 -0
  15. data/lib/ruote-kit/public/_ruote/images/bg.gif +0 -0
  16. data/lib/ruote-kit/public/_ruote/images/bg_button_left.gif +0 -0
  17. data/lib/ruote-kit/public/_ruote/images/bg_button_left_cancel.gif +0 -0
  18. data/lib/ruote-kit/public/_ruote/images/bg_button_left_submit.gif +0 -0
  19. data/lib/ruote-kit/public/_ruote/images/bg_button_right.gif +0 -0
  20. data/lib/ruote-kit/public/_ruote/javascripts/SimplyButtons.js +191 -0
  21. data/lib/ruote-kit/public/_ruote/javascripts/fluo-can.js +1111 -0
  22. data/lib/ruote-kit/public/_ruote/javascripts/fluo-dial.js +149 -0
  23. data/lib/ruote-kit/public/_ruote/javascripts/fluo-json.js +183 -0
  24. data/lib/ruote-kit/public/_ruote/javascripts/fluo-tred.js +515 -0
  25. data/lib/ruote-kit/public/_ruote/stylesheets/SimplyButtons.css +226 -0
  26. data/lib/ruote-kit/public/_ruote/stylesheets/base.css +336 -0
  27. data/lib/ruote-kit/public/_ruote/stylesheets/rk.css +30 -0
  28. data/lib/ruote-kit/public/_ruote/stylesheets/style.css +393 -0
  29. data/lib/ruote-kit/resources/expressions.rb +55 -0
  30. data/lib/ruote-kit/resources/processes.rb +52 -0
  31. data/lib/ruote-kit/resources/workitems.rb +64 -0
  32. data/lib/ruote-kit/spec/ruote_helpers.rb +47 -0
  33. data/lib/ruote-kit/vendor/sinatra-respond_to/LICENSE +21 -0
  34. data/lib/ruote-kit/vendor/sinatra-respond_to/README.markdown +102 -0
  35. data/lib/ruote-kit/vendor/sinatra-respond_to/Rakefile +30 -0
  36. data/lib/ruote-kit/vendor/sinatra-respond_to/VERSION.yml +4 -0
  37. data/lib/ruote-kit/vendor/sinatra-respond_to/lib/sinatra/respond_to.rb +206 -0
  38. data/lib/ruote-kit/vendor/sinatra-respond_to/sinatra-respond_to.gemspec +56 -0
  39. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/app/public/static folder/.keep +0 -0
  40. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/app/public/static.txt +1 -0
  41. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/app/test_app.rb +53 -0
  42. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/app/unreachable_static.txt +1 -0
  43. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/app/views/layout.html.haml +2 -0
  44. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/app/views/resource.html.haml +1 -0
  45. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/app/views/resource.js.erb +3 -0
  46. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/app/views/resource.xml.builder +3 -0
  47. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/extension_spec.rb +403 -0
  48. data/lib/ruote-kit/vendor/sinatra-respond_to/spec/spec_helper.rb +18 -0
  49. data/lib/ruote-kit/views/expression.html.haml +38 -0
  50. data/lib/ruote-kit/views/expressions.html.haml +30 -0
  51. data/lib/ruote-kit/views/index.html.haml +1 -0
  52. data/lib/ruote-kit/views/launch_process.html.haml +19 -0
  53. data/lib/ruote-kit/views/layout.html.haml +46 -0
  54. data/lib/ruote-kit/views/process.html.haml +55 -0
  55. data/lib/ruote-kit/views/processes.html.haml +27 -0
  56. data/lib/ruote-kit/views/resource_not_found.html.haml +7 -0
  57. data/lib/ruote-kit/views/workitem.html.haml +39 -0
  58. data/lib/ruote-kit/views/workitems.html.haml +23 -0
  59. data/lib/ruote-kit.rb +105 -0
  60. data/ruote-kit.gemspec +136 -0
  61. data/spec/helpers/render_helpers_spec.rb +211 -0
  62. data/spec/resources/expressions_spec.rb +179 -0
  63. data/spec/resources/index_spec.rb +46 -0
  64. data/spec/resources/processes_spec.rb +259 -0
  65. data/spec/resources/workitems_spec.rb +308 -0
  66. data/spec/ruote-kit_spec.rb +4 -0
  67. data/spec/spec.opts +2 -0
  68. data/spec/spec_helper.rb +152 -0
  69. data/spec/views/launch_process.html.haml_spec.rb +21 -0
  70. data/spec/views/process.html.haml_spec.rb +16 -0
  71. data/spec/views/processes.html.haml_spec.rb +30 -0
  72. data/spec/views/workitems.html.haml_spec.rb +68 -0
  73. metadata +185 -0
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "GET /" do
4
+ it "should return a welcome message in HTML be default" do
5
+ get "/_ruote"
6
+
7
+ last_response.should be_ok
8
+ last_response.content_type.should match("text/html")
9
+
10
+ last_response.should match(/Hello world/)
11
+ last_response.should match(/<title>/)
12
+ end
13
+
14
+ it "should return a version string if JSON is requested" do
15
+ header "Accept", "application/json"
16
+
17
+ get "/_ruote"
18
+
19
+ last_response.should be_ok
20
+ last_response.content_type.should match("application/json")
21
+ body = last_response.json_body
22
+
23
+ body["misc"].should == { "ruote-kit" => "welcome", "version" => RuoteKit::VERSION.to_s }
24
+ end
25
+ end
26
+
27
+ describe "Generic error handling" do
28
+ it "should give our own 404 page (HTML)" do
29
+ get "/kenneth"
30
+
31
+ last_response.should_not be_ok
32
+ last_response.status.should be(404)
33
+
34
+ last_response.should be_html
35
+ last_response.should match(/Resource not found/)
36
+ end
37
+
38
+ it "should give our own 404 data (JSON)" do
39
+ get "/kenneth.json"
40
+
41
+ last_response.should_not be_ok
42
+ last_response.status.should be(404)
43
+
44
+ last_response.should be_json
45
+ end
46
+ end
@@ -0,0 +1,259 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "GET /_ruote/processes" do
4
+ describe "without any running processes" do
5
+ it "should give no processes back (HTML)" do
6
+ get "/_ruote/processes"
7
+
8
+ last_response.should be_ok
9
+ end
10
+
11
+ it "should give an empty array (JSON)" do
12
+ get "/_ruote/processes.json"
13
+
14
+ last_response.should be_ok
15
+
16
+ body = last_response.json_body
17
+ body.should have_key("processes")
18
+
19
+ body["processes"].should be_empty
20
+ end
21
+ end
22
+
23
+ describe "with running processes" do
24
+ before(:each) do
25
+ @wfid = launch_test_process
26
+ end
27
+
28
+ it "should give process information back (HTML)" do
29
+ get "/_ruote/processes"
30
+
31
+ last_response.should be_ok
32
+ end
33
+
34
+ it "should give process information back (JSON)" do
35
+ get "/_ruote/processes.json"
36
+
37
+ last_response.should be_ok
38
+
39
+ body = last_response.json_body
40
+
41
+ body["processes"].should_not be_empty
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "GET /_ruote/processes/X-Y" do
47
+ describe "with a running process" do
48
+ before(:each) do
49
+ @wfid = launch_test_process
50
+ end
51
+
52
+ it "should give process information back (HTML)" do
53
+ get "/_ruote/processes/#{@wfid}"
54
+
55
+ last_response.should be_ok
56
+ end
57
+
58
+ it "should give process information back (JSON)" do
59
+ get "/_ruote/processes/#{@wfid}.json"
60
+
61
+ last_response.should be_ok
62
+
63
+ body = last_response.json_body
64
+
65
+ body.should have_key('process')
66
+ end
67
+ end
68
+
69
+ describe "without a running process" do
70
+ it "should 404 correctly (HTML)" do
71
+ get "/_ruote/processes/foo"
72
+
73
+ last_response.should_not be_ok
74
+ last_response.status.should be(404)
75
+
76
+ last_response.should match(/Resource not found/)
77
+ end
78
+
79
+ it "should 404 correctly (JSON)" do
80
+ get "/_ruote/processes/foo.json"
81
+
82
+ last_response.should_not be_ok
83
+ last_response.status.should be(404)
84
+
85
+ last_response.json_body.keys.should include("error")
86
+ last_response.json_body['error'].should == { "code" => "404", "message" => "Resource not found" }
87
+ end
88
+ end
89
+ end
90
+
91
+ describe "GET /_ruote/processes/new" do
92
+ it "should return a launch form" do
93
+ get "/_ruote/processes/new"
94
+
95
+ last_response.should be_ok
96
+ end
97
+ end
98
+
99
+ describe "POST /_ruote/processes" do
100
+ before(:each) do
101
+ engine.processes.should be_empty
102
+ end
103
+
104
+ it "should launch a valid process definition (JSON)" do
105
+ params = {
106
+ :definition => %q{Ruote.process_definition :name => 'test' do
107
+ _sleep '1m'
108
+ end}
109
+ }
110
+
111
+ post '/_ruote/processes.json', params.to_json, { 'CONTENT_TYPE' => 'application/json' }
112
+
113
+ last_response.should be_ok
114
+
115
+ last_response.json_body['launched'].should match(/[0-9a-z\-]+/)
116
+
117
+ sleep 0.4
118
+
119
+ engine.processes.should_not be_empty
120
+ end
121
+
122
+ it "should launch a valid process definition with fields (JSON)" do
123
+ params = {
124
+ :definition => %q{Ruote.process_definition :name => 'test' do
125
+ echo '${f:foo}'
126
+ end},
127
+ :fields => { :foo => 'bar' }
128
+ }
129
+
130
+ post '/_ruote/processes.json', params.to_json, { 'CONTENT_TYPE' => 'application/json' }
131
+
132
+ last_response.should be_ok
133
+ last_response.json_body['launched'].should match(/[0-9a-z\-]+/)
134
+
135
+ sleep 0.5
136
+
137
+ @tracer.to_s.should == "bar"
138
+ end
139
+
140
+ it "should launch a valid process definition (HTML)" do
141
+ params = {
142
+ :process_definition => %q{Ruote.process_definition :name => "test" do
143
+ _sleep '1m'
144
+ end
145
+ }
146
+ }
147
+
148
+ post "/_ruote/processes", params
149
+
150
+ last_response.should be_redirect
151
+ last_response['Location'].should match( /^\/_ruote\/processes\/[0-9a-z\-]+$/ )
152
+
153
+ sleep 0.4
154
+
155
+ engine.processes.should_not be_empty
156
+ end
157
+
158
+ it "should launch a process definition with fields (HTML)" do
159
+ params = {
160
+ :process_definition => %q{Ruote.process_definition :name => 'test' do
161
+ echo '${f:foo}'
162
+ end},
163
+ :process_fields => %q{ { "foo": "bar" } }
164
+ }
165
+
166
+ post '/_ruote/processes', params
167
+
168
+ last_response.should be_redirect
169
+ last_response['Location'].should match( /^\/_ruote\/processes\/([0-9a-z\-]+)$/ )
170
+
171
+ sleep 0.5
172
+
173
+ @tracer.to_s.should == "bar"
174
+ end
175
+
176
+ it "should correct for empty fields sent by browsers" do
177
+ params = {
178
+ :process_definition => %q{Ruote.process_definition :name => 'test' do
179
+ wait '5m'
180
+ end},
181
+ :process_fields => ''
182
+ }
183
+
184
+ post '/_ruote/processes', params
185
+
186
+ last_response.should be_redirect
187
+
188
+ sleep 0.4
189
+
190
+ engine.processes.should_not be_empty
191
+ end
192
+ end
193
+
194
+ describe "DELETE /_ruote/processes/X-Y" do
195
+ before(:each) do
196
+ @wfid = launch_test_process do
197
+ Ruote.process_definition :name => 'test' do
198
+ sequence :on_cancel => 'bail_out' do
199
+ echo "done."
200
+ wait '1d'
201
+ end
202
+
203
+ define :name => 'bail_out' do
204
+ echo "bailout."
205
+ end
206
+ end
207
+ end
208
+ end
209
+
210
+ it "should cancel processes (JSON)" do
211
+ delete "/_ruote/processes/#{@wfid}.json"
212
+
213
+ last_response.should be_ok
214
+
215
+ wait_for( @wfid )
216
+
217
+ engine.process( @wfid ).should be_nil
218
+
219
+ @tracer.to_s.should == "done.\nbailout."
220
+ end
221
+
222
+ it "should cancel processes (HMTL)" do
223
+ delete "/_ruote/processes/#{@wfid}"
224
+
225
+ last_response.should be_redirect
226
+ last_response['Location'].should == "/_ruote/processes"
227
+
228
+ wait_for( @wfid )
229
+
230
+ engine.process( @wfid ).should be_nil
231
+
232
+ @tracer.to_s.should == "done.\nbailout."
233
+ end
234
+
235
+ it "should kill processes (JSON)" do
236
+ delete "/_ruote/processes/#{@wfid}.json?_kill=1"
237
+
238
+ last_response.should be_ok
239
+
240
+ wait_for( @wfid )
241
+
242
+ engine.process( @wfid ).should be_nil
243
+
244
+ @tracer.to_s.should == "done."
245
+ end
246
+
247
+ it "should kill processes (HTML)" do
248
+ delete "/_ruote/processes/#{@wfid}?_kill=1"
249
+
250
+ last_response.should be_redirect
251
+ last_response['Location'].should == '/_ruote/processes'
252
+
253
+ wait_for( @wfid )
254
+
255
+ engine.process( @wfid ).should be_nil
256
+
257
+ @tracer.to_s.should == "done."
258
+ end
259
+ end
@@ -0,0 +1,308 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "GET /_ruote/workitems" do
4
+ describe "without any workitems" do
5
+ it "should report no workitems (HTML)" do
6
+ get "/_ruote/workitems"
7
+
8
+ last_response.should be_ok
9
+ last_response.should match(/No workitems are currently available/)
10
+ end
11
+
12
+ it "should report no workitems (JSON)" do
13
+ get "/_ruote/workitems.json"
14
+
15
+ last_response.should be_ok
16
+ json = last_response.json_body
17
+
18
+ json.should have_key('workitems')
19
+ json['workitems'].should be_empty
20
+ end
21
+ end
22
+
23
+ describe "with workitems" do
24
+ before(:each) do
25
+ @wfid = launch_test_process do
26
+ Ruote.process_definition :name => 'test' do
27
+ sequence do
28
+ nada :activity => 'Work your magic'
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ it "should have a list of workitems (HTML)" do
35
+ get "/_ruote/workitems"
36
+
37
+ last_response.should be_ok
38
+ last_response.should match(/1 workitem available/)
39
+ end
40
+
41
+ it "should have a list of workitems (JSON)" do
42
+ get "/_ruote/workitems.json"
43
+
44
+ last_response.should be_ok
45
+ json = last_response.json_body
46
+
47
+ json['workitems'].size.should be(1)
48
+
49
+ wi = json['workitems'][0]
50
+
51
+ wi.keys.should include('fei', 'participant_name', 'fields')
52
+ wi['fei']['wfid'].should == @wfid
53
+ wi['participant_name'].should == 'nada'
54
+ wi['fields']['params']['activity'].should == 'Work your magic'
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "GET /_ruote/workitems/wfid" do
60
+ describe "with workitems" do
61
+ before(:each) do
62
+ @wfid = launch_test_process do
63
+ Ruote.process_definition :name => 'foo' do
64
+ concurrence do
65
+ nada :activity => 'This'
66
+ nada :activity => 'Or that'
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ it "should list the workitems (HTML)" do
73
+ get "/_ruote/workitems/#{@wfid}"
74
+
75
+ last_response.should be_ok
76
+ last_response.should match(/2 workitems available for #{@wfid}/)
77
+ end
78
+
79
+ it "should list the workitems (JSON)" do
80
+ get "/_ruote/workitems/#{@wfid}.json"
81
+
82
+ last_response.should be_ok
83
+
84
+ json = last_response.json_body
85
+
86
+ json.should have_key('workitems')
87
+ json['workitems'].should_not be_empty
88
+ end
89
+ end
90
+
91
+ describe "without workitems" do
92
+ it "should report no workitems (HTML)" do
93
+ get "/_ruote/workitems/foo"
94
+
95
+ last_response.should be_ok
96
+ last_response.should match(/No workitems are currently available for foo/)
97
+ end
98
+
99
+ it "should report an empty list (JSON)" do
100
+ get "/_ruote/workitems/foo.json"
101
+
102
+ last_response.should be_ok
103
+
104
+ json = last_response.json_body
105
+
106
+ json.should have_key('workitems')
107
+ json['workitems'].should be_empty
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "GET /_ruote/workitems/wfid/expid" do
113
+ describe "with a workitem" do
114
+ before(:each) do
115
+ @wfid = launch_test_process do
116
+ Ruote.process_definition :name => 'foo' do
117
+ sequence do
118
+ nada :activity => 'Work your magic'
119
+ end
120
+ end
121
+ end
122
+
123
+ process = engine.process( @wfid )
124
+ @nada_exp_id = "0_0_0" #process.expressions.last.fei.expid
125
+
126
+ @nada_exp_id.should_not be_nil
127
+ end
128
+
129
+ it "should return it (HTML)" do
130
+ get "/_ruote/workitems/#{@wfid}/#{@nada_exp_id}"
131
+
132
+ last_response.should be_ok
133
+ end
134
+
135
+ it "should return it (JSON)" do
136
+ get "/_ruote/workitems/#{@wfid}/#{@nada_exp_id}.json"
137
+
138
+ last_response.should be_ok
139
+ end
140
+ end
141
+
142
+ describe "without a workitem" do
143
+ it "should return a 404 (HTML)" do
144
+ get "/_ruote/workitems/foo/bar"
145
+
146
+ last_response.should_not be_ok
147
+ last_response.status.should be(404)
148
+ end
149
+
150
+ it "should return a 404 (JSON)" do
151
+ get "/_ruote/workitems/foo/bar.json"
152
+
153
+ last_response.should_not be_ok
154
+ last_response.status.should be(404)
155
+ end
156
+ end
157
+ end
158
+
159
+ describe "PUT /_ruote/workitems/X-Y" do
160
+ before(:each) do
161
+ @wfid = launch_test_process do
162
+ Ruote.process_definition :name => 'foo' do
163
+ sequence do
164
+ nada :activity => 'Work your magic'
165
+ echo "${f:foo}"
166
+ end
167
+ end
168
+ end
169
+
170
+ process = engine.process( @wfid )
171
+ @nada_exp_id = "0_0_0" #process.expressions.last.fei.expid
172
+
173
+ @nada_exp_id.should_not be_nil
174
+ end
175
+
176
+ it "should update the workitem fields (HTML)" do
177
+ fields = {
178
+ "params" => {
179
+ "activity" => "Work your magic",
180
+ },
181
+ "foo" => "bar"
182
+ }
183
+
184
+ put "/_ruote/workitems/#{@wfid}/#{@nada_exp_id}", :fields => fields.to_json
185
+
186
+ last_response.should be_redirect
187
+ last_response['Location'].should == "/_ruote/workitems/#{@wfid}/#{@nada_exp_id}"
188
+
189
+ find_workitem( @wfid, @nada_exp_id ).fields.should == fields
190
+
191
+ sleep 0.4
192
+
193
+ @tracer.to_s.should == ""
194
+ end
195
+
196
+ it "should update the workitem fields (JSON)" do
197
+ fields = {
198
+ "params" => {
199
+ "activity" => "Work your magic",
200
+ },
201
+ "foo" => "bar"
202
+ }
203
+ params = {
204
+ "fields" => fields
205
+ }
206
+
207
+ put "/_ruote/workitems/#{@wfid}/#{@nada_exp_id}.json", params.to_json, { 'CONTENT_TYPE' => 'application/json' }
208
+
209
+ last_response.should be_ok
210
+
211
+ find_workitem( @wfid, @nada_exp_id ).fields.should == fields
212
+
213
+ sleep 0.4
214
+
215
+ @tracer.to_s.should == ""
216
+ end
217
+
218
+ it "should reply to the engine (HTML)" do
219
+ fields = {
220
+ "params" => {
221
+ "activity" => "Work your magic",
222
+ },
223
+ "foo" => "bar"
224
+ }.to_json
225
+
226
+ put "/_ruote/workitems/#{@wfid}/#{@nada_exp_id}", :fields => fields, :_proceed => '1'
227
+
228
+ last_response.should be_redirect
229
+ last_response['Location'].should == "/_ruote/workitems/#{@wfid}"
230
+
231
+ #engine.context[:s_logger].wait_for([
232
+ # [ :processes, :terminated, { :wfid => @wfid } ],
233
+ # [ :errors, nil, { :wfid => @wfid } ]
234
+ #])
235
+ sleep 0.5
236
+
237
+ @tracer.to_s.should == "bar"
238
+ end
239
+
240
+ it "should reply to the engine (JSON)" do
241
+ fields = {
242
+ "params" => {
243
+ "activity" => "Work your magic",
244
+ },
245
+ "foo" => "bar"
246
+ }
247
+ params = {
248
+ "fields" => fields,
249
+ "_proceed" => "1"
250
+ }
251
+
252
+ put "/_ruote/workitems/#{@wfid}/#{@nada_exp_id}.json", params.to_json, { 'CONTENT_TYPE' => 'application/json' }
253
+
254
+ last_response.should be_ok
255
+
256
+ #engine.context[:s_logger].wait_for([
257
+ # [ :processes, :terminated, { :wfid => @wfid } ],
258
+ # [ :errors, nil, { :wfid => @wfid } ]
259
+ #])
260
+ sleep 0.5
261
+
262
+ @tracer.to_s.should == "bar"
263
+ end
264
+ end
265
+
266
+ describe "Filtering workitems" do
267
+ describe "on participants" do
268
+ before(:each) do
269
+ @wfid = launch_test_process do
270
+ Ruote.process_definition :name => 'test' do
271
+ concurrence do
272
+ jack :activity => 'Fetch a pale'
273
+ jill :activity => 'Chase Jack'
274
+ well :activity => 'Ready water'
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ it "should narrow results down to a single participant (JSON)" do
281
+ get '/_ruote/workitems.json', :participant => 'jack'
282
+
283
+ last_response.should be_ok
284
+
285
+ last_response.json_body['workitems'].size.should be(1)
286
+ end
287
+
288
+ it "should narrow results down to a single participant (HTML)" do
289
+ get '/_ruote/workitems', :participant => 'jack'
290
+
291
+ last_response.should be_ok
292
+ end
293
+
294
+ it "should narrow results down to multiple participants (JSON)" do
295
+ get "/_ruote/workitems.json", :participant => 'jack,jill'
296
+
297
+ last_response.should be_ok
298
+
299
+ last_response.json_body['workitems'].size.should be(2)
300
+ end
301
+
302
+ it "should narrow results down to multiple participants (HTML)" do
303
+ get "/_ruote/workitems", :participant => 'jack,jill'
304
+
305
+ last_response.should be_ok
306
+ end
307
+ end
308
+ end
@@ -0,0 +1,4 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe RuoteKit do
4
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --debugger