vayacondios-server 0.2.11 → 0.3.0

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.
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
+