ruote-kit 2.1.10 → 2.1.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/.gitignore +2 -0
  2. data/CHANGELOG.txt +10 -0
  3. data/Gemfile +21 -5
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +132 -80
  6. data/Rakefile +4 -15
  7. data/TODO.txt +12 -0
  8. data/config.ru +22 -14
  9. data/lib/ruote-kit/application.rb +46 -22
  10. data/lib/ruote-kit/helpers/json_helpers.rb +280 -0
  11. data/lib/ruote-kit/helpers/link_helpers.rb +117 -0
  12. data/lib/ruote-kit/helpers/misc_helpers.rb +35 -0
  13. data/lib/ruote-kit/helpers/pagination_helpers.rb +30 -0
  14. data/lib/ruote-kit/helpers/render_helpers.rb +39 -92
  15. data/lib/ruote-kit/public/_ruote/images/favicon.ico +0 -0
  16. data/lib/ruote-kit/public/_ruote/images/ruote.png +0 -0
  17. data/lib/ruote-kit/public/_ruote/images/ruote_buttons.png +0 -0
  18. data/lib/ruote-kit/public/_ruote/javascripts/jquery-1.4.2.min.js +154 -0
  19. data/lib/ruote-kit/public/_ruote/javascripts/rk.js +40 -0
  20. data/lib/ruote-kit/public/_ruote/javascripts/ruote-fluo-editor.js +548 -0
  21. data/lib/ruote-kit/public/_ruote/javascripts/ruote-fluo.js +32 -1
  22. data/lib/ruote-kit/public/_ruote/stylesheets/reset.css +53 -0
  23. data/lib/ruote-kit/public/_ruote/stylesheets/rk.css +355 -16
  24. data/lib/ruote-kit/public/_ruote/stylesheets/ruote-fluo-editor.css +108 -0
  25. data/lib/ruote-kit/resources/errors.rb +46 -43
  26. data/lib/ruote-kit/resources/expressions.rb +92 -35
  27. data/lib/ruote-kit/resources/participants.rb +53 -0
  28. data/lib/ruote-kit/resources/processes.rb +68 -36
  29. data/lib/ruote-kit/resources/schedules.rb +27 -0
  30. data/lib/ruote-kit/resources/workitems.rb +93 -31
  31. data/lib/ruote-kit/spec/ruote_helpers.rb +25 -16
  32. data/lib/ruote-kit/version.rb +3 -1
  33. data/lib/ruote-kit/views/_pagination.html.haml +38 -0
  34. data/lib/ruote-kit/views/_tree_editor.html.haml +52 -0
  35. data/lib/ruote-kit/views/error.html.haml +69 -0
  36. data/lib/ruote-kit/views/errors.html.haml +28 -12
  37. data/lib/ruote-kit/views/expression.html.haml +161 -30
  38. data/lib/ruote-kit/views/expressions.html.haml +26 -21
  39. data/lib/ruote-kit/views/http_error.html.haml +11 -0
  40. data/lib/ruote-kit/views/index.html.haml +4 -0
  41. data/lib/ruote-kit/views/layout.html.haml +52 -32
  42. data/lib/ruote-kit/views/participants.html.haml +79 -0
  43. data/lib/ruote-kit/views/process.html.haml +109 -42
  44. data/lib/ruote-kit/views/process_launched.html.haml +6 -2
  45. data/lib/ruote-kit/views/processes.html.haml +55 -24
  46. data/lib/ruote-kit/views/processes_new.html.haml +36 -0
  47. data/lib/ruote-kit/views/schedules.html.haml +42 -0
  48. data/lib/ruote-kit/views/workitem.html.haml +83 -29
  49. data/lib/ruote-kit/views/workitems.html.haml +42 -19
  50. data/lib/ruote-kit.rb +17 -88
  51. data/ruote-kit.gemspec +68 -80
  52. data/spec/it_has_an_engine.rb +69 -0
  53. data/spec/resources/errors_spec.rb +198 -270
  54. data/spec/resources/expressions_spec.rb +308 -52
  55. data/spec/resources/index_spec.rb +28 -16
  56. data/spec/resources/participants_spec.rb +102 -0
  57. data/spec/resources/processes_spec.rb +218 -104
  58. data/spec/resources/schedules_spec.rb +97 -0
  59. data/spec/resources/workitems_spec.rb +195 -100
  60. data/spec/ruote-kit_configure_spec.rb +32 -75
  61. data/spec/spec.opts +0 -1
  62. data/spec/spec_helper.rb +31 -92
  63. data/spec/webapp_helpers_spec.rb +309 -0
  64. metadata +87 -152
  65. data/lib/ruote-kit/configuration.rb +0 -83
  66. data/lib/ruote-kit/helpers/engine_helpers.rb +0 -24
  67. data/lib/ruote-kit/helpers/form_helpers.rb +0 -11
  68. data/lib/ruote-kit/helpers/launch_item_parser.rb +0 -59
  69. data/lib/ruote-kit/helpers/navigation_helpers.rb +0 -54
  70. data/lib/ruote-kit/helpers.rb +0 -9
  71. data/lib/ruote-kit/public/_ruote/images/bg.gif +0 -0
  72. data/lib/ruote-kit/public/_ruote/images/bg_button_left.gif +0 -0
  73. data/lib/ruote-kit/public/_ruote/images/bg_button_left_cancel.gif +0 -0
  74. data/lib/ruote-kit/public/_ruote/images/bg_button_left_submit.gif +0 -0
  75. data/lib/ruote-kit/public/_ruote/images/bg_button_right.gif +0 -0
  76. data/lib/ruote-kit/public/_ruote/javascripts/SimplyButtons.js +0 -191
  77. data/lib/ruote-kit/public/_ruote/javascripts/fluo-dial.js +0 -149
  78. data/lib/ruote-kit/public/_ruote/stylesheets/SimplyButtons.css +0 -226
  79. data/lib/ruote-kit/public/_ruote/stylesheets/base.css +0 -336
  80. data/lib/ruote-kit/public/_ruote/stylesheets/style.css +0 -393
  81. data/lib/ruote-kit/views/launch_process.html.haml +0 -19
  82. data/lib/ruote-kit/views/process_failed_to_launch.html.haml +0 -7
  83. data/lib/ruote-kit/views/resource_not_found.html.haml +0 -7
  84. data/spec/helpers/render_helpers_spec.rb +0 -214
  85. data/spec/ruote-kit_spec.rb +0 -4
  86. data/spec/views/expressions.html.haml_spec.rb +0 -31
  87. data/spec/views/launch_process.html.haml_spec.rb +0 -22
  88. data/spec/views/process.html.haml_spec.rb +0 -17
  89. data/spec/views/process_launched.html.haml_spec.rb +0 -16
  90. data/spec/views/processes.html.haml_spec.rb +0 -31
  91. data/spec/views/workitems.html.haml_spec.rb +0 -69
