openstreetmap 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,87 @@
1
+ require 'openstreetmap'
2
+
3
+ describe 'OpenStreetMap::Node' do
4
+
5
+ subject do
6
+ OpenStreetMap::Node.new(:id => "123",
7
+ :lat => "52.2",
8
+ :lon => "13.4",
9
+ :changeset => "12",
10
+ :user => "fred",
11
+ :uid => "123",
12
+ :visible => true,
13
+ :timestamp => "2005-07-30T14:27:12+01:00")
14
+ end
15
+
16
+ it { should be_valid }
17
+
18
+ it "should be invalid without lat, lon" do
19
+ subject.lat = nil
20
+ subject.lon = nil
21
+ subject.should_not be_valid
22
+ end
23
+
24
+ it "should not be valid when using to large lat value" do
25
+ subject.lat = 181
26
+ subject.should_not be_valid
27
+ end
28
+
29
+ it "should not be valid when using to large lat value" do
30
+ subject.lon = 91
31
+ subject.should_not be_valid
32
+ end
33
+
34
+ it "should have an id attribute set from attributes" do
35
+ subject.id.should eql(123)
36
+ end
37
+
38
+ it "should have an id attribute within xml representation" do
39
+ subject.to_xml.should match /id=\"123\"/
40
+ end
41
+
42
+ it "should have a lat attribute set from attributes" do
43
+ subject.lat.should eql(52.2)
44
+ end
45
+
46
+ it "should have a lat attribute within xml representation" do
47
+ subject.to_xml.should match /lat=\"52.2\"/
48
+ end
49
+
50
+ it "should have a lon attribute set from attributes" do
51
+ subject.lon.should eql(13.4)
52
+ end
53
+
54
+ it "should have a lon attribute within xml representation" do
55
+ subject.to_xml.should match /lon=\"13.4\"/
56
+ end
57
+
58
+ it "should have a user attributes set from attributes" do
59
+ subject.user.should eql("fred")
60
+ end
61
+
62
+ it "should have a user attribute within xml representation" do
63
+ subject.to_xml.should match /user=\"fred\"/
64
+ end
65
+
66
+ it "should have a changeset attributes set from attributes" do
67
+ subject.changeset.should eql(12)
68
+ end
69
+
70
+ it "should have a changeset attribute within xml representation" do
71
+ subject.to_xml.should match /changeset=\"12\"/
72
+ end
73
+
74
+ it "should have a uid attribute set from attributes" do
75
+ subject.uid.should eql(123)
76
+ end
77
+
78
+ it "should have a uid attribute within xml representation" do
79
+ subject.to_xml.should match /uid=\"123\"/
80
+ end
81
+
82
+ it "should produce xml" do
83
+ subject.add_tags(:wheelchair => 'yes')
84
+ subject.to_xml.should match /k=\"wheelchair\"/
85
+ subject.to_xml.should match /v=\"yes\"/
86
+ end
87
+ end
@@ -0,0 +1,26 @@
1
+ require 'openstreetmap'
2
+
3
+ describe 'OpenStreetMap::Relation' do
4
+
5
+ subject do
6
+ OpenStreetMap::Relation.new(:id => "123",
7
+ :lat => "52.2",
8
+ :lon => "13.4",
9
+ :changeset => "12",
10
+ :user => "fred",
11
+ :uid => "123",
12
+ :visible => true,
13
+ :timestamp => "2005-07-30T14:27:12+01:00",
14
+ :member => [
15
+ {"type"=>"relation", "ref"=>"1628007", "role"=>"outer"},
16
+ {"type"=>"way", "ref"=>"50197015", "role"=>""}
17
+ ])
18
+ end
19
+
20
+ it { should be_valid }
21
+
22
+ it "should have members" do
23
+ subject.members.size.should eql 2
24
+ end
25
+
26
+ end
@@ -0,0 +1,77 @@
1
+ require 'openstreetmap'
2
+
3
+ describe 'OpenStreetMap::Way' do
4
+
5
+ def valid_fake_way
6
+ way=<<-EOF
7
+ <osm>
8
+ <way id="1234" version="142" changeset="12" user="fred" uid="123" visible="true" timestamp="2005-07-30T14:27:12+01:00">
9
+ <tag k="note" v="Just a way"/>
10
+ <nd ref="15735248"/>
11
+ <nd ref="169269997"/>
12
+ <nd ref="169270001"/>
13
+ <nd ref="15735251"/>
14
+ <nd ref="15735252"/>
15
+ <nd ref="15735253"/>
16
+ <nd ref="15735250"/>
17
+ <nd ref="15735247"/>
18
+ <nd ref="15735246"/>
19
+ <nd ref="15735249"/>
20
+ <nd ref="15735248"/>
21
+ </way>
22
+ </osm>
23
+ EOF
24
+ end
25
+
26
+ subject do
27
+ @way ||= OpenStreetMap::Way.from_xml(valid_fake_way)
28
+ end
29
+
30
+ it "should have 4 nodes" do
31
+ subject.nodes.size.should eql 11
32
+ subject.nodes.first.should eql 15735248
33
+ end
34
+
35
+ it "should have node referenzes in xml representation" do
36
+ subject.to_xml.should match /ref=\"15735248\"/
37
+ end
38
+
39
+
40
+ it "should have an id attribute set from attributes" do
41
+ subject.id.should eql(1234)
42
+ end
43
+
44
+ it "should have an id attribute within xml representation" do
45
+ subject.to_xml.should match /id=\"1234\"/
46
+ end
47
+
48
+ it "should have a user attributes set from attributes" do
49
+ subject.user.should eql("fred")
50
+ end
51
+
52
+ it "should have a user attribute within xml representation" do
53
+ subject.to_xml.should match /user=\"fred\"/
54
+ end
55
+
56
+ it "should have a changeset attributes set from attributes" do
57
+ subject.changeset.should eql(12)
58
+ end
59
+
60
+ it "should have a changeset attribute within xml representation" do
61
+ subject.to_xml.should match /changeset=\"12\"/
62
+ end
63
+
64
+ it "should have a uid attribute set from attributes" do
65
+ subject.uid.should eql(123)
66
+ end
67
+
68
+ it "should have a uid attribute within xml representation" do
69
+ subject.to_xml.should match /uid=\"123\"/
70
+ end
71
+
72
+ it "should produce xml" do
73
+ subject.add_tags(:wheelchair => 'yes')
74
+ subject.to_xml.should match /k=\"wheelchair\"/
75
+ subject.to_xml.should match /v=\"yes\"/
76
+ end
77
+ end
@@ -0,0 +1,136 @@
1
+ require 'webmock/rspec'
2
+ require 'openstreetmap'
3
+
4
+ describe 'OpenStreetMap' do
5
+
6
+ before do
7
+ WebMock.disable_net_connect!
8
+ end
9
+
10
+ let :osm do
11
+ OpenStreetMap::Api.new
12
+ end
13
+
14
+ describe '::Changeset' do
15
+
16
+ def valid_fake_user
17
+ user=<<-EOF
18
+ <osm version="0.6" generator="OpenStreetMap server">
19
+ <user display_name="Max Muster" account_created="2006-07-21T19:28:26Z" id="1234">
20
+ <home lat="49.4733718952806" lon="8.89285988577866" zoom="3"/>
21
+ <description>The description of your profile</description>
22
+ <languages>
23
+ <lang>de-DE</lang>
24
+ <lang>de</lang>
25
+ <lang>en-US</lang>
26
+ <lang>en</lang>
27
+ </languages>
28
+ </user>
29
+ </osm>
30
+ EOF
31
+ end
32
+
33
+ def missing_changeset
34
+ changeset=<<-EOF
35
+ <osm version="0.6" generator="OpenStreetMap server"/>
36
+ EOF
37
+ end
38
+
39
+ def single_changeset
40
+ changeset=<<-EOF
41
+ <osm version="0.6" generator="OpenStreetMap server">
42
+ <changeset id="10" user="fred" uid="123" created_at="2008-11-08T19:07:39+01:00" open="true" min_lon="7.0191821" min_lat="49.2785426" max_lon="7.0197485" max_lat="49.2793101">
43
+ <tag k="created_by" v="JOSM 1.61"/>
44
+ <tag k="comment" v="Just adding some streetnames"/>
45
+ </changeset>
46
+ </osm>
47
+ EOF
48
+ end
49
+
50
+ def multiple_changeset
51
+ changeset=<<-EOF
52
+ <osm version="0.6" generator="OpenStreetMap server">
53
+ <changeset id="10" user="fred" uid="123" created_at="2008-11-08T19:07:39+01:00" open="true" min_lon="7.0191821" min_lat="49.2785426" max_lon="7.0197485" max_lat="49.2793101">
54
+ <tag k="created_by" v="JOSM 1.61"/>
55
+ <tag k="comment" v="Just adding some streetnames"/>
56
+ </changeset>
57
+ <changeset id="11" user="fred" uid="123" created_at="2008-11-08T19:07:39+01:00" open="true" min_lon="7.0191821" min_lat="49.2785426" max_lon="7.0197485" max_lat="49.2793101">
58
+ <tag k="created_by" v="JOSM 1.61"/>
59
+ <tag k="comment" v="Just adding some streetnames"/>
60
+ </changeset>
61
+ </osm>
62
+ EOF
63
+ end
64
+
65
+ describe '#find:' do
66
+
67
+ let :request_url do
68
+ "http://www.openstreetmap.org/api/0.6/changeset/10"
69
+ end
70
+
71
+ let :stubbed_request do
72
+ stub_request(:get, request_url)
73
+ end
74
+
75
+ it "should build a Change from API response via find_changeset_object" do
76
+ stubbed_request.to_return(:status => 200, :body => single_changeset, :headers => {'Content-Type' => 'application/xml'})
77
+ changeset = osm.find_changeset(10)
78
+ assert_requested :get, request_url, :times => 1
79
+ changeset.class.should eql OpenStreetMap::Changeset
80
+ end
81
+
82
+ it "should raise an NotFound error, when a changeset cannot be found" do
83
+ stubbed_request.to_return(:status => 404, :body => '', :headers => {'Content-Type' => 'text/plain'})
84
+ lambda {
85
+ node = osm.find_changeset(10)
86
+ }.should raise_error(OpenStreetMap::NotFound)
87
+ end
88
+ end
89
+
90
+ describe '#find_for_user' do
91
+
92
+ let :osm do
93
+ OpenStreetMap::Api.new(OpenStreetMap::BasicAuthClient.new('a_username', 'a_password'))
94
+ end
95
+
96
+ let :request_url do
97
+ "http://www.openstreetmap.org/api/0.6/changesets?user=1234"
98
+ end
99
+
100
+ let :stubbed_request do
101
+ stub_request(:get, request_url)
102
+ end
103
+
104
+ let! :stub_user_lookup do
105
+ stub_request(:get, "http://a_username:a_password@www.openstreetmap.org/api/0.6/user/details").to_return(:status => 200, :body => valid_fake_user, :headers => {'Content-Type' => 'application/xml'} )
106
+ end
107
+
108
+ it "should not find changeset for user if user has none" do
109
+ stubbed_request.to_return(:status => 200, :body => missing_changeset, :headers => {'Content-Type' => 'application/xml'})
110
+ changesets = osm.find_changesets_for_user
111
+ changesets.should be_empty
112
+ end
113
+
114
+ it "should find a single changeset for user" do
115
+ stubbed_request.to_return(:status => 200, :body => single_changeset, :headers => {'Content-Type' => 'application/xml'})
116
+ changesets = osm.find_changesets_for_user
117
+ changesets.size.should eql 1
118
+ changesets.first.class.should eql OpenStreetMap::Changeset
119
+ end
120
+
121
+ it "should find a multiple changesets for a user" do
122
+ stubbed_request.to_return(:status => 200, :body => multiple_changeset, :headers => {'Content-Type' => 'application/xml'})
123
+ changesets = osm.find_changesets_for_user
124
+ changesets.size.should eql 2
125
+ changesets.first.class.should eql OpenStreetMap::Changeset
126
+ end
127
+ end
128
+
129
+ describe '#update:' do
130
+ end
131
+
132
+ describe '#close' do
133
+ end
134
+ end
135
+ end
136
+
@@ -0,0 +1,388 @@
1
+ require 'webmock/rspec'
2
+ require 'openstreetmap'
3
+
4
+ describe 'OpenStreetMap' do
5
+
6
+ before do
7
+ WebMock.disable_net_connect!
8
+ end
9
+
10
+ let :osm do
11
+ OpenStreetMap::Api.new
12
+ end
13
+
14
+ let :stub_changeset_lookup do
15
+ stub_request(:get, "http://www.openstreetmap.org/api/0.6/changesets?open=true&user=1234").to_return(:status => 200, :body => valid_fake_changeset, :headers => {'Content-Type' => 'application/xml'} )
16
+ end
17
+
18
+ let :stub_node_lookup do
19
+ stub_request(:get, "http://www.openstreetmap.org/api/0.6/node/123").to_return(:status => 200, :body => valid_fake_node, :headers => {'Content-Type' => 'application/xml'})
20
+ end
21
+
22
+ describe '::Node' do
23
+
24
+ def valid_fake_node
25
+ node=<<-EOF
26
+ <osm>
27
+ <node id="123" lat="51.2" lon="13.4" version="42" changeset="12" user="fred" uid="123" visible="true" timestamp="2005-07-30T14:27:12+01:00">
28
+ <tag k="note" v="Just a node"/>
29
+ <tag k="amenity" v="bar" />
30
+ <tag k="name" v="The rose" />
31
+ </node>
32
+ </osm>
33
+ EOF
34
+ end
35
+
36
+ def valid_fake_user
37
+ user=<<-EOF
38
+ <osm version="0.6" generator="OpenStreetMap server">
39
+ <user display_name="Max Muster" account_created="2006-07-21T19:28:26Z" id="1234">
40
+ <home lat="49.4733718952806" lon="8.89285988577866" zoom="3"/>
41
+ <description>The description of your profile</description>
42
+ <languages>
43
+ <lang>de-DE</lang>
44
+ <lang>de</lang>
45
+ <lang>en-US</lang>
46
+ <lang>en</lang>
47
+ </languages>
48
+ </user>
49
+ </osm>
50
+ EOF
51
+ end
52
+
53
+ def valid_fake_changeset
54
+ changeset=<<-EOF
55
+ <osm>
56
+ <changeset id="10" user="fred" uid="123" created_at="2008-11-08T19:07:39+01:00" open="true" min_lon="7.0191821" min_lat="49.2785426" max_lon="7.0197485" max_lat="49.2793101">
57
+ <tag k="created_by" v="JOSM 1.61"/>
58
+ <tag k="comment" v="Just adding some streetnames"/>
59
+ </changeset>
60
+ </osm>
61
+ EOF
62
+ end
63
+
64
+ describe '#find:' do
65
+
66
+ let :request_url do
67
+ "http://www.openstreetmap.org/api/0.6/node/1234"
68
+ end
69
+
70
+ let :stubbed_request do
71
+ stub_request(:get, request_url)
72
+ end
73
+
74
+ it "should build a Node from API response via get_object" do
75
+ stubbed_request.to_return(:status => 200, :body => valid_fake_node, :headers => {'Content-Type' => 'application/xml'})
76
+ node = osm.find_node 1234
77
+ assert_requested :get, request_url, :times => 1
78
+ node.class.should eql OpenStreetMap::Node
79
+ node.tags.size.should eql 3
80
+ node.tags['name'].should eql 'The rose'
81
+ node['name'].should eql 'The rose'
82
+ node.add_tags('wheelchair' => 'yes')
83
+ node['wheelchair'].should eql 'yes'
84
+ end
85
+
86
+ it "should raise a Unavailable, when api times out" do
87
+ stubbed_request.to_timeout
88
+ lambda {
89
+ node = osm.find_node(1234)
90
+ }.should raise_error(OpenStreetMap::Unavailable)
91
+ end
92
+
93
+ it "should raise an Gone error, when a node has been deleted" do
94
+ stubbed_request.to_return(:status => 410, :body => '', :headers => {'Content-Type' => 'text/plain'})
95
+ lambda {
96
+ node = osm.find_node(1234)
97
+ }.should raise_error(OpenStreetMap::Gone)
98
+ end
99
+
100
+ it "should raise an NotFound error, when a node cannot be found" do
101
+ stubbed_request.to_return(:status => 404, :body => '', :headers => {'Content-Type' => 'text/plain'})
102
+ lambda {
103
+ node = osm.find_node(1234)
104
+ }.should raise_error(OpenStreetMap::NotFound)
105
+ end
106
+ end
107
+
108
+ describe 'with BasicAuthClient' do
109
+
110
+ let :osm do
111
+ OpenStreetMap::Api.new(OpenStreetMap::BasicAuthClient.new('a_username', 'a_password'))
112
+ end
113
+
114
+ let :stub_user_lookup do
115
+ stub_request(:get, "http://a_username:a_password@www.openstreetmap.org/api/0.6/user/details").to_return(:status => 200, :body => valid_fake_user, :headers => {'Content-Type' => 'application/xml'} )
116
+ end
117
+
118
+ describe '#create:' do
119
+
120
+ let :node do
121
+ OpenStreetMap::Node.new
122
+ end
123
+
124
+ let :request_url do
125
+ "http://a_username:a_password@www.openstreetmap.org/api/0.6/node/create"
126
+ end
127
+
128
+ let :stubbed_request do
129
+ stub_request(:put, request_url)
130
+ end
131
+
132
+ before do
133
+ stub_changeset_lookup
134
+ stub_user_lookup
135
+ end
136
+
137
+ it "should create a new Node from given attributes" do
138
+ stubbed_request.to_return(:status => 200, :body => '123', :headers => {'Content-Type' => 'text/plain'})
139
+ node.id.should be_nil
140
+ new_id = osm.save(node)
141
+ end
142
+
143
+ it "should raise a Unavailable, when api times out" do
144
+ stubbed_request.to_timeout
145
+ lambda {
146
+ new_id = osm.save(node)
147
+ }.should raise_error(OpenStreetMap::Unavailable)
148
+ end
149
+
150
+ it "should not create a Node with invalid xml but raise BadRequest" do
151
+ stubbed_request.to_return(:status => 400, :body => 'The given node is invalid', :headers => {'Content-Type' => 'text/plain'})
152
+ lambda {
153
+ new_id = osm.save(node)
154
+ }.should raise_error(OpenStreetMap::BadRequest)
155
+ end
156
+
157
+ it "should not allow to create a node when a changeset has been closed" do
158
+ stubbed_request.to_return(:status => 409, :body => 'The given node is invalid', :headers => {'Content-Type' => 'text/plain'})
159
+ lambda {
160
+ new_id = osm.save(node)
161
+ }.should raise_error(OpenStreetMap::Conflict)
162
+ end
163
+
164
+ it "should not allow to create a node when no authentication client is given" do
165
+ osm = OpenStreetMap::Api.new
166
+ lambda {
167
+ osm.save(node)
168
+ }.should raise_error(OpenStreetMap::CredentialsMissing)
169
+ end
170
+
171
+ end
172
+
173
+ describe '#update:' do
174
+
175
+ let :node do
176
+ osm.find_node 123
177
+ end
178
+
179
+ before do
180
+ stub_changeset_lookup
181
+ stub_user_lookup
182
+ stub_node_lookup
183
+ end
184
+
185
+ it "should save a edited node" do
186
+ stub_request(:put, "http://a_username:a_password@www.openstreetmap.org/api/0.6/node/123").to_return(:status => 200, :body => '43', :headers => {'Content-Type' => 'text/plain'})
187
+ node.tags['amenity'] = 'restaurant'
188
+ node.tags['name'] = 'Il Tramonto'
189
+ node.should_receive(:changeset=)
190
+ new_version = osm.save(node)
191
+ new_version.should eql 43
192
+ end
193
+
194
+ end
195
+
196
+ describe '#delete:' do
197
+
198
+ let :node do
199
+ osm.find_node 123
200
+ end
201
+
202
+ before do
203
+ stub_changeset_lookup
204
+ stub_user_lookup
205
+ stub_node_lookup
206
+ end
207
+
208
+ it "should not delete an node with missing id" do
209
+ node = OpenStreetMap::Node.new
210
+ osm.destroy(node)
211
+ end
212
+
213
+ it "should delete an existing node" do
214
+ stub_request(:delete, "http://a_username:a_password@www.openstreetmap.org/api/0.6/node/123").to_return(:status => 200, :body => '43', :headers => {'Content-Type' => 'text/plain'})
215
+ node.should_receive(:changeset=)
216
+ new_version = osm.destroy(node)
217
+ new_version.should eql 43 # new version number
218
+ end
219
+
220
+ it "should raise an error if node to be deleted is still part of a way" do
221
+ stub_request(:delete, "http://a_username:a_password@www.openstreetmap.org/api/0.6/node/123").to_return(:status => 400, :body => 'Version does not match current database version', :headers => {'Content-Type' => 'text/plain'})
222
+ lambda {
223
+ response = osm.destroy(node)
224
+ response.should eql "Version does not match current database version"
225
+ }.should raise_error OpenStreetMap::BadRequest
226
+ end
227
+
228
+ it "should raise an error if node cannot be found" do
229
+ stub_request(:delete, "http://a_username:a_password@www.openstreetmap.org/api/0.6/node/123").to_return(:status => 404, :body => 'Node cannot be found', :headers => {'Content-Type' => 'text/plain'})
230
+ lambda {
231
+ response = osm.destroy(node)
232
+ response.should eql "Node cannot be found"
233
+ }.should raise_error OpenStreetMap::NotFound
234
+ end
235
+
236
+ it "should raise an error if there is a conflict" do
237
+ stub_request(:delete, "http://a_username:a_password@www.openstreetmap.org/api/0.6/node/123").to_return(:status => 409, :body => 'Node has been deleted in this changeset', :headers => {'Content-Type' => 'text/plain'})
238
+ lambda {
239
+ response = osm.destroy(node)
240
+ response.should eql "Node has been deleted in this changeset"
241
+ }.should raise_error OpenStreetMap::Conflict
242
+ end
243
+
244
+ it "should raise an error if the node is already delted" do
245
+ stub_request(:delete, "http://a_username:a_password@www.openstreetmap.org/api/0.6/node/123").to_return(:status => 410, :body => 'Node has been deleted', :headers => {'Content-Type' => 'text/plain'})
246
+ lambda {
247
+ response = osm.destroy(node)
248
+ response.should eql "Node has been deleted"
249
+ }.should raise_error OpenStreetMap::Gone
250
+ end
251
+
252
+ it "should raise an error if the node is part of a way" do
253
+ stub_request(:delete, "http://a_username:a_password@www.openstreetmap.org/api/0.6/node/123").to_return(:status => 412, :body => 'Node 123 is still used by way 456', :headers => {'Content-Type' => 'text/plain'})
254
+ lambda {
255
+ response = osm.destroy(node)
256
+ response.should eql "Node 123 is still used by way 456"
257
+ }.should raise_error OpenStreetMap::Precondition
258
+ end
259
+
260
+ end
261
+ end
262
+
263
+ describe 'with OauthClient' do
264
+
265
+ let :consumer do
266
+ OAuth::Consumer.new( 'a_key', 'a_secret',
267
+ {
268
+ :site => 'http://www.openstreetmap.org',
269
+ :request_token_path => '/oauth/request_token',
270
+ :access_token_path => '/oauth/access_token',
271
+ :authorize_path => '/oauth/authorize'
272
+ }
273
+ )
274
+ end
275
+
276
+ let :access_token do
277
+ OAuth::AccessToken.new(consumer, 'a_token', 'a_secret')
278
+ end
279
+
280
+ let :osm do
281
+ OpenStreetMap::Api.new(OpenStreetMap::OauthClient.new(access_token))
282
+ end
283
+
284
+ let :stub_user_lookup do
285
+ stub_request(:get, "http://www.openstreetmap.org/api/0.6/user/details").to_return(:status => 200, :body => valid_fake_user, :headers => {'Content-Type' => 'application/xml'} )
286
+ end
287
+
288
+ describe '#create:' do
289
+ let :node do
290
+ OpenStreetMap::Node.new
291
+ end
292
+
293
+ let :request_url do
294
+ "http://www.openstreetmap.org/api/0.6/node/create"
295
+ end
296
+
297
+ let :stubbed_request do
298
+ stub_request(:put, request_url)
299
+ end
300
+
301
+ before do
302
+ stub_changeset_lookup
303
+ stub_user_lookup
304
+ end
305
+
306
+ it "should create a new Node from given attributes" do
307
+ stubbed_request.to_return(:status => 200, :body => '123', :headers => {'Content-Type' => 'text/plain'})
308
+ node.id.should be_nil
309
+ new_id = osm.save(node)
310
+ end
311
+
312
+ it "should raise a Unavailable, when api times out" do
313
+ stubbed_request.to_timeout
314
+ lambda {
315
+ new_id = osm.save(node)
316
+ }.should raise_error(OpenStreetMap::Unavailable)
317
+ end
318
+
319
+
320
+ it "should not create a Node with invalid xml but raise BadRequest" do
321
+ stubbed_request.to_return(:status => 400, :body => 'The given node is invalid', :headers => {'Content-Type' => 'text/plain'})
322
+ lambda {
323
+ new_id = osm.save(node)
324
+ }.should raise_error(OpenStreetMap::BadRequest)
325
+ end
326
+
327
+ it "should not allow to create a node when a changeset has been closed" do
328
+ stubbed_request.to_return(:status => 409, :body => 'The given node is invalid', :headers => {'Content-Type' => 'text/plain'})
329
+ lambda {
330
+ new_id = osm.save(node)
331
+ }.should raise_error(OpenStreetMap::Conflict)
332
+ end
333
+
334
+ it "should not allow to create a node when no authentication client is given" do
335
+ osm = OpenStreetMap::Api.new
336
+ lambda {
337
+ osm.save(node)
338
+ }.should raise_error(OpenStreetMap::CredentialsMissing)
339
+ end
340
+
341
+ end
342
+
343
+ describe '#update:' do
344
+
345
+ let :node do
346
+ osm.find_node 123
347
+ end
348
+
349
+ before do
350
+ stub_changeset_lookup
351
+ stub_user_lookup
352
+ stub_node_lookup
353
+ end
354
+
355
+ it "should save a edited node" do
356
+ stub_request(:put, "http://www.openstreetmap.org/api/0.6/node/123").to_return(:status => 200, :body => '43', :headers => {'Content-Type' => 'text/plain'})
357
+ node.tags['amenity'] = 'restaurant'
358
+ node.tags['name'] = 'Il Tramonto'
359
+ node.should_receive(:changeset=)
360
+ new_version = osm.save(node)
361
+ new_version.should eql 43
362
+ end
363
+ end
364
+
365
+ describe '#delete:' do
366
+
367
+ let :node do
368
+ osm.find_node 123
369
+ end
370
+
371
+ before do
372
+ stub_changeset_lookup
373
+ stub_user_lookup
374
+ stub_node_lookup
375
+ end
376
+
377
+ it "should delete an existing node" do
378
+ stub_request(:delete, "http://www.openstreetmap.org/api/0.6/node/123").to_return(:status => 200, :body => '43', :headers => {'Content-Type' => 'text/plain'})
379
+ node.should_receive(:changeset=)
380
+ lambda {
381
+ # Delete is not implemented using oauth
382
+ new_version = osm.destroy(node)
383
+ }.should raise_error(OpenStreetMap::NotImplemented)
384
+ end
385
+ end
386
+ end
387
+ end
388
+ end