UNPKG

tnt.ensembl

Version:

Library to retrieve data via the Ensembl REST Api

467 lines (431 loc) 19.8 kB
var tnt_ensembl = require("../index.js"); var assert = require("chai").assert; var _ = require("lodash"); describe('TnT REST', function () { this.timeout(5000); it("Exists and is called eRest", function () { assert.isDefined(tnt_ensembl); }); var rest = tnt_ensembl(); it("Has a region limit", function () { assert.isDefined(rest.limits); assert.isDefined(rest.limits.region); }); it("Has a url submodule", function () { assert.isDefined(rest.url) }); it("Has a proxyUrl method", function () { assert.isDefined(rest.proxyUrl); assert.isFunction(rest.proxyUrl); }); it("Has the ensembl rest api as the default proxyUrl", function () { assert.strictEqual(rest.proxyUrl(), "https://rest.ensembl.org"); }); describe('Ensembl Variation (Post)', function () { it ('Makes post requests to get variation data', function (done) { var var_url = rest.url.variation({ "species" : "homo_sapiens", }); rest.call(var_url, { "ids" : ["rs116035550", "COSM476" ] }) .then (function (resp) { assert.isDefined (resp.body); assert.isDefined (resp.body["COSM476"]); assert.isDefined (resp.body["rs116035550"]); done(); }); }); }); describe('Data retrieval', function () { // Being friendly with the REST API. The tests are delayed this time var delay = 300; describe('Ensembl External Ids', function () { it("Has a url.xref field", function () { assert.isDefined(rest.url.xref); }) var name = "BRCA2" var xref_url = rest.url.xref({species:"human", name:name}); it("Has the correct url", function () { assert.equal(xref_url, "https://rest.ensembl.org/xrefs/symbol/human/BRCA2.json?object_type=gene"); }) it("Retrieves xrefs from the REST server", function (done) { rest.call (xref_url) .then (function (resp) { assert.isArray(resp.body); assert.isObject(resp.body[0]); _.each(resp.body, function (el) { assert.isObject(el); assert.property(el, "type"); assert.equal(el.type, "gene"); assert.property(el, "id"); }); setTimeout(done, delay); // done(); }) }); describe('Species names', function () { it("Accepts scientific species names", function (done) { var species = "homo_sapiens"; var name = "BRCA2"; rest.call(rest.url.xref({species:species, name:name})) .then (function (resp) { assert.isArray(resp.body); assert.isObject(resp.body[0]); setTimeout(done, delay); // done(); }); }); it("Accepts scientific species names without underscores", function (done) { var species = "homo sapiens"; var name = "BRCA2"; rest.call(rest.url.xref({species:species, name:name})) .then (function (resp) { assert.isArray(resp.body); assert.isObject(resp.body[0]); setTimeout(done, 400); // done(); }) }); it("Accepts common names", function (done) { var species = "human"; var name = "BRCA2"; rest.call(rest.url.xref({species:species, name:name})) .then (function (resp) { assert.isArray(resp.body); assert.isObject(resp.body[0]); setTimeout(done, delay); // done(); }) }); }); it ("Fires the error callback on wrong url", function (done) { rest.call (xref_url + "xxx") // wrong url .catch (function (err) { assert.isDefined(err); assert.equal(err.status, 400); assert.isTrue(err.isHttpError); setTimeout(done, delay); // done(); }) }); }); describe('Chromosome info', function () { it("Has a url.chr_info field", function () { assert.isDefined(rest.url.chr_info); }) var chr_info_url = rest.url.chr_info({species:"human", chr:"13"}); it ("Has the correct url", function () { assert.equal(chr_info_url, "https://rest.ensembl.org/info/assembly/human/13.json?format=full"); }) it ("Retrieves chr info", function (done) { rest.call (chr_info_url) .then (function (resp) { assert.isObject(resp.body); assert.property(resp.body, "is_chromosome"); assert.equal(resp.body.is_chromosome, 1); assert.property(resp.body, "length"); setTimeout(done, delay); // done(); }) }); }); describe('Genomic alignment blocks', function () { it("Has a url.aln_block field", function () { assert.isDefined(rest.url.aln_block); }); var aln_block_url = rest.url.aln_block({ species : 'homo_sapiens', chr : 2, from : 100040000, to : 100041500, method : 'LASTZ_NET', species_set : ['human', 'mouse'] }); it ("Has the correct url", function () { assert.equal(aln_block_url, "https://rest.ensembl.org/alignment/region/homo_sapiens/2:100040000-100041500.json?method=LASTZ_NET&species_set=human&species_set=mouse"); }); it("Retrieves genomic align blocks", function (done) { rest.call (aln_block_url) .then (function (resp) { assert.isArray(resp.body); assert.strictEqual(resp.body.length, 1); assert.property(resp.body[0], "tree"); assert.property(resp.body[0], "alignments"); assert.isArray(resp.body[0].alignments); assert.isObject(resp.body[0].alignments[0]); assert.property(resp.body[0].alignments[0], "start"); assert.property(resp.body[0].alignments[0], "end"); assert.strictEqual(resp.body[0].alignments[0].species, "homo_sapiens"); assert.isObject(resp.body[0].alignments[1]); assert.property(resp.body[0].alignments[1], "start"); assert.property(resp.body[0].alignments[1], "end"); assert.strictEqual(resp.body[0].alignments[1].species, "mus_musculus"); setTimeout(done, delay); }) }); // it("Fires the error callback on wrong url", function (done) { // rest.call (aln_block_url + "xxx") // .catch (function (err) { // jshing ignore:line // assert.isDefined(err); // assert.equal(err.status, 400); // assert.isTrueequal(err.isHttpError); // setTimeout(done, delay); // }) // }); }); describe('Ensembl sequences', function () { it ("Has a url.sequence field", function () { assert.isDefined (rest.url.sequence); }); var sequence_url = rest.url.sequence({ species: "human", chr : '7', from : 1233000, to : 1234000 }); it ("Has the correct url", function () { assert.equal(sequence_url, "https://rest.ensembl.org/sequence/region/human/7:1233000..1234000?content-type=application/json"); }); it ("Retrieves sequences", function (done) { rest.call (sequence_url) .then (function (resp) { assert.isObject(resp.body); assert.isDefined(resp.body.id); assert.isDefined(resp.body.seq); assert.lengthOf(resp.body.seq, 1001); // Both ends are included assert.isDefined(resp.body.molecule); assert.equal(resp.body.molecule, 'dna'); setTimeout(done, delay); }); }); }); describe('Ensembl GeneTrees', function () { it("Has a url.gene_tree field", function () { assert.isDefined(rest.url.gene_tree); }); var gene_tree_url = rest.url.gene_tree({ id : "ENSGT00390000003602" }); it("Has the correct url", function () { assert.equal(gene_tree_url, "https://rest.ensembl.org/genetree/id/ENSGT00390000003602.json?sequence=protein;aligned=0"); }); it("Retrieves gene trees", function (done) { rest.call (gene_tree_url) .then (function (resp) { assert.isObject(resp.body); // TODO: Include more structural tests setTimeout(done, delay); }); }); it("Retrieves protein sequences by default", function (done) { rest.call (gene_tree_url) .then (function (resp) { var check_seq = function (node) { if (node.children === undefined) { assert.isDefined(node.sequence); assert.isDefined(node.sequence.mol_seq); } else { for (var i=0; i<node.children.length; i++) { check_seq(node.children[i]); } } }; check_seq(resp.body.tree); setTimeout(done, delay); }); }); it("Does not retrieve sequences when passed sequence=none", function (done) { var gene_tree_url = rest.url.gene_tree({ id : "ENSGT00390000003602", sequence : "none" }); rest.call (gene_tree_url) .then (function (resp) { var check_seq = function (node) { if (node.children === undefined) { assert.isDefined(node.sequence); assert.isUndefined(node.sequence.mol_seq); } else { for (var i=0; i<node.children.length; i++) { check_seq(node.children[i]); } } }; check_seq(resp.body.tree); setTimeout(done, delay); }); }); it("Retrieves un-aligned sequences when sequence flag is passed", function (done) { var gene_tree_url = rest.url.gene_tree ({ id : "ENSGT00390000003602", sequence : "protein" }); rest.call (gene_tree_url) .then (function (resp) { var check_seq = function (node) { if (node.children === undefined) { assert.isDefined(node.sequence); assert.isDefined(node.sequence.mol_seq); assert.strictEqual(node.sequence.mol_seq.is_aligned, 0); } else { for (var i=0; i<node.children.length; i++) { check_seq(node.children[i]); } } } check_seq(resp.body.tree); setTimeout(done, delay); }); }); it("Retrieves aligned sequences when align flag is passed", function (done) { var gene_tree_url = rest.url.gene_tree ({ id : "ENSGT00390000003602", aligned : 1 }); rest.call (gene_tree_url) .then (function (resp) { var check_seq = function (node) { if (node.children === undefined) { assert.isDefined(node.sequence); assert.isDefined(node.sequence.mol_seq); assert.strictEqual(node.sequence.mol_seq.is_aligned, 1); } else { for (var i=0; i<node.children.length; i++) { check_seq(node.children[i]); } } } check_seq(resp.body.tree); setTimeout(done, delay); }); }); }); describe('Ensembl Gene Ids', function () { it("Has a url.gene field", function () { assert.isDefined(rest.url.gene) }) var gene_url = rest.url.gene({id:"ENSG00000139618"}); it("Has the correct url", function () { assert.equal(gene_url, "https://rest.ensembl.org/lookup/id/ENSG00000139618.json?format=full") }) it("Retrieves gene from ensembl ID", function (done) { rest.call (gene_url) .then (function (resp) { assert.isObject(resp.body); assert.property(resp.body, "id"); assert.equal(resp.body.id, "ENSG00000139618"); assert.property(resp.body, "display_name"); assert.equal(resp.body.display_name, "BRCA2"); assert.property(resp.body, "species"); assert.equal(resp.body.species, "homo_sapiens"); assert.property(resp.body, "object_type"); assert.equal(resp.body.object_type, "Gene"); assert.property(resp.body, "biotype"); assert.equal(resp.body.biotype, "protein_coding"); assert.property(resp.body, "strand"); assert.equal(resp.body.strand, 1); assert.property(resp.body, "seq_region_name"); assert.equal(resp.body.seq_region_name, 13); setTimeout(done, delay); // done(); }) }) it("Fires the error callback on wrong url", function (done) { rest.call (gene_url + "xxxxx") .catch (function (err) { // jshint ignore:line assert.isDefined(err); assert.equal(err.status, 400); assert.isTrue(err.isHttpError); setTimeout(done, delay); // done(); }); }) }) describe('Gene Homologues', function () { it("Has a url.homologues field", function () { assert.isDefined(rest.url.homologues); }); var homologues_url = rest.url.homologues({id:"ENSG00000139618"}); it("Has the correct url", function () { assert.equal(homologues_url, "https://rest.ensembl.org/homology/id/ENSG00000139618.json?format=condensed;sequence=none;type=all"); }); it ("Has the species option", function () { var url = rest.url.homologues({ "id" : "ENSG00000139618", "species" : ["human", "mouse"] }); }); it("Retrieves homologues", function (done) { rest.call (homologues_url) .then (function (resp) { assert.isObject(resp.body); assert.property(resp.body, "data"); assert.isArray(resp.body.data); assert.lengthOf(resp.body.data, 1); assert.property(resp.body.data[0], "homologies"); assert.isArray(resp.body.data[0].homologies); _.each(resp.body.data[0].homologies, function (el) { assert.match(el.type, /ortholog|paralog/); }); var ids = _.pluck(resp.body.data[0].homologies, "id"); assert.isArray(ids), assert.equal(ids.length, resp.body.data[0].homologies.length); _.each(ids, function (el) { assert.isDefined(el); }); setTimeout(done, delay); }) }) }) describe("Ensembl Region", function () { it("Has a url.region field", function () { assert.isDefined(rest.url.region); }) var region_url = rest.url.region({ "species" : "homo_sapiens", "chr" : 13, "from" : 32889611, "to" : 32973805 }); it ("Has the correct url", function () { assert.equal(region_url, "https://rest.ensembl.org/overlap/region/homo_sapiens/13:32889611-32973805.json?feature=gene"); }); it ("Sets url with different features", function () { var url = rest.url.region ({ "species" : "homo_sapiens", "chr" : 13, "from" : 32889611, "to" : 32973805, "features" : ["gene", "transcript"] }); assert.equal(url, "https://rest.ensembl.org/overlap/region/homo_sapiens/13:32889611-32973805.json?feature=gene&feature=transcript"); }); it("Retrieves regions correctly", function (done) { rest.call (region_url) .then (function (resp) { assert.isArray(resp.body); var ids = _.pluck(resp.body, 'id'); assert.isArray(ids); assert.equal(ids.length, resp.body.length); _.each(ids, function (el) { assert.isDefined(el); }) setTimeout(done, delay); // done(); }); }); it("Fires the error callback on wrong url", function (done) { rest.call( region_url + "xxxxx") // wrong url .catch (function (err) { assert.isDefined(err); assert.equal(err.status, 400); assert.isTrue(err.isHttpError); setTimeout(done, delay); // done(); }) //assert.isTrue(rest.connections() > 0); }) }); }); });