From 64b4e54fd9011f70031f3bc8bddc6d407d44f46a Mon Sep 17 00:00:00 2001 From: iimpulse Date: Mon, 23 Oct 2023 12:05:14 -0600 Subject: [PATCH] unit test for oan-etl load --- README.md | 4 +- oan-etl/build.gradle | 13 +++++ .../org/jacksonlaboratory/GraphCommand.java | 1 - .../jacksonlaboratory/graph/Operations.java | 12 ++--- .../{Module.java => OntologyModule.java} | 4 +- .../ontology/HpoGraphLoader.java | 6 +-- .../graph/OperationsTest.java | 49 +++++++++++++++++++ .../jacksonlaboratory/model/ModuleTest.java | 16 ------ .../model/OntologyModuleTest.java | 21 ++++++++ 9 files changed, 96 insertions(+), 30 deletions(-) rename oan-etl/src/main/java/org/jacksonlaboratory/model/{Module.java => OntologyModule.java} (62%) create mode 100644 oan-etl/src/test/java/org/jacksonlaboratory/graph/OperationsTest.java delete mode 100644 oan-etl/src/test/java/org/jacksonlaboratory/model/ModuleTest.java create mode 100644 oan-etl/src/test/java/org/jacksonlaboratory/model/OntologyModuleTest.java diff --git a/README.md b/README.md index ce06c2e..e87a166 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Micronaut 4.1.2 ### Modules #### OAN-ETL - A module to load our graph data which includes phenotypes, diseases, genes, assays. There + A ontologyModule to load our graph data which includes phenotypes, diseases, genes, assays. There are multiple loaders for the different ontologies that are supported Running @@ -30,7 +30,7 @@ Testing ``` #### OAN-REST - A module that exposes our graph via a REST-API. This will be used for the hpo web application + A ontologyModule that exposes our graph via a REST-API. This will be used for the hpo web application and deployed to google cloud. Running diff --git a/oan-etl/build.gradle b/oan-etl/build.gradle index 8c59c59..2ec3bce 100644 --- a/oan-etl/build.gradle +++ b/oan-etl/build.gradle @@ -1,6 +1,7 @@ plugins { id("com.github.johnrengelman.shadow") version "8.1.1" id("io.micronaut.application") version "4.0.3" + id('jacoco') } group = 'org.jacksonlaboratory' @@ -52,3 +53,15 @@ micronaut { annotations("org.jacksonlaboratory.*") } } + +test { + finalizedBy jacocoTestReport // report is always generated after tests run +} +jacocoTestReport { + dependsOn test // tests are required to run before generating the report + reports { + xml.required = false + csv.required = false + html.outputLocation = layout.buildDirectory.dir('jacocoHtml') + } +} diff --git a/oan-etl/src/main/java/org/jacksonlaboratory/GraphCommand.java b/oan-etl/src/main/java/org/jacksonlaboratory/GraphCommand.java index 392984b..ce54934 100644 --- a/oan-etl/src/main/java/org/jacksonlaboratory/GraphCommand.java +++ b/oan-etl/src/main/java/org/jacksonlaboratory/GraphCommand.java @@ -3,7 +3,6 @@ import io.micronaut.configuration.picocli.PicocliRunner; import jakarta.inject.Inject; import org.jacksonlaboratory.graph.Operations; -import org.jacksonlaboratory.model.Module; import org.jacksonlaboratory.ontology.HpoGraphLoader; import picocli.CommandLine.Command; import picocli.CommandLine.Option; diff --git a/oan-etl/src/main/java/org/jacksonlaboratory/graph/Operations.java b/oan-etl/src/main/java/org/jacksonlaboratory/graph/Operations.java index 1bf68a9..574acde 100644 --- a/oan-etl/src/main/java/org/jacksonlaboratory/graph/Operations.java +++ b/oan-etl/src/main/java/org/jacksonlaboratory/graph/Operations.java @@ -1,14 +1,12 @@ package org.jacksonlaboratory.graph; import jakarta.inject.Singleton; -import org.jacksonlaboratory.model.Module; +import org.jacksonlaboratory.model.OntologyModule; import org.neo4j.driver.Driver; import org.neo4j.driver.Transaction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; - @Singleton public class Operations { private static final Logger logger = LoggerFactory.getLogger(Operations.class); @@ -27,9 +25,9 @@ public void truncate(){ } } - public void createIndexes(Module module){ + public void createIndexes(OntologyModule ontologyModule){ Transaction tx = driver.session().beginTransaction(); - if (module.equals(Module.HPO)){ + if (ontologyModule.equals(OntologyModule.HPO)){ logger.info("Creating Indexes..."); tx.run("CREATE INDEX phenotype_id FOR (n:Phenotype) ON (n.id)"); tx.run("CREATE INDEX disease_id FOR (n:Disease) ON (n.id)"); @@ -41,9 +39,9 @@ public void createIndexes(Module module){ tx.close(); } - public void dropIndexes(Module module){ + public void dropIndexes(OntologyModule ontologyModule){ Transaction tx = driver.session().beginTransaction(); - if(module.equals(Module.HPO)){ + if(ontologyModule.equals(OntologyModule.HPO)){ logger.info("Dropping Indexes..."); tx.run("DROP INDEX phenotype_id IF EXISTS"); tx.run("DROP INDEX disease_id IF EXISTS"); diff --git a/oan-etl/src/main/java/org/jacksonlaboratory/model/Module.java b/oan-etl/src/main/java/org/jacksonlaboratory/model/OntologyModule.java similarity index 62% rename from oan-etl/src/main/java/org/jacksonlaboratory/model/Module.java rename to oan-etl/src/main/java/org/jacksonlaboratory/model/OntologyModule.java index 0ae5ebe..edd978f 100644 --- a/oan-etl/src/main/java/org/jacksonlaboratory/model/Module.java +++ b/oan-etl/src/main/java/org/jacksonlaboratory/model/OntologyModule.java @@ -1,5 +1,7 @@ package org.jacksonlaboratory.model; -public enum Module { +public enum OntologyModule { HPO, MAXO + } + diff --git a/oan-etl/src/main/java/org/jacksonlaboratory/ontology/HpoGraphLoader.java b/oan-etl/src/main/java/org/jacksonlaboratory/ontology/HpoGraphLoader.java index 84c01ee..b27d692 100644 --- a/oan-etl/src/main/java/org/jacksonlaboratory/ontology/HpoGraphLoader.java +++ b/oan-etl/src/main/java/org/jacksonlaboratory/ontology/HpoGraphLoader.java @@ -2,7 +2,7 @@ import io.micronaut.context.annotation.Context; import org.jacksonlaboratory.graph.Operations; -import org.jacksonlaboratory.model.Module; +import org.jacksonlaboratory.model.OntologyModule; import org.monarchinitiative.phenol.annotations.assoc.MissingPhenolResourceException; import org.monarchinitiative.phenol.annotations.formats.AnnotationReference; import org.monarchinitiative.phenol.annotations.formats.hpo.HpoAssociationData; @@ -56,12 +56,12 @@ public void load(String folder) throws IOException, MissingPhenolResourceExcepti final HpoAssociationData associations = HpoAssociationData.builder(hpoOntology).orphaToGenePath(orphaToGenePath).mim2GeneMedgen(omimToGenePath) .hpoDiseases(diseases).hgncCompleteSetArchive(hgncPath).build(); List phenotypes = diseases.stream().flatMap(d -> d.annotationLines().stream().map(HpoAnnotationLine::phenotypeTermId)).distinct().toList(); - operations.dropIndexes(Module.HPO); + operations.dropIndexes(OntologyModule.HPO); try (Session session = driver.session()) { phenotypes(session, phenotypes, hpoOntology); diseases(session, diseases); genes(session, associations); - operations.createIndexes(Module.HPO); + operations.createIndexes(OntologyModule.HPO); diseaseToPhenotype(session, diseases, hpoOntology); diseaseToGene(session, associations); assayToPhenotype(session, loincPath); diff --git a/oan-etl/src/test/java/org/jacksonlaboratory/graph/OperationsTest.java b/oan-etl/src/test/java/org/jacksonlaboratory/graph/OperationsTest.java new file mode 100644 index 0000000..22d0756 --- /dev/null +++ b/oan-etl/src/test/java/org/jacksonlaboratory/graph/OperationsTest.java @@ -0,0 +1,49 @@ +package org.jacksonlaboratory.graph; + +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; +import org.jacksonlaboratory.model.OntologyModule; +import org.junit.jupiter.api.Test; +import org.neo4j.driver.Driver; +import org.neo4j.driver.Record; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; + +@MicronautTest +class OperationsTest { + + Driver driver; + Operations operations; + public OperationsTest(Driver driver, Operations operations) { + this.driver = driver; + this.operations = operations; + } + + @Test + void truncate() { + // Create fake nodes + // expect nodes to be 0. + driver.session().executeWriteWithoutResult(tx -> tx.run("CREATE (sample1),(sample2),(sample3),(sample4),(sample5)")); + int current = driver.session().executeWrite(tx -> tx.run("MATCH (x) RETURN COUNT(x)").single().values().get(0).asInt()); + assertEquals(5, current); + operations.truncate(); + current = driver.session().executeWrite(tx -> tx.run("MATCH (x) RETURN COUNT(x)").single().values().get(0).asInt()); + assertEquals(0, current); + } + + @Test + void createAndDropIndexes() { + driver.session().executeWriteWithoutResult(tx -> + tx.run("CREATE (p: Phenotype {id: 'HP:000001'}),(d: Disease {id: 'OMIM:1000'}),(g: Gene {id: 'NCBIGene:30'}),(a: Assay {id: 'LOINC:09103-3'})")); + + operations.createIndexes(OntologyModule.HPO); + List indexes = driver.session().executeWrite(tx -> tx.run("SHOW INDEXES YIELD name, labelsOrTypes, properties, type").list()).stream().filter(r -> r.get("type").asString().equals("RANGE")).collect(Collectors.toList()); + assertEquals(4, indexes.size()); + operations.dropIndexes(OntologyModule.HPO); + indexes = driver.session().executeWrite(tx -> tx.run("SHOW INDEXES YIELD name, labelsOrTypes, properties, type").list()).stream().filter(r -> r.get("type").asString().equals("RANGE")).collect(Collectors.toList());; + assertEquals(0, indexes.size()); + operations.truncate(); + } +} diff --git a/oan-etl/src/test/java/org/jacksonlaboratory/model/ModuleTest.java b/oan-etl/src/test/java/org/jacksonlaboratory/model/ModuleTest.java deleted file mode 100644 index e478b23..0000000 --- a/oan-etl/src/test/java/org/jacksonlaboratory/model/ModuleTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jacksonlaboratory.model; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class ModuleTest { - - @Test - void values() { - } - - @Test - void valueOf() { - } -} diff --git a/oan-etl/src/test/java/org/jacksonlaboratory/model/OntologyModuleTest.java b/oan-etl/src/test/java/org/jacksonlaboratory/model/OntologyModuleTest.java new file mode 100644 index 0000000..b490f22 --- /dev/null +++ b/oan-etl/src/test/java/org/jacksonlaboratory/model/OntologyModuleTest.java @@ -0,0 +1,21 @@ +package org.jacksonlaboratory.model; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class OntologyModuleTest { + + @Test + void values() { + assertEquals(OntologyModule.HPO, OntologyModule.HPO); + assertNotEquals(OntologyModule.HPO, OntologyModule.MAXO); + assertEquals(OntologyModule.values().length, 2); + } + + @Test + void valueOf() { + assertEquals(OntologyModule.valueOf("HPO"), OntologyModule.HPO); + assertEquals(OntologyModule.valueOf("MAXO"), OntologyModule.MAXO); + } +}