mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-14 18:37:58 +00:00
bdd: add osm2pgsql tests for updating interpolations
This commit is contained in:
133
test/bdd/osm2pgsql/update/interpolations.feature
Normal file
133
test/bdd/osm2pgsql/update/interpolations.feature
Normal file
@@ -0,0 +1,133 @@
|
||||
@DB
|
||||
Feature: Updates of address interpolation objects
|
||||
Test that changes to address interpolation objects are correctly
|
||||
propagated.
|
||||
|
||||
Background:
|
||||
Given the grid
|
||||
| 1 | 2 |
|
||||
|
||||
|
||||
Scenario: Adding a new interpolation
|
||||
When loading osm data
|
||||
"""
|
||||
n1 Taddr:housenumber=3
|
||||
n2 Taddr:housenumber=17
|
||||
"""
|
||||
Then place contains
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
|
||||
When updating osm data
|
||||
"""
|
||||
w99 Taddr:interpolation=odd Nn1,n2
|
||||
"""
|
||||
Then place contains
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
| W99:place | houses |
|
||||
When indexing
|
||||
Then placex contains exactly
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
Then location_property_osmline contains exactly
|
||||
| object |
|
||||
| 99:5 |
|
||||
|
||||
|
||||
Scenario: Delete an existing interpolation
|
||||
When loading osm data
|
||||
"""
|
||||
n1 Taddr:housenumber=2
|
||||
n2 Taddr:housenumber=7
|
||||
w99 Taddr:interpolation=odd Nn1,n2
|
||||
"""
|
||||
Then place contains
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
| W99:place | houses |
|
||||
|
||||
When updating osm data
|
||||
"""
|
||||
w99 v2 dD
|
||||
"""
|
||||
Then place contains
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
When indexing
|
||||
Then placex contains exactly
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
Then location_property_osmline contains exactly
|
||||
| object | indexed_status |
|
||||
|
||||
|
||||
Scenario: Changing an object to an interpolation
|
||||
When loading osm data
|
||||
"""
|
||||
n1 Taddr:housenumber=3
|
||||
n2 Taddr:housenumber=17
|
||||
w99 Thighway=residential Nn1,n2
|
||||
"""
|
||||
Then place contains
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
| W99:highway | residential |
|
||||
|
||||
When updating osm data
|
||||
"""
|
||||
w99 Taddr:interpolation=odd Nn1,n2
|
||||
"""
|
||||
Then place contains
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
| W99:place | houses |
|
||||
When indexing
|
||||
Then placex contains exactly
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
And location_property_osmline contains exactly
|
||||
| object |
|
||||
| 99:5 |
|
||||
|
||||
|
||||
Scenario: Changing an interpolation to something else
|
||||
When loading osm data
|
||||
"""
|
||||
n1 Taddr:housenumber=3
|
||||
n2 Taddr:housenumber=17
|
||||
w99 Taddr:interpolation=odd Nn1,n2
|
||||
"""
|
||||
Then place contains
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
| W99:place | houses |
|
||||
|
||||
When updating osm data
|
||||
"""
|
||||
w99 Thighway=residential Nn1,n2
|
||||
"""
|
||||
Then place contains
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
| W99:highway | residential |
|
||||
When indexing
|
||||
Then placex contains exactly
|
||||
| object | type |
|
||||
| N1:place | house |
|
||||
| N2:place | house |
|
||||
| W99:highway | residential |
|
||||
And location_property_osmline contains exactly
|
||||
| object |
|
||||
|
||||
@@ -380,4 +380,49 @@ def check_location_property_osmline(context, oid, neg):
|
||||
|
||||
assert not todo, f"Unmatched lines in table: {list(context.table[i] for i in todo)}"
|
||||
|
||||
@then("location_property_osmline contains(?P<exact> exactly)?")
|
||||
def check_place_contents(context, exact):
|
||||
""" Check contents of the interpolation table. Each row represents a table row
|
||||
and all data must match. Data not present in the expected table, may
|
||||
be arbitry. The rows are identified via the 'object' column which must
|
||||
have an identifier of the form '<osm id>[:<startnumber>]'. When multiple
|
||||
rows match (for example because 'startnumber' was left out and there are
|
||||
multiple entries for the given OSM object) then all must match. All
|
||||
expected rows are expected to be present with at least one database row.
|
||||
When 'exactly' is given, there must not be additional rows in the database.
|
||||
"""
|
||||
with context.db.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
|
||||
expected_content = set()
|
||||
for row in context.table:
|
||||
if ':' in row['object']:
|
||||
nid, start = row['object'].split(':', 2)
|
||||
start = int(start)
|
||||
else:
|
||||
nid, start = row['object'], None
|
||||
|
||||
query = """SELECT *, ST_AsText(linegeo) as geomtxt,
|
||||
ST_GeometryType(linegeo) as geometrytype
|
||||
FROM location_property_osmline WHERE osm_id=%s"""
|
||||
|
||||
if ':' in row['object']:
|
||||
query += ' and startnumber = %s'
|
||||
params = [int(val) for val in row['object'].split(':', 2)]
|
||||
else:
|
||||
params = (int(row['object']), )
|
||||
|
||||
cur.execute(query, params)
|
||||
assert cur.rowcount > 0, "No rows found for " + row['object']
|
||||
|
||||
for res in cur:
|
||||
if exact:
|
||||
expected_content.add((res['osm_id'], res['startnumber']))
|
||||
|
||||
DBRow(nid, res, context).assert_row(row, ['object'])
|
||||
|
||||
if exact:
|
||||
cur.execute('SELECT osm_id, startnumber from location_property_osmline')
|
||||
actual = set([(r[0], r[1]) for r in cur])
|
||||
assert expected_content == actual, \
|
||||
f"Missing entries: {expected_content - actual}\n" \
|
||||
f"Not expected in table: {actual - expected_content}"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user