@@ -1,52 +1,63 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
1
 
3
- describe "GET /_ruote/expressions", :type => :with_engine do
2
+ require 'spec_helper'
4
3
 
5
- it "should report a friendly message to the user (HTML)" do
6
- get "/_ruote/expressions"
4
+ undef :context if defined?(context)
7
5
 
8
- last_response.should be_ok
9
- end
10
6
 
11
- it "should report a friendly message to the client (JSON)" do
12
- get "/_ruote/expressions.json"
7
+ describe 'GET /_ruote/expressions' do
8
+
9
+ it_has_an_engine
13
10
 
14
- last_response.should be_ok
11
+ it 'should 404 (HTML)' do
15
12
 
16
- last_response.json_body['status'].should == 'ok'
13
+ get '/_ruote/expressions'
14
+
15
+ last_response.status.should be(404)
17
16
  end
18
17
  end
19
18
 
20
- describe "GET /_ruote/expressions/wfid", :type => :with_engine do
19
+ describe 'GET /_ruote/expressions/wfid' do
20
+
21
+ it_has_an_engine
22
+
23
+ describe 'with running processes' do
21
24
 
22
- describe "with running processes" do
23
25
  before(:each) do
24
26
  @wfid = launch_test_process
25
27
  end
26
28
 
27
- it "should render the expression tree (HTML)" do
29
+ it 'should render the expressions (HTML)' do
30
+
28
31
  get "/_ruote/expressions/#{@wfid}"
29
32
 
30
33
  last_response.should be_ok
31
34
  end
32
35
 
33
- it "should render the expression tree (JSON)" do
36
+ it 'should render the expressions (JSON)' do
37
+
34
38
  get "/_ruote/expressions/#{@wfid}.json"
