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,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vayacondios::Server::EventsHandler, behaves_like: 'handler' do
4
+
5
+ let(:params) { { organization: 'organization', topic: 'topic' } }
6
+ let(:query) { { foo: 'bar' } }
7
+ let(:model_class){ Vayacondios::Server::Event }
8
+
9
+ context '#create' do
10
+ it 'raises a validation error' do
11
+ expect{ handler.create(params, query) }.to raise_error(validation_error, /create/)
12
+ end
13
+ end
14
+
15
+ context '#search', 'when events are found' do
16
+ it 'returns an array of events' do
17
+ model_class.should_receive(:search).with(params, query).and_call_original
18
+ driver.should_receive(:search).and_return([{ _id: 'abc123', _t: '2013-01-01T08:12:23.328Z', _d: { foo: 'bar' } }])
19
+ handler.search(params, query).should eq([
20
+ {
21
+ id: 'abc123',
22
+ time: '2013-01-01T08:12:23.328Z',
23
+ foo: 'bar'
24
+ }
25
+ ])
26
+ end
27
+ end
28
+
29
+ context '#search', 'when no events are found' do
30
+ it 'returns an empty array' do
31
+ model_class.should_receive(:search).with(params, query).and_call_original
32
+ driver.should_receive(:search).and_return([])
33
+ handler.search(params, query).should eq([])
34
+ end
35
+ end
36
+
37
+ context '#update' do
38
+ it 'raises a validation error' do
39
+ expect{ handler.update(params, query) }.to raise_error(validation_error, /update/)
40
+ end
41
+ end
42
+
43
+ context '#delete' do
44
+ it 'returns a success response' do
45
+ model_class.should_receive(:destroy).with(params, query).and_call_original
46
+ driver.should_receive(:remove).and_return(true)
47
+ handler.delete(params, query).should eq(success_response)
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vayacondios::Server::StashHandler, behaves_like: 'handler' do
4
+
5
+ let(:params) { { organization: 'organization', topic: 'topic' } }
6
+ let(:document) { { foo: 'bar' } }
7
+ let(:model_class){ Vayacondios::Server::Stash }
8
+
9
+ context '#create' do
10
+ it 'returns the created stash' do
11
+ model_class.should_receive(:create).with(params, document).and_call_original
12
+ driver.should_receive(:insert).and_return(_id: 'topic', foo: 'bar')
13
+ handler.create(params, document).should eq(foo: 'bar')
14
+ end
15
+ end
16
+
17
+ context '#retrieve', 'when not found' do
18
+ it 'raises a validation error' do
19
+ driver.should_receive(:retrieve).and_return(nil)
20
+ expect{ handler.retrieve(params, {}) }.to raise_error(validation_error, /not found/)
21
+ end
22
+ end
23
+
24
+ context '#retrieve', 'when params have no id' do
25
+ it 'returns the selected record' do
26
+ model_class.should_receive(:find).with(params).and_call_original
27
+ driver.should_receive(:retrieve).and_return(_id: 'topic', id: { foo: 'bar' })
28
+ handler.retrieve(params, {}).should eq(id: { foo: 'bar' })
29
+ end
30
+ end
31
+
32
+ context '#retrieve', 'when params have an id' do
33
+ let(:params){ { organization: 'organization', topic: 'topic', id: 'id' } }
34
+
35
+ it 'returns the selected record sliced by id' do
36
+ model_class.should_receive(:find).with(params).and_call_original
37
+ driver.should_receive(:retrieve).and_return(_id: 'topic', id: { foo: 'bar' })
38
+ handler.retrieve(params, {}).should eq(foo: 'bar')
39
+ end
40
+
41
+ it 'raises a validation error when retrieved record does not have id as a key' do
42
+ driver.should_receive(:retrieve).and_return(_id: 'topic', id2: { foo: 'bar' })
43
+ expect{ handler.retrieve(params, {}) }.to raise_error(validation_error, /contain id/i)
44
+ end
45
+ end
46
+
47
+ context '#update' do
48
+ it 'raises a validation error' do
49
+ expect{ handler.update(params, document) }.to raise_error(validation_error, /update/)
50
+ end
51
+ end
52
+
53
+ context '#delete', 'when params have an id' do
54
+ let(:params){ { organization: 'organization', topic: 'topic', id: 'id' } }
55
+
56
+ it 'raises a validation error' do
57
+ expect{ handler.delete(params, {}) }.to raise_error(validation_error, /not supported/)
58
+ end
59
+ end
60
+
61
+ context '#delete', 'when params do not have an id' do
62
+ it 'returns a success response' do
63
+ model_class.should_receive(:destroy).with(params, {}).and_call_original
64
+ driver.should_receive(:remove).and_return(true)
65
+ handler.delete(params, {}).should eq(success_response)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vayacondios::Server::StashesHandler, behaves_like: 'handler' do
4
+
5
+ let(:params) { { organization: 'organization', topic: 'topic' } }
6
+ let(:query) { { foo: 'bar' } }
7
+ let(:model_class){ Vayacondios::Server::Stash }
8
+
9
+ context '#create' do
10
+ it 'raises a validation error' do
11
+ expect{ handler.create(params, query) }.to raise_error(validation_error, /create not allowed/)
12
+ end
13
+ end
14
+
15
+ context '#retrieve', 'when no stashes are found' do
16
+ it 'returns an empty array' do
17
+ model_class.should_receive(:search).with(params, query).and_call_original
18
+ driver.should_receive(:search).and_return([])
19
+ handler.retrieve(params, query).should eq([])
20
+ end
21
+ end
22
+
23
+ context '#retrieve', 'when stashes are found' do
24
+ it "returns the record found by the Stash model it delegates to" do
25
+ model_class.should_receive(:search).with(params, query).and_call_original
26
+ driver.should_receive(:search).and_return([{ _id: 'topic', foo: 'bar' }])
27
+ handler.retrieve(params, query).should eq([{ topic: 'topic', foo: 'bar' }])
28
+ end
29
+ end
30
+
31
+ context '#update' do
32
+ it 'raises a validation error' do
33
+ expect{ handler.update(params, query) }.to raise_error(validation_error, /update not allowed/)
34
+ end
35
+ end
36
+
37
+ context '#delete', 'with an empty query', focus: true do
38
+ it 'raises a validation error' do
39
+ expect{ handler.delete(params, {}) }.to raise_error(validation_error, /empty/)
40
+ end
41
+ end
42
+
43
+ context '#delete', 'with a query', focus: true do
44
+ it 'returns a success response' do
45
+ model_class.should_receive(:destroy).with(params, query).and_call_original
46
+ driver.should_receive(:remove).and_return(true)
47
+ handler.delete(params, query).should eq(success_response)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vayacondios::Server::StreamHandler, behaves_like: 'handler' do
4
+ # FIX ME
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vayacondios::Server::Document do
4
+
5
+ let(:params){ { organization: 'organization', topic: 'topic' } }
6
+
7
+ subject(:document){ described_class.new(log, database, params) }
8
+
9
+ end
@@ -0,0 +1,185 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vayacondios::Server::Event do
4
+
5
+ let(:params) { { topic: 'topic', organization: 'organization', id: 'id' } }
6
+ let(:now) { event.format_time Time.now }
7
+ let(:document_error){ Vayacondios::Server::Document::Error }
8
+
9
+ subject(:event){ described_class.receive params }
10
+
11
+ its(:location){ should eq('organization.topic.events') }
12
+
13
+ context '#receive_topic' do
14
+ it 'sanitizes the topic' do
15
+ event.receive_topic '.foo$bar'
16
+ event.topic.should eq('_foo_bar')
17
+ end
18
+ end
19
+
20
+ context '#receive_time' do
21
+ it 'formats the time' do
22
+ event.receive_time '2014-01-23T15:29:19.412412-06:00'
23
+ event.time.should be_a(Time)
24
+ event.time.should be_utc
25
+ end
26
+ end
27
+
28
+ context '#to_timestamp', 'when argument is a string' do
29
+ it 'returns a time' do
30
+ event.to_timestamp('Aug 31').should be_a(Time)
31
+ end
32
+
33
+ it 'returns the default when there is parse error' do
34
+ default = now
35
+ event.to_timestamp('foobar', default).should be(default)
36
+ end
37
+ end
38
+
39
+ context '#to_timestamp', 'when argument is a date' do
40
+ it 'returns a time' do
41
+ event.to_timestamp(Date.today).should be_a(Time)
42
+ end
43
+ end
44
+
45
+ context '#to_timestamp', 'when argument is a time' do
46
+ it 'returns the time argument' do
47
+ t = now
48
+ event.to_timestamp(t).should be(t)
49
+ end
50
+ end
51
+
52
+ context '#to_timestamp', 'when argument is numeric' do
53
+ it 'returns a time' do
54
+ event.to_timestamp(1390513812).should be_a(Time)
55
+ end
56
+ end
57
+
58
+ context '#to_timestamp', 'when argument is anything else' do
59
+ it 'returns the default' do
60
+ default = now
61
+ event.to_timestamp(Object.new, default).should be(default)
62
+ end
63
+ end
64
+
65
+ context '#format_time' do
66
+ it 'converts all time to UTC' do
67
+ tokyo_time = now.getlocal('+09:00')
68
+ event.format_time(tokyo_time).should be_utc
69
+ end
70
+
71
+ it 'rounds all time to milliseconds' do
72
+ precise_time = Time.at(1390514371.671_238_912)
73
+ event.format_time(precise_time).nsec.should eq(671_000_000)
74
+ end
75
+ end
76
+
77
+ context '#document' do
78
+ it 'returns the internal representation of this Event' do
79
+ event.receive!(time: now, body: { foo: 'bar' })
80
+ event.document.should eq(_id: 'id',
81
+ _t: now,
82
+ _d: { foo: 'bar' })
83
+ end
84
+ end
85
+
86
+ context '#from_document' do
87
+ it 'updates the Event with the document' do
88
+ updated = event.from_document(_t: now, _d: { foo: 'bar' })
89
+ updated.id.should eq('id')
90
+ updated.time.should eq(now)
91
+ updated.body.should eq(foo: 'bar')
92
+ end
93
+ end
94
+
95
+ context '#external_document' do
96
+ it 'returns the external representation of this Event' do
97
+ event.receive!(time: now, body: { foo: 'bar' })
98
+ event.external_document.should eq(id: 'id',
99
+ time: now.iso8601(3),
100
+ foo: 'bar')
101
+ end
102
+ end
103
+
104
+ context '#event_filter' do
105
+ it 'handles :after as greater than' do
106
+ event.event_filter(after: now).should eq(_t: { gt: now })
107
+ end
108
+
109
+ it 'handles :from as greater than or equal to' do
110
+ event.event_filter(from: now).should eq(_t: { gte: now })
111
+ end
112
+
113
+ it 'prioritizes :after over :from' do
114
+ event.event_filter(after: now, from: now).should eq(_t: { gt: now })
115
+ end
116
+
117
+ it 'handles :before as less than' do
118
+ event.event_filter(before: now).should eq(_t: { lt: now })
119
+ end
120
+
121
+ it 'handles :upto as less than or equal to' do
122
+ event.event_filter(upto: now).should eq(_t: { lte: now })
123
+ end
124
+
125
+ it 'prioritizes :before over :upto' do
126
+ event.event_filter(before: now, upto: now).should eq(_t: { lt: now })
127
+ end
128
+
129
+ it 'merges extra keys as data matchers' do
130
+ event.event_filter(foo: 'bar', before: now).should eq(_t: { lt: now }, _d: { foo: 'bar' })
131
+ end
132
+ end
133
+
134
+ context '#prepare_search', focus: true do
135
+ it 'returns self for chaining' do
136
+ event.prepare_search({}).should be(event)
137
+ end
138
+
139
+ it 'creates a filter based on the query' do
140
+ prepared = event.prepare_search(foo: 'bar', before: now)
141
+ prepared.filter.should eq(_t: { lt: now }, _d: { foo: 'bar' })
142
+ end
143
+ end
144
+
145
+ context '#prepare_find', focus: true do
146
+ it 'returns self for chaining' do
147
+ event.prepare_find.should be(event)
148
+ end
149
+
150
+ it 'raises an error if it was not created with an id' do
151
+ event.write_attribute(:id, nil)
152
+ expect{ event.prepare_find }.to raise_error(document_error, /id/i)
153
+ end
154
+
155
+ it 'returns itself' do
156
+ event.prepare_find.document.should eq(_id: 'id')
157
+ end
158
+ end
159
+
160
+ context '#prepare_create', focus: true do
161
+ it 'returns self for chaining' do
162
+ event.prepare_create({}).should be(event)
163
+ end
164
+
165
+ it 'raises an error when given a non-Hash' do
166
+ expect{ subject.prepare_create([]) }.to raise_error(document_error, /Hash/)
167
+ end
168
+
169
+ it 'sets the time and body of the event' do
170
+ prepared = event.prepare_create(time: now, foo: 'bar')
171
+ prepared.document.should eq(_id: 'id', _t: now, _d: { foo: 'bar' })
172
+ end
173
+ end
174
+
175
+ context '#prepare_destroy', focus: true do
176
+ it 'returns self for chaining' do
177
+ event.prepare_destroy({}).should be(event)
178
+ end
179
+
180
+ it 'creates a filter based on the query' do
181
+ prepared = event.prepare_destroy(foo: 'bar', before: now)
182
+ prepared.filter.should eq(_t: { lt: now }, _d: { foo: 'bar' })
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vayacondios::Server::Stash, stashes: true do
4
+
5
+ let(:params) { { topic: 'topic', organization: 'organization', id: 'id' } }
6
+ let(:document_error){ Vayacondios::Server::Document::Error }
7
+
8
+ subject(:stash){ described_class.receive params }
9
+
10
+ its(:location){ should eq('organization.stash') }
11
+
12
+ context '#document' do
13
+ it 'returns the internal representation of this stash' do
14
+ stash.receive!(body: { foo: 'bar' })
15
+ stash.document.should eq(_id: 'topic', foo: 'bar')
16
+ end
17
+ end
18
+
19
+ context '#from_document' do
20
+ it 'updates the stash with the document' do
21
+ updated = stash.from_document(_id: 'qix', foo: 'bar')
22
+ updated.document.should eq(_id: 'qix', foo: 'bar')
23
+ end
24
+ end
25
+
26
+ context '#external_document' do
27
+ it 'returns the external representation of this stash' do
28
+ stash.receive!(body: { foo: 'bar' })
29
+ stash.external_document.should eq(topic: 'topic', foo: 'bar')
30
+ end
31
+ end
32
+
33
+ context '#prepare_search' do
34
+ it 'returns itself for chaining' do
35
+ stash.prepare_search({}).should be(stash)
36
+ end
37
+
38
+ it 'prepares a search filter' do
39
+ prepared = stash.prepare_search(foo: 'bar')
40
+ prepared.filter.should eq(_id: 'topic', foo: 'bar')
41
+ end
42
+ end
43
+
44
+ context '#prepare_create' do
45
+ it 'returns itself for chaining' do
46
+ stash.prepare_create({}).should be(stash)
47
+ end
48
+ end
49
+
50
+ context '#prepare_create', 'without an id' do
51
+ before(:each){ stash.write_attribute(:id, nil) }
52
+
53
+ it 'raises an error if document is not a Hash' do
54
+ expect{ stash.prepare_create([]) }.to raise_error(document_error, /hash/i)
55
+ end
56
+
57
+ it 'sets :body to be the document' do
58
+ prepared = stash.prepare_create(foo: 'bar')
59
+ prepared.body.should eq(foo: 'bar')
60
+ end
61
+ end
62
+
63
+ context '#prepare_create', 'with an id' do
64
+ it 'sets :body to be the document' do
65
+ prepared = stash.prepare_create(foo: 'bar')
66
+ prepared.body.should eq('id' => { foo: 'bar' })
67
+ end
68
+ end
69
+
70
+ context '#prepare_find' do
71
+ it 'returns itself for chaining' do
72
+ stash.prepare_find.should be(stash)
73
+ end
74
+
75
+ it 'raises an error if there is no topic' do
76
+ stash.write_attribute(:topic, nil)
77
+ expect{ stash.prepare_find }.to raise_error(document_error, /topic/)
78
+ end
79
+
80
+ it 'returns itself' do
81
+ stash.prepare_find.document.should eq(_id: 'topic')
82
+ end
83
+ end
84
+
85
+ context '#prepare_destroy' do
86
+ it 'returns itself for chaining' do
87
+ stash.prepare_destroy({}).should be(stash)
88
+ end
89
+
90
+ it 'prepares a delete filter' do
91
+ prepared = stash.prepare_destroy(foo: 'bar')
92
+ prepared.filter.should eq(_id: 'topic', foo: 'bar')
93
+ end
94
+ end
95
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,27 @@
1
- require 'bundler/setup' ; Bundler.require
2
-
3
- Dir["spec/support/**/*.rb"].each {|f| require File.join(File.dirname(__FILE__), '..', f) }
1
+ require 'bundler/setup' ; Bundler.require(:test)
4
2
 
