vayacondios-server 0.2.11 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. data/.gitignore +3 -1
  2. data/.travis.yml +2 -0
  3. data/Gemfile +15 -9
  4. data/LICENSE.md +2 -6
  5. data/Procfile +1 -1
  6. data/README.md +656 -111
  7. data/Rakefile +89 -6
  8. data/bin/vcd +10 -0
  9. data/bin/vcd-server +8 -0
  10. data/config/database.yml +6 -0
  11. data/config/spec.example.yml +18 -0
  12. data/config/vayacondios.example.yml +15 -0
  13. data/config/vcd-server.rb +37 -0
  14. data/examples/configuration.rb +56 -0
  15. data/examples/event_stream.rb +19 -0
  16. data/examples/simple.rb +61 -0
  17. data/features/event.feature +319 -0
  18. data/features/events.feature +208 -0
  19. data/features/stash.feature +840 -0
  20. data/features/stashes.feature +492 -0
  21. data/features/step_definitions/stash_steps.rb +113 -0
  22. data/features/stream.feature +30 -0
  23. data/features/support/em.rb +14 -0
  24. data/features/support/env.rb +13 -0
  25. data/lib/vayacondios/configuration.rb +63 -0
  26. data/lib/vayacondios/server/api.rb +126 -0
  27. data/lib/vayacondios/server/api_options.rb +56 -0
  28. data/lib/vayacondios/server/configuration.rb +23 -0
  29. data/lib/vayacondios/server/driver.rb +71 -0
  30. data/lib/vayacondios/server/drivers/mongo.rb +126 -0
  31. data/lib/vayacondios/server/handlers/document_handler.rb +81 -0
  32. data/lib/vayacondios/server/handlers/event_handler.rb +31 -26
  33. data/lib/vayacondios/server/handlers/events_handler.rb +31 -0
  34. data/lib/vayacondios/server/handlers/stash_handler.rb +69 -0
  35. data/lib/vayacondios/server/handlers/stashes_handler.rb +49 -0
  36. data/lib/vayacondios/server/handlers/stream_handler.rb +39 -0
  37. data/lib/vayacondios/server/models/document.rb +87 -0
  38. data/lib/vayacondios/server/models/event.rb +198 -0
  39. data/lib/vayacondios/server/models/stash.rb +100 -0
  40. data/lib/vayacondios/server.rb +35 -0
  41. data/lib/vayacondios-server.rb +19 -13
  42. data/lib/vayacondios.rb +22 -0
  43. data/pom.xml +124 -4
  44. data/spec/configuration_spec.rb +41 -0
  45. data/spec/server/api_options_spec.rb +32 -0
  46. data/spec/server/api_spec.rb +279 -0
  47. data/spec/server/configuration_spec.rb +27 -0
  48. data/spec/server/drivers/mongo_spec.rb +107 -0
  49. data/spec/server/handlers/event_handler_spec.rb +62 -0
  50. data/spec/server/handlers/events_handler_spec.rb +51 -0
  51. data/spec/server/handlers/stash_handler_spec.rb +68 -0
  52. data/spec/server/handlers/stashes_handler_spec.rb +50 -0
  53. data/spec/server/handlers/stream_handler_spec.rb +5 -0
  54. data/spec/server/models/document_spec.rb +9 -0
  55. data/spec/server/models/event_spec.rb +185 -0
  56. data/spec/server/models/stash_spec.rb +95 -0
  57. data/spec/spec_helper.rb +23 -3
  58. data/spec/support/database_helper.rb +42 -0
  59. data/spec/support/log_helper.rb +19 -0
  60. data/spec/support/shared_context_for_events.rb +22 -0
  61. data/spec/support/shared_context_for_stashes.rb +24 -0
  62. data/spec/support/shared_examples_for_handlers.rb +32 -0
  63. data/src/main/java/com/infochimps/vayacondios/BaseClient.java +342 -0
  64. data/src/main/java/com/infochimps/vayacondios/HTTPClient.java +426 -0
  65. data/src/main/java/com/infochimps/vayacondios/VayacondiosClient.java +487 -65
  66. data/src/main/java/com/infochimps/vayacondios/test/IntegrationTest.java +3 -0
  67. data/src/test/java/com/infochimps/vayacondios/BaseClientTest.java +50 -0
  68. data/src/test/java/com/infochimps/vayacondios/HTTPClientIT.java +267 -0
  69. data/vayacondios-server.gemspec +9 -9
  70. metadata +127 -122
  71. checksums.yaml +0 -15
  72. data/.rspec +0 -2
  73. data/.yardopts +0 -10
  74. data/Guardfile +0 -41
  75. data/app/http_shim.rb +0 -71
  76. data/bin/vcd.sh +0 -27
  77. data/config/http_shim.rb +0 -43
  78. data/config/vayacondios.example.yaml +0 -7
  79. data/config/vayacondios.yaml +0 -7
  80. data/examples/java/ItemSetTest.java +0 -76
  81. data/lib/tasks/publish.rake +0 -23
  82. data/lib/tasks/spec.rake +0 -11
  83. data/lib/tasks/yard.rake +0 -2
  84. data/lib/vayacondios/client/config.rb +0 -7
  85. data/lib/vayacondios/client/configliere.rb +0 -38
  86. data/lib/vayacondios/client/cube_client.rb +0 -39
  87. data/lib/vayacondios/client/http_client.rb +0 -49
  88. data/lib/vayacondios/client/itemset.rb +0 -130
  89. data/lib/vayacondios/client/legacy_switch.rb +0 -43
  90. data/lib/vayacondios/client/notifier.rb +0 -123
  91. data/lib/vayacondios/client/zabbix_client.rb +0 -148
  92. data/lib/vayacondios/legacy_switch.rb +0 -43
  93. data/lib/vayacondios/server/errors/bad_request.rb +0 -6
  94. data/lib/vayacondios/server/errors/not_found.rb +0 -6
  95. data/lib/vayacondios/server/handlers/config_handler.rb +0 -32
  96. data/lib/vayacondios/server/handlers/itemset_handler.rb +0 -60
  97. data/lib/vayacondios/server/legacy_switch.rb +0 -43
  98. data/lib/vayacondios/server/model/config_document.rb +0 -89
  99. data/lib/vayacondios/server/model/document.rb +0 -25
  100. data/lib/vayacondios/server/model/event_document.rb +0 -94
  101. data/lib/vayacondios/server/model/itemset_document.rb +0 -126
  102. data/lib/vayacondios/server/rack/extract_methods.rb +0 -35
  103. data/lib/vayacondios/server/rack/jsonize.rb +0 -43
  104. data/lib/vayacondios/server/rack/params.rb +0 -50
  105. data/lib/vayacondios/server/rack/path.rb +0 -23
  106. data/lib/vayacondios/server/rack/path_validation.rb +0 -22
  107. data/lib/vayacondios/version.rb +0 -3
  108. data/lib/vayacondios-client.rb +0 -22
  109. data/scripts/hadoop_monitor/configurable.rb +0 -66
  110. data/scripts/hadoop_monitor/hadoop_attempt_scraper.rb +0 -45
  111. data/scripts/hadoop_monitor/hadoop_client.rb +0 -273
  112. data/scripts/hadoop_monitor/hadoop_monitor.rb +0 -101
  113. data/scripts/hadoop_monitor/hadoopable.rb +0 -65
  114. data/scripts/hadoop_monitor/machine_monitor.rb +0 -115
  115. data/scripts/s3_cataloger/buckets +0 -33
  116. data/scripts/s3_cataloger/foreach_bucket +0 -88
  117. data/scripts/s3_cataloger/parse_ls.py +0 -391
  118. data/spec/client/itemset_legacy_spec.rb +0 -55
  119. data/spec/client/itemset_spec.rb +0 -60
  120. data/spec/client/notifier_spec.rb +0 -120
  121. data/spec/server/config_spec.rb +0 -113
  122. data/spec/server/event_spec.rb +0 -103
  123. data/spec/server/itemset_legacy_spec.rb +0 -320
  124. data/spec/server/itemset_spec.rb +0 -317
  125. data/spec/server/rack/extract_methods_spec.rb +0 -60
  126. data/spec/server/rack/path_spec.rb +0 -36
  127. data/spec/server/rack/path_validation_spec.rb +0 -22
  128. data/spec/server/server_spec.rb +0 -20
  129. data/spec/support/mongo_cleaner.rb +0 -32
  130. data/src/main/java/ItemSetTest.java +0 -76
  131. data/src/main/java/com/infochimps/util/CurrentClass.java +0 -26
  132. data/src/main/java/com/infochimps/util/DebugUtil.java +0 -38
  133. data/src/main/java/com/infochimps/util/HttpHelper.java +0 -181
  134. data/src/main/java/com/infochimps/vayacondios/ItemSets.java +0 -373
  135. data/src/main/java/com/infochimps/vayacondios/LinkToVCD.java +0 -18
  136. data/src/main/java/com/infochimps/vayacondios/MemoryVCDShim.java +0 -84
  137. data/src/main/java/com/infochimps/vayacondios/Organization.java +0 -62
  138. data/src/main/java/com/infochimps/vayacondios/PathBuilder.java +0 -13
  139. data/src/main/java/com/infochimps/vayacondios/StandardVCDLink.java +0 -218
  140. data/src/main/java/com/infochimps/vayacondios/VCDIntegrationTest.java +0 -108
  141. data/src/test/java/com/infochimps/vayacondios/TestVayacondiosInMemory.java +0 -78
  142. data/vayacondios-client.gemspec +0 -25
