suttacentral-api
Version:
SuttaCentral API cached proxy
557 lines (540 loc) • 20 kB
JavaScript
(typeof describe === 'function') && describe("sc-api", function() {
const should = require("should");
const fs = require('fs');
const path = require('path');
const { logger } = require('log-instance');
logger.logLevel = "warn";
const {
ScApi,
} = require('../index');
const APP_DIR = path.join(__dirname, '..');
const SUTTAPLEX_SNP1_8_2021 = {
acronym: 'Snp 1.8',
volpages: ' PTS 26',
uid: 'snp1.8',
difficulty: null,
original_title: 'Mettasutta',
root_lang: 'pli',
type: 'leaf',
from: null,
translated_title: 'The Discourse on Love ',
parallel_count: 1,
biblio: null,
};
const SUTTAPLEX_SNP1_8 = {
acronym: 'Snp 1.8',
volpages: 'Snp 25',
uid: 'snp1.8',
blurb: null,
difficulty: null,
original_title: 'Metta Sutta',
root_lang: 'pli',
type: 'text',
from: null,
translated_title: 'Loving-kindness',
parallel_count: 1,
biblio: null,
num: 8,
};
const SUTTAPLEX_AN2_12_2021 = {
acronym: 'AN 2.11–20',
uid: 'an2.11-20',
blurb: null,
difficulty: null,
original_title: 'Adhikaraṇavagga',
root_lang: 'pli',
type: 'leaf',
from: null,
translated_title: 'Disciplinary Issues ',
parallel_count: 7,
biblio: null,
};
const SUTTAPLEX_AN2_12 = {
acronym: null,
volpages: null,
uid: 'an2.11-20',
blurb: null,
difficulty: null,
original_title: 'Adhikaraṇa Vagga',
root_lang: 'pli',
type: 'text',
from: null,
translated_title: '',
parallel_count: 7,
biblio: null,
num: 1,
};
const SUTTAPLEX_AN2_12_2019 = {
acronym: null,
volpages: {
'pts-vp-pli1ed': 'AN i 53',
},
uid: 'an2.11-20',
blurb: null,
difficulty: null,
original_title: 'Adhikaraṇa Vagga',
root_lang: 'pli',
type: 'text',
from: null,
translated_title: '',
parallel_count: 7,
biblio: null,
num: 1,
};
const SUTTAPLEX_EA12_1_2021 = {
acronym: 'EA 12.1',
volpages: 'T ii 568a01',
uid: 'ea12.1',
blurb: null,
difficulty: null,
original_title: '?',
root_lang: 'lzh',
type: 'leaf',
from: null,
translated_title: 'The One Way In Sūtra',
parallel_count: 8,
biblio: null,
};
const SUTTAPLEX_EA12_1 = {
acronym: 'EA 12.1//T 125.12.1',
volpages: 'T ii 568a01',
uid: 'ea12.1',
blurb: null,
difficulty: null,
original_title: ' ?',
root_lang: 'lzh',
type: 'text',
from: null,
translated_title: 'The One Way In Sūtra',
parallel_count: 8,
biblio: null,
num: 96,
};
const TRANSLATIONS_SNP1_8_2021 = {
author: 'Laurence Khantipalo Mills',
author_short: 'Mills',
author_uid: 'mills',
id: 'en_snp1.8_mills',
lang: 'en',
lang_name: 'English',
segmented: false,
title: 'Loving-kindness',
is_root: false,
publication_date: "2015",
volpage: null,
};
const TRANSLATIONS_SNP1_8 = [{
author: 'Laurence Khantipalo Mills',
author_short: 'Mills',
author_uid: 'mills',
id: 'en_snp1.8_mills',
lang: 'en',
lang_name: 'English',
segmented: false,
title: 'Loving-kindness',
}];
const TRANSLATIONS_SNP1_8_2019 = [{
author: 'Laurence Khantipalo Mills',
author_short: 'Mills',
author_uid: 'mills',
id: 'en_snp1.8_mills',
lang: 'en',
lang_name: 'English',
segmented: false,
title: 'Loving-kindness',
is_root: false,
publication_date: "2015",
volpage: null,
}];
const TRANSLATIONS_EA12_1_2021 = [{
author: 'Thích Nhất Hạnh, Annabel Laity',
author_short: 'Nhất Hạnh …',
author_uid: 'nhat_hanh-laity',
has_comment: false,
id: 'en_ea12.1_nhat_hanh-laity',
lang: 'en',
lang_name: 'English',
segmented: false,
title: 'The One Way In Sūtra',
is_root: false,
publication_date: null,
volpage: null,
},{
"author": "Charles Patton",
"author_short": "Patton",
"author_uid": "patton",
"has_comment": false,
"id": "en_ea12.1_patton",
"is_root": false,
"lang": "en",
"lang_name": "English",
"publication_date": null,
"segmented": false,
"title": "The Four Stations of Mind",
"volpage": null,
}];
const TRANSLATIONS_EA12_1 = [{
author: 'Thích Nhất Hạnh, Annabel Laity',
author_short: 'Nhất Hạnh …',
author_uid: 'nhat_hanh-laity',
id: 'en_ea12.1_nhat_hanh-laity',
lang: 'en',
lang_name: 'English',
segmented: false,
title: 'The One Way In Sūtra',
}];
const TRANSLATIONS_EA12_1_2019 = [{
author: 'Thích Nhất Hạnh, Annabel Laity',
author_short: 'Nhất Hạnh …',
author_uid: 'nhat_hanh-laity',
id: 'en_ea12.1_nhat_hanh-laity',
lang: 'en',
lang_name: 'English',
segmented: false,
title: 'The One Way In Sūtra',
is_root: false,
publication_date: null,
volpage: null,
}];
const DEADSERVER = {
apiUrl: 'https://127.0.0.1:911/api',
readFile: false, // avoid cached response for worst case test
};
this.timeout(10*1000);
it("default ctor", async()=>{
var sca = await new ScApi();
should(sca.apiUrl).equal('https://suttacentral.net/api');
should(sca.apiUrl2).equal('https://staging.suttacentral.net/api');
});
it("custom ctor", async()=>{
let apiUrl = 'test-apiUrl';
let apiUrl2 = 'test-apiUrl2';
var sca = await new ScApi({ apiUrl, apiUrl2 });
should(sca.apiUrl).equal(apiUrl);
should(sca.apiUrl2).equal(apiUrl2);
});
it("TESTTESTloadLegacySutta(...) => dn33", async()=>{
var sca = await new ScApi().initialize();
var opts = {
"scid":"dn33",
"id":"dn33",
"translator":"sujato",
}
var sutta = await sca.loadLegacySutta(opts);
should.deepEqual(Object.keys(sutta).sort(), [
'translation', 'sutta_uid', 'author_uid',
'segmented', 'segments', 'suttaplex',
].sort());
let { segments } = sutta;
should(segments.length).equal(0); // it's not legacy
should.deepEqual(sutta.segmented, true);
var suttaplex = sutta.suttaplex;
should(suttaplex.acronym).equal('DN 33');
var translations = suttaplex.translations;
should(translations).instanceOf(Array);
should(sutta.translation.author_uid).equal('sujato');
});
it("TESTTESTloadLegacySutta(...) => an10.2/pt/beisert", async()=>{
var sca = await new ScApi().initialize();
var opts = {
"scid":"an10.2",
"language":"pt",
"id":"an10.2",
"translator":"beisert",
}
var sutta = await sca.loadLegacySutta(opts);
should.deepEqual(sutta.segmented, false);
var suttaplex = sutta.suttaplex;
should(suttaplex.acronym).equal('AN 10.2');
var translations = suttaplex.translations;
should(translations).instanceOf(Array);
should(translations[0].author_uid).equal('beisert');
});
it("loadLegacySutta(...) => deadserver an10.2/pt/beisert", async()=>{
var sca = await new ScApi(DEADSERVER).initialize();
sca.logLevel = 'warn';
var opts = {
"scid":"an10.2",
"language":"pt",
"id":"an10.2",
"translator":"beisert",
}
sca.warn('EXPECTED WARN (BEGIN)');
var sutta = await sca.loadLegacySutta(opts);
should(sca.lastLog('warn')).match(/RETRY.*suttacentral.net.*ECONNREFUSED/);
sca.warn('EXPECTED WARN (END)');
should.deepEqual(sutta.segmented, false);
var suttaplex = sutta.suttaplex;
should(suttaplex.acronym).equal('AN 10.2');
var translations = suttaplex.translations;
should(translations).instanceOf(Array);
should(translations[0].author_uid).equal('beisert');
let deadMemo1 = path.join(APP_DIR,
'api/sc.suttaplex/3a/3a10d005b354faae124851c4242139ff.json');
should(fs.existsSync(deadMemo1)).equal(false);
let deadMemo2 = path.join(APP_DIR,
'api/sc.suttaplex/33/33f16195a6a5adf83f89753c89e2db11.json');
should(fs.existsSync(deadMemo2)).equal(false);
});
it("TESTTESTloadLegacySutta(...) => legacy german sutta", async()=>{
return; // no longer legacy
var sca = await new ScApi().initialize();
var scid = 'thig1.1';
var language = 'de';
var sutta = await sca.loadLegacySutta(scid,language);
should.deepEqual(sutta.segmented, false);
var suttaplex = sutta.suttaplex;
should(suttaplex.acronym).equal('DN 1');
var translations = suttaplex.translations;
should(translations).instanceOf(Array);
should(translations[0].author_uid).equal('franke');
var sutta = await sca.loadLegacySutta(scid, language, 'sujato');
should(sutta).equal(null);
});
it("TESTTESTloadLegacySutta(...) => list of Snp1.8 en translations", async()=>{
return; // no longer legacy
var sca = await new ScApi().initialize();
var scid = 'snp1.8';
var language = 'en';
var sutta = await sca.loadLegacySutta('snp1.8','en');
should.deepEqual(sutta.segmented, false);
var suttaplex = sutta.suttaplex;
should(suttaplex).properties(SUTTAPLEX_SNP1_8_2021);
var translations = suttaplex.translations;
should(translations).instanceOf(Array);
should.deepEqual(translations[0], TRANSLATIONS_SNP1_8_2021);
});
it("TESTTESTloadLegacySutta(...) => en translations for Snp1.8", async()=>{
return; // no longer legacy
var sca = await new ScApi().initialize();
var language = 'en';
var sutta = await sca.loadLegacySutta({
scid:'snp1.8',
language: 'en',
translator: 'mills'
});
should.deepEqual(Object.keys(sutta).sort(), [
'translation', 'sutta_uid', 'author_uid',
'segmented', 'segments', 'metaarea', 'suttaplex', 'lang',
].sort());
should.deepEqual(sutta.segmented, false);
var suttaplex = sutta.suttaplex;
should(suttaplex).properties(SUTTAPLEX_SNP1_8_2021);
var translations = suttaplex.translations;
should(translations).instanceOf(Array);
should.deepEqual(translations[0], TRANSLATIONS_SNP1_8_2021);
var translation = suttaplex.translations[0];
var segments = sutta.segments;
var i = 0;
should(segments[i].scid).match(/snp1.8:0.1/um);
should(segments[i].en).match(/Sutta Nipāta 1/um);
i += 1;
should(segments[i].scid).match(/snp1.8:0.2/um);
should(segments[i].en).match(/Loving-kindness/um);
should(segments[i].pli).match(/Mettasutta/um);
should(segments.length).equal(17);
});
it("TESTTESTloadLegacySutta(...) => en translations for ea12.1", async()=>{
var sca = await new ScApi().initialize();
var language = 'en';
var sutta = await sca.loadLegacySutta({
scid:'ea12.1',
language: 'en',
});
should.deepEqual(Object.keys(sutta).sort(), [
'translation', 'sutta_uid', 'author_uid',
'segments', 'segmented', 'metaarea', 'suttaplex', 'lang',
].sort());
should.deepEqual(sutta.segmented, false);
var suttaplex = sutta.suttaplex;
should(suttaplex).properties(SUTTAPLEX_EA12_1_2021);
var translations = suttaplex.translations;
should(translations).instanceOf(Array);
should.deepEqual(translations, TRANSLATIONS_EA12_1_2021);
var translation = suttaplex.translations[0];
var segments = sutta.segments;
var i = 0;
should(segments[i].scid).match(/ea12.1:0.1/um);
should(segments[i].en).match(/Ekottarikāgama \(1st\) 12.1/um);
i += 1;
should(segments[i].scid).match(/ea12.1:0.2/um);
should(segments[i].en).match(/The One Way In Sūtra/um);
should(segments[i].lzh).match(/ ?/um);
i += 1;
should(segments[i].scid).match(/ea12.1:1.0.1$/um);
should(segments[i].en).match(/I heard these words of the Buddha/um);
should(segments.length).equal(56);
});
it("loadLegacySutta(opts) returns Error if sutta not found", async()=>{
var sca = await new ScApi().initialize();
// implausible sutta
var err = null;
try {
logger.warn("EXPECTED WARNING (BEGIN)");
var result = await sca.loadLegacySutta('nonsense-sutta-id');
console.error(result);
} catch(e) {
err = e;
}
logger.warn("EXPECTED WARNING (END)");
should(err).instanceOf(Error);
// plausible but not existing
var err = null;
try {
logger.warn("EXPECTED WARN (BEGIN)");
var result = await sca.loadLegacySutta('mn911');
console.error(result);
} catch(e) {
err = e;
}
logger.warn("EXPECTED WARN (END)");
should(err).instanceOf(Error);
// plausible but not existing
var err = null;
try {
logger.warn("EXPECTED WARN (BEGIN)");
var result = await sca.loadLegacySutta('an2.911');
//console.error(result);
} catch(e) {
err = e;
}
should(err).instanceOf(Error);
logger.warn("EXPECTED WARN (END)");
});
it("TESTTESTloadLegacySutta(...) => an2.12 as part of an2.11-20", async()=>{
var sca = await new ScApi().initialize();
var language = 'en';
var sutta = await sca.loadLegacySutta('an2.12');
should.deepEqual(sutta.segmented, true);
should(sutta.suttaplex.uid).equal('an2.11-20');
should(sutta.sutta_uid).equal('an2.11-20');
var suttaplex = sutta.suttaplex;
should(suttaplex).properties(SUTTAPLEX_AN2_12_2021);
var translations = suttaplex.translations;
should(translations).instanceOf(Array);
should(translations.length).equal(2); // sujato, thanissaro
var segments = sutta.segments;
should(segments.length).equal(0);
should(sutta.metaarea).equal(undefined);
});
it("expandAbbreviation(abbr) expands abbreviation", async()=>{
var sca = await new ScApi().initialize();
should.deepEqual(sca.expandAbbreviation('sk'), [
"Sk",
"Sekhiya"
]);
});
it("loadLegacySutta(opts) loads MN79", async()=>{
var sca = await new ScApi().initialize();
var sutta = await sca.loadLegacySutta("mn79", "en", "sujato");
should(sutta.segments.length).equal(0);
should.deepEqual(Object.keys(sutta).sort(), [
'translation', 'sutta_uid', 'author_uid',
'segmented', 'segments', 'suttaplex',
].sort());
});
it("TESTTESTloadLegacySutta(...)=>refreshes api folder", async()=>{
// Force writing of api cache
var sca = await new ScApi({
readMem: false,
readFile: false,
}).initialize();
var ms0 = Date.now();
var mn121 = await sca.loadLegacySutta("mn121");
should(mn121.acronym).equal(`MN 121`);
should(mn121.original_title).equal('Cūḷasuññatasutta');
should(mn121.translations.length).above(0);
var mn122 = await sca.loadLegacySutta("mn122");
should(mn122.acronym).equal(`MN 122`);
should(mn122.original_title).equal('Mahāsuññatasutta');
should(mn122.translations.length).above(0);
var ms1 = Date.now();
should(ms1-ms0).above(150); //slow
});
it("TESTTESTloadLegacySutta(...)=>suttaplex", async()=>{
// normal cache use
var sca = await new ScApi().initialize();
var ms0 = Date.now();
var mn121 = await sca.loadLegacySutta("mn121");
should(mn121.acronym).equal(`MN 121`);
should(mn121.original_title).equal('Cūḷasuññatasutta');
should(mn121.translations.length).above(0);
var ms1 = Date.now();
var mn121 = await sca.loadLegacySutta("mn121");
should(mn121.acronym).equal(`MN 121`);
should(mn121.original_title).equal('Cūḷasuññatasutta');
should(mn121.translations.length).above(0);
var ms2 = Date.now();
should(ms1-ms0).below(300); // read file
should(ms2-ms1).below(30); // read memory
});
it("TESTTESTloadLegacySutta(...)=>DN3 suttaplex", async()=>{
var sca = await new ScApi().initialize();
var dn3 = await sca.loadLegacySutta("dn3");
should(dn3.acronym).equal(`DN 3`);
should(dn3.original_title).equal('Ambaṭṭhasutta');
should(dn3.translations.length).above(0);
});
it("TESTTESTloadLegacySutta(...)=>sn46.55 suttaplex", async()=>{
var sca = await new ScApi().initialize();
var scid = 'sn46.55';
var acronym = `SN 46.55`;
var original_title = 'Saṅgāravasutta';
var spx = await sca.loadLegacySutta(scid, 'de');
should(spx).properties({acronym, original_title});
should(spx.translations.length).equal(2); // German translations
// TODO: 20210325 ashinsarana suttas not in publishing
// This should not affect subsequent query
//var spx = await sca.loadLegacySutta(scid, 'cs');
//should(spx).properties({acronym, original_title});
//should(spx.translations.length).equal(0); // no Czech
// Should be identical to first query
var spx = await sca.loadLegacySutta(scid, 'de');
should(spx).properties({acronym, original_title});
should(spx.translations.length).equal(2); // German translations
});
it("TESTTESTsuttaFromHtml(html, opts) parses HTML", async()=>{
var sca = await new ScApi().initialize();
var text = [
'hello',
'there\n',
].join('\n');
var sutta = sca.suttaFromHtml(text, {
uid: 'sn12.23',
suttaplex: {
uid: 'sn12.23',
original_title: 'Sudattasutta',
},
translation: {
title: '8. Mit Sudatta',
author_uid: 'sabbamitta',
lang: 'de',
},
});
should.deepEqual(Object.keys(sutta).sort(), [
'author_uid', 'segmented', 'segments',
'sutta_uid', 'lang', 'translation',
'metaarea',
].sort());
should(sutta.author_uid).equal('sabbamitta');
should(sutta.sutta_uid).equal('sn12.23');
should(sutta.segments.length).equal(4);
should.deepEqual(sutta.segments[0], {
scid: 'sn12.23:0.1',
de: 'Saṁyutta Nikāya 12.23',
});
should.deepEqual(sutta.segments[1], {
scid: 'sn12.23:0.2',
de: '8. Mit Sudatta',
pli: 'Sudattasutta',
});
should.deepEqual(sutta.segments[2], {
scid: 'sn12.23:1.0.1',
de: 'hello',
});
should.deepEqual(sutta.segments[3], {
scid: 'sn12.23:1.0.2',
de: 'there',
});
});
})