35
39
 
36
40
  last_response.should be_ok
41
+
42
+ last_response.json_body['expressions'].first.keys.sort.should == %w[
43
+ class fei links name parent
44
+ ]
37
45
  end
38
46
  end
39
47
 
40
- describe "without running processes" do
41
- it "should 404 correctly (HTML)" do
48
+ describe 'without running processes' do
49
+
50
+ it 'should 404 correctly (HTML)' do
51
+
42
52
  get "/_ruote/expressions/foo"
43
53
 
44
54
  last_response.should_not be_ok
45
55
  last_response.status.should be(404)
46
56
  end
47
57
 
48
- it "should 404 correctly (JSON)" do
49
- get "/_ruote/expressions/foo.json"
58
+ it 'should 404 correctly (JSON)' do
59
+
60
+ get '/_ruote/expressions/foo.json'
50
61
 
51
62
  last_response.should_not be_ok
52
63
  last_response.status.should be(404)
@@ -54,49 +65,105 @@ describe "GET /_ruote/expressions/wfid", :type => :with_engine do
54
65
  end
55
66
  end
56
67
 
57
- describe "GET /_ruote/expressions/wfid/expid", :type => :with_engine do
68
+ describe 'GET /_ruote/expressions/fei' do
69
+
70
+ it_has_an_engine
71
+
72
+ describe 'with running processes' do
58
73
 
59
- describe "with running processes" do
60
74
  before(:each) do
75
+
61
76
  @wfid = launch_test_process
62
- process = engine.process( @wfid )
77
+ process = engine.process(@wfid)
63
78
  @nada_exp_id = process.expressions.last.fei.expid
64
79
  end
65
80
 
66
- it "should render the expression details (HTML)" do
67
- get "/_ruote/expressions/#{@wfid}/#{@nada_exp_id}"
81
+ it 'should render the expression (HTML)' do
82
+
83
+ get "/_ruote/expressions/#{@nada_exp_id}!!#{@wfid}"
68
84
 
69
85
  last_response.should be_ok
70
86
  end
71
87
 
72
- it "should render the expression details (JSON)" do
73
- get "/_ruote/expressions/#{@wfid}/#{@nada_exp_id}.json"
88
+ it 'should render the expression (JSON)' do
89
+
90
+ get "/_ruote/expressions/#{@nada_exp_id}!!#{@wfid}.json"
74
91
 
75
92
  last_response.should be_ok
93
+
94
+ #puts Rufus::Json.pretty_encode(last_response.json_body)
95
+
96
+ last_response.json_body['expression']['links'].size.should be(4)
97
+
98
+ last_response.json_body['expression'].keys.sort.should == %w[
99
+ applied_workitem class fei links name original_tree parent
100
+ timeout_schedule_id tree variables
101
+ ]
76
102
  end
77
103
  end
78
104
 
79
- describe "without running processes" do
80
- it "should 404 correctly (HTML)" do
81
- get "/workitems/foo/bar"
105
+ describe 'without running processes' do
106
+
107
+ it 'should 404 correctly (HTML)' do
108
+
109
+ get '/workitems/foo/bar'
82
110
 
83
111
  last_response.should_not be_ok
84
112
  last_response.status.should be(404)
85
113
  end
86
114
 
87
- it "should 404 correctly (JSON)" do
88
- get "/workitems/foo/bar.json"
115
+ it 'should 404 correctly (JSON)' do
116
+
117
+ get '/workitems/foo/bar.json'
89
118
 
90
119
  last_response.should_not be_ok
91
120
  last_response.status.should be(404)
92
121
  end
93
122
  end
123
+
124
+ describe 'with an expression that has a schedule' do
125
+
126
+ before(:each) do
127
+
128
+ @wfid = RuoteKit.engine.launch(Ruote.define do
129
+ alpha :timeout => '2y'
130
+ end)
131
+
132
+ RuoteKit.engine.wait_for(:alpha)
133
+ end
134
+
135
+ it 'should render the expression (HTML)' do
136
+
137
+ get "/_ruote/expressions/0_0!!#{@wfid}"
138
+
139
+ last_response.status.should be(200)
140
+
141
+ last_response.should have_selector(
142
+ 'table.details tr td', :content => 'timeout')
143
+ end
144
+
145
+ it 'should render the expression (JSON)' do
146
+
147
+ get "/_ruote/expressions/0_0!!#{@wfid}.json"
148
+
149
+ last_response.status.should be(200)
150
+
151
+ #puts Rufus::Json.pretty_encode(last_response.json_body)
152
+
153
+ last_response.json_body['expression'].keys.should include(
154
+ 'timeout_schedule_id')
155
+ end
156
+ end
94
157
  end
