summaryrefslogtreecommitdiff
path: root/osmpass/enrich_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'osmpass/enrich_test.go')
-rw-r--r--osmpass/enrich_test.go149
1 files changed, 149 insertions, 0 deletions
diff --git a/osmpass/enrich_test.go b/osmpass/enrich_test.go
new file mode 100644
index 0000000..88c6a3f
--- /dev/null
+++ b/osmpass/enrich_test.go
@@ -0,0 +1,149 @@
+package osmpass
+
+import (
+ "database/sql"
+ "testing"
+
+ _ "github.com/mattn/go-sqlite3"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestNormalizeName(t *testing.T) {
+ assert.Equal(t, "col du telegraphe", normalizeName("Col du Télégraphe"))
+ assert.Equal(t, "col de la gineste", normalizeName("Col de la Gineste"))
+ assert.Equal(t, normalizeName("Col de la Gineste"), normalizeName("col de la gineste"))
+ assert.True(t, nameMatches("Col de la Lombarde", "Col de la Lombarde / Colle della Lombarda"))
+ assert.False(t, nameMatches("Col de la Gatasse", "Col de la Gatasso"))
+}
+
+func TestEnrichMountainPasses(t *testing.T) {
+ db := testDB(t, `
+ CREATE TABLE osm_passes (
+ osm_id integer unique not null,
+ name text,
+ elevation integer,
+ latitude real not null,
+ longitude real not null
+ );
+ CREATE TABLE mountain_passes (
+ external_id text unique not null,
+ name text not null,
+ department_code text not null,
+ elevation integer not null,
+ latitude real,
+ longitude real
+ );
+ `)
+
+ insert(t, db, "INSERT INTO osm_passes VALUES (1, 'Col de la Gineste', 327, 43.2, 5.4)")
+ insert(t, db, "INSERT INTO osm_passes VALUES (2, 'Col de la Couillole', 1678, 44.1, 7.0)")
+ insert(t, db, "INSERT INTO osm_passes VALUES (3, 'Col de la Gatasso', 122, 43.3, 5.5)")
+ insert(t, db, "INSERT INTO osm_passes VALUES (4, 'Col des Portes', NULL, 43.6, 5.8)")
+
+ insert(t, db, "INSERT INTO mountain_passes VALUES ('c/1', 'Col de la Gineste', '13', 326, NULL, NULL)")
+ insert(t, db, "INSERT INTO mountain_passes VALUES ('c/2', 'Col de la Gatasse', '13', 120, NULL, NULL)")
+ insert(t, db, "INSERT INTO mountain_passes VALUES ('c/3', 'Col inconnu', '13', 999, NULL, NULL)")
+
+ count, err := EnrichMountainPasses(db)
+ require.NoError(t, err)
+ assert.Equal(t, 2, count)
+
+ var latitude, longitude float64
+ err = db.QueryRow("SELECT latitude, longitude FROM mountain_passes WHERE external_id = 'c/1'").Scan(&latitude, &longitude)
+ require.NoError(t, err)
+ assert.InDelta(t, 43.2, latitude, 1e-9)
+ assert.InDelta(t, 5.4, longitude, 1e-9)
+
+ err = db.QueryRow("SELECT latitude, longitude FROM mountain_passes WHERE external_id = 'c/2'").Scan(&latitude, &longitude)
+ require.NoError(t, err)
+ assert.InDelta(t, 43.3, latitude, 1e-9)
+ assert.InDelta(t, 5.5, longitude, 1e-9)
+
+ var isNull bool
+ err = db.QueryRow("SELECT latitude IS NULL FROM mountain_passes WHERE external_id = 'c/3'").Scan(&isNull)
+ require.NoError(t, err)
+ assert.True(t, isNull)
+}
+
+func TestEnrichMountainPassesAmbiguousElevationOnly(t *testing.T) {
+ db := testDB(t, `
+ CREATE TABLE osm_passes (
+ osm_id integer unique not null,
+ name text,
+ elevation integer,
+ latitude real not null,
+ longitude real not null
+ );
+ CREATE TABLE mountain_passes (
+ external_id text unique not null,
+ name text not null,
+ department_code text not null,
+ elevation integer not null,
+ latitude real,
+ longitude real
+ );
+ `)
+
+ insert(t, db, "INSERT INTO osm_passes VALUES (1, 'Autre Col A', 122, 43.3, 5.5)")
+ insert(t, db, "INSERT INTO osm_passes VALUES (2, 'Autre Col B', 130, 43.5, 5.7)")
+
+ insert(t, db, "INSERT INTO mountain_passes VALUES ('c/1', 'Col de la Gatasse', '13', 120, NULL, NULL)")
+
+ count, err := EnrichMountainPasses(db)
+ require.NoError(t, err)
+ assert.Zero(t, count)
+
+ var isNull bool
+ err = db.QueryRow("SELECT latitude IS NULL FROM mountain_passes WHERE external_id = 'c/1'").Scan(&isNull)
+ require.NoError(t, err)
+ assert.True(t, isNull)
+}
+
+func TestEnrichMountainPassesRejectsCrossDepartmentHomonym(t *testing.T) {
+ db := testDB(t, `
+ CREATE TABLE osm_passes (
+ osm_id integer unique not null,
+ name text,
+ elevation integer,
+ latitude real not null,
+ longitude real not null
+ );
+ CREATE TABLE mountain_passes (
+ external_id text unique not null,
+ name text not null,
+ department_code text not null,
+ elevation integer not null,
+ latitude real,
+ longitude real
+ );
+ `)
+
+ insert(t, db, "INSERT INTO osm_passes VALUES (1, 'Collet de la Selle', 1178, 43.77, 6.81)")
+
+ insert(t, db, "INSERT INTO mountain_passes VALUES ('c/1', 'La Selle', '01', 1175, NULL, NULL)")
+
+ count, err := EnrichMountainPasses(db)
+ require.NoError(t, err)
+ assert.Zero(t, count)
+
+ var isNull bool
+ err = db.QueryRow("SELECT latitude IS NULL FROM mountain_passes WHERE external_id = 'c/1'").Scan(&isNull)
+ require.NoError(t, err)
+ assert.True(t, isNull)
+}
+
+func testDB(t *testing.T, schema string) *sql.DB {
+ db, err := sql.Open("sqlite3", ":memory:")
+ require.NoError(t, err)
+ db.SetMaxOpenConns(1)
+ t.Cleanup(func() { db.Close() })
+ _, err = db.Exec(schema)
+ require.NoError(t, err)
+ return db
+}
+
+func insert(t *testing.T, db *sql.DB, query string) {
+ _, err := db.Exec(query)
+ require.NoError(t, err)
+}