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 <[email protected]> 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 _______________________________________________ Pkg-grass-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

