fix DB bd tests for address hstore

This commit is contained in:
Sarah Hoffmann
2017-03-26 21:19:52 +02:00
parent 49b5e4dbad
commit 8c7fa0213f
5 changed files with 268 additions and 215 deletions

View File

@@ -8,7 +8,7 @@ import psycopg2.extras
class PlaceColumn:
def __init__(self, context, force_name):
self.columns = { 'admin_level' : 100}
self.columns = { 'admin_level' : 15}
self.force_name = force_name
self.context = context
self.geometry = None
@@ -21,7 +21,7 @@ class PlaceColumn:
elif key.startswith('extra+'):
self.add_hstore('extratags', key[6:], value)
elif key.startswith('addr+'):
self.add_hstore('address', key[6:], value)
self.add_hstore('address', key[5:], value)
else:
assert_in(key, ('class', 'type'))
self.columns[key] = None if value == '' else value
@@ -42,6 +42,9 @@ class PlaceColumn:
def set_key_housenr(self, value):
self.add_hstore('address', 'housenumber', None if value == '' else value)
def set_key_postcode(self, value):
self.add_hstore('address', 'postcode', None if value == '' else value)
def set_key_street(self, value):
self.add_hstore('address', 'street', None if value == '' else value)
@@ -81,6 +84,46 @@ class PlaceColumn:
self.geometry)
cursor.execute(query, list(self.columns.values()))
class LazyFmt(object):
def __init__(self, fmtstr, *args):
self.fmt = fmtstr
self.args = args
def __str__(self):
return self.fmt % self.args
class PlaceObjName(object):
def __init__(self, placeid, conn):
self.pid = placeid
self.conn = conn
def __str__(self):
if self.pid is None:
return "<null>"
self.conn.cursor().execute("""SELECT osm_type, osm_id, class
FROM placex WHERE place_id = %s""",
self.pid)
eq_(1, cur.rowcount, "No entry found for place id %s" % self.pid)
return "%s%s:%s" % cur.fetchone()
def compare_place_id(expected, result, column, context):
if expected == '0':
eq_(0, result,
LazyFmt("Bad place id in column %s. Expected: 0, got: %s.",
column, PlaceObjName(result, context.db)))
elif expected == '-':
assert_is_none(result,
LazyFmt("bad place id in column %s: %s.",
column, PlaceObjName(result, context.db)))
else:
eq_(NominatimID(expected).get_place_id(context.db.cursor()), result,
LazyFmt("Bad place id in column %s. Expected: %s, got: %s.",
column, expected, PlaceObjName(result, context.db)))
class NominatimID:
""" Splits a unique identifier for places into its components.
As place_ids cannot be used for testing, we use a unique
@@ -305,14 +348,16 @@ def check_placex_contents(context, exact):
eq_(res['name'][name], row[h])
elif h.startswith('extratags+'):
eq_(res['extratags'][h[10:]], row[h])
elif h in ('linked_place_id', 'parent_place_id'):
if row[h] == '0':
eq_(0, res[h])
elif row[h] == '-':
assert_is_none(res[h])
elif h.startswith('addr+'):
if row[h] == '-':
if res['address'] is not None:
assert_not_in(h[5:], res['address'])
else:
eq_(NominatimID(row[h]).get_place_id(context.db.cursor()),
res[h])
assert_in(h[5:], res['address'], "column " + h)
assert_equals(res['address'][h[5:]], row[h],
"column %s" % h)
elif h in ('linked_place_id', 'parent_place_id'):
compare_place_id(row[h], res[h], h, context)
else:
assert_db_column(res, h, row[h], context)
@@ -358,13 +403,7 @@ def check_placex_contents(context, exact):
else:
assert_equals(res['address'][h[5:]], row[h], msg)
elif h in ('linked_place_id', 'parent_place_id'):
if row[h] == '0':
assert_equals(0, res[h], msg)
elif row[h] == '-':
assert_is_none(res[h], msg)
else:
assert_equals(NominatimID(row[h]).get_place_id(context.db.cursor()),
res[h], msg)
compare_place_id(row[h], res[h], h, context)
else:
assert_db_column(res, h, row[h], context)
@@ -455,13 +494,7 @@ def check_location_property_osmline(context, oid, neg):
if h in ('start', 'end'):
continue
elif h == 'parent_place_id':
if row[h] == '0':
eq_(0, res[h])
elif row[h] == '-':
assert_is_none(res[h])
else:
eq_(NominatimID(row[h]).get_place_id(context.db.cursor()),
res[h])
compare_place_id(row[h], res[h], h, context)
else:
assert_db_column(res, h, row[h], context)