UNPKG

larvitgeodata

Version:

Geo data, primarily ISO territories, languages etc. Data fetched mostly from CLDR.

373 lines (302 loc) 13.4 kB
'use strict'; const GeoLib = require(__dirname + '/../index.js'); const assert = require('assert'); const {Log} = require('larvitutils'); const async = require('async'); const Db = require('larvitdb'); const fs = require('fs'); const log = new Log('warning'); let db; let geoData; // Make sure the database is set up before(function (done) { const tasks = []; // Let this test take some time this.timeout(60000); this.slow(3000); // Run DB Setup tasks.push(function (cb) { let confFile; if (process.env.DBCONFFILE === undefined) { confFile = __dirname + '/../config/db_test.json'; } else { confFile = process.env.DBCONFFILE; } // First look for absolute path fs.stat(confFile, function (err) { let dbConf; if (err) { // Then look for this string in the config folder confFile = __dirname + '/../config/' + confFile; fs.stat(confFile, function (err) { if (err) throw err; dbConf = require(confFile); dbConf.log = log; db.setup(dbConf, cb); }); return; } dbConf = require(confFile); dbConf.log = log; db = new Db(dbConf); cb(); }); }); // Check for empty db tasks.push(async function () { await db.removeAllTables(); }); // Setup geoData tasks.push(async function () { geoData = new GeoLib({ db, log, }); await geoData.ready(); }); async.series(tasks, function (err) { if (err) throw err; done(); }); }); // Tear down the database after(async function () { await db.removeAllTables(); }); describe('Check database for existing stuff', function () { it('Check for Sweden', async function () { const {rows} = await db.query('SELECT * FROM geo_territories WHERE iso3166_1_alpha_2 = \'SE\''); assert(rows.length === 1, 'There should be exactly one row'); assert(rows[0].iso3166_1_num === 752, 'Swedens numeric code is 752'); }); it('Check for Swedish language label', async function () { const {rows} = await db.query('SELECT * FROM geo_langlabels WHERE langIso639_3 = \'swe\' AND labelIso639_3 = \'swe\''); assert(rows.length === 1, 'There should be exactly one row'); assert(rows[0].label === 'svenska', 'The correct label should be "svenska", but is "' + rows[0].label + '"'); }); it('Check for Swedish territory label', async function () { const {rows} = await db.query('SELECT * FROM geo_territorylabels WHERE labelIso639_3 = \'swe\' AND terIso3166_1_alpha_2 = \'SE\''); assert.strictEqual(rows.length, 1); assert(rows[0].label === 'Sverige', 'The correct label should be "Sverige", but is "' + rows[0].label + '"'); }); }); describe('Language functions', function () { it('Getting language labels, basic', async function () { const result = await geoData.getLanguages(); assert.strictEqual(result.length, 140); assert.strictEqual(result[0].iso639_1, 'ab'); assert.strictEqual(result[0].label, 'Abkhazian'); assert.strictEqual(result[69].iso639_3, 'lit'); assert.strictEqual(result[69].label, 'Lithuanian'); assert.strictEqual(result[30].iso639_3, 'eng'); assert.strictEqual(result[30].iso639_1, 'en'); assert.strictEqual(result[30].label, 'English'); assert.strictEqual(result[112].iso639_3, 'swe'); assert.strictEqual(result[112].iso639_1, 'sv'); assert.strictEqual(result[112].label, 'Swedish'); }); it('Getting all languages', async function () { const result = await geoData.getLanguages({type: false, scope: false, gotIso639_1: 'all'}); assert.strictEqual(result.length, 8368); assert.strictEqual(result[0].iso639_3, 'aaa'); assert.strictEqual(result[0].iso639_1, null); assert.strictEqual(result[0].scope, 'individual'); assert.strictEqual(result[0].type, 'living'); assert.strictEqual(result[0].label, null); assert.strictEqual(result[8367].iso639_3, 'zun'); assert.strictEqual(result[8367].iso639_1, null); assert.strictEqual(result[8367].scope, 'individual'); assert.strictEqual(result[8367].type, 'living'); assert.strictEqual(result[8367].label, 'Zuni'); }); it('Getting all languages without iso639_1', async function () { const result = await geoData.getLanguages({type: false, scope: false, gotIso639_1: false}); assert.strictEqual(result.length, 8184); }); it('Getting all swedish language labels', async function () { geoData.labelLang = 'swe'; const result = await geoData.getLanguages(); assert.strictEqual(result.length, 140); assert.strictEqual(result[0].iso639_1, 'ab'); assert.strictEqual(result[0].label, 'abchaziska'); assert.strictEqual(result[69].iso639_3, 'mri'); assert.strictEqual(result[69].label, 'maori'); assert.strictEqual(result[21].iso639_3, 'eng'); assert.strictEqual(result[21].iso639_1, 'en'); assert.strictEqual(result[21].label, 'engelska'); assert.strictEqual(result[102].iso639_3, 'swe'); assert.strictEqual(result[102].iso639_1, 'sv'); assert.strictEqual(result[102].label, 'svenska'); geoData.labelLang = 'eng'; // Set it back to default, "eng" }); it('Get only swedish', async function () { const result = await geoData.getLanguages({iso639_1: 'sv'}); assert.strictEqual(result.length, 1); assert.strictEqual(result[0].iso639_3, 'swe'); assert.strictEqual(result[0].iso639_1, 'sv'); assert.strictEqual(result[0].label, 'Swedish'); }); it('Get only swedish and english', async function () { const result = await geoData.getLanguages({iso639_3: ['swe', 'eng']}); assert.strictEqual(result.length, 2); assert.strictEqual(result[0].iso639_3, 'eng'); assert.strictEqual(result[0].iso639_1, 'en'); assert.strictEqual(result[0].label, 'English'); assert.strictEqual(result[1].iso639_3, 'swe'); assert.strictEqual(result[1].iso639_1, 'sv'); assert.strictEqual(result[1].label, 'Swedish'); }); it('Get only swedish by specifying iso639_3 as swe', async function () { const result = await geoData.getLanguages({iso639_3: 'swe'}); assert.strictEqual(result.length, 1); assert.strictEqual(result[0].iso639_3, 'swe'); assert.strictEqual(result[0].iso639_1, 'sv'); assert.strictEqual(result[0].label, 'Swedish'); }); }); describe('Territory functions', function () { it('Getting territory labels, basic', async function () { const result = await geoData.getTerritories(); assert.strictEqual(result.length, 250); assert.strictEqual(result[110].iso3166_1_num, 384); assert.strictEqual(result[110].iso3166_1_alpha_3, 'CIV'); assert.strictEqual(result[110].iso3166_1_alpha_2, 'CI'); assert.strictEqual(result[110].label, 'Ivory Coast'); }); it('Get Swedish labels', async function () { const result = await geoData.getTerritories({labelLang: 'swe'}); assert.strictEqual(result.length, 250); assert.strictEqual(result[110].iso3166_1_num, 417); assert.strictEqual(result[110].iso3166_1_alpha_3, 'KGZ'); assert.strictEqual(result[110].iso3166_1_alpha_2, 'KG'); assert.strictEqual(result[110].label, 'Kirgizistan'); }); it('Get Swedish labels collate by utf8mb4_swedish_ci', async function () { const result = await geoData.getTerritories({labelLang: 'swe', collate: 'utf8mb4_swedish_ci'}); assert.strictEqual(result.length, 250); assert.strictEqual(result[247].iso3166_1_num, 248); assert.strictEqual(result[247].iso3166_1_alpha_3, 'ALA'); assert.strictEqual(result[247].iso3166_1_alpha_2, 'AX'); assert.strictEqual(result[247].label, 'Åland'); assert.strictEqual(result[248].iso3166_1_num, 40); assert.strictEqual(result[248].iso3166_1_alpha_3, 'AUT'); assert.strictEqual(result[248].iso3166_1_alpha_2, 'AT'); assert.strictEqual(result[248].label, 'Österrike'); assert.strictEqual(result[249].iso3166_1_num, 626); assert.strictEqual(result[249].iso3166_1_alpha_3, 'TLS'); assert.strictEqual(result[249].iso3166_1_alpha_2, 'TL'); assert.strictEqual(result[249].label, 'Östtimor'); }); it('Get only Germany', async function () { const result = await geoData.getTerritories({iso3166_1_alpha_2: 'DE'}); assert.strictEqual(result.length, 1); assert.strictEqual(result[0].iso3166_1_num, 276); assert.strictEqual(result[0].iso3166_1_alpha_3, 'DEU'); assert.strictEqual(result[0].iso3166_1_alpha_2, 'DE'); assert.strictEqual(result[0].label, 'Germany'); }); it('Get only Germany and Russia', async function () { const result = await geoData.getTerritories({iso3166_1_alpha_2: ['DE', 'RU']}); assert.strictEqual(result.length, 2); assert.strictEqual(result[0].iso3166_1_num, 276); assert.strictEqual(result[0].iso3166_1_alpha_3, 'DEU'); assert.strictEqual(result[0].iso3166_1_alpha_2, 'DE'); assert.strictEqual(result[0].label, 'Germany'); assert.strictEqual(result[1].iso3166_1_num, 643); assert.strictEqual(result[1].iso3166_1_alpha_3, 'RUS'); assert.strictEqual(result[1].iso3166_1_alpha_2, 'RU'); assert.strictEqual(result[1].label, 'Russia'); }); it('Get region for territory', async function () { // Germany const regions = await geoData.getRegionForTerritory(276); assert.notStrictEqual(regions, undefined); assert.strictEqual(regions.length, 2); for (let r of regions) { if (r.id === 155) { assert.strictEqual(r.name, 'Western Europe'); assert.notStrictEqual(r.parent, undefined); assert.strictEqual(r.parent.id, 150); assert.notStrictEqual(r.parent.parent, undefined); assert.strictEqual(r.parent.parent.id, 1); } else { assert.strictEqual(r.name, 'European Union'); assert.strictEqual(r.parent, undefined); } } }); it('Get counties without terrtiory code throws an error', async function () { await assert.rejects(async () => await geoData.getCounties({}), new Error('Required option "iso_3166_1_alpha_3" not set')); }); it('Get municipalities without terrtiory code throws an error', async function () { await assert.rejects(async () => await geoData.getMunicipalities({}), new Error('Required option "iso_3166_1_alpha_3" not set')); }); it('Get counties orderd by code', async function () { const result = await geoData.getCounties({iso_3166_1_alpha_3: 'SWE', orderBy: 'code'}); assert.strictEqual(result.length, 21); assert.strictEqual(result[0].label, 'Stockholms län'); assert.strictEqual(result[0].iso_3166_1_alpha_3, 'SWE'); assert.strictEqual(result[0].code, '01'); }); it('Get counties ordered by label', async function () { const result = await geoData.getCounties({iso_3166_1_alpha_3: 'SWE', orderBy: 'label'}); assert.strictEqual(result.length, 21); assert.strictEqual(result[0].label, 'Blekinge län'); assert.strictEqual(result[0].iso_3166_1_alpha_3, 'SWE'); assert.strictEqual(result[0].code, '10'); }); it('Get counties with municipalities', async function () { const result = await geoData.getCounties({iso_3166_1_alpha_3: 'SWE', orderBy: 'code', includeMunicipalities: true}); assert.strictEqual(result.length, 21); assert.strictEqual(result[0].label, 'Stockholms län'); assert.strictEqual(result[0].iso_3166_1_alpha_3, 'SWE'); assert.strictEqual(result[0].code, '01'); assert.strictEqual(result[0].municipalities.length, 26); assert.strictEqual(result[0].municipalities[0].label, 'Botkyrka'); assert.strictEqual(result[0].municipalities[0].code, '0127'); }); it('Get municipalities ordered by code', async function () { const result = await geoData.getMunicipalities({iso_3166_1_alpha_3: 'SWE', orderBy: 'code'}); assert.strictEqual(result.length, 290); assert.strictEqual(result[0].label, 'Upplands Väsby'); assert.strictEqual(result[0].county_label, 'Stockholms län'); assert.strictEqual(result[0].iso_3166_1_alpha_3, 'SWE'); assert.strictEqual(result[0].code, '0114'); }); it('Get municipalities ordered by label', async function () { const result = await geoData.getMunicipalities({iso_3166_1_alpha_3: 'SWE', orderBy: 'label'}); assert.strictEqual(result.length, 290); assert.strictEqual(result[0].label, 'Ale'); assert.strictEqual(result[0].county_label, 'Västra Götalands län'); assert.strictEqual(result[0].iso_3166_1_alpha_3, 'SWE'); assert.strictEqual(result[0].code, '1440'); }); }); describe('Currency functions', function () { it('Get currencies, iso_4217 codes only', async function () { const result = await geoData.getCurrencies(null); assert.strictEqual(result.length, 297); }); it('Get currencies with descriptions, without lables', async function () { const result = await geoData.getCurrencies({descriptions: true}); assert.strictEqual(result.length, 297); assert.strictEqual(result[0].description, 'Andorran Peseta'); assert.strictEqual(result[0].iso_4217, 'adp'); assert.strictEqual(result[0].displayName, undefined); assert.strictEqual(result[0].symbol, undefined); }); it('Get currencies with lables, without descriptions', async function () { const result = await geoData.getCurrencies({labelLang: 'sv'}); assert.strictEqual(result.length, 297); assert.strictEqual(result[1].description, undefined); assert.strictEqual(result[1].displayName, 'Förenade Arabemiratens dirham'); assert.strictEqual(result[1].symbol, 'AED'); }); it('Get currencies with lables and descriptions', async function () { const result = await geoData.getCurrencies({labelLang: 'sv', descriptions: true}); assert.strictEqual(result.length, 297); assert.strictEqual(result[1].description, 'United Arab Emirates Dirham'); assert.strictEqual(result[1].displayName, 'Förenade Arabemiratens dirham'); assert.strictEqual(result[1].symbol, 'AED'); }); });