amee 2.6.0 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +18 -0
- data/README +2 -2
- data/Rakefile +31 -0
- data/VERSION +1 -0
- data/amee-ruby.gemspec +147 -0
- data/examples/view_profile_item.rb +32 -0
- data/lib/amee.rb +0 -1
- data/lib/amee/profile_item.rb +27 -6
- data/spec/amee_spec.rb +25 -0
- data/spec/cache_spec.rb +152 -0
- data/spec/connection_spec.rb +295 -0
- data/spec/data_category_spec.rb +259 -0
- data/spec/data_item_spec.rb +224 -0
- data/spec/data_item_value_history_spec.rb +311 -0
- data/spec/data_item_value_spec.rb +231 -0
- data/spec/data_object_spec.rb +9 -0
- data/spec/drill_down_spec.rb +163 -0
- data/spec/fixtures/AD63A83B4D41.json +1 -0
- data/spec/fixtures/AD63A83B4D41.xml +1 -0
- data/spec/fixtures/create_item.json +1 -0
- data/spec/fixtures/create_item.xml +1 -0
- data/spec/fixtures/data.json +1 -0
- data/spec/fixtures/data.xml +1 -0
- data/spec/fixtures/data_home_energy_quantity.xml +146 -0
- data/spec/fixtures/data_home_energy_quantity_biodiesel.xml +177 -0
- data/spec/fixtures/data_transport_car_generic_drill_fuel_diesel.xml +33 -0
- data/spec/fixtures/empty.json +1 -0
- data/spec/fixtures/empty.xml +1 -0
- data/spec/fixtures/parse_test.xml +22 -0
- data/spec/fixtures/v0_data_transport_transport_drill_transportType_Car1.xml +20 -0
- data/spec/item_definition_spec.rb +313 -0
- data/spec/item_value_definition_spec.rb +253 -0
- data/spec/logger_spec.rb +16 -0
- data/spec/object_spec.rb +44 -0
- data/spec/parse_helper_spec.rb +72 -0
- data/spec/profile_category_spec.rb +565 -0
- data/spec/profile_item_spec.rb +451 -0
- data/spec/profile_item_value_spec.rb +196 -0
- data/spec/profile_object_spec.rb +24 -0
- data/spec/profile_spec.rb +88 -0
- data/spec/rails_spec.rb +48 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +56 -0
- data/spec/user_spec.rb +249 -0
- metadata +189 -55
- data/lib/amee/version.rb +0 -10
@@ -0,0 +1,224 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe AMEE::Data::Item do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@item = AMEE::Data::Item.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should have common AMEE object properties" do
|
10
|
+
@item.is_a?(AMEE::Data::Object).should be_true
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have values" do
|
14
|
+
@item.should respond_to(:values)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should have values" do
|
18
|
+
@item.should respond_to(:choices)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should a label" do
|
22
|
+
@item.should respond_to(:label)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should initialize AMEE::Object data on creation" do
|
26
|
+
uid = 'ABCD1234'
|
27
|
+
@item = AMEE::Data::Item.new(:uid => uid)
|
28
|
+
@item.uid.should == uid
|
29
|
+
end
|
30
|
+
|
31
|
+
it "can be created with hash of data" do
|
32
|
+
values = ["one", "two"]
|
33
|
+
choices = [{:name => "one", :value => "two"}]
|
34
|
+
label = "test"
|
35
|
+
@item = AMEE::Data::Item.new(:label => label, :values => values, :choices => choices)
|
36
|
+
@item.values.should == values
|
37
|
+
@item.choices.should == choices
|
38
|
+
@item.label.should == label
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
describe AMEE::Data::Item, "with an authenticated connection" do
|
44
|
+
|
45
|
+
it "should parse XML correctly" do
|
46
|
+
connection = flexmock "connection"
|
47
|
+
connection.should_receive(:retries).and_return(0)
|
48
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.xml')))
|
49
|
+
@data = AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")
|
50
|
+
@data.uid.should == "AD63A83B4D41"
|
51
|
+
@data.path.should == "/transport/plane/generic/AD63A83B4D41"
|
52
|
+
@data.full_path.should == "/data/transport/plane/generic/AD63A83B4D41"
|
53
|
+
@data.category_uid.should == "FBA97B70DBDF"
|
54
|
+
@data.created.should == DateTime.new(2007,8,1,9,00,41)
|
55
|
+
@data.modified.should == DateTime.new(2007,8,1,9,00,41)
|
56
|
+
@data.label.should == "domestic"
|
57
|
+
@data.item_definition_uid.should == "441BF4BEA15B"
|
58
|
+
@data.values.size.should == 5
|
59
|
+
@data.values[0][:name].should == "kgCO2 Per Passenger Journey"
|
60
|
+
@data.values[0][:path].should == "kgCO2PerPassengerJourney"
|
61
|
+
@data.values[0][:value].should == "0"
|
62
|
+
@data.values[0][:uid].should == "127612FA4921"
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should parse choices correctly from XML" do
|
66
|
+
connection = flexmock "connection"
|
67
|
+
connection.should_receive(:retries).and_return(0)
|
68
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.xml')))
|
69
|
+
@data = AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")
|
70
|
+
@data.choices.size.should == 6
|
71
|
+
@data.choices[0][:name].should == "distanceKmPerYear"
|
72
|
+
@data.choices[0][:value].should be_empty
|
73
|
+
@data.choices[1][:name].should == "journeysPerYear"
|
74
|
+
@data.choices[1][:value].should be_empty
|
75
|
+
@data.choices[2][:name].should == "lat1"
|
76
|
+
@data.choices[2][:value].should == "-999"
|
77
|
+
@data.choices[3][:name].should == "lat2"
|
78
|
+
@data.choices[3][:value].should == "-999"
|
79
|
+
@data.choices[4][:name].should == "long1"
|
80
|
+
@data.choices[4][:value].should == "-999"
|
81
|
+
@data.choices[5][:name].should == "long2"
|
82
|
+
@data.choices[5][:value].should == "-999"
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should parse JSON correctly" do
|
86
|
+
connection = flexmock "connection"
|
87
|
+
connection.should_receive(:retries).and_return(0)
|
88
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json')))
|
89
|
+
@data = AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")
|
90
|
+
@data.uid.should == "AD63A83B4D41"
|
91
|
+
@data.path.should == "/transport/plane/generic/AD63A83B4D41"
|
92
|
+
@data.full_path.should == "/data/transport/plane/generic/AD63A83B4D41"
|
93
|
+
@data.category_uid.should == "FBA97B70DBDF"
|
94
|
+
@data.created.should == DateTime.new(2007,8,1,9,00,41)
|
95
|
+
@data.modified.should == DateTime.new(2007,8,1,9,00,41)
|
96
|
+
@data.label.should == "domestic"
|
97
|
+
@data.values.size.should == 5
|
98
|
+
@data.values[0][:name].should == "kgCO2 Per Passenger Journey"
|
99
|
+
@data.values[0][:path].should == "kgCO2PerPassengerJourney"
|
100
|
+
@data.values[0][:value].should == "0"
|
101
|
+
@data.values[0][:uid].should == "127612FA4921"
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should parse choices correctly from JSON" do
|
105
|
+
connection = flexmock "connection"
|
106
|
+
connection.should_receive(:retries).and_return(0)
|
107
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json')))
|
108
|
+
@data = AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")
|
109
|
+
@data.choices.size.should == 6
|
110
|
+
@data.choices[0][:name].should == "distanceKmPerYear"
|
111
|
+
@data.choices[0][:value].should be_empty
|
112
|
+
@data.choices[1][:name].should == "journeysPerYear"
|
113
|
+
@data.choices[1][:value].should be_empty
|
114
|
+
@data.choices[2][:name].should == "lat1"
|
115
|
+
@data.choices[2][:value].should == "-999"
|
116
|
+
@data.choices[3][:name].should == "lat2"
|
117
|
+
@data.choices[3][:value].should == "-999"
|
118
|
+
@data.choices[4][:name].should == "long1"
|
119
|
+
@data.choices[4][:value].should == "-999"
|
120
|
+
@data.choices[5][:name].should == "long2"
|
121
|
+
@data.choices[5][:value].should == "-999"
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should fail gracefully with bad XML" do
|
125
|
+
connection = flexmock "connection"
|
126
|
+
connection.should_receive(:retries).and_return(0)
|
127
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.xml').first(12)))
|
128
|
+
connection.should_receive(:expire).with("/data/transport/plane/generic/AD63A83B4D41").once
|
129
|
+
lambda{AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")}.should raise_error(REXML::ParseException)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should retry if bad XML is received first time" do
|
133
|
+
connection = flexmock "connection"
|
134
|
+
connection.should_receive(:retries).and_return(2)
|
135
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.xml').first(12))).twice
|
136
|
+
connection.should_receive(:expire).with("/data/transport/plane/generic/AD63A83B4D41").twice
|
137
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.xml'))).once
|
138
|
+
lambda{AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")}.should_not raise_error
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should fail gracefully with bad data in XML" do
|
142
|
+
connection = flexmock "connection"
|
143
|
+
connection.should_receive(:retries).and_return(0)
|
144
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('empty.xml')))
|
145
|
+
connection.should_receive(:expire).with("/data/transport/plane/generic/AD63A83B4D41").once
|
146
|
+
lambda{AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")}.should raise_error(AMEE::BadData)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should fail gracefully with bad JSON" do
|
150
|
+
connection = flexmock "connection"
|
151
|
+
connection.should_receive(:retries).and_return(0)
|
152
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json').first(12)))
|
153
|
+
connection.should_receive(:expire).with("/data/transport/plane/generic/AD63A83B4D41").once
|
154
|
+
lambda{AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")}.should raise_error(JSON::ParserError)
|
155
|
+
end
|
156
|
+
|
157
|
+
it "should retry if bad JSON is received first time" do
|
158
|
+
connection = flexmock "connection"
|
159
|
+
connection.should_receive(:retries).and_return(2)
|
160
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json').first(12))).twice
|
161
|
+
connection.should_receive(:expire).with("/data/transport/plane/generic/AD63A83B4D41").twice
|
162
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json'))).once
|
163
|
+
lambda{AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")}.should_not raise_error
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should fail gracefully with bad data in JSON" do
|
167
|
+
connection = flexmock "connection"
|
168
|
+
connection.should_receive(:retries).and_return(0)
|
169
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('empty.json')))
|
170
|
+
connection.should_receive(:expire).with("/data/transport/plane/generic/AD63A83B4D41").once
|
171
|
+
lambda{AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")}.should raise_error(AMEE::BadData)
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should fail gracefully on other errors" do
|
175
|
+
connection = flexmock "connection"
|
176
|
+
connection.should_receive(:retries).and_return(0)
|
177
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_raise(Timeout::Error)
|
178
|
+
lambda{AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")}.should raise_error(Timeout::Error)
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "with sensible data" do
|
184
|
+
|
185
|
+
it "allows client to get a value by name" do
|
186
|
+
connection = flexmock "connection"
|
187
|
+
connection.should_receive(:retries).and_return(0)
|
188
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json')))
|
189
|
+
@data = AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")
|
190
|
+
@data.value("kgCO2 Per Passenger Km").should_not be_nil
|
191
|
+
@data.value("Source").should_not be_nil
|
192
|
+
end
|
193
|
+
|
194
|
+
it "allows client to get a value by path" do
|
195
|
+
connection = flexmock "connection"
|
196
|
+
connection.should_receive(:retries).and_return(0)
|
197
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json')))
|
198
|
+
@data = AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")
|
199
|
+
@data.value("kgCO2PerPassengerKm").should_not be_nil
|
200
|
+
@data.value("source").should_not be_nil
|
201
|
+
end
|
202
|
+
|
203
|
+
it "allows update" do
|
204
|
+
connection = flexmock "connection"
|
205
|
+
connection.should_receive(:retries).and_return(0)
|
206
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json')))
|
207
|
+
connection.should_receive(:put).with("/data/transport/plane/generic/AD63A83B4D41", :kgCO2PerPassengerKm => 0.159).and_return(flexmock(:body => '{"amountPerMonth":0,"userValueChoices":{"choices":[{"value":"","name":"distanceKmPerYear"},{"value":"","name":"journeysPerYear"},{"value":"-999","name":"lat1"},{"value":"-999","name":"lat2"},{"value":"-999","name":"long1"},{"value":"-999","name":"long2"}],"name":"userValueChoices"},"path":"/transport/plane/generic/AD63A83B4D41","dataItem":{"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","itemDefinition":{"uid":"441BF4BEA15B"},"itemValues":[{"value":"0","uid":"127612FA4921","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}},{"value":"0.159","uid":"7F27A5707101","path":"kgCO2PerPassengerKm","name":"kgCO2 Per Passenger Km","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"996AE5477B3F","name":"kgCO2PerKm"},"uid":"D7B4340D9404","path":"kgCO2PerPassengerKm","name":"kgCO2 Per Passenger Km"}},{"value":"-","uid":"FF50EC918A8E","path":"size","name":"Size","itemValueDefinition":{"valueDefinition":{"valueType":"TEXT","uid":"CCEB59CACE1B","name":"text"},"uid":"5D7FB5F552A5","path":"size","name":"Size"}},{"value":"domestic","uid":"FDD62D27AA15","path":"type","name":"Type","itemValueDefinition":{"valueDefinition":{"valueType":"TEXT","uid":"CCEB59CACE1B","name":"text"},"uid":"C376560CB19F","path":"type","name":"Type"}},{"value":"DfT INAS Division, 29 March 2007","uid":"9BE08FBEC54E","path":"source","name":"Source","itemValueDefinition":{"valueDefinition":{"valueType":"TEXT","uid":"CCEB59CACE1B","name":"text"},"uid":"0F0592F05AAC","path":"source","name":"Source"}}],"label":"domestic","dataCategory":{"uid":"FBA97B70DBDF","path":"generic","name":"Generic"},"uid":"AD63A83B4D41","environment":{"uid":"5F5887BCF726"},"path":"","name":"AD63A83B4D41"}}'))
|
208
|
+
@data = AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")
|
209
|
+
@data.value("kgCO2PerPassengerKm").should == "0.158"
|
210
|
+
@data.update(:kgCO2PerPassengerKm => 0.159)
|
211
|
+
#@data.value("kgCO2PerPassengerKm").should == "0.159"
|
212
|
+
end
|
213
|
+
|
214
|
+
it "fails gracefully if update fails" do
|
215
|
+
connection = flexmock "connection"
|
216
|
+
connection.should_receive(:retries).and_return(0)
|
217
|
+
connection.should_receive(:get).with("/data/transport/plane/generic/AD63A83B4D41", {}).and_return(flexmock(:body => fixture('AD63A83B4D41.json')))
|
218
|
+
connection.should_receive(:put).with("/data/transport/plane/generic/AD63A83B4D41", :kgCO2PerPassengerKm => 0.159).and_raise("generic error")
|
219
|
+
@data = AMEE::Data::Item.get(connection, "/data/transport/plane/generic/AD63A83B4D41")
|
220
|
+
lambda{@data.update(:kgCO2PerPassengerKm => 0.159)}.should raise_error(AMEE::BadData)
|
221
|
+
end
|
222
|
+
|
223
|
+
|
224
|
+
end
|
@@ -0,0 +1,311 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
TestSeriesOne=[[AMEE::Epoch,1],[AMEE::Epoch+1,2],[AMEE::Epoch+3,4]]
|
4
|
+
TestSeriesTwo=[[AMEE::Epoch,2],[AMEE::Epoch+1,6],[AMEE::Epoch+5,7],[AMEE::Epoch+9,11]]
|
5
|
+
|
6
|
+
MockResourcePath="/data/transport/plane/generic/AD63A83B4D41/kgCO2PerPassengerJourney"
|
7
|
+
MockDataItemPath="/data/transport/plane/generic/AD63A83B4D41"
|
8
|
+
MockResourceXML='<Resources><DataItemValueResource><ItemValues>'+
|
9
|
+
'<ItemValue Created="2007-08-01 09:00:41.0" Modified="2007-08-01 09:00:41.0" uid="127612FA4921"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><StartDate>'+AMEE::Epoch.xmlschema+'</StartDate><Value>1</Value><ItemValueDefinition uid="653828811D42"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><FromProfile>false</FromProfile><FromData>true</FromData><ValueDefinition uid="8CB8A1789CD6"><Name>kgCO2PerJourney</Name><ValueType>DOUBLE</ValueType></ValueDefinition></ItemValueDefinition><DataItem uid="AD63A83B4D41"/></ItemValue><DataItem uid="AD63A83B4D41"/>'+
|
10
|
+
'<ItemValue Created="2007-08-01 09:00:41.0" Modified="2007-08-01 09:00:41.0" uid="127612FA4922"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><StartDate>'+(AMEE::Epoch+1).xmlschema+'</StartDate><Value>2</Value><ItemValueDefinition uid="653828811D42"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><FromProfile>false</FromProfile><FromData>true</FromData><ValueDefinition uid="8CB8A1789CD6"><Name>kgCO2PerJourney</Name><ValueType>DOUBLE</ValueType></ValueDefinition></ItemValueDefinition><DataItem uid="AD63A83B4D41"/></ItemValue><DataItem uid="AD63A83B4D41"/>'+
|
11
|
+
'<ItemValue Created="2007-08-01 09:00:41.0" Modified="2007-08-01 09:00:41.0" uid="127612FA4923"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><StartDate>'+(AMEE::Epoch+3).xmlschema+'</StartDate><Value>4</Value><ItemValueDefinition uid="653828811D42"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><FromProfile>false</FromProfile><FromData>true</FromData><ValueDefinition uid="8CB8A1789CD6"><Name>kgCO2PerJourney</Name><ValueType>DOUBLE</ValueType></ValueDefinition></ItemValueDefinition><DataItem uid="AD63A83B4D41"/></ItemValue><DataItem uid="AD63A83B4D41"/>'+
|
12
|
+
'</ItemValues></DataItemValueResource></Resources>'
|
13
|
+
MockResourceJSON='{"dataItem":{"uid":"AD63A83B4D41"},"itemValues":['+
|
14
|
+
' {"item":{"uid":"AD63A83B4D41"},"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","startDate":"'+AMEE::Epoch.xmlschema+'","value":"1","uid":"127612FA4921","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}}'+
|
15
|
+
',{"item":{"uid":"AD63A83B4D41"},"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","startDate":"'+(AMEE::Epoch+1).xmlschema+'","value":"2","uid":"127612FA4922","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}}'+
|
16
|
+
',{"item":{"uid":"AD63A83B4D41"},"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","startDate":"'+(AMEE::Epoch+3).xmlschema+'","value":"4","uid":"127612FA4923","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}}'+
|
17
|
+
']}'
|
18
|
+
MockResourceXMLTwo='<Resources><DataItemValueResource><ItemValues>'+
|
19
|
+
'<ItemValue Created="2007-08-01 09:00:41.0" Modified="2007-08-01 09:00:41.0" uid="127612FA4921"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><StartDate>'+AMEE::Epoch.xmlschema+'</StartDate><Value>1</Value><ItemValueDefinition uid="653828811D42"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><FromProfile>false</FromProfile><FromData>true</FromData><ValueDefinition uid="8CB8A1789CD6"><Name>kgCO2PerJourney</Name><ValueType>DOUBLE</ValueType></ValueDefinition></ItemValueDefinition><DataItem uid="AD63A83B4D41"/></ItemValue><DataItem uid="AD63A83B4D41"/>'+
|
20
|
+
'<ItemValue Created="2007-08-01 09:00:41.0" Modified="2007-08-01 09:00:41.0" uid="127612FA4922"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><StartDate>'+(AMEE::Epoch+1).xmlschema+'</StartDate><Value>6</Value><ItemValueDefinition uid="653828811D42"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><FromProfile>false</FromProfile><FromData>true</FromData><ValueDefinition uid="8CB8A1789CD6"><Name>kgCO2PerJourney</Name><ValueType>DOUBLE</ValueType></ValueDefinition></ItemValueDefinition><DataItem uid="AD63A83B4D41"/></ItemValue><DataItem uid="AD63A83B4D41"/>'+
|
21
|
+
'<ItemValue Created="2007-08-01 09:00:41.0" Modified="2007-08-01 09:00:41.0" uid="127612FA4924"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><StartDate>'+(AMEE::Epoch+5).xmlschema+'</StartDate><Value>7</Value><ItemValueDefinition uid="653828811D42"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><FromProfile>false</FromProfile><FromData>true</FromData><ValueDefinition uid="8CB8A1789CD6"><Name>kgCO2PerJourney</Name><ValueType>DOUBLE</ValueType></ValueDefinition></ItemValueDefinition><DataItem uid="AD63A83B4D41"/></ItemValue><DataItem uid="AD63A83B4D41"/>'+
|
22
|
+
'<ItemValue Created="2007-08-01 09:00:41.0" Modified="2007-08-01 09:00:41.0" uid="127612FA4925"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><StartDate>'+(AMEE::Epoch+9).xmlschema+'</StartDate><Value>11</Value><ItemValueDefinition uid="653828811D42"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><FromProfile>false</FromProfile><FromData>true</FromData><ValueDefinition uid="8CB8A1789CD6"><Name>kgCO2PerJourney</Name><ValueType>DOUBLE</ValueType></ValueDefinition></ItemValueDefinition><DataItem uid="AD63A83B4D41"/></ItemValue><DataItem uid="AD63A83B4D41"/>'+
|
23
|
+
'</ItemValues></DataItemValueResource></Resources>'
|
24
|
+
MockResourceJSONTwo='{"dataItem":{"uid":"AD63A83B4D41"},"itemValues":['+
|
25
|
+
' {"item":{"uid":"AD63A83B4D41"},"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","startDate":"'+AMEE::Epoch.xmlschema+'","value":"1","uid":"127612FA4921","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}}'+
|
26
|
+
',{"item":{"uid":"AD63A83B4D41"},"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","startDate":"'+(AMEE::Epoch+1).xmlschema+'","value":"6","uid":"127612FA4922","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}}'+
|
27
|
+
',{"item":{"uid":"AD63A83B4D41"},"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","startDate":"'+(AMEE::Epoch+5).xmlschema+'","value":"7","uid":"127612FA4924","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}}'+
|
28
|
+
',{"item":{"uid":"AD63A83B4D41"},"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","startDate":"'+(AMEE::Epoch+9).xmlschema+'","value":"11","uid":"127612FA4925","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}}'+
|
29
|
+
']}'
|
30
|
+
MockResourceXMLSingle='<Resources><DataItemValueResource><ItemValue Created="2007-08-01 09:00:41.0" Modified="2007-08-01 09:00:41.0" uid="127612FA4921"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><StartDate>'+AMEE::Epoch.xmlschema+'</StartDate><Value>1</Value><ItemValueDefinition uid="653828811D42"><Path>kgCO2PerPassengerJourney</Path><Name>kgCO2 Per Passenger Journey</Name><FromProfile>false</FromProfile><FromData>true</FromData><ValueDefinition uid="8CB8A1789CD6"><Name>kgCO2PerJourney</Name><ValueType>DOUBLE</ValueType></ValueDefinition></ItemValueDefinition><DataItem uid="AD63A83B4D41"/></ItemValue><DataItem uid="AD63A83B4D41"/></DataItemValueResource>'+
|
31
|
+
'</Resources>'
|
32
|
+
MockResourceJSONSingle='{"dataItem":{"uid":"AD63A83B4D41"},"itemValue":'+
|
33
|
+
' {"item":{"uid":"AD63A83B4D41"},"modified":"2007-08-01 09:00:41.0","created":"2007-08-01 09:00:41.0","startDate":"'+AMEE::Epoch.xmlschema+'","value":"1","uid":"127612FA4921","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey","itemValueDefinition":{"valueDefinition":{"valueType":"DOUBLE","uid":"8CB8A1789CD6","name":"kgCO2PerJourney"},"uid":"653828811D42","path":"kgCO2PerPassengerJourney","name":"kgCO2 Per Passenger Journey"}}'+
|
34
|
+
'}'
|
35
|
+
|
36
|
+
|
37
|
+
describe AMEE::Data::ItemValueHistory do
|
38
|
+
|
39
|
+
before(:each) do
|
40
|
+
@history = AMEE::Data::ItemValueHistory.new
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should NOT have common AMEE object properties" do
|
44
|
+
# we can't be an AMEE object, since we have a set of UIDs, not one UID
|
45
|
+
@history.is_a?(AMEE::Data::Object).should be_false
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should have an array of ItemValue objects" do
|
49
|
+
@history.should respond_to(:values)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should be able to return a time series" do
|
53
|
+
@history.should respond_to(:series)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should have a type" do
|
57
|
+
@history.should respond_to(:type)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "can be created with a type, and a time-value pairs array" do
|
61
|
+
series=TestSeriesOne
|
62
|
+
type = "TEXT"
|
63
|
+
@history = AMEE::Data::ItemValueHistory.new(:series => series, :type => type)
|
64
|
+
@history.series.should == series
|
65
|
+
@history.type.should == type
|
66
|
+
@history.values[0].is_a?(AMEE::Data::ItemValue).should be_true
|
67
|
+
@history.values[0].value.should == 1
|
68
|
+
@history.values[0].start_date.should == AMEE::Epoch
|
69
|
+
end
|
70
|
+
|
71
|
+
it "can be created by pushing to the array of item values" do
|
72
|
+
series=TestSeriesOne
|
73
|
+
type = "TEXT"
|
74
|
+
@history = AMEE::Data::ItemValueHistory.new(:type=>type)
|
75
|
+
@history.series.should == []
|
76
|
+
@history.type.should == type
|
77
|
+
@fstvalue = AMEE::Data::ItemValue.new(:type=>type,:value=>1,:start_date=>AMEE::Epoch)
|
78
|
+
@sndvalue = AMEE::Data::ItemValue.new(:type=>type,:value=>2,:start_date=>AMEE::Epoch+1)
|
79
|
+
@trdvalue = AMEE::Data::ItemValue.new(:type=>type,:value=>4,:start_date=>AMEE::Epoch+3)
|
80
|
+
@history.values.push @fstvalue
|
81
|
+
@history.values.push @sndvalue
|
82
|
+
@history.values.push @trdvalue
|
83
|
+
@history.values[0].is_a?(AMEE::Data::ItemValue).should be_true
|
84
|
+
@history.values[0].value.should == 1
|
85
|
+
@history.values[0].start_date.should == AMEE::Epoch
|
86
|
+
@history.series.should == series
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should support DOUBLE data type" do
|
90
|
+
@history = AMEE::Data::ItemValueHistory.new(:series => TestSeriesOne, :type => "DOUBLE")
|
91
|
+
@history.series.should == TestSeriesOne
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should support TEXT data type" do
|
95
|
+
@history = AMEE::Data::ItemValueHistory.new(:series => TestSeriesOne, :type => "TEXT")
|
96
|
+
@history.series.should == TestSeriesOne
|
97
|
+
end
|
98
|
+
|
99
|
+
it "allows value to be changed after creation" do
|
100
|
+
series=TestSeriesOne
|
101
|
+
type = "TEXT"
|
102
|
+
@history = AMEE::Data::ItemValueHistory.new(:series => series, :type => type)
|
103
|
+
@history.series.should == series
|
104
|
+
series = TestSeriesTwo
|
105
|
+
@history.series = series
|
106
|
+
@history.series.should == series
|
107
|
+
@history.values[1].value.should == 6
|
108
|
+
end
|
109
|
+
|
110
|
+
it "allows item values to be found by time" do
|
111
|
+
series=TestSeriesTwo
|
112
|
+
type = "TEXT"
|
113
|
+
@history = AMEE::Data::ItemValueHistory.new(:series => series, :type => type)
|
114
|
+
@value=@history.value_at(AMEE::Epoch+5)
|
115
|
+
@value.value.should == 7
|
116
|
+
lambda {
|
117
|
+
@history.value_at(AMEE::Epoch+6)
|
118
|
+
}.should raise_error
|
119
|
+
@history.values_at([AMEE::Epoch+1,AMEE::Epoch+9]).length.should eql 2
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
describe AMEE::Data::ItemValueHistory, "when comparing to another history" do
|
125
|
+
before(:each) do
|
126
|
+
@historyone = AMEE::Data::ItemValueHistory.new(:series=>TestSeriesOne)
|
127
|
+
@historytwo = AMEE::Data::ItemValueHistory.new(:series=>TestSeriesTwo)
|
128
|
+
@comparison=@historytwo.compare(@historyone)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should be able to compare histories" do
|
132
|
+
@comparison.should be_a Hash
|
133
|
+
@comparison[:deletions].should be_a Array
|
134
|
+
@comparison[:updates].should be_a Array
|
135
|
+
@comparison[:insertions].should be_a Array
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should return an array of items to update" do
|
139
|
+
# note comparison list isnt order stable so sort here for test
|
140
|
+
@changes=@comparison[:updates].sort{|x,y| x.start_date <=> y.start_date}
|
141
|
+
@changes.length.should eql 2
|
142
|
+
@changes[1].value.should eql 6
|
143
|
+
@changes[1].start_date.should eql AMEE::Epoch+1
|
144
|
+
@changes[0].start_date.should eql AMEE::Epoch
|
145
|
+
@changes[0].value.should eql 2
|
146
|
+
|
147
|
+
end
|
148
|
+
it "should return an array of items to create" do
|
149
|
+
@changes=@comparison[:insertions].sort{|x,y| x.start_date <=> y.start_date}
|
150
|
+
@changes.length.should eql 2
|
151
|
+
@changes[0].start_date.should eql AMEE::Epoch+5
|
152
|
+
@changes[1].start_date.should eql AMEE::Epoch+9
|
153
|
+
@changes[0].value.should eql 7
|
154
|
+
@changes[1].value.should eql 11
|
155
|
+
end
|
156
|
+
it "should return an array of items to delete" do
|
157
|
+
@changes=@comparison[:deletions].sort{|x,y| x.start_date <=> y.start_date}
|
158
|
+
@changes.length.should eql 1
|
159
|
+
@changes[0].start_date.should eql AMEE::Epoch+3
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
describe AMEE::Data::ItemValueHistory, "with an authenticated connection" do
|
165
|
+
|
166
|
+
it "should parse XML correctly" do
|
167
|
+
connection = flexmock "connection"
|
168
|
+
connection.should_receive(:get).with(MockResourcePath,:valuesPerPage=>2).
|
169
|
+
and_return(flexmock(:body => MockResourceXML))
|
170
|
+
@history = AMEE::Data::ItemValueHistory.get(connection, MockResourcePath)
|
171
|
+
@history.series.should == TestSeriesOne
|
172
|
+
@fstvalue=@history.values[0]
|
173
|
+
@sndvalue=@history.values[1]
|
174
|
+
@fstvalue.uid.should == "127612FA4921"
|
175
|
+
@sndvalue.uid.should == "127612FA4922"
|
176
|
+
@fstvalue.name.should == "kgCO2 Per Passenger Journey"
|
177
|
+
@fstvalue.full_path.should == MockResourcePath
|
178
|
+
@fstvalue.created.should == DateTime.new(2007,8,1,9,00,41)
|
179
|
+
@fstvalue.modified.should == DateTime.new(2007,8,1,9,00,41)
|
180
|
+
@fstvalue.type.should == "DOUBLE"
|
181
|
+
@history.series.should == TestSeriesOne
|
182
|
+
@history.type.should == "DOUBLE"
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should parse JSON correctly" do
|
186
|
+
connection = flexmock "connection"
|
187
|
+
connection.should_receive(:get).with(MockResourcePath,:valuesPerPage=>2).and_return(flexmock(:body => MockResourceJSON))
|
188
|
+
@history = AMEE::Data::ItemValueHistory.get(connection, MockResourcePath)
|
189
|
+
@fstvalue=@history.values[0]
|
190
|
+
@sndvalue=@history.values[1]
|
191
|
+
@fstvalue.uid.should == "127612FA4921"
|
192
|
+
@sndvalue.uid.should == "127612FA4922"
|
193
|
+
@fstvalue.name.should == "kgCO2 Per Passenger Journey"
|
194
|
+
@fstvalue.full_path.should == MockResourcePath
|
195
|
+
@fstvalue.created.should == DateTime.new(2007,8,1,9,00,41)
|
196
|
+
@fstvalue.modified.should == DateTime.new(2007,8,1,9,00,41)
|
197
|
+
@fstvalue.type.should == "DOUBLE"
|
198
|
+
@history.series.should == TestSeriesOne
|
199
|
+
@history.type.should == "DOUBLE"
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should parse JSON correctly if theres only one point" do
|
203
|
+
connection = flexmock "connection"
|
204
|
+
connection.should_receive(:get).with(MockResourcePath,:valuesPerPage=>2).and_return(flexmock(:body => MockResourceJSONSingle))
|
205
|
+
@history = AMEE::Data::ItemValueHistory.get(connection, MockResourcePath)
|
206
|
+
@fstvalue=@history.values[0]
|
207
|
+
@fstvalue.uid.should == "127612FA4921"
|
208
|
+
@fstvalue.name.should == "kgCO2 Per Passenger Journey"
|
209
|
+
@fstvalue.full_path.should == MockResourcePath
|
210
|
+
@fstvalue.created.should == DateTime.new(2007,8,1,9,00,41)
|
211
|
+
@fstvalue.modified.should == DateTime.new(2007,8,1,9,00,41)
|
212
|
+
@fstvalue.type.should == "DOUBLE"
|
213
|
+
@history.series.should == [[AMEE::Epoch,1]]
|
214
|
+
@history.type.should == "DOUBLE"
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should parse XML correctly if theres only one point" do
|
218
|
+
connection = flexmock "connection"
|
219
|
+
connection.should_receive(:get).with(MockResourcePath,:valuesPerPage=>2).and_return(flexmock(:body => MockResourceXMLSingle))
|
220
|
+
@history = AMEE::Data::ItemValueHistory.get(connection, MockResourcePath)
|
221
|
+
@fstvalue=@history.values[0]
|
222
|
+
@fstvalue.uid.should == "127612FA4921"
|
223
|
+
@fstvalue.name.should == "kgCO2 Per Passenger Journey"
|
224
|
+
@fstvalue.full_path.should == MockResourcePath
|
225
|
+
@fstvalue.created.should == DateTime.new(2007,8,1,9,00,41)
|
226
|
+
@fstvalue.modified.should == DateTime.new(2007,8,1,9,00,41)
|
227
|
+
@fstvalue.type.should == "DOUBLE"
|
228
|
+
@history.series.should == [[AMEE::Epoch,1]]
|
229
|
+
@history.type.should == "DOUBLE"
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should fail gracefully with incorrect XML data" do
|
233
|
+
connection = flexmock "connection"
|
234
|
+
xml = '<?xml version="1.0" encoding="UTF-8"?><Resources></Resources>'
|
235
|
+
connection.should_receive(:get).with("/data",:valuesPerPage=>2).and_return(flexmock(:body => xml))
|
236
|
+
lambda{AMEE::Data::ItemValueHistory.get(connection, "/data")}.should raise_error(AMEE::BadData)
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should fail gracefully with incorrect JSON data" do
|
240
|
+
connection = flexmock "connection"
|
241
|
+
json = '{}'
|
242
|
+
connection.should_receive(:get).with("/data",:valuesPerPage=>2).and_return(flexmock(:body => json))
|
243
|
+
lambda{AMEE::Data::ItemValueHistory.get(connection, "/data")}.should raise_error(AMEE::BadData)
|
244
|
+
end
|
245
|
+
|
246
|
+
it "should fail gracefully on other errors" do
|
247
|
+
connection = flexmock "connection"
|
248
|
+
connection.should_receive(:get).with("/data",:valuesPerPage=>2).and_raise("unidentified error")
|
249
|
+
lambda{AMEE::Data::ItemValueHistory.get(connection, "/data")}.should raise_error(AMEE::BadData)
|
250
|
+
end
|
251
|
+
|
252
|
+
it "should fail gracefully if create series without epoch" do
|
253
|
+
@history = AMEE::Data::ItemValueHistory.new()
|
254
|
+
lambda{@history.series=[[AMEE::Epoch+1,5]]}.should raise_error(AMEE::BadData)
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
describe AMEE::Data::ItemValueHistory, "after loading" do
|
260
|
+
|
261
|
+
before(:each) do
|
262
|
+
@path = MockResourcePath
|
263
|
+
@connection = flexmock "connection"
|
264
|
+
@connection.should_receive(:get).with(@path,:valuesPerPage=>2).and_return(flexmock(:body => MockResourceJSON))
|
265
|
+
@val = AMEE::Data::ItemValueHistory.get(@connection, @path)
|
266
|
+
end
|
267
|
+
|
268
|
+
it "can have series changed and saved back to server" do
|
269
|
+
@connection.should_receive(:put).with(MockDataItemPath+"/127612FA4921", :value => 2).once.and_return(flexmock(:body => ''))
|
270
|
+
# note this one shouldn't include a start date as it is the epoch point
|
271
|
+
@connection.should_receive(:put).with(MockDataItemPath+"/127612FA4922", :value => 6, :startDate => AMEE::Epoch+1).once.and_return(flexmock(:body => ''))
|
272
|
+
@connection.should_receive(:delete).with(MockDataItemPath+"/127612FA4923").once.and_return(flexmock(:body => ''))
|
273
|
+
@connection.should_receive(:post).with(MockDataItemPath,
|
274
|
+
:kgCO2PerPassengerJourney => 7, :startDate => AMEE::Epoch+5).once.and_return({'Location'=>'http://foo.com/'})
|
275
|
+
@connection.should_receive(:post).with(MockDataItemPath,
|
276
|
+
:kgCO2PerPassengerJourney => 11, :startDate => AMEE::Epoch+9).once.and_return({'Location'=>'http://foo.com/'})
|
277
|
+
lambda {
|
278
|
+
@val.series = TestSeriesTwo
|
279
|
+
@val.save!
|
280
|
+
}.should_not raise_error
|
281
|
+
end
|
282
|
+
|
283
|
+
it "can have series changed and saved back to server (using SSL)" do
|
284
|
+
@connection.should_receive(:put).with(MockDataItemPath+"/127612FA4921", :value => 2).once.and_return(flexmock(:body => ''))
|
285
|
+
# note this one shouldn't include a start date as it is the epoch point
|
286
|
+
@connection.should_receive(:put).with(MockDataItemPath+"/127612FA4922", :value => 6, :startDate => AMEE::Epoch+1).once.and_return(flexmock(:body => ''))
|
287
|
+
@connection.should_receive(:delete).with(MockDataItemPath+"/127612FA4923").once.and_return(flexmock(:body => ''))
|
288
|
+
@connection.should_receive(:post).with(MockDataItemPath,
|
289
|
+
:kgCO2PerPassengerJourney => 7, :startDate => AMEE::Epoch+5).once.and_return({'Location'=>'https://foo.com/'})
|
290
|
+
@connection.should_receive(:post).with(MockDataItemPath,
|
291
|
+
:kgCO2PerPassengerJourney => 11, :startDate => AMEE::Epoch+9).once.and_return({'Location'=>'https://foo.com/'})
|
292
|
+
lambda {
|
293
|
+
@val.series = TestSeriesTwo
|
294
|
+
@val.save!
|
295
|
+
}.should_not raise_error
|
296
|
+
end
|
297
|
+
|
298
|
+
it "cannot create a new series (unsupported by platform)" do
|
299
|
+
lambda {
|
300
|
+
@val.series = TestSeriesTwo
|
301
|
+
@val.create!
|
302
|
+
}.should raise_error(AMEE::NotSupported,"Cannot create a Data Item Value History from scratch: at least one data point must exist when the DI is created")
|
303
|
+
end
|
304
|
+
|
305
|
+
it "cannot delete an entire series (unsupported by platform)" do
|
306
|
+
lambda {
|
307
|
+
@val.delete!
|
308
|
+
}.should raise_error(AMEE::NotSupported,"Cannot delete all of history: at least one data point must always exist.")
|
309
|
+
end
|
310
|
+
|
311
|
+
end
|