Files
marco/tests/unit/routes/place-test.js

129 lines
3.1 KiB
JavaScript

import { module, test } from 'qunit';
import { setupTest } from 'marco/tests/helpers';
import Service from '@ember/service';
module('Unit | Route | place', function (hooks) {
setupTest(hooks);
test('it exists', function (assert) {
let route = this.owner.lookup('route:place');
assert.ok(route);
});
test('afterModel enriches model with missing geometry', async function (assert) {
let route = this.owner.lookup('route:place');
// Mock Services
let fetchCalled = false;
let selectPlaceCalled = false;
class OsmStub extends Service {
async fetchOsmObject(id, type) {
fetchCalled = true;
assert.strictEqual(id, '123', 'Correct ID passed');
assert.strictEqual(type, 'way', 'Correct Type passed');
return {
osmId: '123',
osmType: 'way',
geojson: { type: 'Polygon', coordinates: [] },
tags: { updated: 'true' },
};
}
}
class MapUiStub extends Service {
selectPlace(place) {
selectPlaceCalled = true;
}
stopSearch() {}
}
this.owner.register('service:osm', OsmStub);
this.owner.register('service:map-ui', MapUiStub);
// Initial partial model (from search)
let model = {
osmId: '123',
osmType: 'way',
title: 'Partial Place',
// No geojson
};
await route.afterModel(model);
assert.ok(fetchCalled, 'fetchOsmObject should be called');
assert.ok(selectPlaceCalled, 'selectPlace should be called');
assert.ok(model.geojson, 'Model should now have geojson');
assert.strictEqual(
model.tags.updated,
'true',
'Model should have updated tags'
);
});
test('afterModel skips fetch if geometry exists', async function (assert) {
let route = this.owner.lookup('route:place');
let fetchCalled = false;
class OsmStub extends Service {
async fetchOsmObject() {
fetchCalled = true;
return null;
}
}
class MapUiStub extends Service {
selectPlace() {}
stopSearch() {}
}
this.owner.register('service:osm', OsmStub);
this.owner.register('service:map-ui', MapUiStub);
let model = {
osmId: '456',
osmType: 'relation',
geojson: { type: 'MultiLineString' },
};
await route.afterModel(model);
assert.notOk(
fetchCalled,
'fetchOsmObject should NOT be called if geojson exists'
);
});
test('afterModel skips fetch for nodes even if geometry is missing', async function (assert) {
let route = this.owner.lookup('route:place');
let fetchCalled = false;
class OsmStub extends Service {
async fetchOsmObject() {
fetchCalled = true;
return null;
}
}
class MapUiStub extends Service {
selectPlace() {}
stopSearch() {}
}
this.owner.register('service:osm', OsmStub);
this.owner.register('service:map-ui', MapUiStub);
let model = {
osmId: '789',
osmType: 'node',
// No geojson, but it's a node
};
await route.afterModel(model);
assert.notOk(fetchCalled, 'fetchOsmObject should NOT be called for nodes');
});
});