[python-osmapi] 01/05: New upstream version 1.1.0
Bas Couwenberg
sebastic at debian.org
Thu Oct 12 06:12:47 UTC 2017
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository python-osmapi.
commit 04db7011279cb62fa2db8a723de407554663f99f
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Thu Oct 12 08:01:36 2017 +0200
New upstream version 1.1.0
---
CHANGELOG.md | 7 +
README.md | 11 +-
osmapi/OsmApi.py | 201 +++++++++++----------
osmapi/__init__.py | 2 +-
tests/changeset_tests.py | 63 ++++++-
tests/fixtures/passwordfile.txt | 1 +
.../test_ChangesetDownload_invalid_response.xml | 1 +
.../test_ChangesetUpload_invalid_response.xml | 1 +
tests/fixtures/test_NodeGet_invalid_response.xml | 3 +
tests/fixtures/test_NoteGet_invalid_xml.xml | 13 ++
tests/fixtures/test_WayFull_invalid_response.xml | 1 +
tests/helper_tests.py | 12 +-
tests/node_tests.py | 6 +
tests/notes_tests.py | 7 +
tests/way_tests.py | 6 +
15 files changed, 222 insertions(+), 113 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c512de1..e04c610 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
## [Unreleased][unreleased]
+## 1.1.0 - 2017-10-11
+### Added
+- Raise new `XmlResponseInvalidError` if XML response from the OpenStreetMap API is invalid
+
+### Changed
+- Improved README (thanks [Mateusz Konieczny](https://github.com/matkoniecz))
+
## 1.0.2 - 2017-09-07
### Added
- Rais ResponseEmptyApiError if we expect a response from the OpenStreetMap API, but didn't get one
diff --git a/README.md b/README.md
index d536b11..620b02e 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,8 @@ To update the online documentation, you need to re-generate the documentation wi
## Examples
+To test this library, please create an account on the [development server of OpenStreetMap (https://api06.dev.openstreetmap.org)](https://api06.dev.openstreetmap.org).
+
### Read from OpenStreetMap
```python
@@ -45,18 +47,18 @@ print api.NodeGet(123)
```python
import osmapi
-api = osmapi.OsmApi(api="api06.dev.openstreetmap.org", username = "you", password = "***")
+api = osmapi.OsmApi(api="https://api06.dev.openstreetmap.org", username = "you", password = "***")
api = osmapi.OsmApi(username = "you", passwordfile = "/etc/mypasswords")
-api = osmapi.OsmApi(passwordfile = "/etc/mypasswords") # username will be first line username
+api = osmapi.OsmApi(passwordfile = "/etc/mypasswords") # if only the passwordfile is specified, the credentials on the first line of the file will be used
```
-Note: The password file should have the format _user:password_
+Note: Each line in the password file should have the format _user:password_
### Write to OpenStreetMap
```python
import osmapi
-api = osmapi.OsmApi(api="api06.dev.openstreetmap.org", username = u"metaodi", password = u"*******")
+api = osmapi.OsmApi(api="https://api06.dev.openstreetmap.org", username = u"metaodi", password = u"*******")
api.ChangesetCreate({u"comment": u"My first test"})
print api.NodeCreate({u"lon":1, u"lat":1, u"tag": {}})
# {u'changeset': 532907, u'lon': 1, u'version': 1, u'lat': 1, u'tag': {}, u'id': 164684}
@@ -99,6 +101,7 @@ To create a new release, follow these steps (please respect [Semantic Versioning
1. Create a pull request to merge develop into master (make sure the tests pass!)
1. Create a [new release/tag on GitHub](https://github.com/metaodi/osmapi/releases) (on the master branch)
1. The [publication on PyPI](https://pypi.python.org/pypi/osmapi) happens via [Travis CI](https://travis-ci.org/metaodi/osmapi) on every tagged commit
+1. Re-build the documentation (see above) and copy the generated file to `index.html` on the `gh-pages` branch
## Attribution
diff --git a/osmapi/OsmApi.py b/osmapi/OsmApi.py
index 4c18572..1d4bdda 100644
--- a/osmapi/OsmApi.py
+++ b/osmapi/OsmApi.py
@@ -29,6 +29,7 @@ Find all information about changes of the different versions of this module
from __future__ import (absolute_import, print_function, unicode_literals)
import xml.dom.minidom
+import xml.parsers.expat
import time
import sys
import urllib
@@ -84,6 +85,12 @@ class OsmTypeAlreadyExistsError(OsmApiError):
pass
+class XmlResponseInvalidError(OsmApiError):
+ """
+ Error if the XML response from the OpenStreetMap API is invalid
+ """
+
+
class ApiError(OsmApiError):
"""
Error class, is thrown when an API request fails
@@ -291,9 +298,8 @@ class OsmApi:
"""
uri = "/api/capabilities"
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("api")[0]
+
+ data = self._OsmResponseToDom(data, tag="api", single=True)
result = {}
for elem in data.childNodes:
if elem.nodeType != elem.ELEMENT_NODE:
@@ -338,9 +344,7 @@ class OsmApi:
if NodeVersion != -1:
uri += "/%s" % (NodeVersion)
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("node")[0]
+ data = self._OsmResponseToDom(data, tag="node", single=True)
return self._DomParseNode(data)
def NodeCreate(self, NodeData):
@@ -476,11 +480,10 @@ class OsmApi:
"""
uri = "/api/0.6/node/%s/history" % NodeId
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ nodes = self._OsmResponseToDom(data, tag="node")
result = {}
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("node"):
- data = self._DomParseNode(data)
+ for node in nodes:
+ data = self._DomParseNode(node)
result[data["version"]] = data
return result
@@ -509,11 +512,10 @@ class OsmApi:
"""
uri = "/api/0.6/node/%d/ways" % NodeId
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ ways = self._OsmResponseToDom(data, tag="way")
result = []
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("way"):
- data = self._DomParseWay(data)
+ for way in ways:
+ data = self._DomParseWay(way)
result.append(data)
return result
@@ -551,11 +553,10 @@ class OsmApi:
"""
uri = "/api/0.6/node/%d/relations" % NodeId
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ relations = self._OsmResponseToDom(data, tag="relation")
result = []
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("relation"):
- data = self._DomParseRelation(data)
+ for relation in relations:
+ data = self._DomParseRelation(relation)
result.append(data)
return result
@@ -577,11 +578,10 @@ class OsmApi:
node_list = ",".join([str(x) for x in NodeIdList])
uri = "/api/0.6/nodes?nodes=%s" % node_list
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ nodes = self._OsmResponseToDom(data, tag="node")
result = {}
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("node"):
- data = self._DomParseNode(data)
+ for node in nodes:
+ data = self._DomParseNode(node)
result[data["id"]] = data
return result
@@ -616,10 +616,8 @@ class OsmApi:
if WayVersion != -1:
uri += "/%s" % (WayVersion)
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("way")[0]
- return self._DomParseWay(data)
+ way = self._OsmResponseToDom(data, tag="way", single=True)
+ return self._DomParseWay(way)
def WayCreate(self, WayData):
"""
@@ -751,11 +749,10 @@ class OsmApi:
"""
uri = "/api/0.6/way/%s/history" % (WayId)
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ ways = self._OsmResponseToDom(data, tag="way")
result = {}
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("way"):
- data = self._DomParseWay(data)
+ for way in ways:
+ data = self._DomParseWay(way)
result[data["version"]] = data
return result
@@ -793,11 +790,10 @@ class OsmApi:
"""
uri = "/api/0.6/way/%d/relations" % WayId
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ relations = self._OsmResponseToDom(data, tag="relation")
result = []
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("relation"):
- data = self._DomParseRelation(data)
+ for relation in relations:
+ data = self._DomParseRelation(relation)
result.append(data)
return result
@@ -840,11 +836,10 @@ class OsmApi:
way_list = ",".join([str(x) for x in WayIdList])
uri = "/api/0.6/ways?ways=%s" % way_list
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ ways = self._OsmResponseToDom(data, tag="way")
result = {}
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("way"):
- data = self._DomParseWay(data)
+ for way in ways:
+ data = self._DomParseWay(way)
result[data["id"]] = data
return result
@@ -888,10 +883,8 @@ class OsmApi:
if RelationVersion != -1:
uri += "/%s" % (RelationVersion)
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("relation")[0]
- return self._DomParseRelation(data)
+ relation = self._OsmResponseToDom(data, tag="relation", single=True)
+ return self._DomParseRelation(relation)
def RelationCreate(self, RelationData):
"""
@@ -1050,11 +1043,10 @@ class OsmApi:
"""
uri = "/api/0.6/relation/%s/history" % (RelationId)
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ relations = self._OsmResponseToDom(data, tag="relation")
result = {}
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("relation"):
- data = self._DomParseRelation(data)
+ for relation in relations:
+ data = self._DomParseRelation(relation)
result[data["version"]] = data
return result
@@ -1093,11 +1085,10 @@ class OsmApi:
"""
uri = "/api/0.6/relation/%d/relations" % RelationId
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ relations = self._OsmResponseToDom(data, tag="relation")
result = []
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("relation"):
- data = self._DomParseRelation(data)
+ for relation in relations:
+ data = self._DomParseRelation(relation)
result.append(data)
return result
@@ -1184,11 +1175,10 @@ class OsmApi:
relation_list = ",".join([str(x) for x in RelationIdList])
uri = "/api/0.6/relations?relations=%s" % relation_list
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
+ relations = self._OsmResponseToDom(data, tag="relation")
result = {}
- osm_data = data.getElementsByTagName("osm")[0]
- for data in osm_data.getElementsByTagName("relation"):
- data = self._DomParseRelation(data)
+ for relation in relations:
+ data = self._DomParseRelation(relation)
result[data["id"]] = data
return result
@@ -1226,10 +1216,8 @@ class OsmApi:
if (include_discussion):
path += "?include_discussion=true"
data = self._get(path)
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("changeset")[0]
- return self._DomParseChangeset(data)
+ changeset = self._OsmResponseToDom(data, tag="changeset", single=True)
+ return self._DomParseChangeset(changeset)
def ChangesetUpdate(self, ChangesetTags={}):
"""
@@ -1334,9 +1322,15 @@ class OsmApi:
"/api/0.6/changeset/%s/upload" % (self._CurrentChangesetId),
data.encode("utf-8")
)
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("diffResult")[0]
- data = [x for x in data.childNodes if x.nodeType == x.ELEMENT_NODE]
+ try:
+ data = xml.dom.minidom.parseString(data)
+ data = data.getElementsByTagName("diffResult")[0]
+ data = [x for x in data.childNodes if x.nodeType == x.ELEMENT_NODE]
+ except (xml.parsers.expat.ExpatError, IndexError) as e:
+ raise XmlResponseInvalidError(
+ "The XML response from the OSM API is invalid: %r" % e
+ )
+
for i in range(len(ChangesData)):
if ChangesData[i]["action"] == "delete":
ChangesData[i]["data"].pop("version")
@@ -1420,11 +1414,9 @@ class OsmApi:
uri += "?" + urllib.urlencode(params)
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("changeset")
+ changesets = self._OsmResponseToDom(data, tag="changeset")
result = {}
- for curChangeset in data:
+ for curChangeset in changesets:
tmpCS = self._DomParseChangeset(curChangeset)
result[tmpCS["id"]] = tmpCS
return result
@@ -1462,10 +1454,8 @@ class OsmApi:
"/api/0.6/changeset/%s/comment" % (ChangesetId),
params
)
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("changeset")[0]
- return self._DomParseChangeset(data)
+ changeset = self._OsmResponseToDom(data, tag="changeset", single=True)
+ return self._DomParseChangeset(changeset)
def ChangesetSubscribe(self, ChangesetId):
"""
@@ -1504,10 +1494,8 @@ class OsmApi:
raise AlreadySubscribedApiError(e.status, e.reason, e.payload)
else:
raise
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("changeset")[0]
- return self._DomParseChangeset(data)
+ changeset = self._OsmResponseToDom(data, tag="changeset", single=True)
+ return self._DomParseChangeset(changeset)
def ChangesetUnsubscribe(self, ChangesetId):
"""
@@ -1546,10 +1534,8 @@ class OsmApi:
raise NotSubscribedApiError(e.status, e.reason, e.payload)
else:
raise
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
- data = data.getElementsByTagName("changeset")[0]
- return self._DomParseChangeset(data)
+ changeset = self._OsmResponseToDom(data, tag="changeset", single=True)
+ return self._DomParseChangeset(changeset)
##################################################
# Notes #
@@ -1617,12 +1603,8 @@ class OsmApi:
"""
uri = "/api/0.6/notes/%s" % (id)
data = self._get(uri)
- data = xml.dom.minidom.parseString(data)
- osm_data = data.getElementsByTagName("osm")[0]
-
- noteElement = osm_data.getElementsByTagName("note")[0]
- note = self._DomParseNote(noteElement)
- return note
+ noteElement = self._OsmResponseToDom(data, tag="note", single=True)
+ return self._DomParseNote(noteElement)
def NoteCreate(self, NoteData):
"""
@@ -1705,13 +1687,8 @@ class OsmApi:
result = self._post(uri, None, optionalAuth=optionalAuth)
# parse the result
- data = xml.dom.minidom.parseString(result)
- osm_data = data.getElementsByTagName("osm")[0]
-
- noteElement = osm_data.getElementsByTagName("note")[0]
- note = self._DomParseNote(noteElement)
-
- return note
+ noteElement = self._OsmResponseToDom(result, tag="note", single=True)
+ return self._DomParseNote(noteElement)
##################################################
# Other #
@@ -1752,8 +1729,14 @@ class OsmApi:
data: {}
}
"""
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osm")[0]
+ try:
+ data = xml.dom.minidom.parseString(data)
+ data = data.getElementsByTagName("osm")[0]
+ except (xml.parsers.expat.ExpatError, IndexError) as e:
+ raise XmlResponseInvalidError(
+ "The XML response from the OSM API is invalid: %r" % e
+ )
+
result = []
for elem in data.childNodes:
if elem.nodeName == "node":
@@ -1786,8 +1769,14 @@ class OsmApi:
data: {}
}
"""
- data = xml.dom.minidom.parseString(data)
- data = data.getElementsByTagName("osmChange")[0]
+ try:
+ data = xml.dom.minidom.parseString(data)
+ data = data.getElementsByTagName("osmChange")[0]
+ except (xml.parsers.expat.ExpatError, IndexError) as e:
+ raise XmlResponseInvalidError(
+ "The XML response from the OSM API is invalid: %r" % e
+ )
+
result = []
for action in data.childNodes:
if action.nodeName == "#text":
@@ -1834,11 +1823,9 @@ class OsmApi:
{ ... }
]
"""
- data = xml.dom.minidom.parseString(data)
+ noteElements = self._OsmResponseToDom(data, tag="note")
result = []
- osm_data = data.getElementsByTagName("osm")[0]
-
- for noteElement in osm_data.getElementsByTagName("note"):
+ for noteElement in noteElements:
note = self._DomParseNote(noteElement)
result.append(note)
return result
@@ -2063,6 +2050,24 @@ class OsmApi:
# Internal dom function #
##################################################
+ def _OsmResponseToDom(self, response, tag, single=False):
+ """
+ Returns the (sub-) DOM parsed from an OSM response
+ """
+ try:
+ dom = xml.dom.minidom.parseString(response)
+ osm_dom = dom.getElementsByTagName("osm")[0]
+ all_data = osm_dom.getElementsByTagName(tag)
+ first_element = all_data[0]
+ except (xml.parsers.expat.ExpatError, IndexError) as e:
+ raise XmlResponseInvalidError(
+ "The XML response from the OSM API is invalid: %r" % e
+ )
+
+ if single:
+ return first_element
+ return all_data
+
def _DomGetAttributes(self, DomElement): # noqa
"""
Returns a formated dictionnary of attributes of a DomElement.
diff --git a/osmapi/__init__.py b/osmapi/__init__.py
index 9f8ccda..c86fa72 100644
--- a/osmapi/__init__.py
+++ b/osmapi/__init__.py
@@ -1,5 +1,5 @@
from __future__ import (absolute_import, print_function, unicode_literals)
-__version__ = '1.0.2'
+__version__ = '1.1.0'
from .OsmApi import * # noqa
diff --git a/tests/changeset_tests.py b/tests/changeset_tests.py
index 7176d38..5173108 100644
--- a/tests/changeset_tests.py
+++ b/tests/changeset_tests.py
@@ -92,10 +92,10 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
xmltosorteddict(kwargs['data']),
xmltosorteddict(
b'<?xml version="1.0" encoding="UTF-8"?>\n'
- b'<osm version="0.6" generator="osmapi/1.0.2">\n'
+ b'<osm version="0.6" generator="osmapi/1.1.0">\n'
b' <changeset visible="true">\n'
b' <tag k="test" v="foobar"/>\n'
- b' <tag k="created_by" v="osmapi/1.0.2"/>\n'
+ b' <tag k="created_by" v="osmapi/1.1.0"/>\n'
b' </changeset>\n'
b'</osm>\n'
)
@@ -125,7 +125,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
xmltosorteddict(kwargs['data']),
xmltosorteddict(
b'<?xml version="1.0" encoding="UTF-8"?>\n'
- b'<osm version="0.6" generator="osmapi/1.0.2">\n'
+ b'<osm version="0.6" generator="osmapi/1.1.0">\n'
b' <changeset visible="true">\n'
b' <tag k="test" v="foobar"/>\n'
b' <tag k="created_by" v="MyTestOSMApp"/>\n'
@@ -163,10 +163,10 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
xmltosorteddict(kwargs['data']),
xmltosorteddict(
b'<?xml version="1.0" encoding="UTF-8"?>\n'
- b'<osm version="0.6" generator="osmapi/1.0.2">\n'
+ b'<osm version="0.6" generator="osmapi/1.1.0">\n'
b' <changeset visible="true">\n'
b' <tag k="foobar" v="A new test changeset"/>\n'
- b' <tag k="created_by" v="osmapi/1.0.2"/>\n'
+ b' <tag k="created_by" v="osmapi/1.1.0"/>\n'
b' </changeset>\n'
b'</osm>\n'
)
@@ -190,7 +190,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
xmltosorteddict(kwargs['data']),
xmltosorteddict(
b'<?xml version="1.0" encoding="UTF-8"?>\n'
- b'<osm version="0.6" generator="osmapi/1.0.2">\n'
+ b'<osm version="0.6" generator="osmapi/1.1.0">\n'
b' <changeset visible="true">\n'
b' <tag k="foobar" v="A new test changeset"/>\n'
b' <tag k="created_by" v="CoolTestApp"/>\n'
@@ -276,7 +276,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
xmltosorteddict(kwargs['data']),
xmltosorteddict(
b'<?xml version="1.0" encoding="UTF-8"?>\n'
- b'<osmChange version="0.6" generator="osmapi/1.0.2">\n'
+ b'<osmChange version="0.6" generator="osmapi/1.1.0">\n'
b'<create>\n'
b' <node lat="47.123" lon="8.555" visible="true" '
b'changeset="4444">\n'
@@ -350,7 +350,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
xmltosorteddict(kwargs['data']),
xmltosorteddict(
b'<?xml version="1.0" encoding="UTF-8"?>\n'
- b'<osmChange version="0.6" generator="osmapi/1.0.2">\n'
+ b'<osmChange version="0.6" generator="osmapi/1.1.0">\n'
b'<modify>\n'
b' <way id="4294967296" version="2" visible="true" '
b'changeset="4444">\n'
@@ -434,7 +434,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
xmltosorteddict(kwargs['data']),
xmltosorteddict(
b'<?xml version="1.0" encoding="UTF-8"?>\n'
- b'<osmChange version="0.6" generator="osmapi/1.0.2">\n'
+ b'<osmChange version="0.6" generator="osmapi/1.1.0">\n'
b'<delete>\n'
b' <relation id="676" version="2" visible="true" '
b'changeset="4444">\n'
@@ -458,6 +458,46 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
self.assertEquals(data['id'], 676)
self.assertNotIn('version', data)
+ def test_ChangesetUpload_invalid_response(self):
+ self._session_mock(auth=True)
+
+ # setup mock
+ self.api.ChangesetCreate = mock.Mock(
+ return_value=4444
+ )
+ self.api._CurrentChangesetId = 4444
+
+ changesdata = [
+ {
+ 'type': 'relation',
+ 'action': 'delete',
+ 'data': {
+ 'id': 676,
+ 'version': 2,
+ 'member': [
+ {
+ 'ref': 4799,
+ 'role': 'outer',
+ 'type': 'way'
+ },
+ {
+ 'ref': 9391,
+ 'role': 'outer',
+ 'type': 'way'
+ },
+ ],
+ 'tag': {
+ 'admin_level': '9',
+ 'boundary': 'administrative',
+ 'type': 'multipolygon'
+ }
+ }
+ }
+ ]
+
+ with self.assertRaises(osmapi.XmlResponseInvalidError):
+ self.api.ChangesetUpload(changesdata)
+
def test_ChangesetDownload(self):
self._session_mock()
@@ -491,6 +531,11 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
}
)
+ def test_ChangesetDownload_invalid_response(self):
+ self._session_mock()
+ with self.assertRaises(osmapi.XmlResponseInvalidError):
+ self.api.ChangesetDownload(23123)
+
def test_ChangesetDownloadContainingUnicode(self):
self._session_mock()
diff --git a/tests/fixtures/passwordfile.txt b/tests/fixtures/passwordfile.txt
index 708dc2e..20c4643 100644
--- a/tests/fixtures/passwordfile.txt
+++ b/tests/fixtures/passwordfile.txt
@@ -1 +1,2 @@
testosm:testpass
+testuser:testuserpass
diff --git a/tests/fixtures/test_ChangesetDownload_invalid_response.xml b/tests/fixtures/test_ChangesetDownload_invalid_response.xml
new file mode 100644
index 0000000..12bbf74
--- /dev/null
+++ b/tests/fixtures/test_ChangesetDownload_invalid_response.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?>
diff --git a/tests/fixtures/test_ChangesetUpload_invalid_response.xml b/tests/fixtures/test_ChangesetUpload_invalid_response.xml
new file mode 100644
index 0000000..12bbf74
--- /dev/null
+++ b/tests/fixtures/test_ChangesetUpload_invalid_response.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?>
diff --git a/tests/fixtures/test_NodeGet_invalid_response.xml b/tests/fixtures/test_NodeGet_invalid_response.xml
new file mode 100644
index 0000000..0ca770b
--- /dev/null
+++ b/tests/fixtures/test_NodeGet_invalid_response.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" generator="OpenStreetMap server">
+</osm>
diff --git a/tests/fixtures/test_NoteGet_invalid_xml.xml b/tests/fixtures/test_NoteGet_invalid_xml.xml
new file mode 100644
index 0000000..064f790
--- /dev/null
+++ b/tests/fixtures/test_NoteGet_invalid_xml.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" generator="OpenStreetMap server">
+<note lon="12.3133135" lat="37.9305489">
+ <id>1111</id>
+ <url>http://api.openstreetmap.org/api/0.6/notes/1111</url>
+ <reopen_url>http://api.openstreetmap.org/api/0.6/notes/1111/reopen</reopen_url>
+ <date_created>2013-05-01 20:58:21 UTC</date_created>
+ <status>closed</status>
+ <date_closed>2013-08-21 16:43:26 UTC</date_closed>
+ <comments>
+ <comment>
+</note>
+</osm>
diff --git a/tests/fixtures/test_WayFull_invalid_response.xml b/tests/fixtures/test_WayFull_invalid_response.xml
new file mode 100644
index 0000000..12bbf74
--- /dev/null
+++ b/tests/fixtures/test_WayFull_invalid_response.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?>
diff --git a/tests/helper_tests.py b/tests/helper_tests.py
index 76fb596..667689a 100644
--- a/tests/helper_tests.py
+++ b/tests/helper_tests.py
@@ -26,7 +26,7 @@ class TestOsmApiHelper(osmapi_tests.TestOsmApi):
self.api._username = 'testuser'
self.api._password = 'testpassword'
- def test_passwordfile(self):
+ def test_passwordfile_only(self):
path = os.path.join(
__location__,
'fixtures',
@@ -36,6 +36,16 @@ class TestOsmApiHelper(osmapi_tests.TestOsmApi):
self.assertEquals('testosm', my_api._username)
self.assertEquals('testpass', my_api._password)
+ def test_passwordfile_with_user(self):
+ path = os.path.join(
+ __location__,
+ 'fixtures',
+ 'passwordfile.txt'
+ )
+ my_api = osmapi.OsmApi(username='testuser', passwordfile=path)
+ self.assertEquals('testuser', my_api._username)
+ self.assertEquals('testuserpass', my_api._password)
+
def test_http_request_get(self):
response = self.api._http_request(
'GET',
diff --git a/tests/node_tests.py b/tests/node_tests.py
index 4a82419..cbb7f8c 100644
--- a/tests/node_tests.py
+++ b/tests/node_tests.py
@@ -56,6 +56,12 @@ class TestOsmApiNode(osmapi_tests.TestOsmApi):
},
})
+ def test_NodeGet_invalid_response(self):
+ self._session_mock()
+
+ with self.assertRaises(osmapi.XmlResponseInvalidError):
+ self.api.NodeGet(987)
+
def test_NodeCreate_changesetauto(self):
# setup mock
self.api = osmapi.OsmApi(
diff --git a/tests/notes_tests.py b/tests/notes_tests.py
index 11e0d01..856ab39 100644
--- a/tests/notes_tests.py
+++ b/tests/notes_tests.py
@@ -1,6 +1,7 @@
from __future__ import (unicode_literals, absolute_import)
from . import osmapi_tests
from datetime import datetime
+import osmapi
try:
import urlparse
@@ -98,6 +99,12 @@ class TestOsmApiNotes(osmapi_tests.TestOsmApi):
]
})
+ def test_NoteGet_invalid_xml(self):
+ self._session_mock()
+
+ with self.assertRaises(osmapi.XmlResponseInvalidError):
+ self.api.NoteGet(1111)
+
def test_NoteCreate(self):
self._session_mock(auth=True)
diff --git a/tests/way_tests.py b/tests/way_tests.py
index 37d96f2..e09534c 100644
--- a/tests/way_tests.py
+++ b/tests/way_tests.py
@@ -246,6 +246,12 @@ class TestOsmApiWay(osmapi_tests.TestOsmApi):
self.assertEquals(result[16]['data']['changeset'], 298)
self.assertEquals(result[16]['type'], 'way')
+ def test_WayFull_invalid_response(self):
+ self._session_mock()
+
+ with self.assertRaises(osmapi.XmlResponseInvalidError):
+ self.api.WayFull(321)
+
def test_WaysGet(self):
self._session_mock()
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/python-osmapi.git
More information about the Pkg-grass-devel
mailing list