cosm-rb 0.0.1
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.
- data/.gitignore +12 -0
- data/.rbenv-version +1 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/.travis.yml +10 -0
- data/CHANGELOG.md +91 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README.md +195 -0
- data/Rakefile +35 -0
- data/ci/build_hudson.sh +24 -0
- data/cosm-rb.gemspec +40 -0
- data/init.rb +2 -0
- data/lib/cosm-rb/array_extensions.rb +6 -0
- data/lib/cosm-rb/base/instance_methods.rb +28 -0
- data/lib/cosm-rb/base.rb +52 -0
- data/lib/cosm-rb/client.rb +7 -0
- data/lib/cosm-rb/datapoint.rb +71 -0
- data/lib/cosm-rb/datastream.rb +136 -0
- data/lib/cosm-rb/feed.rb +108 -0
- data/lib/cosm-rb/hash_extensions.rb +16 -0
- data/lib/cosm-rb/helpers.rb +42 -0
- data/lib/cosm-rb/key.rb +98 -0
- data/lib/cosm-rb/nil_content.rb +15 -0
- data/lib/cosm-rb/object_extensions.rb +6 -0
- data/lib/cosm-rb/parsers/csv/datastream_defaults.rb +12 -0
- data/lib/cosm-rb/parsers/csv/feed_defaults.rb +38 -0
- data/lib/cosm-rb/parsers/defaults.rb +13 -0
- data/lib/cosm-rb/parsers/json/datapoint_defaults.rb +12 -0
- data/lib/cosm-rb/parsers/json/datastream_defaults.rb +53 -0
- data/lib/cosm-rb/parsers/json/feed_defaults.rb +103 -0
- data/lib/cosm-rb/parsers/json/key_defaults.rb +15 -0
- data/lib/cosm-rb/parsers/json/search_result_defaults.rb +18 -0
- data/lib/cosm-rb/parsers/json/trigger_defaults.rb +12 -0
- data/lib/cosm-rb/parsers/xml/datapoint_defaults.rb +20 -0
- data/lib/cosm-rb/parsers/xml/datastream_defaults.rb +77 -0
- data/lib/cosm-rb/parsers/xml/feed_defaults.rb +127 -0
- data/lib/cosm-rb/parsers/xml/key_defaults.rb +40 -0
- data/lib/cosm-rb/parsers/xml/trigger_defaults.rb +22 -0
- data/lib/cosm-rb/permission.rb +67 -0
- data/lib/cosm-rb/resource.rb +43 -0
- data/lib/cosm-rb/search_result.rb +63 -0
- data/lib/cosm-rb/string_extensions.rb +6 -0
- data/lib/cosm-rb/template.rb +32 -0
- data/lib/cosm-rb/templates/csv/datapoint_defaults.rb +22 -0
- data/lib/cosm-rb/templates/csv/datastream_defaults.rb +43 -0
- data/lib/cosm-rb/templates/csv/feed_defaults.rb +47 -0
- data/lib/cosm-rb/templates/defaults.rb +14 -0
- data/lib/cosm-rb/templates/json/datapoint_defaults.rb +15 -0
- data/lib/cosm-rb/templates/json/datastream_defaults.rb +66 -0
- data/lib/cosm-rb/templates/json/feed_defaults.rb +134 -0
- data/lib/cosm-rb/templates/json/key_defaults.rb +41 -0
- data/lib/cosm-rb/templates/json/search_result_defaults.rb +47 -0
- data/lib/cosm-rb/templates/json/trigger_defaults.rb +21 -0
- data/lib/cosm-rb/templates/xml/datapoint_defaults.rb +25 -0
- data/lib/cosm-rb/templates/xml/datastream_defaults.rb +66 -0
- data/lib/cosm-rb/templates/xml/feed_defaults.rb +110 -0
- data/lib/cosm-rb/templates/xml/search_result_defaults.rb +116 -0
- data/lib/cosm-rb/templates/xml_headers.rb +17 -0
- data/lib/cosm-rb/trigger.rb +65 -0
- data/lib/cosm-rb/validations.rb +9 -0
- data/lib/cosm-rb/version.rb +3 -0
- data/lib/cosm-rb.rb +29 -0
- data/spec/cosm-rb/array_extensions_spec.rb +9 -0
- data/spec/cosm-rb/base/instance_methods_spec.rb +109 -0
- data/spec/cosm-rb/base_spec.rb +56 -0
- data/spec/cosm-rb/client_spec.rb +7 -0
- data/spec/cosm-rb/datapoint_spec.rb +169 -0
- data/spec/cosm-rb/datastream_spec.rb +301 -0
- data/spec/cosm-rb/feed_spec.rb +298 -0
- data/spec/cosm-rb/hash_extensions_spec.rb +20 -0
- data/spec/cosm-rb/helpers_spec.rb +56 -0
- data/spec/cosm-rb/key_spec.rb +178 -0
- data/spec/cosm-rb/parsers/csv/datastream_defaults_spec.rb +12 -0
- data/spec/cosm-rb/parsers/csv/feed_defaults_spec.rb +35 -0
- data/spec/cosm-rb/parsers/json/datapoint_defaults_spec.rb +15 -0
- data/spec/cosm-rb/parsers/json/datastream_defaults_spec.rb +82 -0
- data/spec/cosm-rb/parsers/json/feed_defaults_spec.rb +18 -0
- data/spec/cosm-rb/parsers/json/key_defaults_spec.rb +8 -0
- data/spec/cosm-rb/parsers/json/search_result_defaults_spec.rb +12 -0
- data/spec/cosm-rb/parsers/json/trigger_defaults_spec.rb +16 -0
- data/spec/cosm-rb/parsers/xml/datapoint_defaults_spec.rb +19 -0
- data/spec/cosm-rb/parsers/xml/datastream_defaults_spec.rb +63 -0
- data/spec/cosm-rb/parsers/xml/feed_defaults_spec.rb +65 -0
- data/spec/cosm-rb/parsers/xml/key_defaults_spec.rb +16 -0
- data/spec/cosm-rb/parsers/xml/trigger_defaults_spec.rb +16 -0
- data/spec/cosm-rb/search_result_spec.rb +258 -0
- data/spec/cosm-rb/string_extensions_spec.rb +12 -0
- data/spec/cosm-rb/template_spec.rb +74 -0
- data/spec/cosm-rb/templates/csv/datapoint_defaults_spec.rb +41 -0
- data/spec/cosm-rb/templates/csv/datastream_defaults_spec.rb +131 -0
- data/spec/cosm-rb/templates/csv/feed_defaults_spec.rb +78 -0
- data/spec/cosm-rb/templates/json/datapoint_defaults_spec.rb +14 -0
- data/spec/cosm-rb/templates/json/datastream_defaults_spec.rb +170 -0
- data/spec/cosm-rb/templates/json/feed_defaults_spec.rb +397 -0
- data/spec/cosm-rb/templates/json/key_defaults_spec.rb +29 -0
- data/spec/cosm-rb/templates/json/search_result_defaults_spec.rb +37 -0
- data/spec/cosm-rb/templates/json/trigger_defaults_spec.rb +19 -0
- data/spec/cosm-rb/templates/xml/datapoint_defaults_spec.rb +14 -0
- data/spec/cosm-rb/templates/xml/datastream_defaults_spec.rb +113 -0
- data/spec/cosm-rb/templates/xml/feed_defaults_spec.rb +131 -0
- data/spec/cosm-rb/templates/xml/search_result_defaults_spec.rb +44 -0
- data/spec/cosm-rb/trigger_spec.rb +117 -0
- data/spec/fixtures/models.rb +81 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/contain_datapoint_eeml_matcher.rb +16 -0
- data/spec/support/contain_datastream_eeml_matcher.rb +60 -0
- data/spec/support/contain_feed_eeml_matcher.rb +96 -0
- data/spec/support/datapoint_helper.rb +53 -0
- data/spec/support/datastream_helper.rb +300 -0
- data/spec/support/describe_eeml_matcher.rb +23 -0
- data/spec/support/feed_helper.rb +771 -0
- data/spec/support/fully_represent_datapoint_matcher.rb +30 -0
- data/spec/support/fully_represent_datastream_matcher.rb +92 -0
- data/spec/support/fully_represent_feed_matcher.rb +226 -0
- data/spec/support/fully_represent_key_matcher.rb +74 -0
- data/spec/support/fully_represent_search_result_matcher.rb +67 -0
- data/spec/support/fully_represent_trigger_matcher.rb +29 -0
- data/spec/support/key_helper.rb +74 -0
- data/spec/support/search_result_helper.rb +252 -0
- data/spec/support/trigger_helper.rb +51 -0
- metadata +363 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe Cosm::Datastream do
|
|
5
|
+
|
|
6
|
+
it "should have a constant that defines the allowed keys" do
|
|
7
|
+
Cosm::Datastream::ALLOWED_KEYS.should == %w(feed_id id feed_creator current_value datapoints max_value min_value tags unit_label unit_symbol unit_type updated datapoints_function)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe "validation" do
|
|
11
|
+
before(:each) do
|
|
12
|
+
@datastream = Cosm::Datastream.new
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
%w(id).each do |field|
|
|
16
|
+
it "should require a '#{field}'" do
|
|
17
|
+
@datastream.send("#{field}=".to_sym, nil)
|
|
18
|
+
@datastream.should_not be_valid
|
|
19
|
+
@datastream.errors[field.to_sym].should include("can't be blank")
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
["red hat", "foo*", "KYB:FOO"].each do |invalid_id|
|
|
24
|
+
it "should not allow '#{invalid_id}' as an id" do
|
|
25
|
+
@datastream.id = invalid_id
|
|
26
|
+
@datastream.should_not be_valid
|
|
27
|
+
@datastream.errors[:id].should include("is invalid")
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
["üöäÜÖÄ", "ÜÖÄ", "üöä", "current_to_direction-degrees_true-1", "current_to_direction.degrees_true.1"].each do |valid_id|
|
|
32
|
+
it "should allow '#{valid_id}' as an id" do
|
|
33
|
+
@datastream.feed_id = 1234
|
|
34
|
+
@datastream.id = valid_id
|
|
35
|
+
@datastream.should be_valid
|
|
36
|
+
@datastream.errors[:id].should be_empty
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
["red hat", "foo*", 12.05].each do |invalid_feed_id|
|
|
41
|
+
it "should not allow '#{invalid_feed_id}' as a feed_id" do
|
|
42
|
+
@datastream.id = "1"
|
|
43
|
+
@datastream.feed_id = invalid_feed_id
|
|
44
|
+
@datastream.should_not be_valid
|
|
45
|
+
@datastream.errors[:feed_id].should include("is invalid")
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
[0, 1234, 102931203, "123"].each do |valid_feed_id|
|
|
50
|
+
it "should allow '#{valid_feed_id}' as a feed_id" do
|
|
51
|
+
@datastream.id = "1"
|
|
52
|
+
@datastream.feed_id = valid_feed_id
|
|
53
|
+
@datastream.should be_valid
|
|
54
|
+
@datastream.errors[:feed_id].should be_empty
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
%w(current_value tags).each do |field|
|
|
59
|
+
it "should restrict '#{field}' field length to 255" do
|
|
60
|
+
@datastream.send("#{field}=".to_sym, "a"*256)
|
|
61
|
+
@datastream.should_not be_valid
|
|
62
|
+
@datastream.errors[field.to_sym].should == ["is too long (maximum is 255 characters)"]
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should not allow arrays of 255 entries for tags" do
|
|
67
|
+
@datastream.tags = []
|
|
68
|
+
254.times {@datastream.tags << 'a'}
|
|
69
|
+
@datastream.should_not be_valid
|
|
70
|
+
@datastream.errors[:tags].should == ["is too long (maximum is 255 characters)"]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
%w(unit_type current_value).each do |field|
|
|
74
|
+
it "should allow blank '#{field}'" do
|
|
75
|
+
@datastream.send("#{field}=".to_sym, nil)
|
|
76
|
+
@datastream.valid?
|
|
77
|
+
@datastream.errors[field.to_sym].should be_blank
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
%w(basicSI derivedSI conversionBasedUnits derivedUnits contextDependentUnits).each do |valid_unit_type|
|
|
82
|
+
it "should allow unit_type of '#{valid_unit_type}'" do
|
|
83
|
+
@datastream.unit_type = valid_unit_type
|
|
84
|
+
@datastream.valid?
|
|
85
|
+
@datastream.errors[:unit_type].should be_blank
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
%w(baicSI deriedSI conversinBasedUnits deriedUnits cotextDependentUnits).each do |invalid_unit_type|
|
|
90
|
+
it "should not allow unit_type of '#{invalid_unit_type}'" do
|
|
91
|
+
@datastream.unit_type = invalid_unit_type
|
|
92
|
+
@datastream.valid?
|
|
93
|
+
@datastream.errors[:unit_type].should == ["is not a valid unit_type (pick one from #{Cosm::Datastream::VALID_UNIT_TYPES.join(', ')} or leave blank)"]
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
describe "#initialize" do
|
|
99
|
+
it "should create a blank slate when passed no arguments" do
|
|
100
|
+
datastream = Cosm::Datastream.new
|
|
101
|
+
Cosm::Datastream::ALLOWED_KEYS.each do |attr|
|
|
102
|
+
datastream.attributes[attr.to_sym].should be_nil
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
%w(xml json hash csv).each do |format|
|
|
107
|
+
it "should accept #{format}" do
|
|
108
|
+
datastream = Cosm::Datastream.new(datastream_as_(format.to_sym))
|
|
109
|
+
datastream.current_value.should == "14"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
%w(to_csv as_json to_xml to_json attributes).each do |output_format|
|
|
113
|
+
it "should be able to output from #{format} using #{output_format}" do
|
|
114
|
+
datastream = Cosm::Datastream.new(datastream_as_(format.to_sym))
|
|
115
|
+
lambda {datastream.send(output_format.to_sym)}.should_not raise_error
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe "#attributes" do
|
|
122
|
+
it "should return a hash of datastream properties" do
|
|
123
|
+
attrs = {}
|
|
124
|
+
Cosm::Datastream::ALLOWED_KEYS.each do |key|
|
|
125
|
+
attrs[key] = "key #{rand(1000)}"
|
|
126
|
+
end
|
|
127
|
+
attrs["datapoints"] = [Cosm::Datapoint.new({"value" => "ein"})]
|
|
128
|
+
datastream = Cosm::Datastream.new(attrs)
|
|
129
|
+
|
|
130
|
+
datastream.attributes.should == attrs
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "should not return nil values" do
|
|
134
|
+
attrs = {}
|
|
135
|
+
Cosm::Datastream::ALLOWED_KEYS.each do |key|
|
|
136
|
+
attrs[key] = "key #{rand(1000)}"
|
|
137
|
+
end
|
|
138
|
+
attrs["created_at"] = nil
|
|
139
|
+
datastream = Cosm::Datastream.new(attrs)
|
|
140
|
+
|
|
141
|
+
datastream.attributes.should_not include("created_at")
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
describe "#attributes=" do
|
|
146
|
+
it "should accept and save a hash of datastream properties" do
|
|
147
|
+
datastream = Cosm::Datastream.new({})
|
|
148
|
+
|
|
149
|
+
attrs = {}
|
|
150
|
+
Cosm::Datastream::ALLOWED_KEYS.each do |key|
|
|
151
|
+
value = "key #{rand(1000)}"
|
|
152
|
+
attrs[key] = value
|
|
153
|
+
datastream.should_receive("#{key}=").with(value)
|
|
154
|
+
end
|
|
155
|
+
datastream.attributes=(attrs)
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
context "associated datapoints" do
|
|
160
|
+
|
|
161
|
+
describe "#datapoints" do
|
|
162
|
+
it "should return an array of datapoints" do
|
|
163
|
+
datapoints = [Cosm::Datapoint.new(datapoint_as_(:hash))]
|
|
164
|
+
attrs = {"datapoints" => datapoints}
|
|
165
|
+
datastream = Cosm::Datastream.new(attrs)
|
|
166
|
+
datastream.datapoints.each do |ds|
|
|
167
|
+
ds.should be_kind_of(Cosm::Datapoint)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "should never be nil" do
|
|
172
|
+
Cosm::Datastream.new({}).datapoints.should == []
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
describe "#datapoints=" do
|
|
177
|
+
before(:each) do
|
|
178
|
+
@datastream = Cosm::Datastream.new({})
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "should be empty if not assigned an array" do
|
|
182
|
+
@datastream.datapoints = "kittens"
|
|
183
|
+
@datastream.datapoints.should be_empty
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it "should accept an array of datapoints and hashes and store an array of datapoints" do
|
|
187
|
+
new_datapoint1 = Cosm::Datapoint.new(datapoint_as_(:hash))
|
|
188
|
+
new_datapoint2 = Cosm::Datapoint.new(datapoint_as_(:hash))
|
|
189
|
+
Cosm::Datapoint.should_receive(:new).with(datapoint_as_(:hash)).and_return(new_datapoint2)
|
|
190
|
+
|
|
191
|
+
datapoints = [new_datapoint1, datapoint_as_(:hash)]
|
|
192
|
+
@datastream.datapoints = datapoints
|
|
193
|
+
@datastream.datapoints.length.should == 2
|
|
194
|
+
@datastream.datapoints.should include(new_datapoint1)
|
|
195
|
+
@datastream.datapoints.should include(new_datapoint2)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
it "should accept an array of datapoints and store an array of datapoints" do
|
|
199
|
+
datapoints = [Cosm::Datapoint.new(datapoint_as_(:hash))]
|
|
200
|
+
@datastream.datapoints = datapoints
|
|
201
|
+
@datastream.datapoints.should == datapoints
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it "should accept an array of hashes and store an array of datapoints" do
|
|
205
|
+
new_datapoint = Cosm::Datapoint.new(datapoint_as_(:hash))
|
|
206
|
+
Cosm::Datapoint.should_receive(:new).with(datapoint_as_(:hash)).and_return(new_datapoint)
|
|
207
|
+
|
|
208
|
+
datapoints_hash = [datapoint_as_(:hash)]
|
|
209
|
+
@datastream.datapoints = datapoints_hash
|
|
210
|
+
@datastream.datapoints.should == [new_datapoint]
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Provided by Cosm::Templates::DatastreamDefaults
|
|
216
|
+
describe "#generate_json" do
|
|
217
|
+
it "should take a version and generate the appropriate template" do
|
|
218
|
+
datastream = Cosm::Datastream.new({})
|
|
219
|
+
Cosm::Template.should_receive(:new).with(datastream, :json)
|
|
220
|
+
lambda {datastream.generate_json("1.0.0")}.should raise_error(NoMethodError)
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
describe "#to_csv" do
|
|
225
|
+
|
|
226
|
+
it "should call the csv generator with default version" do
|
|
227
|
+
datastream = Cosm::Datastream.new({})
|
|
228
|
+
datastream.should_receive(:generate_csv).with("2", {}).and_return("2")
|
|
229
|
+
datastream.to_csv.should == "2"
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "should accept optional xml version" do
|
|
233
|
+
datastream = Cosm::Datastream.new({})
|
|
234
|
+
datastream.should_receive(:generate_csv).with("1", {}).and_return("1234,32")
|
|
235
|
+
datastream.to_csv(:version => "1").should == "1234,32"
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it "should accept additional options" do
|
|
239
|
+
datastream = Cosm::Datastream.new({})
|
|
240
|
+
datastream.should_receive(:generate_csv).with("1", {:full => true}).and_return("34")
|
|
241
|
+
datastream.to_csv(:version => "1", :full => true).should == "34"
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
describe "#to_xml" do
|
|
246
|
+
|
|
247
|
+
it "should call the xml generator with default version" do
|
|
248
|
+
datastream = Cosm::Datastream.new({})
|
|
249
|
+
datastream.should_receive(:generate_xml).with("0.5.1", {}).and_return("<xml></xml>")
|
|
250
|
+
datastream.to_xml.should == "<xml></xml>"
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
it "should accept optional xml version" do
|
|
254
|
+
datastream = Cosm::Datastream.new({})
|
|
255
|
+
datastream.should_receive(:generate_xml).with("5", {}).and_return("<xml></xml>")
|
|
256
|
+
datastream.to_xml(:version => "5").should == "<xml></xml>"
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
describe "#as_json" do
|
|
262
|
+
|
|
263
|
+
it "should call the json generator with default version" do
|
|
264
|
+
datastream = Cosm::Datastream.new({})
|
|
265
|
+
datastream.should_receive(:generate_json).with("1.0.0", {}).and_return({"title" => "Environment"})
|
|
266
|
+
datastream.as_json.should == {"title" => "Environment"}
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
it "should accept optional json version" do
|
|
270
|
+
datastream = Cosm::Datastream.new({})
|
|
271
|
+
datastream.should_receive(:generate_json).with("0.6-alpha", {}).and_return({"title" => "Environment"})
|
|
272
|
+
datastream.as_json(:version => "0.6-alpha").should == {"title" => "Environment"}
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
describe "#to_json" do
|
|
278
|
+
it "should call #as_json" do
|
|
279
|
+
datastream_hash = {"id" => "env001", "value" => "2344"}
|
|
280
|
+
datastream = Cosm::Datastream.new(datastream_hash)
|
|
281
|
+
datastream.should_receive(:as_json).with({})
|
|
282
|
+
datastream.to_json
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it "should pass options through to #as_json" do
|
|
286
|
+
datastream_hash = {"id" => "env001", "value" => "2344"}
|
|
287
|
+
datastream = Cosm::Datastream.new(datastream_hash)
|
|
288
|
+
datastream.should_receive(:as_json).with({:crazy => "options"})
|
|
289
|
+
datastream.to_json({:crazy => "options"})
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
it "should pass the output of #as_json to yajl" do
|
|
293
|
+
datastream_hash = {"id" => "env001", "value" => "2344"}
|
|
294
|
+
datastream = Cosm::Datastream.new(datastream_hash)
|
|
295
|
+
datastream.should_receive(:as_json).and_return({:awesome => "hash"})
|
|
296
|
+
::JSON.should_receive(:generate).with({:awesome => "hash"})
|
|
297
|
+
datastream.to_json
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Cosm::Feed do
|
|
4
|
+
|
|
5
|
+
it "should have a constant that defines the allowed keys" do
|
|
6
|
+
Cosm::Feed::ALLOWED_KEYS.should == %w(id creator owner_login datastreams description email feed icon location_disposition location_domain location_ele location_exposure location_lat location_lon location_name location_waypoints private status tags title updated created website auto_feed_url csv_version)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context "attr accessors" do
|
|
10
|
+
before(:each) do
|
|
11
|
+
@feed = Cosm::Feed.new(feed_as_(:json))
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "setting whitelisted fields" do
|
|
15
|
+
Cosm::Feed::ALLOWED_KEYS.each do |key|
|
|
16
|
+
it "##{key}=" do
|
|
17
|
+
lambda {
|
|
18
|
+
@feed.send("#{key}=", key)
|
|
19
|
+
}.should_not raise_error
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "getting whitelisted fields" do
|
|
25
|
+
Cosm::Feed::ALLOWED_KEYS.each do |key|
|
|
26
|
+
it "##{key}" do
|
|
27
|
+
lambda {
|
|
28
|
+
@feed.send(key)
|
|
29
|
+
}.should_not raise_error
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe "setting non-whitelisted keys" do
|
|
35
|
+
it "should not be possible to set non-whitelisted fields" do
|
|
36
|
+
lambda {
|
|
37
|
+
@feed.something_bogus = 'whatevs'
|
|
38
|
+
}.should raise_error
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should not be possible to get non-whitelisted fields" do
|
|
42
|
+
lambda {
|
|
43
|
+
@feed.something_bogus
|
|
44
|
+
}.should raise_error
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "validation" do
|
|
50
|
+
%w(title).each do |field|
|
|
51
|
+
it "should require a '#{field}'" do
|
|
52
|
+
feed = Cosm::Feed.new
|
|
53
|
+
feed.send("#{field}=".to_sym, nil)
|
|
54
|
+
feed.should_not be_valid
|
|
55
|
+
feed.errors[field.to_sym].should == ["can't be blank"]
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should not allow duplicate datastreams" do
|
|
60
|
+
feed = Cosm::Feed.new
|
|
61
|
+
feed.datastreams = [Cosm::Datastream.new('id' => '1'), Cosm::Datastream.new('id' => '1')]
|
|
62
|
+
feed.should_not be_valid
|
|
63
|
+
feed.errors[:datastreams].should == ["can't have duplicate IDs: 1"]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should validate all datastreams" do
|
|
67
|
+
feed = Cosm::Feed.new
|
|
68
|
+
feed.datastreams = [Cosm::Datastream.new('id' => '')]
|
|
69
|
+
feed.should_not be_valid
|
|
70
|
+
feed.errors[:datastreams_id].should == ["can't be blank"]
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe "#initialize" do
|
|
75
|
+
it "should create a blank slate when passed no arguments" do
|
|
76
|
+
feed = Cosm::Feed.new
|
|
77
|
+
Cosm::Feed::ALLOWED_KEYS.each do |attr|
|
|
78
|
+
feed.attributes[attr.to_sym].should be_nil
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
%w(xml json hash).each do |format|
|
|
83
|
+
it "should accept #{format}" do
|
|
84
|
+
feed = Cosm::Feed.new(feed_as_(format.to_sym))
|
|
85
|
+
feed.title.downcase.should == "cosm office environment"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
%w(to_csv as_json to_xml to_json attributes).each do |output_format|
|
|
89
|
+
it "should be able to output from #{format} using #{output_format}" do
|
|
90
|
+
feed = Cosm::Feed.new(feed_as_(format.to_sym))
|
|
91
|
+
lambda {feed.send(output_format.to_sym)}.should_not raise_error
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
describe "#attributes" do
|
|
98
|
+
it "should return a hash of feed properties" do
|
|
99
|
+
attrs = {}
|
|
100
|
+
Cosm::Feed::ALLOWED_KEYS.each do |key|
|
|
101
|
+
attrs[key] = "key #{rand(1000)}"
|
|
102
|
+
end
|
|
103
|
+
attrs["datastreams"] = [Cosm::Datastream.new({"id" => "ein"})]
|
|
104
|
+
feed = Cosm::Feed.new(attrs)
|
|
105
|
+
|
|
106
|
+
feed.attributes.should == attrs
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "should contain csv_version in the allowed keys" do
|
|
110
|
+
Cosm::Feed::ALLOWED_KEYS.should include("csv_version")
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "should not return nil values" do
|
|
114
|
+
attrs = {}
|
|
115
|
+
Cosm::Feed::ALLOWED_KEYS.each do |key|
|
|
116
|
+
attrs[key] = "key #{rand(1000)}"
|
|
117
|
+
end
|
|
118
|
+
attrs["created_at"] = nil
|
|
119
|
+
feed = Cosm::Feed.new(attrs)
|
|
120
|
+
|
|
121
|
+
feed.attributes.should_not include("created_at")
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
describe "#attributes=" do
|
|
126
|
+
it "should accept and save a hash of feed properties" do
|
|
127
|
+
feed = Cosm::Feed.new({})
|
|
128
|
+
|
|
129
|
+
attrs = {}
|
|
130
|
+
Cosm::Feed::ALLOWED_KEYS.each do |key|
|
|
131
|
+
value = "key #{rand(1000)}"
|
|
132
|
+
attrs[key] = value
|
|
133
|
+
feed.should_receive("#{key}=").with(value)
|
|
134
|
+
end
|
|
135
|
+
feed.attributes=(attrs)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
context "associated datastreams" do
|
|
140
|
+
|
|
141
|
+
describe "#datastreams" do
|
|
142
|
+
it "should return an array of datastreams" do
|
|
143
|
+
datastreams = [Cosm::Datastream.new(datastream_as_(:hash))]
|
|
144
|
+
attrs = {"datastreams" => datastreams}
|
|
145
|
+
feed = Cosm::Feed.new(attrs)
|
|
146
|
+
feed.datastreams.each do |ds|
|
|
147
|
+
ds.should be_kind_of(Cosm::Datastream)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "should default to an empty array" do
|
|
152
|
+
feed = Cosm::Feed.new({})
|
|
153
|
+
feed.datastreams.should == []
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
describe "#datastreams=" do
|
|
158
|
+
before(:each) do
|
|
159
|
+
@feed = Cosm::Feed.new({})
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it "should return an empty array if not an array" do
|
|
163
|
+
@feed.datastreams = "kittens"
|
|
164
|
+
@feed.datastreams.should be_empty
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "should accept an array of datastreams and hashes and store an array of datastreams" do
|
|
168
|
+
new_datastream1 = Cosm::Datastream.new(datastream_as_(:hash))
|
|
169
|
+
new_datastream2 = Cosm::Datastream.new(datastream_as_(:hash))
|
|
170
|
+
Cosm::Datastream.should_receive(:new).with(datastream_as_(:hash)).and_return(new_datastream2)
|
|
171
|
+
|
|
172
|
+
datastreams = [new_datastream1, datastream_as_(:hash)]
|
|
173
|
+
@feed.datastreams = datastreams
|
|
174
|
+
@feed.datastreams.length.should == 2
|
|
175
|
+
@feed.datastreams.should include(new_datastream1)
|
|
176
|
+
@feed.datastreams.should include(new_datastream2)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "should accept an array of datastreams and store an array of datastreams" do
|
|
180
|
+
datastreams = [Cosm::Datastream.new(datastream_as_(:hash))]
|
|
181
|
+
@feed.datastreams = datastreams
|
|
182
|
+
@feed.datastreams.should == datastreams
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
it "should accept an array of hashes and store an array of datastreams" do
|
|
186
|
+
new_datastream = Cosm::Datastream.new(datastream_as_(:hash))
|
|
187
|
+
Cosm::Datastream.should_receive(:new).with(datastream_as_(:hash)).and_return(new_datastream)
|
|
188
|
+
|
|
189
|
+
datastreams_hash = [datastream_as_(:hash)]
|
|
190
|
+
@feed.datastreams = datastreams_hash
|
|
191
|
+
@feed.datastreams.should == [new_datastream]
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it "should accept an array of subclass of datastream and store an array of datastreams" do
|
|
195
|
+
class OurSpecialDatastreamClass < Cosm::Datastream
|
|
196
|
+
attr_accessor :something_new
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
datastreams = [OurSpecialDatastreamClass.new(datastream_as_(:hash))]
|
|
200
|
+
@feed.datastreams = datastreams
|
|
201
|
+
@feed.datastreams.should == datastreams
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Provided by Cosm::Templates::FeedDefaults
|
|
208
|
+
describe "#generate_json" do
|
|
209
|
+
it "should take a version and generate the appropriate template" do
|
|
210
|
+
feed = Cosm::Feed.new({})
|
|
211
|
+
Cosm::Template.should_receive(:new).with(feed, :json)
|
|
212
|
+
lambda {feed.generate_json("1.0.0", {})}.should raise_error(NoMethodError)
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
describe "#to_csv" do
|
|
217
|
+
it "should call the csv generator with default version" do
|
|
218
|
+
feed = Cosm::Feed.new({})
|
|
219
|
+
feed.should_receive(:generate_csv).with("2", {}).and_return("1,2,3,4")
|
|
220
|
+
feed.to_csv.should == "1,2,3,4"
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "should accept optional csv version" do
|
|
224
|
+
version = "1"
|
|
225
|
+
feed = Cosm::Feed.new({})
|
|
226
|
+
feed.should_receive(:generate_csv).with(version, {}).and_return("1,2,3,4")
|
|
227
|
+
feed.to_csv(:version => version).should == "1,2,3,4"
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
it "should accept additional options" do
|
|
231
|
+
version = "1"
|
|
232
|
+
feed = Cosm::Feed.new({})
|
|
233
|
+
feed.should_receive(:generate_csv).with(version, :full => true).and_return("1,2,3,4")
|
|
234
|
+
feed.to_csv(:version => version, :full => true).should == "1,2,3,4"
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
describe "#to_xml" do
|
|
239
|
+
it "should call the xml generator with default version" do
|
|
240
|
+
feed = Cosm::Feed.new({})
|
|
241
|
+
feed.should_receive(:generate_xml).with("0.5.1", {}).and_return("<xml></xml>")
|
|
242
|
+
feed.to_xml.should == "<xml></xml>"
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
it "should accept optional xml version" do
|
|
246
|
+
version = "5"
|
|
247
|
+
feed = Cosm::Feed.new({})
|
|
248
|
+
feed.should_receive(:generate_xml).with(version, {}).and_return("<xml></xml>")
|
|
249
|
+
feed.to_xml(:version => version).should == "<xml></xml>"
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
describe "#as_json" do
|
|
254
|
+
it "should call the json generator with default version" do
|
|
255
|
+
feed = Cosm::Feed.new({})
|
|
256
|
+
feed.should_receive(:generate_json).with("1.0.0", {}).and_return({"title" => "Environment"})
|
|
257
|
+
feed.as_json.should == {"title" => "Environment"}
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
it "should accept optional json version" do
|
|
261
|
+
version = "0.6-alpha"
|
|
262
|
+
feed = Cosm::Feed.new({})
|
|
263
|
+
feed.should_receive(:generate_json).with(version, {}).and_return({"title" => "Environment"})
|
|
264
|
+
feed.as_json(:version => version).should == {"title" => "Environment"}
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
describe "#to_json" do
|
|
269
|
+
it "should call #as_json" do
|
|
270
|
+
feed_hash = {"title" => "Environment"}
|
|
271
|
+
feed = Cosm::Feed.new(feed_hash)
|
|
272
|
+
feed.should_receive(:as_json).with({})
|
|
273
|
+
feed.to_json
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
it "should pass options through to #as_json" do
|
|
277
|
+
feed_hash = {"title" => "Environment"}
|
|
278
|
+
feed = Cosm::Feed.new(feed_hash)
|
|
279
|
+
feed.should_receive(:as_json).with({:crazy => "options"})
|
|
280
|
+
feed.to_json({:crazy => "options"})
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it "should generate datastreams" do
|
|
284
|
+
feed = Cosm::Feed.new(feed_as_('hash'))
|
|
285
|
+
feed.datastreams = datastream_as_(:hash)
|
|
286
|
+
JSON.parse(feed.to_json)["datastreams"].should_not be_nil
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
it "should pass the output of #as_json to yajl" do
|
|
290
|
+
feed_hash = {"title" => "Environment"}
|
|
291
|
+
feed = Cosm::Feed.new(feed_hash)
|
|
292
|
+
feed.should_receive(:as_json).and_return({:awesome => "hash"})
|
|
293
|
+
::JSON.should_receive(:generate).with({:awesome => "hash"})
|
|
294
|
+
feed.to_json
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Hash extensions" do
|
|
4
|
+
it "should add a delete_if_nil_value method to hashes" do
|
|
5
|
+
hash = { "foo" => "awesome", "bar" => nil, :symbol => "" }
|
|
6
|
+
hash.delete_if_nil_value.should == { "foo" => "awesome" }
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# HACK probably
|
|
10
|
+
it "should add a deep_stringify_keys method to hash instances" do
|
|
11
|
+
hash = { :sym => "val", :nested => { "str" => 12, :symtoo => 58 } }
|
|
12
|
+
hash.deep_stringify_keys.should == { "sym" => "val", "nested" => { "str" => 12, "symtoo" => 58 } }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should have a destructive in place version of the deep_stringify_keys method" do
|
|
16
|
+
hash = { :sym => "val", :nested => { "str" => 12, :symtoo => 58 } }
|
|
17
|
+
hash.deep_stringify_keys!
|
|
18
|
+
hash.should == { "sym" => "val", "nested" => { "str" => 12, "symtoo" => 58 } }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Template helpers" do
|
|
4
|
+
include Cosm::Helpers
|
|
5
|
+
|
|
6
|
+
describe "#join_tags" do
|
|
7
|
+
|
|
8
|
+
it "should just return the string if it already is one" do
|
|
9
|
+
join_tags('help, me').should == 'help, me'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should convert an array into a string" do
|
|
13
|
+
join_tags(['bag', 'jag', 'lag', 'tag']).should == 'bag,jag,lag,tag'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should sort the array" do
|
|
17
|
+
join_tags(['zag', 'xag', 'Bag', 'aag']).should == 'aag,Bag,xag,zag'
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe "#parse_tag_string" do
|
|
22
|
+
it "should handle single tags" do
|
|
23
|
+
parse_tag_string('tag').should == ['tag']
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should handle multiple tags" do
|
|
27
|
+
parse_tag_string('tag, bag ,lag,jag').should == ['bag', 'jag', 'lag', 'tag']
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should handle complex tags" do
|
|
31
|
+
string = 'apple, orange, "red room", " I like space ", "tennis, later"'
|
|
32
|
+
parse_tag_string(string).should ==
|
|
33
|
+
[
|
|
34
|
+
" I like space ",
|
|
35
|
+
"apple",
|
|
36
|
+
"orange",
|
|
37
|
+
"red room",
|
|
38
|
+
"tennis, later"
|
|
39
|
+
]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should handle tags with escaped double quote" do
|
|
43
|
+
string = 'apple, orange, "horse:height=2\"", " I like space ", "tennis, later", "\"quote\""'
|
|
44
|
+
parse_tag_string(string).should ==
|
|
45
|
+
[
|
|
46
|
+
" I like space ",
|
|
47
|
+
"\"quote\"",
|
|
48
|
+
"apple",
|
|
49
|
+
"horse:height=2\"",
|
|
50
|
+
"orange",
|
|
51
|
+
"tennis, later"
|
|
52
|
+
]
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|