@@ -0,0 +1,492 @@
1
+ Feature: Stashes
2
+ In order to provide functionality
3
+ As a user of the Vayacondios Api
4
+ I want to document how Stashes work
5
+
6
+ Scenario: Retrieving Missing Stashes
7
+ Given there are no matching Stashes in the database
8
+ When the client sends a GET request to "/v3/organization/stashes" with no body
9
+ Then the response status should be 200
10
+ And the response body should be:
11
+ """
12
+ [
13
+ ]
14
+ """
15
+
16
+ Scenario: Retrieving Existing Stashes
17
+ Given the following Stash exists in the database:
18
+ """
19
+ {
20
+ "_id": "topic",
21
+ "foo": "bar"
22
+ }
23
+ """
24
+ And the following Stash exists in the database:
25
+ """
26
+ {
27
+ "_id": "un_topic",
28
+ "baz": "qix"
29
+ }
30
+ """
31
+ When the client sends a GET request to "/v3/organization/stashes" with no body
32
+ Then the response status should be 200
33
+ And the response body should be:
34
+ """
35
+ [
36
+ {
37
+ "topic": "topic",
38
+ "foo":"bar"
39
+ },
40
+ {
41
+ "topic": "un_topic",
42
+ "baz": "qix"
43
+ }
44
+ ]
45
+ """
46
+
47
+ Scenario: Retrieving Nested Stashes
48
+ Given the following Stash exists in the database:
49
+ """
50
+ {
51
+ "_id": "topic",
52
+ "root": {
53
+ "b": 1
54
+ }
55
+ }
56
+ """
57
+ When the client sends a GET request to "/v3/organization/stashes" with the following body:
58
+ """
59
+ {
60
+ "root.b": 1
61
+ }
62
+ """
63
+ Then the response status should be 200
64
+ And the response body should be:
65
+ """
66
+ [
67
+ {
68
+ "topic": "topic",
69
+ "root": {
70
+ "b": 1
71
+ }
72
+ }
73
+ ]
74
+ """
75
+
76
+ Scenario: Retrieving Nested Stashes using Projection
77
+ Given the following Stash exists in the database:
78
+ """
79
+ {
80
+ "_id": "topic",
81
+ "root": {
82
+ "a": {
83
+ "foo": "bar"
84
+ },
85
+ "b": 1
86
+ }
87
+ }
88
+ """
89
+ When the client sends a GET request to "/v3/organization/stashes" with the following body:
90
+ """
91
+ {
92
+ "root.b": 1,
93
+ "fields": ["root.a"]
94
+ }
95
+ """
96
+ Then the response status should be 200
97
+ And the response body should be:
98
+ """
99
+ [
100
+ {
101
+ "topic": "topic",
102
+ "root": {
103
+ "a": {
104
+ "foo": "bar"
105
+ }
106
+ }
107
+ }
108
+ ]
109
+ """
110
+
111
+ Scenario: Creating Stashes without a Query
112
+ Given there are no matching Stashes in the database
113
+ When the client sends a POST request to "/v3/organization/stashes" with no body
114
+ Then the response status should be 405
115
+ And the response body should be:
116
+ """
117
+ {
118
+ "error": "Operation create not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
119
+ }
120
+ """
121
+ And there are no Stashes in the database
122
+ # Then the response status should be 400
123
+ # And the response body should be:
124
+ # """
125
+ # {
126
+ # "error": "Query cannot be empty"
127
+ # }
128
+ # """
129
+ # And there are no Stashes in the database
130
+
131
+ Scenario: Creating Stashes with a Malformed Query
132
+ Given there are no matching Stashes in the database
133
+ When the client sends a POST request to "/v3/organization/stashes" with the following body:
134
+ """
135
+ {
136
+ "query": "busted"
137
+ }
138
+ """
139
+ Then the response status should be 405
140
+ And the response body should be:
141
+ """
142
+ {
143
+ "error": "Operation create not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
144
+ }
145
+ """
146
+ And there are no Stashes in the database
147
+ # Then the response status should be 400
148
+ # And the response body should be:
149
+ # """
150
+ # {
151
+ # "error": "Query must be a Hash"
152
+ # }
153
+ # """
154
+ # And there are no Stashes in the database
155
+
156
+ Scenario: Creating Stashes with an Empty Query
157
+ Given there are no matching Stashes in the database
158
+ When the client sends a POST request to "/v3/organization/stashes" with the following body:
159
+ """
160
+ {
161
+ "query": { }
162
+ }
163
+ """
164
+ Then the response status should be 405
165
+ And the response body should be:
166
+ """
167
+ {
168
+ "error": "Operation create not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
169
+ }
170
+ """
171
+ And there are no Stashes in the database
172
+ # Then the response status should be 400
173
+ # And the response body should be:
174
+ # """
175
+ # {
176
+ # "error": "Query cannot be empty"
177
+ # }
178
+ # """
179
+ # And there are no Stashes in the database
180
+
181
+ Scenario: Creating Stashes when the Query does not Match
182
+ Given the following Stash exists in the database:
183
+ """
184
+ {
185
+ "_id": "topic",
186
+ "foo": "bar"
187
+ }
188
+ """
189
+ When the client sends a POST request to "/v3/organization/stashes" with the following body:
190
+ """
191
+ {
192
+ "query": {
193
+ "foo": "baz"
194
+ },
195
+ "update": {
196
+ "foo": "qix"
197
+ }
198
+ }
199
+ """
200
+ Then the response status should be 405
201
+ And the response body should be:
202
+ """
203
+ {
204
+ "error": "Operation create not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
205
+ }
206
+ """
207
+ # Then the response status should be 200
208
+ # And the response body should be:
209
+ # """
210
+ # {
211
+ # }
212
+ # """
213
+ # And the database should have the following Stash:
214
+ # """
215
+ # {
216
+ # "_id": "topic"
217
+ # "foo": "bar"
218
+ # }
219
+ # """
220
+
221
+ Scenario: Creating Stashes when the Query does Match
222
+ Given the following Stash exists in the database:
223
+ """
224
+ {
225
+ "_id": "topic",
226
+ "foo": "bar"
227
+ }
228
+ """
229
+ When the client sends a POST request to "/v3/organization/stashes" with the following body:
230
+ """
231
+ {
232
+ "query": {
233
+ "foo": "bar"
234
+ },
235
+ "update": {
236
+ "foo": "qix"
237
+ }
238
+ }
239
+ """
240
+ Then the response status should be 405
241
+ And the response body should be:
242
+ """
243
+ {
244
+ "error": "Operation create not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
245
+ }
246
+ """
247
+ # Then the response status should be 200
248
+ # And the response body should be:
249
+ # """
250
+ # {
251
+ # }
252
+ # """
253
+ # And the database should have the following Stash:
254
+ # """
255
+ # {
256
+ # "_id": "topic"
257
+ # "foo": "qix"
258
+ # }
259
+ # """
260
+
261
+ Scenario: Updating a non-Existent Stash with an Empty Hash
262
+ Given there are no matching Stashes in the database
263
+ When the client sends a PUT request to "/v3/organization/stashes" with no body
264
+ Then the response status should be 405
265
+ And the response body should be:
266
+ """
267
+ {
268
+ "error": "Operation update not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
269
+ }
270
+ """
271
+ # Then the response status should be 200
272
+ # And the response body should be:
273
+ # """
274
+ # {
275
+ # }
276
+ # """
277
+ # And the database should have the following Stash:
278
+ # """
279
+ # {
280
+ # "_id": "topic"
281
+ # }
282
+ # """
283
+
284
+ Scenario: Updating non-Existent Stashes without a Query
285
+ Given there are no matching Stashes in the database
286
+ When the client sends a PUT request to "/v3/organization/stashes" with no body
287
+ Then the response status should be 405
288
+ And the response body should be:
289
+ """
290
+ {
291
+ "error": "Operation update not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
292
+ }
293
+ """
294
+ # Then the response status should be 400
295
+ # And the response body should be:
296
+ # """
297
+ # {
298
+ # "error": "Query cannot be empty"
299
+ # }
300
+ # """
301
+ # And there are no Stashes in the database
302
+
303
+ Scenario: Updating non-Existent Stashes with a Malformed Query
304
+ Given there are no matching Stashes in the database
305
+ When the client sends a PUT request to "/v3/organization/stashes" with the following body:
306
+ """
307
+ {
308
+ "query": "busted"
309
+ }
310
+ """
311
+ Then the response status should be 405
312
+ And the response body should be:
313
+ """
314
+ {
315
+ "error": "Operation update not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
316
+ }
317
+ """
318
+ # Then the response status should be 400
319
+ # And the response body should be:
320
+ # """
321
+ # {
322
+ # "error": "Query must be a Hash"
323
+ # }
324
+ # """
325
+ # And there are no Stashes in the database
326
+
327
+ Scenario: Updating non-Existent Stashes with an Empty Query
328
+ Given there are no matching Stashes in the database
329
+ When the client sends a PUT request to "/v3/organization/stashes" with the following body:
330
+ """
331
+ {
332
+ "query": { }
333
+ }
334
+ """
335
+ Then the response status should be 405
336
+ And the response body should be:
337
+ """
338
+ {
339
+ "error": "Operation update not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
340
+ }
341
+ """
342
+ # Then the response status should be 400
343
+ # And the response body should be:
344
+ # """
345
+ # {
346
+ # "error": "Query cannot be empty"
347
+ # }
348
+ # """
349
+ # And there are no Stashes in the database
350
+
351
+ Scenario: Updating Existent Stashes when the Query does not Match
352
+ Given the following Stash exists in the database:
353
+ """
354
+ {
355
+ "_id": "topic",
356
+ "foo": "bar"
357
+ }
358
+ """
359
+ When the client sends a PUT request to "/v3/organization/stashes" with the following body:
360
+ """
361
+ {
362
+ "query": {
363
+ "foo": "baz"
364
+ },
365
+ "update": {
366
+ "foo": "qix"
367
+ }
368
+ }
369
+ """
370
+ Then the response status should be 405
371
+ And the response body should be:
372
+ """
373
+ {
374
+ "error": "Operation update not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
375
+ }
376
+ """
377
+ # Then the response status should be 200
378
+ # And the response body should be:
379
+ # """
380
+ # {
381
+ # }
382
+ # """
383
+ # And the database should have the following Stash:
384
+ # """
385
+ # {
386
+ # "_id": "topic"
387
+ # "foo": "bar"
388
+ # }
389
+ # """
390
+
391
+ Scenario: Updating Existing Stashes when the Query does Match
392
+ Given the following Stash exists in the database:
393
+ """
394
+ {
395
+ "_id": "topic",
396
+ "foo": "bar"
397
+ }
398
+ """
399
+ When the client sends a PUT request to "/v3/organization/stashes" with the following body:
400
+ """
401
+ {
402
+ "query": {
403
+ "foo": "bar"
404
+ },
405
+ "update": {
406
+ "foo": "qix"
407
+ }
408
+ }
409
+ """
410
+ Then the response status should be 405
411
+ And the response body should be:
412
+ """
413
+ {
414
+ "error": "Operation update not allowed for Vayacondios::Server::StashesHandler. Valid operations are [\"retrieve\", \"delete\"]"
415
+ }
416
+ """
417
+ # Then the response status should be 200
418
+ # And the response body should be:
419
+ # """
420
+ # {
421
+ # }
422
+ # """
423
+ # And the database should have the following Stash:
424
+ # """
425
+ # {
426
+ # "_id": "topic"
427
+ # "foo": "qix"
428
+ # }
429
+ # """
430
+
431
+ Scenario: Deleting Stashes with an Empty Query
432
+ Given there are no matching Stashes in the database
433
+ When the client sends a DELETE request to "/v3/organization/stashes" with no body
434
+ Then the response status should be 400
435
+ And the response body should be:
436
+ """
437
+ {
438
+ "error": "Query cannot be empty"
439
+ }
440
+ """
441
+
442
+ Scenario: Deleting Stashes when the Query Does Not Match
443
+ Given the following Stash exists in the database:
444
+ """
445
+ {
446
+ "_id": "topic",
447
+ "foo": "bar"
448
+ }
449
+ """
450
+ When the client sends a DELETE request to "/v3/organization/stashes" with the following body:
451
+ """
452
+ {
453
+ "foo": "baz"
454
+ }
455
+ """
456
+ Then the response status should be 200
457
+ And the response body should be:
458
+ """
459
+ {
460
+ "ok": true
461
+ }
462
+ """
463
+ And the database should have the following Stash:
464
+ """
465
+ {
466
+ "_id": "topic",
467
+ "foo": "bar"
468
+ }
469
+ """
470
+
471
+ Scenario: Deleting Stashes when the Query Does Match
472
+ Given the following Stash exists in the database:
473
+ """
474
+ {
475
+ "_id": "topic",
476
+ "foo": "bar"
477
+ }
478
+ """
479
+ When the client sends a DELETE request to "/v3/organization/stashes" with the following body:
480
+ """
481
+ {
482
+ "foo": "bar"
483
+ }
484
+ """
485
+ Then the response status should be 200
486
+ And the response body should be:
487
+ """
488
+ {
489
+ "ok": true
490
+ }
491
+ """
492
+ And there are no Stashes in the database
@@ -0,0 +1,113 @@
1
+ require_relative '../../spec/support/database_helper'
2
+ require_relative '../../spec/support/log_helper'
3
+ require 'em-synchrony/em-http'
4
+
5
+ include DatabaseHelper
6
+ include LogHelper
7
+
8
+ def make_request(verb, path, body = nil)
9
+ EM::Synchrony.sleep(0.1) # Make sure the db call is complete
10
+ params = { path: path }
11
+ params[:body] = MultiJson.dump(body) if body
12
+ EM::HttpRequest.new('http://localhost:3467').send(verb.to_s.downcase, params)
13
+ end
14
+
15
+ def stash_location() 'organization.stash' ; end
16
+ def event_location(topic) "organization.#{topic}.events" ; end
17
+
18
+ Before do
19
+ db_reset!
20
+ end
21
+
22
+ Given(/^there are no matching Stashes in the database$/) do
23
+ database_count(stash_location).should == 0
24
+ end
25
+
26
+ Given(/^the following Stash exists in the database:$/) do |json|
27
+ insert_record(stash_location, MultiJson.load(json))
28
+ end
29
+
30
+ Given(/^there are no Events under topic "(.*?)" in the database$/) do |topic|
31
+ database_count(event_location topic).should == 0
32
+ end
33
+
34
+ Given(/^the following Event exists under topic "(.*?)" in the database:$/) do |topic, json|
35
+ event = MultiJson.load json
36
+ event['_t'] = Time.parse(event['_t']).round(3).utc if event.has_key?('_t')
37
+ insert_record(event_location(topic), event)
38
+ end
39
+
40
+ When(/^the client sends a (GET|POST|PUT|DELETE) request to "(.*?)" with no body$/) do |verb, path|
41
+ @response = make_request(verb, path)
42
+ end
43
+
44
+ When(/^the client sends a (GET|POST|PUT|DELETE) request to "(.*?)" with the following body:$/) do |verb, path, json|
45
+ @response = make_request(verb, path, MultiJson.load(json))
46
+ end
47
+
48
+ When(/^the client open a stream request to "(.*?)" with the following body:$/) do |path, json|
49
+ @queue = []
50
+ @response = make_request('GET', path, MultiJson.load(json))
51
+ @response.stream{ |chunk| @queue << chunk }
52
+ end
53
+
54
+ Then(/^the response status should be (\d+)$/) do |status|
55
+ @response.response_header.status.to_s.should == status
56
+ end
57
+
58
+ Then(/^the response body should be:$/) do |json|
59
+ MultiJson.load(@response.response).should == MultiJson.load(json)
60
+ end
61
+
62
+ Then(/^the response body should contain:$/) do |json|
63
+ MultiJson.load(@response.response).should include(MultiJson.load json)
64
+ end
65
+
66
+ Then(/^the response body should contain a randomly assigned Id$/) do
67
+ body = MultiJson.load @response.response
68
+ body.should have_key('id')
69
+ body['id'].should be_a(String)
70
+ body['id'].size.should_not be_zero
71
+ end
72
+
73
+ Then(/^the response body should contain a generated timestamp$/) do
74
+ body = MultiJson.load @response.response
75
+ body.should have_key('time')
76
+ body['time'].should be_a(String)
77
+ Time.parse(body['time']).should be_within(1).of(Time.now)
78
+ end
79
+
80
+ Then(/^the stream response body should be:$/) do |json|
81
+ MultiJson.load(@queue.shift).should eq(MultiJson.load json)
82
+ end
83
+
84
+ Then(/^the database should have the following Stash:$/) do |json|
85
+ retrieve_record(stash_location).should == MultiJson.load(json)
86
+ end
87
+
88
+ Then(/^there are no Stashes in the database$/) do
89
+ database_count('organization.stash').should == 0
90
+ end
91
+
92
+ Then(/^there is exactly one Event under topic "(.*?)" in the database$/) do |topic|
93
+ database_count(event_location topic).should == 1
94
+ end
95
+
96
+ Then(/^the database should have the following Event under topic "(.*?)":$/) do |topic, json|
97
+ db_event = retrieve_record(event_location topic)
98
+ db_event["_t"] = db_event["_t"].iso8601(3)
99
+ db_event.should == MultiJson.load(json)
100
+ end
101
+
102
+ Then(/^there (should|should not) be an Event with Id "(.*?)" under topic "(.*?)" in the database$/) do |assert, id, topic|
103
+ result = retrieve_record(event_location(topic), { _id: id })
104
+ if assert =~ /not/
105
+ result.should be_nil
106
+ else
107
+ result.should_not be_nil
108
+ end
109
+ end
110
+
111
+ After do
112
+ db_reset!
113
+ end
@@ -0,0 +1,30 @@
1
+ Feature: Stash
2
+ In order to provide functionality
3
+ As a user of the Vayacondios Api
4
+ I want to document how the Stream works
5
+
6
+ Scenario: Retrieving Events as a stream
7
+ Given the following Event exists under topic "topic" in the database:
8
+ """
9
+ {
10
+ "_id": "id1",
11
+ "_t": "2012-02-13T12:34:42.452Z",
12
+ "_d": {
13
+ "time": "2012-02-13T12:34:42.452Z"
14
+ }
15
+ }
16
+ """
17
+ # When the client open a stream request to "/v2/organization/stream/topic" with the following body:
18
+ # """
19
+ # {
20
+ # "from":"2012-01-01T00:00:00.000Z"
21
+ # }
22
+ # """
23
+ # Then the response status should be 200
24
+ # And the stream response body should be:
25
+ # """
26
+ # {
27
+ # "id":"id1",
28
+ # "time": "2012-02-13T12:34:42.452Z"
29
+ # }
30
+ # """
@@ -0,0 +1,14 @@
1
+ module Cucumber
2
+ module Ast
3
+ class TreeWalker
4
+ alias_method :visit_features_alias, :visit_features
5
+
6
+ def visit_features(features)
7
+ EM.synchrony do
8
+ visit_features_alias features
9
+ EM.stop
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require 'vayacondios-server'
2
+ # can automate the server start if necessary
3
+ # start the vayacondios server
4
+ # api = spawn 'bundle exec vcd-server -e test'
5
+ # puts 'Waiting for Vayacondios Server to start'
6
+ # sleep 2
7
+
8
+ # # stop the vayacondios server
9
+ # at_exit do
10
+ # Process.kill('KILL', api)
11
+ # Process.wait api
12
+ # end
13
+