p2p-db-osm
Version:
API for p2p-db adding OpenStreetMap data types and querying.
460 lines (412 loc) • 7.63 kB
JavaScript
var test = require('tape')
var createDb = require('./lib/create-db')
var hyper = require('hyperdb')
var P2P = require('p2p-db')
var Osm = require('..')
var ram = require('random-access-memory')
test('incorrect db init', function (t) {
t.plan(3)
try {
Osm()
} catch (e) {
t.ok(e instanceof Error)
}
try {
Osm({})
} catch (e) {
t.ok(e instanceof Error)
}
try {
Osm({
p2pdb: P2P(hyper(ram, { valueEncoding: 'json' }))
})
} catch (e) {
t.ok(e instanceof Error)
}
})
test('create unknown element', function (t) {
t.plan(1)
var db = createDb()
var node = {
type: 'cortada',
changeset: '9',
lat: '-11',
lon: '-10',
timestamp: '2017-10-10T19:55:08.570Z'
}
db.osm.create(node, function (err) {
t.ok(err instanceof Error)
})
})
test('create good nodes', function (t) {
var nodes = [
{
type: 'node',
changeset: '9',
lat: '-11',
lon: '-10',
timestamp: '2017-10-10T19:55:08.570Z'
},
{
type: 'node',
changeset: '9',
lat: '-11',
lon: '-10'
}
]
t.plan(nodes.length * 4)
var db = createDb()
nodes.forEach(function (node) {
db.osm.create(node, function (err, elm) {
t.error(err)
t.ok(elm)
t.ok(elm.id)
t.ok(elm.version)
})
})
})
test('create bad nodes', function (t) {
var nodes = [
{
// no type set
},
{
// non-string type
type: 17
},
{
type: 'node'
},
{
type: 'node',
changeset: '9'
},
{
type: 'node',
changeset: '9',
lat: '12'
},
{
type: 'node',
changeset: '9',
lon: '-7'
},
{
type: 'node',
changeset: '9',
lat: '-91',
lon: '-7'
},
{
type: 'node',
changeset: '9',
lat: '291',
lon: '-7'
},
{
type: 'node',
changeset: '9',
lat: '31',
lon: '-185'
},
{
type: 'node',
changeset: '9',
lat: '31',
lon: '185'
},
{
type: 'node',
changeset: '9',
lat: '31',
lon: '85',
timestamp: 'soon'
},
{
type: 'node',
changeset: '9',
lat: '31',
lon: '85',
tags: 'hello' // non-object tags
}
]
t.plan(nodes.length)
var db = createDb()
nodes.forEach(function (node, idx) {
db.osm.create(node, function (err) {
t.ok(err instanceof Error, 'nodes[' + idx + ']')
})
})
})
test('create good ways', function (t) {
var ways = [
{
type: 'way',
changeset: '19',
refs: ['bob', 'dole', 'for', 'prez'],
timestamp: '2017-10-10T19:55:08.570Z'
},
{
type: 'way',
changeset: '19',
refs: ['bob', 'dole', 'for', 'prez']
},
{
type: 'node',
changeset: '9',
lat: '-11',
lon: '-10',
extra: 'field'
}
]
t.plan(ways.length * 4)
var db = createDb()
ways.forEach(function (node) {
db.osm.create(node, function (err, elm) {
t.error(err)
t.ok(elm)
t.ok(elm.id)
t.ok(elm.version)
})
})
})
test('create bad ways', function (t) {
var ways = [
{
type: 'way'
},
{
type: 'way',
changeset: '14'
},
{
type: 'way',
changeset: '14',
refs: []
},
{
type: 'way',
changeset: '14',
refs: ['hi']
},
{
type: 'way',
changeset: '14',
refs: ['hi', 'there']
},
{
type: 'way',
changeset: 14,
refs: ['hi', 'there', 'friend']
},
{
type: 'way',
changeset: '14',
refs: ['hi', 'there', 'friend'],
timestamp: 'a while ago'
}
]
t.plan(ways.length)
var db = createDb()
ways.forEach(function (node, idx) {
db.osm.create(node, function (err) {
t.ok(err instanceof Error, 'ways[' + idx + ']')
})
})
})
test('create good relations', function (t) {
var relations = [
{
type: 'relation',
changeset: '19',
tags: { waterway: 'river' },
members: [
{
type: 'node',
id: '101'
}
]
},
{
type: 'relation',
changeset: '19',
tags: { waterway: 'river' },
members: [
{
type: 'node',
id: '101',
role: 'best-friend'
}
]
},
{
type: 'relation',
changeset: '21',
tags: { foo: 'bar' },
members: []
}
]
t.plan(relations.length * 4)
var db = createDb()
relations.forEach(function (node) {
db.osm.create(node, function (err, elm) {
t.error(err)
t.ok(elm)
t.ok(elm.id)
t.ok(elm.version)
})
})
})
test('create bad relations </pun>', function (t) {
var relations = [
{
type: 'relation'
},
{
type: 'relation',
changeset: '21'
},
{
type: 'relation',
changeset: '21',
tags: { foo: 'bar' }
},
{
type: 'relation',
changeset: '21',
tags: {},
members: []
},
{
type: 'relation',
changeset: '21',
tags: { foo: 'bar' },
members: {}
},
{
type: 'relation',
changeset: '21',
tags: { foo: 'bar' },
members: [
{
type: 'sandwich',
ref: '17'
}
]
},
{
type: 'relation',
changeset: '21',
tags: { foo: 'bar' },
members: [
{
type: true,
ref: '17'
}
]
},
{
type: 'relation',
changeset: '21',
tags: true,
members: [
{
type: 'sandwich',
ref: '17'
}
]
},
{
type: 'relation',
changeset: '21',
tags: { foo: 'bar' },
members: [
{
ref: '17'
}
]
},
{
type: 'relation',
changeset: '21',
tags: { foo: 'bar' },
members: [
{
type: 'way',
id: 17
}
]
}
]
t.plan(relations.length)
var db = createDb()
relations.forEach(function (node, idx) {
db.osm.create(node, function (err) {
t.ok(err instanceof Error, 'relations[' + idx + ']')
})
})
})
test('create good changesets', function (t) {
var changesets = [
{
type: 'changeset'
},
{
type: 'changeset',
timestamp: '2017-10-10T19:55:08.570Z'
}
]
t.plan(changesets.length * 4)
var db = createDb()
changesets.forEach(function (node) {
db.osm.create(node, function (err, elm) {
t.error(err)
t.ok(elm)
t.ok(elm.id)
t.ok(elm.version)
})
})
})
test('create bad changesets', function (t) {
var changesets = [
{
type: 'changeset',
timestamp: 'now'
}
]
t.plan(changesets.length)
var db = createDb()
changesets.forEach(function (node, idx) {
db.osm.create(node, function (err) {
t.ok(err instanceof Error, 'changesets[' + idx + ']')
})
})
})
test('create changeset', function (t) {
t.plan(4)
var db = createDb()
var changes = {
type: 'changeset'
}
db.osm.create(changes, function (err, elm) {
t.error(err)
t.ok(elm)
t.ok(elm.id)
t.ok(elm.version)
})
})
test('version lookup correctness', function (t) {
var db = createDb()
var changes = {
type: 'changeset'
}
db.osm.create(changes, function (err, elm1) {
t.error(err)
db.osm.getByVersion(elm1.version, function (err, elm2) {
t.error(err)
t.equals(elm1.id, elm2.id)
t.equals(elm1.version, elm2.version)
t.end()
})
})
})