95
158
 
96
- describe "DELETE /_ruote/expressions/wfid/expid", :type => :with_engine do
159
+ describe 'DELETE /_ruote/expressions/fei' do
160
+
161
+ it_has_an_engine
162
+
163
+ describe 'with running processes' do
97
164
 
98
- describe "with running processes" do
99
165
  before(:each) do
166
+
100
167
  @wfid = launch_test_process do
101
168
  Ruote.process_definition :name => 'delete' do
102
169
  sequence do
@@ -112,72 +179,261 @@ describe "DELETE /_ruote/expressions/wfid/expid", :type => :with_engine do
112
179
  end
113
180
  end
114
181
 
115
- wait_exp = engine.process( @wfid ).expressions.last
182
+ wait_exp = engine.process(@wfid).expressions.last
116
183
  @expid = "0_1_0" #wait_exp.fei.expid
117
184
  end
118
185
 
119
- it "should cancel the expressions (HTML)" do
120
- delete "/_ruote/expressions/#{@wfid}/#{@expid}"
186
+ it 'should cancel the expressions (HTML)' do
187
+
188
+ delete "/_ruote/expressions/#{@expid}!!#{@wfid}"
121
189
 
122
190
  last_response.should be_redirect
123
191
  last_response['Location'].should == "/_ruote/expressions/#{@wfid}"
124
192
 
125
193
  #sleep 0.4
126
- wait_for( @wfid )
194
+ wait_for(@wfid)
127
195
 
128
196
  @tracer.to_s.should == "bailed\ndone"
129
197
  end
130
198
 
131
- it "should cancel the expressions (JSON)" do
132
- delete "/_ruote/expressions/#{@wfid}/#{@expid}.json"
199
+ it 'should cancel the expressions (JSON)' do
200
+
201
+ delete "/_ruote/expressions/#{@expid}!!#{@wfid}.json"
133
202
 
134
203
  last_response.should be_ok
135
204
  last_response.json_body['status'].should == 'ok'
136
205
 
137
206
  #sleep 0.4
138
- wait_for( @wfid )
207
+ wait_for(@wfid)
139
208
 
140
209
  @tracer.to_s.should == "bailed\ndone"
141
210
  end
142
211
 
143
- it "should kill the expression (HTML)" do
144
- delete "/_ruote/expressions/#{@wfid}/#{@expid}?_kill=1"
212
+ it 'should kill the expression (HTML)' do
213
+
214
+ delete "/_ruote/expressions/#{@expid}!!#{@wfid}?_kill=1"
145
215
 
146
216
  last_response.should be_redirect
147
217
  last_response['Location'].should == "/_ruote/expressions/#{@wfid}"
148
218
 
149
219
  #sleep 0.4
150
- wait_for( @wfid )
220
+ wait_for(@wfid)
151
221
 
152
- @tracer.to_s.should == "done"
222
+ @tracer.to_s.should == 'done'
153
223
  end
154
224
 
155
- it "should kill the expression (JSON)" do
156
- delete "/_ruote/expressions/#{@wfid}/#{@expid}.json?_kill=1"
225
+ it 'should kill the expression (JSON)' do
226
+
227
+ delete "/_ruote/expressions/#{@expid}!!#{@wfid}.json?_kill=1"
157
228
 
158
229
  last_response.should be_ok
159
230
  last_response.json_body['status'].should == 'ok'
160
231
 
161
232
  #sleep 0.4
162
- wait_for( @wfid )
233
+ wait_for(@wfid)
163
234
 
164
- @tracer.to_s.should == "done"
235
+ @tracer.to_s.should == 'done'
165
236
  end
166
237
  end
167
238
 
168
- describe "without running processes" do
169
- it "should 404 correctly (HTML)" do
170
- delete "/_ruote/expressions/foo/bar"
239
+ describe 'without running processes' do
240
+
241
+ it 'should 404 correctly (HTML)' do
242
+
243
+ delete '/_ruote/expressions/foo/bar'
171
244
 
