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.
- data/CHANGELOG +1 -0
- data/LICENSE +7 -0
- data/Manifest +29 -0
- data/README.md +70 -0
- data/Rakefile +39 -0
- data/lib/changeset_callbacks.rb +31 -0
- data/lib/hash.rb +19 -0
- data/lib/open_street_map/api.rb +214 -0
- data/lib/open_street_map/basic_auth_client.rb +15 -0
- data/lib/open_street_map/changeset.rb +93 -0
- data/lib/open_street_map/element.rb +280 -0
- data/lib/open_street_map/errors.rb +55 -0
- data/lib/open_street_map/member.rb +39 -0
- data/lib/open_street_map/node.rb +51 -0
- data/lib/open_street_map/oauth_client.rb +31 -0
- data/lib/open_street_map/parser.rb +123 -0
- data/lib/open_street_map/relation.rb +52 -0
- data/lib/open_street_map/tags.rb +26 -0
- data/lib/open_street_map/user.rb +34 -0
- data/lib/open_street_map/way.rb +84 -0
- data/lib/openstreetmap.rb +31 -0
- data/openstreetmap.gemspec +53 -0
- data/spec/open_street_map/changeset_spec.rb +90 -0
- data/spec/open_street_map/node_spec.rb +87 -0
- data/spec/open_street_map/relation_spec.rb +26 -0
- data/spec/open_street_map/way_spec.rb +77 -0
- data/spec/open_street_map_changeset_spec.rb +136 -0
- data/spec/open_street_map_node_spec.rb +388 -0
- data/spec/open_street_map_way_spec.rb +56 -0
- metadata +188 -0
@@ -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
|