UNPKG

osm-p2p-server

Version:

Peer-to-peer OpenStreetMap API v0.6 Server

167 lines (151 loc) 5.92 kB
// TODO: We are not tracking versions in this test or the original code, // We need to test on forked data with references var test = require('tape') var osmdb = require('./test_db') var filterSafeDeletes = require('../../lib/filter_deletes') var osm = osmdb() test('filterSafeDeletes: setup db', t => { var batch0 = [ { type: 'put', key: 'A', value: { type: 'node', lat: 64.5, lon: -147.3 } }, { type: 'put', key: 'B', value: { type: 'node', lat: 63.9, lon: -147.6 } }, { type: 'put', key: 'C', value: { type: 'node', lat: 64.2, lon: -146.5 } }, { type: 'put', key: 'D', value: { type: 'node', lat: 64.123, lon: -147.56 } }, { type: 'put', key: 'E', value: { type: 'way', refs: [ 'A', 'B' ] } }, { type: 'put', key: 'F', value: { type: 'relation', refs: [ 'A', 'C', 'E' ] } }, { type: 'put', key: 'G', value: { type: 'way', refs: [ 'B', 'C' ] } }, { type: 'put', key: 'H', value: { type: 'relation', refs: [ 'F', 'G', 'I' ] } }, { type: 'put', key: 'I', value: { type: 'node', lat: 64.1, lon: -147.1 } }, { type: 'put', key: 'J', value: { type: 'node', lat: 64.2, lon: -147.2 } }, { type: 'put', key: 'K', value: { type: 'node', lat: 64.3, lon: -147.3 } }, { type: 'put', key: 'L', value: { type: 'node', lat: 64.4, lon: -147.4 } }, { type: 'put', key: 'M', value: { type: 'node', lat: 64.5, lon: -147.5 } }, { type: 'put', key: 'N', value: { type: 'way', refs: [ 'J', 'K', 'L', 'M' ] } } ] osm.batch(batch0, function (err, nodes) { t.error(err) t.end() }) }) test('filterSafeDeletes: unused node', function (t) { var changes = [ { action: 'delete', type: 'node', id: 'D' } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, changes.length, 'Safe delete is not filtered') t.end() }) }) test('filterSafeDeletes: used node', function (t) { var changes = [ { action: 'delete', type: 'node', id: 'A' } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.true(err instanceof Error, 'returns an error') t.end() }) }) test('filterSafeDeletes: used node, ignore with ifUnused', function (t) { var changes = [ { action: 'delete', type: 'node', id: 'A', ifUnused: true } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, 0, 'action is filtered from result') t.end() }) }) test('filterSafeDeletes: relation used by super-relation', function (t) { var changes = [ { action: 'delete', type: 'relation', id: 'F', ifUnused: true } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, 0, 'action is filtered from result') t.end() }) }) test('filterSafeDeletes: delete node originally with two references', function (t) { var changes = [ { action: 'modify', type: 'way', id: 'E', nodes: ['A', 'C'] }, { action: 'modify', type: 'relation', id: 'H', refs: [ 'F', 'I' ] }, { action: 'delete', type: 'way', id: 'G', ifUnused: true }, { action: 'delete', type: 'node', id: 'B', ifUnused: true } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, changes.length, 'nothing filtered, all deletes valid') t.end() }) }) test('filterSafeDeletes: create-modify-delete', function (t) { var changes = [ { action: 'create', type: 'way', id: 'X', nodes: ['A', 'B', 'D'] }, { action: 'modify', type: 'way', id: 'X', nodes: ['A', 'B', 'C'] }, { action: 'delete', type: 'node', id: 'D' } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, changes.length, 'Safe delete is not filtered') t.end() }) }) test('filterSafeDeletes: node unused after changeset modify', function (t) { var changes = [ { action: 'modify', type: 'relation', id: 'H', nodes: ['F', 'G'] }, { action: 'delete', type: 'node', id: 'I' } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, changes.length, 'delete shouldn\'t be filtered') t.end() }) }) test('filterSafeDeletes: node unused after changeset delete', function (t) { var changes = [ { action: 'delete', type: 'relation', id: 'H' }, { action: 'delete', type: 'node', id: 'I' } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, changes.length, 'delete shouldn\'t be filtered') t.end() }) }) // Passing this test requires the reverseRefs logic, it is not clear whether // editing clients will create this, but generic osmChange docs (used in diffs) // certainly can test('filterSafeDeletes: node used after changeset modify', function (t) { var changes = [ { action: 'modify', type: 'way', id: 'E', nodes: ['A', 'B', 'D'] }, { action: 'delete', type: 'node', id: 'D', ifUnused: true } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, 1, 'delete is filtered') t.end() }) }) test('filterSafeDeletes: node used after changeset create', function (t) { var changes = [ { action: 'create', type: 'way', id: 'X', nodes: ['A', 'D'] }, { action: 'delete', type: 'node', id: 'D', ifUnused: true } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, 1, 'delete is filtered') t.end() }) }) test('filterSafeDeletes: split way', function (t) { var changes = [ { action: 'modify', type: 'way', id: 'N', nodes: ['J', 'K'] }, { action: 'delete', type: 'node', id: 'L', ifUnused: true }, { action: 'delete', type: 'node', id: 'M', ifUnused: true } ] filterSafeDeletes(osm, changes, function (err, filtered) { t.error(err) t.equal(filtered.length, changes.length, 'delete shouldn\'t be filtered') t.end() }) })