172
245
  last_response.should_not be_ok
173
246
  last_response.status.should be(404)
174
247
  end
175
248
 
176
- it "should 404 correctly (JSON)" do
177
- delete "/_ruote/expressions/foo/bar.json"
249
+ it 'should 404 correctly (JSON)' do
250
+
251
+ delete '/_ruote/expressions/foo/bar.json'
178
252
 
179
253
  last_response.should_not be_ok
180
254
  last_response.status.should be(404)
181
255
  end
182
256
  end
183
257
  end
258
+
259
+ describe 'PUT /_ruote/expressions/fei' do
260
+
261
+ it_has_an_engine
262
+
263
+ before(:each) do
264
+
265
+ @wfid = launch_test_process do
266
+ Ruote.process_definition do
267
+ alpha
268
+ end
269
+ end
270
+
271
+ @exp = RuoteKit.engine.process(@wfid).expressions.find { |e|
272
+ e.fei.expid == '0_0'
273
+ }
274
+ end
275
+
276
+ it 'should re-apply (HTML)' do
277
+
278
+ at0 = RuoteKit.engine.storage_participant.first.dispatched_at
279
+
280
+ put(
281
+ "/_ruote/expressions/#{@exp.fei.sid}",
282
+ :fields => '{}')
283
+
284
+ last_response.status.should be(302)
285
+ last_response.location.should == "/_ruote/expressions/#{@wfid}"
286
+
287
+ #RuoteKit.engine.wait_for(:alpha)
288
+ sleep 0.500
289
+
290
+ at1 = RuoteKit.engine.storage_participant.first.dispatched_at
291
+
292
+ at1.should_not == at0
293
+ end
294
+
295
+ it 'should re-apply (JSON)' do
296
+
297
+ #RuoteKit.engine.noisy = true
298
+
299
+ at0 = RuoteKit.engine.storage_participant.first.dispatched_at
300
+
301
+ put(
302
+ "/_ruote/expressions/#{@exp.fei.sid}.json",
303
+ Rufus::Json.encode({}),
304
+ { 'CONTENT_TYPE' => 'application/json' })
305
+
306
+ last_response.status.should be(200)
307
+
308
+ #RuoteKit.engine.wait_for(:alpha)
309
+ sleep 0.500
310
+
311
+ at1 = RuoteKit.engine.storage_participant.first.dispatched_at
312
+
313
+ at1.should_not == at0
314
+ end
315
+
316
+ it 'should re-apply with different fields (HTML)' do
317
+
318
+ wi = RuoteKit.engine.storage_participant.first
319
+ wi.fields['car'].should be(nil)
320
+
321
+ put(
322
+ "/_ruote/expressions/#{@exp.fei.sid}",
323
+ :fields => '{"car":"daimler-benz"}')
324
+
325
+ last_response.status.should be(302)
326
+ last_response.location.should == "/_ruote/expressions/#{@wfid}"
327
+
328
+ #RuoteKit.engine.wait_for(:alpha)
329
+ sleep 0.500
330
+
331
+ wi = RuoteKit.engine.storage_participant.first
332
+
333
+ wi.fields['car'].should == 'daimler-benz'
334
+ end
335
+
336
+ it 'should re-apply with different fields (JSON)' do
337
+
338
+ wi = RuoteKit.engine.storage_participant.first
339
+ wi.fields['car'].should be(nil)
340
+
341
+ put(
342
+ "/_ruote/expressions/#{@exp.fei.sid}.json",
343
+ Rufus::Json.encode({ 'fields' => { 'car' => 'bentley' } }),
344
+ { 'CONTENT_TYPE' => 'application/json' })
345
+
346
+ last_response.status.should be(200)
347
+
348
+ #RuoteKit.engine.wait_for(:alpha)
349
+ sleep 0.500
350
+
351
+ wi = RuoteKit.engine.storage_participant.first
352
+
353
+ wi.fields['car'].should == 'bentley'
354
+ end
355
+
356
+ it 'should re-apply when passed {"expression":{"fields":...}} (JSON)' do
357
+
358
+ exp = { 'expression' => { 'fields' => { 'car' => 'BMW' } } }
359
+
360
+ put(
361
+ "/_ruote/expressions/#{@exp.fei.sid}.json",
362
+ Rufus::Json.encode(exp),
363
+ { 'CONTENT_TYPE' => 'application/json' })
364
+
365
+ last_response.status.should be(200)
366
+
367
+ #RuoteKit.engine.wait_for(:alpha)
368
+ sleep 0.500
369
+
370
+ wi = RuoteKit.engine.storage_participant.first
371
+
372
+ wi.fields['car'].should == 'BMW'
373
+ end
374
+
375
+ it 'should re-apply with a different tree (HTML)' do
376
+
377
+ put(
378
+ "/_ruote/expressions/#{@exp.fei.sid}",
379
+ :tree => '["charly", {}, []]')
380
+
381
+ last_response.status.should be(302)
382
+ last_response.location.should == "/_ruote/expressions/#{@wfid}"
383
+
384
+ #RuoteKit.engine.wait_for(:alpha)
385
+ sleep 0.500
386
+
387
+ wi = RuoteKit.engine.storage_participant.first
388
+
389
+ wi.participant_name.should == 'charly'
390
+
391
+ RuoteKit.engine.process(@wfid).current_tree.should == [ 'define', {}, [
392
+ [ 'participant', { '_triggered' => 'on_re_apply', 'ref' => 'charly' }, [] ] ] ]
393
+ end
394
+
395
+ it 'should re-apply with a different tree (JSON)' do
396
+
397
+ wi = RuoteKit.engine.storage_participant.first
398
+ wi.participant_name.should == 'alpha'
399
+
400
+ put(
401
+ "/_ruote/expressions/#{@exp.fei.sid}.json",
402
+ Rufus::Json.encode({ 'tree' => [ 'bravo', {}, [] ] }),
403
+ { 'CONTENT_TYPE' => 'application/json' })
404
+
405
+ last_response.status.should be(200)
406
+
407
+ #RuoteKit.engine.wait_for(:alpha)
408
+ sleep 0.500
409
+
410
+ wi = RuoteKit.engine.storage_participant.first
411
+
412
+ wi.participant_name.should == 'bravo'
413
+
414
+ RuoteKit.engine.process(@wfid).current_tree.should == [ 'define', {}, [
415
+ [ 'participant', { '_triggered' => 'on_re_apply', 'ref' => 'bravo' }, [] ] ] ]
416
+ end
417
+
418
+ it 'should 400 when passed bogus JSON (HTML)' do
419
+
420
+ put(
421
+ "/_ruote/expressions/#{@exp.fei.sid}",
422
+ :fields => "{bogus}")
423
+
424
+ last_response.status.should be(400)
425
+ end
426
+
427
+ it 'should 400 when passed bogus JSON (JSON)' do
428
+
429
+ put(
430
+ "/_ruote/expressions/#{@exp.fei.sid}.json",
431
+ '{"fields":{bogus}}',
432
+ { 'CONTENT_TYPE' => 'application/json' })
433
+
434
+ last_response.status.should be(400)
435
+ last_response.json_body['http_error']['code'].should == 400
436
+ last_response.json_body['http_error']['message'].should == 'bad request'
437
+ end
438
+ end
439
+
@@ -1,44 +1,55 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
1
 
