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
@@ -1,320 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'multi_json'
4
-
5
- require File.join(File.dirname(__FILE__), '../../', 'app/http_shim')
6
-
7
- describe HttpShim do
8
- include Goliath::TestHelper
9
-
10
- let(:err) { Proc.new{ |c| fail "HTTP Request Failed #{c.response}" } }
11
-
12
- context 'Basic requirements' do
13
- it 'requires a topic' do
14
- Vayacondios.force_legacy_mode(true)
15
- with_api(HttpShim) do |api|
16
- put_request({
17
- :path => '/v1/infochimps/itemset/',
18
- :body => MultiJson.dump(["foo"]),
19
- :head => { :content_type => 'application/json' }
20
- }, err) do |c|
21
- c.response_header.status.should == 400
22
- end
23
- end
24
- end
25
-
26
- it 'requires an id' do
27
- with_api(HttpShim) do |api|
28
- put_request({
29
- :path => '/v1/infochimps/itemset/power',
30
- :body => MultiJson.dump(["foo"]),
31
- :head => { :content_type => 'application/json' }
32
- }, err) do |c|
33
- c.response_header.status.should == 400
34
- end
35
-
36
- get_mongo_db do |db|
37
- db.collection("infochimps.power.itemset").find_one().should be_nil
38
- end
39
- end
40
- end
41
-
42
- it 'rejects deep IDs' do
43
- with_api(HttpShim) do |api|
44
- put_request({
45
- :path => '/v1/infochimps/itemset/power/level/is/invalid',
46
- :body => MultiJson.dump(["foo"]),
47
- :head => { :content_type => 'application/json' }
48
- }, err) do |c|
49
- c.response_header.status.should == 400
50
- end
51
-
52
- get_mongo_db do |db|
53
- db.collection("infochimps.power.itemset").find_one({:_id => "level"}).should be_nil
54
- end
55
- end
56
- end
57
- end
58
-
59
-
60
- context 'can handle GET requests' do
61
- Vayacondios.force_legacy_mode(true)
62
-
63
- it 'and return 404 for missing resources' do
64
- with_api(HttpShim) do |api|
65
- Vayacondios.force_legacy_mode(true)
66
-
67
- get_request({:path => '/v1/infochimps/itemset/missing/resource'}, err) do |c|
68
- c.response_header.status.should == 404
69
- end
70
- end
71
- end
72
-
73
- it 'and return an array for valid resources' do
74
-
75
- with_api(HttpShim) do |api|
76
- put_request({
77
- :path => '/v1/infochimps/itemset/power/level',
78
- :body => MultiJson.dump(["foo", "bar"]),
79
- :head => { :content_type => 'application/json' }
80
- }, err)
81
- end
82
- with_api(HttpShim) do |api|
83
- get_request({:path => '/v1/infochimps/itemset/power/level'}, err) do |c|
84
- c.response_header.status.should == 200
85
- MultiJson.load(c.response).should eql(["foo", "bar"])
86
- end
87
- end
88
- end
89
- end
90
-
91
- context "will not handle POST requests" do
92
- it 'fails on POST' do
93
- with_api(HttpShim) do |api|
94
- post_request({
95
- :path => '/v1/infochimps/itemset/post/unsupported',
96
- :body => MultiJson.dump({ :totally => :ignored }),
97
- :head => { :content_type => 'application/json' }
98
- }, err) do |c|
99
- c.response_header.status.should eql 405
100
- c.response_header["ALLOW"].should_not be_nil
101
- end
102
- end
103
- end
104
- end
105
-
106
- context 'handles PUT requests in legacy mode' do
107
- Vayacondios.force_legacy_mode(true)
108
- it 'only accepts arrays' do
109
- with_api(HttpShim) do |api|
110
- put_request({
111
- :path => '/v1/infochimps/itemset/power/level',
112
- :body => MultiJson.dump({'foo' => 'bar'}),
113
- :head => { :content_type => 'application/json' }
114
- }, err) do |c|
115
- c.response_header.status.should == 400 # geometrid: changed from 500
116
- end
117
-
118
- get_mongo_db do |db|
119
- db.collection("infochimps.itemset").find_one({:_id => "power"}).should be_nil
120
- end
121
- end
122
- with_api(HttpShim) do |api|
123
- put_request({
124
- :path => '/v1/infochimps/itemset/power/level',
125
- :body => "foo",
126
- :head => { :content_type => 'application/json' }
127
- }, err) do |c|
128
- c.response_header.status.should == 400
129
- end
130
-
131
- get_mongo_db do |db|
132
- db.collection("infochimps.itemset").find_one({:_id => "power"}).should be_nil
133
- end
134
- end
135
- end
136
- it "stores the array when the resource doesn't exist" do
137
- with_api(HttpShim) do |api|
138
- put_request({
139
- :path => '/v1/infochimps/itemset/power/level',
140
- :body => MultiJson.dump(["foo", "bar"]),
141
- :head => { :content_type => 'application/json' }
142
- }, err) do |c|
143
- c.response_header.status.should == 200 # TODO Make this 201 Created
144
- c.response.should eql ""
145
- end
146
-
147
- get_mongo_db do |db|
148
- db.collection("infochimps.power.itemset").find_one({:_id => "level"})["d"].should eql ["foo", "bar"]
149
- end
150
- end
151
- end
152
- it "clobbers the previous array when the resource does exist" do
153
- with_api(HttpShim) do |api|
154
- put_request({
155
- :path => '/v1/infochimps/itemset/power/level',
156
- :body => MultiJson.dump(["chimpanzee", "bonobo"]),
157
- :head => { :content_type => 'application/json' }
158
- }, err) do |c|
159
- c.response_header.status.should == 200 # TODO Make this 204 No content
160
- c.response.should eql ""
161
- end
162
- end
163
-
164
- # Verify the first was created
165
- get_mongo_db do |db|
166
- db.collection("infochimps.power.itemset").find_one({:_id => "level"})["d"].should eql ["chimpanzee", "bonobo"]
167
- end
168
-
169
- with_api(HttpShim) do |api|
170
- put_request({
171
- :path => '/v1/infochimps/itemset/power/level',
172
- :body => MultiJson.dump(["foo", "bar"]),
173
- :head => { :content_type => 'application/json' }
174
- }, err) do |c|
175
- c.response_header.status.should == 200
176
- c.response.should eql ""
177
- end
178
-
179
- # Verify the first was clobbered
180
- get_mongo_db do |db|
181
- db.collection("infochimps.power.itemset").find_one({:_id => "level"})["d"].should eql ["foo", "bar"]
182
- end
183
- end
184
- end
185
- end
186
-
187
- context "handles PATCH requests in legacy mode" do
188
- Vayacondios.force_legacy_mode(true)
189
- it 'creates a missing resource' do
190
- with_api(HttpShim) do |api|
191
- put_request({
192
- :path => '/v1/infochimps/itemset/power/level',
193
- :head => ({'X-Method' => 'PATCH', :content_type => 'application/json' }),
194
- :body => MultiJson.dump(["bar"])
195
- }, err) do |c|
196
- c.response_header.status.should eql 200 # TODO Make this 201 Created
197
- c.response.should eql ""
198
- end
199
-
200
- # Verify the resource was created
201
- get_mongo_db do |db|
202
- db.collection("infochimps.power.itemset").find_one({:_id => "level"})["d"].should eql ["bar"]
203
- end
204
- end
205
- end
206
-
207
- it 'merges with PATCH' do
208
- with_api(HttpShim) do |api|
209
- put_request({
210
- :path => '/v1/infochimps/itemset/merge/test',
211
- :body => MultiJson.dump(["foo"]),
212
- :head => { :content_type => 'application/json' }
213
- }, err)
214
- end
215
- with_api(HttpShim) do |api|
216
- put_request({
217
- :path => '/v1/infochimps/itemset/merge/test',
218
- :head => ({'X-Method' => 'PATCH', :content_type => 'application/json' }),
219
- :body => MultiJson.dump(["bar"])
220
- }, err)
221
- end
222
- with_api(HttpShim) do |api|
223
- get_request({:path => '/v1/infochimps/itemset/merge/test'}, err) do |c|
224
- c.response_header.status.should == 200
225
- MultiJson.load(c.response).should eql(["foo", "bar"])
226
- end
227
- end
228
- end
229
- end
230
-
231
- context "will handle DELETE requests in legacy mode" do
232
- Vayacondios.force_legacy_mode(true)
233
- it 'will not delete a missing resource' do
234
- with_api(HttpShim) do |api|
235
- delete_request({
236
- :path => '/v1/infochimps/itemset/merge/test',
237
- :body => MultiJson.dump(["bar"]),
238
- :head => { :content_type => 'application/json' }
239
- }, err) do |c|
240
- c.response_header.status.should == 404
241
- end
242
- end
243
- end
244
-
245
- it "will be ok to delete items that don't exist" do
246
- with_api(HttpShim) do |api|
247
- put_request({
248
- :path => '/v1/infochimps/itemset/power/level',
249
- :body => MultiJson.dump(["foo"]),
250
- :head => { :content_type => 'application/json' }
251
- }, err) do |c|
252
- c.response_header.status.should == 200 # TODO Make this 201 Created
253
- end
254
- end
255
- with_api(HttpShim) do |api|
256
- delete_request({
257
- :path => '/v1/infochimps/itemset/power/level',
258
- :body => MultiJson.dump(["bar"]),
259
- :head => { :content_type => 'application/json' }
260
- }, err) do |c|
261
- c.response_header.status.should == 200 # TODO Make this 204 No content
262
- end
263
- end
264
- end
265
-
266
- it "will delete items that do exist" do
267
- with_api(HttpShim) do |api|
268
- put_request({
269
- :path => '/v1/infochimps/itemset/power/level',
270
- :body => MultiJson.dump(["foo", "bar"]),
271
- :head => { :content_type => 'application/json' }
272
- }, err) do |c|
273
- c.response_header.status.should == 200 # TODO Makes this 201 Created
274
- end
275
- end
276
- with_api(HttpShim) do |api|
277
- delete_request({
278
- :path => '/v1/infochimps/itemset/power/level',
279
- :body => MultiJson.dump(["bar"]),
280
- :head => { :content_type => 'application/json' }
281
- }, err) do |c|
282
- c.response_header.status.should == 200 # TODO Make this 204 No content
283
- end
284
- end
285
- with_api(HttpShim) do |api|
286
- get_request({:path => '/v1/infochimps/itemset/power/level'}, err) do |c|
287
- c.response_header.status.should == 200
288
- MultiJson.load(c.response).should eql(["foo"])
289
- end
290
- end
291
- end
292
-
293
- it "leaves behind an empty array if everything is deleted" do
294
- with_api(HttpShim) do |api|
295
- put_request({
296
- :path => '/v1/infochimps/itemset/power/level',
297
- :body => MultiJson.dump(["foo", "bar"]),
298
- :head => { :content_type => 'application/json' }
299
- }, err) do |c|
300
- c.response_header.status.should == 200 # TODO Makes this 201 Created
301
- end
302
- end
303
- with_api(HttpShim) do |api|
304
- delete_request({
305
- :path => '/v1/infochimps/itemset/power/level',
306
- :body => MultiJson.dump(["foo", "bar"]),
307
- :head => { :content_type => 'application/json' }
308
- }, err) do |c|
309
- c.response_header.status.should == 200 # TODO Make this 204 No content
310
- end
311
- end
312
- with_api(HttpShim) do |api|
313
- get_request({:path => '/v1/infochimps/itemset/power/level'}, err) do |c|
314
- c.response_header.status.should == 200
315
- MultiJson.load(c.response).should eql([])
316
- end
317
- end
318
- end
319
- end
320
- end
@@ -1,317 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'multi_json'
4
-
5
- require File.join(File.dirname(__FILE__), '../../', 'app/http_shim')
6
-
7
- describe HttpShim do
8
- include Goliath::TestHelper
9
-
10
- let(:err) { Proc.new{ |c| fail "HTTP Request Failed #{c.response}" } }
11
-
12
- context 'Basic requirements' do
13
- it 'requires a topic' do
14
- with_api(HttpShim) do |api|
15
- put_request({
16
- :path => '/v1/infochimps/itemset/',
17
- :body => MultiJson.dump({:contents =>["foo"]}),
18
- :head => { :content_type => 'application/json' }
19
- }, err) do |c|
20
- c.response_header.status.should == 400
21
- end
22
- end
23
- end
24
-
25
- it 'requires an id' do
26
- with_api(HttpShim) do |api|
27
- put_request({
28
- :path => '/v1/infochimps/itemset/power',
29
- :body => MultiJson.dump({:contents =>["foo"]}),
30
- :head => { :content_type => 'application/json' }
31
- }, err) do |c|
32
- c.response_header.status.should == 400
33
- end
34
-
35
- get_mongo_db do |db|
36
- db.collection("infochimps.power.itemset").find_one().should be_nil
37
- end
38
- end
39
- end
40
-
41
- it 'rejects deep IDs' do
42
- with_api(HttpShim) do |api|
43
- put_request({
44
- :path => '/v1/infochimps/itemset/power/level/is/invalid',
45
- :body => MultiJson.dump({:contents =>["foo"]}),
46
- :head => { :content_type => 'application/json' }
47
- }, err) do |c|
48
- c.response_header.status.should == 400
49
- end
50
-
51
- get_mongo_db do |db|
52
- db.collection("infochimps.power.itemset").find_one({:_id => "level"}).should be_nil
53
- end
54
- end
55
- end
56
- end
57
-
58
- context 'handles PUT requests' do
59
- it 'only accepts hashes' do
60
- # note: due to unknown class variable handling by rspec,
61
- # force_legacy_mode must be set inside the it block to
62
- # get all tests to pass at once
63
- Vayacondios.force_legacy_mode(false)
64
- with_api(HttpShim) do |api|
65
- put_request({
66
- :path => '/v1/infochimps/itemset/power/level',
67
- :body => MultiJson.dump(['foo', 'bar']),
68
- :head => { :content_type => 'application/json' }
69
- }, err) do |c|
70
- c.response_header.status.should == 400 # geometrid: changed from 500
71
- end
72
-
73
- get_mongo_db do |db|
74
- db.collection("infochimps.itemset").find_one({:_id => "power"}).should be_nil
75
- end
76
- end
77
- with_api(HttpShim) do |api|
78
- put_request({
79
- :path => '/v1/infochimps/itemset/power/level',
80
- :body => "foo",
81
- :head => { :content_type => 'application/json' }
82
- }, err) do |c|
83
- c.response_header.status.should == 400
84
- end
85
-
86
- get_mongo_db do |db|
87
- db.collection("infochimps.itemset").find_one({:_id => "power"}).should be_nil
88
- end
89
- end
90
- end
91
-
92
- it "stores the array when the resource doesn't exist" do
93
- with_api(HttpShim) do |api|
94
- put_request({
95
- :path => '/v1/infochimps/itemset/power/level',
96
- :body => MultiJson.dump({:contents =>["foo", "bar"]}),
97
- :head => { :content_type => 'application/json' }
98
- }, err) do |c|
99
- c.response_header.status.should == 200 # TODO Make this 201 Created
100
- c.response.should eql ""
101
- end
102
-
103
- get_mongo_db do |db|
104
- db.collection("infochimps.power.itemset").find_one({:_id => "level"})["d"].should eql ["foo", "bar"]
105
- end
106
- end
107
- end
108
-
109
- it "clobbers the previous array when the resource does exist" do
110
- with_api(HttpShim) do |api|
111
- put_request({
112
- :path => '/v1/infochimps/itemset/power/level',
113
- :body => MultiJson.dump({:contents =>["chimpanzee", "bonobo"]}),
114
- :head => { :content_type => 'application/json' }
115
- }, err) do |c|
116
- c.response_header.status.should == 200 # TODO Make this 204 No content
117
- c.response.should eql ""
118
- end
119
- end
120
-
121
- # Verify the first was created
122
- get_mongo_db do |db|
123
- db.collection("infochimps.power.itemset").find_one({:_id => "level"})["d"].should eql ["chimpanzee", "bonobo"]
124
- end
125
-
126
- with_api(HttpShim) do |api|
127
- put_request({
128
- :path => '/v1/infochimps/itemset/power/level',
129
- :body => MultiJson.dump({:contents =>["foo", "bar"]}),
130
- :head => { :content_type => 'application/json' }
131
- }, err) do |c|
132
- c.response_header.status.should == 200
133
- c.response.should eql ""
134
- end
135
-
136
- # Verify the first was clobbered
137
- get_mongo_db do |db|
138
- db.collection("infochimps.power.itemset").find_one({:_id => "level"})["d"].should eql ["foo", "bar"]
139
- end
140
- end
141
- end
142
- end
143
-
144
- context 'can handle GET requests' do
145
- it 'and return 404 for missing resources' do
146
- with_api(HttpShim) do |api|
147
- get_request({:path => '/v1/infochimps/itemset/missing/resource'}, err) do |c|
148
- c.response_header.status.should == 404
149
- end
150
- end
151
- end
152
-
153
- it 'and return an array for valid resources' do
154
- with_api(HttpShim) do |api|
155
- put_request({
156
- :path => '/v1/infochimps/itemset/power/level',
157
- :body => MultiJson.dump({:contents =>["foo", "bar"]}),
158
- :head => { :content_type => 'application/json' }
159
- }, err)
160
- end
161
- with_api(HttpShim) do |api|
162
- get_request({:path => '/v1/infochimps/itemset/power/level'}, err) do |c|
163
- c.response_header.status.should == 200
164
- MultiJson.load(c.response).should eql({"contents" => ["foo", "bar"]})
165
- end
166
- end
167
- end
168
- end
169
-
170
- context "will not handle POST requests" do
171
- it 'fails on POST' do
172
- with_api(HttpShim) do |api|
173
- post_request({
174
- :path => '/v1/infochimps/itemset/post/unsupported',
175
- :body => MultiJson.dump({ :totally => :ignored }),
176
- :head => { :content_type => 'application/json' }
177
- }, err) do |c|
178
- c.response_header.status.should eql 405
179
- c.response_header["ALLOW"].should_not be_nil
180
- end
181
- end
182
- end
183
- end
184
-
185
- context "handles PATCH requests" do
186
- it 'creates a missing resource' do
187
- with_api(HttpShim) do |api|
188
- put_request({
189
- :path => '/v1/infochimps/itemset/power/level',
190
- :head => ({'X-Method' => 'PATCH', :content_type => 'application/json' }),
191
- :body => MultiJson.dump({:contents =>["bar"]})
192
- }, err) do |c|
193
- c.response_header.status.should eql 200 # TODO Make this 201 Created
194
- c.response.should eql ""
195
- end
196
-
197
- # Verify the resource was created
198
- get_mongo_db do |db|
199
- db.collection("infochimps.power.itemset").find_one({:_id => "level"})["d"].should eql ["bar"]
200
- end
201
- end
202
- end
203
-
204
- it 'merges with PATCH' do
205
- with_api(HttpShim) do |api|
206
- put_request({
207
- :path => '/v1/infochimps/itemset/merge/test',
208
- :body => MultiJson.dump({:contents =>["foo"]}),
209
- :head => { :content_type => 'application/json' }
210
- }, err)
211
- end
212
- with_api(HttpShim) do |api|
213
- put_request({
214
- :path => '/v1/infochimps/itemset/merge/test',
215
- :head => ({'X-Method' => 'PATCH', :content_type => 'application/json' }),
216
- :body => MultiJson.dump({:contents =>["bar"]})
217
- }, err)
218
- end
219
- with_api(HttpShim) do |api|
220
- get_request({:path => '/v1/infochimps/itemset/merge/test'}, err) do |c|
221
- c.response_header.status.should == 200
222
- MultiJson.load(c.response).should eql({"contents" => ["foo", "bar"]})
223
- end
224
- end
225
- end
226
- end
227
-
228
- context "will handle DELETE requests" do
229
- Vayacondios.force_legacy_mode(false)
230
- it 'will not delete a missing resource' do
231
- with_api(HttpShim) do |api|
232
- delete_request({
233
- :path => '/v1/infochimps/itemset/merge/test',
234
- :body => MultiJson.dump({:contents =>["bar"]}),
235
- :head => { :content_type => 'application/json' }
236
- }, err) do |c|
237
- c.response_header.status.should == 404
238
- end
239
- end
240
- end
241
-
242
- it "will be ok to delete items that don't exist" do
243
- with_api(HttpShim) do |api|
244
- put_request({
245
- :path => '/v1/infochimps/itemset/power/level',
246
- :body => MultiJson.dump({:contents =>["foo"]}),
247
- :head => { :content_type => 'application/json' }
248
- }, err) do |c|
249
- c.response_header.status.should == 200 # TODO Make this 201 Created
250
- end
251
- end
252
- with_api(HttpShim) do |api|
253
- delete_request({
254
- :path => '/v1/infochimps/itemset/power/level',
255
- :body => MultiJson.dump({:contents =>["bar"]}),
256
- :head => { :content_type => 'application/json' }
257
- }, err) do |c|
258
- c.response_header.status.should == 200 # TODO Make this 204 No content
259
- end
260
- end
261
- end
262
-
263
- it "will delete items that do exist" do
264
- with_api(HttpShim) do |api|
265
- put_request({
266
- :path => '/v1/infochimps/itemset/power/level',
267
- :body => MultiJson.dump({:contents =>["foo", "bar"]}),
268
- :head => { :content_type => 'application/json' }
269
- }, err) do |c|
270
- c.response_header.status.should == 200 # TODO Makes this 201 Created
271
- end
272
- end
273
- with_api(HttpShim) do |api|
274
- delete_request({
275
- :path => '/v1/infochimps/itemset/power/level',
276
- :body => MultiJson.dump({:contents =>["bar"]}),
277
- :head => { :content_type => 'application/json' }
278
- }, err) do |c|
279
- c.response_header.status.should == 200 # TODO Make this 204 No content
280
- end
281
- end
282
- with_api(HttpShim) do |api|
283
- get_request({:path => '/v1/infochimps/itemset/power/level'}, err) do |c|
284
- c.response_header.status.should == 200
285
- MultiJson.load(c.response).should eql({"contents" => ["foo"]})
286
- end
287
- end
288
- end
289
-
290
- it "leaves behind an empty array if everything is deleted" do
291
- with_api(HttpShim) do |api|
292
- put_request({
293
- :path => '/v1/infochimps/itemset/power/level',
294
- :body => MultiJson.dump({:contents =>["foo", "bar"]}),
295
- :head => { :content_type => 'application/json' }
296
- }, err) do |c|
297
- c.response_header.status.should == 200 # TODO Makes this 201 Created
298
- end
299
- end
300
- with_api(HttpShim) do |api|
301
- delete_request({
302
- :path => '/v1/infochimps/itemset/power/level',
303
- :body => MultiJson.dump({:contents =>["foo", "bar"]}),
304
- :head => { :content_type => 'application/json' }
305
- }, err) do |c|
306
- c.response_header.status.should == 200 # TODO Make this 204 No content
307
- end
308
- end
309
- with_api(HttpShim) do |api|
310
- get_request({:path => '/v1/infochimps/itemset/power/level'}, err) do |c|
311
- c.response_header.status.should == 200
312
- MultiJson.load(c.response).should eql({"contents" => []})
313
- end
314
- end
315
- end
316
- end
317
- end
@@ -1,60 +0,0 @@
1
- require 'spec_helper'
2
- require 'vayacondios/server/rack/extract_methods'
3
-
4
- describe Vayacondios::Rack::ExtractMethods do
5
- let(:env){ { 'CONTENT_TYPE' => 'application/x-www-form-urlencoded; charset=utf-8' } }
6
- let(:app){ mock('app').as_null_object }
7
- subject { described_class.new(app) }
8
-
9
- it 'adds a key in env for :vayacondios_method' do
10
- app.should_receive(:call).with do |app_env|
11
- app_env.keys.should include(:vayacondios_method)
12
- end
13
- subject.call(env)
14
- end
15
-
16
- context 'PUT' do
17
- context 'without http_x_method' do
18
- it 'correctly extracts :update' do
19
- env.merge!('REQUEST_METHOD' => 'PUT')
20
- subject.extract_method(env).should == :update
21
- end
22
- end
23
-
24
- context 'with http_x_method' do
25
- it 'correctly extracts :patch' do
26
- env.merge!('REQUEST_METHOD' => 'PUT', 'HTTP_X_METHOD' => 'PATCH')
27
- subject.extract_method(env).should == :patch
28
- end
29
- end
30
- end
31
-
32
- context 'GET' do
33
- it 'correctly extracts :show' do
34
- env.merge!('REQUEST_METHOD' => 'GET')
35
- subject.extract_method(env).should == :show
36
- end
37
- end
38
-
39
- context 'POST' do
40
- it 'correctly extracts :create' do
41
- env.merge!('REQUEST_METHOD' => 'POST')
42
- subject.extract_method(env).should == :create
43
- end
44
-
45
- end
46
-
47
- context 'PATCH' do
48
- it 'correctly extracts :patch' do
49
- env.merge!('REQUEST_METHOD' => 'PATCH')
50
- subject.extract_method(env).should == :patch
51
- end
52
- end
53
-
54
- context 'DELETE' do
55
- it 'correctly extracts :delete' do
56
- env.merge!('REQUEST_METHOD' => 'DELETE')
57
- subject.extract_method(env).should == :delete
58
- end
59
- end
60
- end