/*************************************************************************
* *
* This file is part of the 20n/act project. *
* 20n/act enables DNA prediction for synthetic biology/bioengineering. *
* Copyright (C) 2017 20n Labs, Inc. *
* *
* Please direct all queries to act@20n.com. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*************************************************************************/
package act.installer;
import act.shared.Chemical;
import com.act.biointerpretation.test.util.MockedMongoDB;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class HMDBParserTest {
public static final String TEST_HMDB_FILE_NAME = "HMDB01859.xml";
Document doc;
@Before
public void setUp() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
InputStream testFileStream = this.getClass().getResourceAsStream(TEST_HMDB_FILE_NAME);
doc = documentBuilder.parse(testFileStream);
}
@Test
public void testExtractChemicalFromXMLDocument() throws Exception {
MockedMongoDB mockedDb = new MockedMongoDB();
HMDBParser parser = HMDBParser.Factory.makeParser(mockedDb.getMockMongoDB());
Chemical chem = parser.extractChemicalFromXMLDocument(doc);
assertEquals("Canonical name matches", "acetaminophen", chem.getCanon().toLowerCase());
assertEquals("InChI matches", "InChI=1S/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)", chem.getInChI());
assertEquals("SMILES matches", "CC(=O)NC1=CC=C(O)C=C1", chem.getSmiles());
assertTrue("Expected synonyms appear", chem.getSynonyms().containsAll(Arrays.asList(
"tylenol", // Why can you never find tylenol on pirate ships?
"acetaminophen", // ...
"paracetamol", // <-- Because parrots eat 'em all!
"apap" // ... HAH!
// Any many more!
)));
assertEquals("Pubchem id matches", Long.valueOf(1983), chem.getPubchemID()); // My favorite!
// Pick apart the XRef
JSONObject xref = chem.getRef(Chemical.REFS.HMDB);
assertEquals("HMDB ID matches", "HMDB01859", xref.getString("hmdb_id"));
assertEquals("Metlin ID matches", "6353", xref.getString("metlin_id"));
assertEquals("ChEBI ID matches", "46195", xref.getString("chebi_id"));
assertEquals("Fluid length matches", 3, xref.getJSONObject("location").getJSONArray("fluid").length());
assertEquals("First fluid matches", "Blood", xref.getJSONObject("location").getJSONArray("fluid").getString(0));
assertEquals("Tissue length matches", 1, xref.getJSONObject("location").getJSONArray("tissue").length());
assertEquals("First tissue matches",
"All Tissues", xref.getJSONObject("location").getJSONArray("tissue").getString(0));
assertEquals("Proteins length matches", 4, xref.getJSONArray("proteins").length());
assertEquals("First protein name matches",
"Cytochrome P450 1A2", xref.getJSONArray("proteins").getJSONObject(0).getString("name"));
assertEquals("First protein uniprot_id matches",
"P05177", xref.getJSONArray("proteins").getJSONObject(0).getString("uniprot_id"));
assertEquals("First protein gene name matches",
"CYP1A2", xref.getJSONArray("proteins").getJSONObject(0).getString("gene_name"));
assertEquals("First ontology origin matches",
"Drug", xref.getJSONObject("ontology").getJSONArray("origins").getString(0));
// TODO: consider another test using data that has disease/pathway names.
}
}