openstreetmap 0.2.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.
@@ -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