3
- describe "GET /", :type => :with_engine do
2
+ require 'spec_helper'
4
3
 
5
- it "should return a welcome message in HTML be default" do
6
- get "/_ruote"
4
+
5
+ describe 'GET /' do
6
+
7
+ it_has_an_engine
8
+
9
+ it 'should return a welcome message in HTML be default' do
10
+
11
+ get '/_ruote'
7
12
 
8
13
  last_response.should be_ok
9
- last_response.content_type.should match("text/html")
14
+ last_response.content_type.should match('text/html')
10
15
 
11
16
  last_response.should match(/Hello world/)
12
17
  last_response.should match(/<title>/)
13
18
  end
14
19
 
15
- it "should return a version string if JSON is requested" do
16
- header "Accept", "application/json"
20
+ it 'should return a version string if JSON is requested' do
21
+
22
+ header 'Accept', 'application/json'
17
23
 
18
- get "/_ruote"
24
+ get '/_ruote'
19
25
 
20
26
  last_response.should be_ok
21
- last_response.content_type.should match("application/json")
27
+ last_response.content_type.should match('application/json')
22
28
  body = last_response.json_body
23
29
 
24
- body["misc"].should == { "ruote-kit" => "welcome", "version" => RuoteKit::VERSION.to_s }
30
+ body['misc'].should == {
31
+ 'ruote-kit' => 'welcome', 'version' => RuoteKit::VERSION.to_s }
25
32
  end
