bdd: add osm2pgsql tests for updating interpolations

This commit is contained in:
Sarah Hoffmann
2022-11-14 16:57:31 +01:00
parent a46348da38
commit d8e3ba3b54
2 changed files with 178 additions and 0 deletions

View 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 |

View File

@@ -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}"