5
3
  require 'goliath/test_helper'
4
+ require 'mongo'
5
+
6
+ if ENV['VAYACONDIOS_COV']
7
+ require 'simplecov'
8
+ SimpleCov.start do
9
+ add_group 'Library', 'lib/'
10
+ add_group 'Test', '(spec|features)/'
11
+ end
12
+ end
13
+
14
+ WITH_MONGO = ENV['WITH_MONGO']
15
+
16
+ require 'vayacondios-server'
17
+ require 'vayacondios-client'
18
+
19
+ Dir[File.expand_path('../support/**/*.rb', __FILE__)].each{ |f| require f }
6
20
 
7
21
  Goliath.env = :test
22
+
23
+ require 'vayacondios/server/api'
24
+
25
+ RSpec.configure do |c|
26
+ c.include Goliath::TestHelper
27
+ end
@@ -0,0 +1,42 @@
1
+ module DatabaseHelper
2
+
3
+ def insert_record(index, document)
4
+ # mongo only
5
+ db_query(index){ |db| db.connection.insert(document) }
6
+ end
7
+
8
+ def database_count index
9
+ # mongo only
10
+ db_query(index){ |db| db.connection.count }
11
+ end
12
+
13
+ def retrieve_record(index, filter = {})
14
+ # mongo only
15
+ db_query(index){ |db| db.connection.find_one(filter) }
16
+ end
17
+
18
+ def db_connection
19
+ return @db_connection if @db_connection
20
+ settings = Vayacondios::Server::DbConfig.env :test
21
+ driver = Vayacondios::Server::Driver.retrieve settings[:driver]
22
+ @db_connection = driver.connect settings.merge(log: log)
23
+ end
24
+
25
+ def db_locations
26
+ @locations ||= [ "organization.topic.events", "organization.stash" ]
27
+ end
28
+
29
+ def db_query(location, &blk)
30
+ db_connection.set_location location
31
+ db_locations << location
32
+ result = blk.call db_connection
33
+ db_connection.unset_location
34
+ result
35
+ end
36
+
37
+ def db_reset!
38
+ db_locations.uniq.each do |location|
39
+ db_query(location){ |db| EM::Synchrony.sync db.reset! }
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,19 @@
1
+ require 'logger'
2
+
3
+ module LogHelper
4
+
5
+ def log
6
+ @logdev = StringIO.new
7
+ Logger.new @logdev
8
+ end
9
+
10
+ def log_device
11
+ @logdev
12
+ end
13
+
14
+ def log_content
15
+ log_device.rewind
16
+ log_device.read
17
+ end
18
+
19
+ end
@@ -0,0 +1,22 @@
1
+ shared_context 'events', events: true do
2
+ let(:nil_event) { nil }
3
+ let(:json_nil_event) { 'null' }
4
+ let(:hash_event) { { 'foo' => 'bar'} }
5
+ let(:json_hash_event) { '{"foo":"bar"}' }
6
+ let(:array_event) { [1, 2, 3] }
7
+ let(:json_array_event) { '[1,2,3]' }
8
+ let(:string_event) { 'HELLO' }
9
+ let(:json_string_event) { '"HELLO"' }
10
+ let(:numeric_event) { 1 }
11
+ let(:json_numeric_event) { '1' }
12
+ let(:nested_event) { { 'A' => 1, 'B' => { 'c' => 2, 'd' => 3 } } }
13
+ let(:json_nested_event) { MultiJson.dump(nested_event) }
14
+ let(:event_query) { { 'foo' => 'bar' } }
15
+ let(:json_event_query) { MultiJson.dump(event_query) }
16
+ let(:event_query_with_sort) { { 'foo' => 'bar', 'sort' => %w[ bing descending ] } }
17
+ let(:event_query_with_limit) { { 'foo' => 'bar', 'limit' => 10 } }
18
+ let(:event_query_with_fields) { { 'foo' => 'bar', 'fields' => %w[ bing bam ] } }
19
+ let(:event_query_with_string_time) { { 'foo' => 'bar', 'from' => '2013-06-08 01:19:15 -0500' } }
20
+ let(:event_query_with_int_time) { { 'foo' => 'bar', 'from' => 1370672418 } }
21
+ let(:event_query_with_id) { { 'foo' => 'bar', 'id' => 'baz' } }
22
+ end
@@ -0,0 +1,24 @@
1
+ shared_context 'stashes', stashes: true do
2
+ let(:nil_stash) { nil }
3
+ let(:json_nil_stash) { 'null' }
4
+ let(:hash_stash) { { 'foo' => 'bar' } }
5
+ let(:json_hash_stash) { '{"foo":"bar"}' }
6
+ let(:array_stash) { [1, 2, 3] }
7
+ let(:json_array_stash) { '[1,2,3]' }
8
+ let(:string_stash) { 'HELLO' }
9
+ let(:json_string_stash) { '"HELLO"' }
10
+ let(:numeric_stash) { 1 }
11
+ let(:json_numeric_stash) { '1' }
12
+ let(:nested_stash) { { 'root' => { 'b' => 2, 'c' => { 'x' => 3 }, 'a' => 1 } } }
13
+ let(:stash_query) { { 'foo' => 'bar' } }
14
+ let(:json_stash_query) { MultiJson.dump(stash_query) }
15
+ let(:nested_stash_query) { { 'root.b' => 2 } }
16
+ let(:json_nested_stash_query) { MultiJson.dump(nested_stash_query) }
17
+ let(:stash_query_with_limit) { { 'foo' => 'bar', 'limit' => 10 } }
18
+ let(:stash_query_with_sort) { { 'foo' => 'bar', 'sort' => %w[ bar ascending ] } }
19
+ let(:stash_query_with_topic) { { 'foo' => 'bar', 'topic' => 'baz' } }
20
+ let(:stash_replacement) { { 'foo' => 'baz' } }
21
+ let(:json_stash_replacement) { '{"foo":"baz"}' }
22
+ let(:stash_update) { { 'counter' => 1 } }
23
+ let(:json_stash_update) { '{"counter":1}' }
24
+ end
@@ -0,0 +1,32 @@
1
+ shared_examples 'handlers', behaves_like: 'handler' do
2
+ include LogHelper
3
+
4
+ let!(:driver) do
5
+ db = Class.new{ include Vayacondios::Server::Driver }.new
6
+ db.set_log log
7
+ db
8
+ end
9
+
10
+ def validation_error
11
+ Goliath::Validation::Error
12
+ end
13
+
14
+ def success_response
15
+ handler.action_successful
16
+ end
17
+
18
+ subject(:handler){ described_class.new(log, driver) }
19
+
20
+ it{ should respond_to(:log) }
21
+ it{ should respond_to(:database) }
22
+
23
+ its(:action_successful){ should eq(ok: true) }
24
+
25
+ context '#call' do
26
+ it 'calls base methods for logging before delegating' do
27
+ handler.log.should_receive(:debug).at_least(1).times
28
+ handler.should_receive(:create).with({}, {})
29
+ handler.call(:create, {}, {})
30
+ end
31
+ end
32
+ end