26
33
  end
27
34
 
28
- describe "Generic error handling", :type => :with_engine do
35
+ describe 'Generic error handling' do
29
36
 
30
- it "should give our own 404 page (HTML)" do
31
- get "/kenneth"
37
+ it_has_an_engine
38
+
39
+ it 'should give our own 404 page (HTML)' do
40
+
41
+ get '/kenneth'
32
42
 
33
43
  last_response.should_not be_ok
34
44
  last_response.status.should be(404)
35
45
 
36
46
  last_response.should be_html
37
- last_response.should match(/Resource not found/)
47
+ last_response.should match(/resource not found/)
38
48
  end
39
49
 
40
- it "should give our own 404 data (JSON)" do
41
- get "/kenneth.json"
50
+ it 'should give our own 404 data (JSON)' do
51
+
52
+ get '/kenneth.json'
42
53
 
43
54
  last_response.should_not be_ok
44
55
  last_response.status.should be(404)
@@ -46,3 +57,4 @@ describe "Generic error handling", :type => :with_engine do
46
57
  last_response.should be_json
47
58
  end
48
59
  end
60
+
@@ -0,0 +1,102 @@
1
+
2
+ require 'spec_helper'
3
+
4
+
5
+ describe 'GET /_ruote/participants' do
6
+
7
+ describe 'without any participant' do
8
+
9
+ it_has_an_engine_with_no_participants
10
+
11
+ it 'should give an empty list (HTML)' do
12
+ get '/_ruote/participants'
13
+
14
+ last_response.status.should be(200)
15
+ end
16
+
17
+ it 'should give an empty array (JSON)' do
18
+
19
+ get '/_ruote/participants.json'
20
+
21
+ last_response.status.should be(200)
22
+
23
+ body = last_response.json_body
24
+ body.should have_key('participants')
25
+
26
+ body['participants'].should be_empty
27
+ end
28
+ end
29
+
30
+ describe 'with participant' do
31
+
32
+ it_has_an_engine
33
+
34
+ it 'should give participant information back (HTML)' do
35
+
36
+ get '/_ruote/participants'
37
+
38
+ last_response.status.should be(200)
39
+ end
40
+
41
+ it 'should give participant information back (JSON)' do
42
+
43
+ get '/_ruote/participants.json'
44
+
45
+ last_response.status.should be(200)
46
+
47
+ body = last_response.json_body
48
+
49
+ body['participants'].should_not be_empty
50
+ end
51
+ end
52
+ end
53
+
54
+ describe 'PUT /_ruote/participants' do
55
+
56
+ it_has_an_engine
57
+
58
+ it 'should update the list (HTML)' do
59
+
60
+ put(
61
+ '/_ruote/participants',
62
+ 'regex_0' => '^alice$',
63
+ 'classname_0' => 'Ruote::StorageParticipant',
64
+ 'options_0' => '{}',
65
+ 'regex_1' => '^bravo$',
66
+ 'classname_1' => 'Ruote::StorageParticipant',
67
+ 'options_1' => '{}')
68
+
69
+ last_response.should be_redirect
70
+ last_response['Location'].should == '/_ruote/participants'
71
+
72
+ RuoteKit.engine.participant_list.collect { |pe| pe.regex }.should == [
73
+ '^alice$', '^bravo$'
74
+ ]
75
+ end
76
+
77
+ it 'should update the list (JSON)' do
78
+
79
+ list = {
80
+ 'participants' => [
81
+ { 'regex' => '^alice$',
82
+ 'classname' => 'Ruote::StorageParticipant',
83
+ 'options' => {} },
84
+ { 'regex' => '^bravo$',
85
+ 'classname' => 'Ruote::StorageParticipant',
86
+ 'options' => {} }
87
+ ]
88
+ }
89
+
90
+ put(
91
+ '/_ruote/participants.json',
92
+ Rufus::Json.encode(list),
93
+ { 'CONTENT_TYPE' => 'application/json' })
94
+
95
+ last_response.status.should be(200)
96
+
97
+ RuoteKit.engine.participant_list.collect { |pe| pe.regex }.should == [
98
+ '^alice$', '^bravo$'
99
+ ]
100
+ end
101
+ end
102
+