/************************************************************************* * * * 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 com.act.biointerpretation.l2expansion; import act.server.MongoDB; import act.shared.Reaction; import com.act.biointerpretation.sars.Sar; import org.biopax.paxtools.model.level3.ConversionDirectionType; import org.biopax.paxtools.model.level3.StepDirection; import org.json.JSONObject; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.function.Function; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class ReactionsTransformerTest { final String SUBSTRATE_INCHI = "substrate_inchi"; final Long SUBSTRATE_ID = new Long(1); final String SUBSTRATE_NAME = "substrate_name"; final L2PredictionChemical SUBSTRATE_PREDICTION_CHEMICAL = new L2PredictionChemical( SUBSTRATE_INCHI, SUBSTRATE_ID, SUBSTRATE_NAME); final String PRODUCT_PRODUCED_INCHI = "product_produced_inchi"; final Long PRODUCT_PRODUCED_ID = new Long(2); final String PRODUCT_PRODUCED_NAME = "product_produced_name"; final L2PredictionChemical PRODUCT_PRODUCED_CHEMICAL = new L2PredictionChemical( PRODUCT_PRODUCED_INCHI, PRODUCT_PRODUCED_ID, PRODUCT_PRODUCED_NAME); final String PRODUCT_NOT_PRODUCED_INCHI = "product_not_produced_inchi"; final Long PRODUCT_NOT_PRODUCED_ID = new Long(3); final String PRODUCT_NOT_PRODUCED_NAME = "product_not_produced_name"; final L2PredictionChemical PRODUCT_NOT_PRODUCED_CHEMICAL = new L2PredictionChemical( PRODUCT_NOT_PRODUCED_INCHI, PRODUCT_NOT_PRODUCED_ID, PRODUCT_NOT_PRODUCED_NAME); final String ONLY_INCHI = "only_an_inchi"; final L2PredictionChemical ONLY_INCHI_CHEMICAL = new L2PredictionChemical(ONLY_INCHI); final String ERO_ID_STRING = new Integer(5).toString(); final Integer PREDICTION_ID = new Integer(6); final List<Sar> NO_SAR = new ArrayList<>(); final Long REACTION_ID = new Long(6); Reaction reaction = new Reaction(REACTION_ID, new Long[] {SUBSTRATE_ID}, new Long[] {PRODUCT_PRODUCED_ID}, new Long[] {}, new Long[] {}, new Long[] {}, "", ConversionDirectionType.LEFT_TO_RIGHT, StepDirection.LEFT_TO_RIGHT, "", Reaction.RxnDetailType.ABSTRACT ); MongoDB mockMongo; JSONObject validationRoMatch; JSONObject validationNoRoMatch; @Before public void setup() { // Set up mechanistic validation results validationRoMatch = Mockito.mock(JSONObject.class); validationNoRoMatch = Mockito.mock(JSONObject.class); Set<String> validationSet = new HashSet<>(); validationSet.add(ERO_ID_STRING); Mockito.when(validationRoMatch.keySet()).thenReturn(validationSet); Mockito.when(validationNoRoMatch.keySet()).thenReturn(new HashSet<Integer>()); // Set up reactions DB. mockMongo = Mockito.mock(MongoDB.class); Mockito.when(mockMongo.getRxnsWithAll(Arrays.asList(SUBSTRATE_ID), Arrays.asList(PRODUCT_PRODUCED_ID))). thenReturn(Arrays.asList(reaction)); Mockito.when(mockMongo.getRxnsWithAll(Arrays.asList(SUBSTRATE_ID), Arrays.asList(PRODUCT_NOT_PRODUCED_ID))). thenReturn(new ArrayList<Reaction>()); } @Test public void testReactionInDBRoMatch() { // Arrange L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, Arrays.asList(SUBSTRATE_PREDICTION_CHEMICAL), ERO_ID_STRING, Arrays.asList(PRODUCT_PRODUCED_CHEMICAL)); testPrediction.getSubstrates().get(0).setId(SUBSTRATE_ID); testPrediction.getProducts().get(0).setId(PRODUCT_PRODUCED_ID); reaction.setMechanisticValidatorResult(validationRoMatch); Function<L2Prediction, L2Prediction> filter = new ReactionsTransformer(mockMongo); // Act L2Prediction result = filter.apply(testPrediction); // Assert assertEquals("Should return one matching reaction.", 1, result.getReactionsRoMatch().size()); assertEquals("Reaction ID should match DB response.", REACTION_ID, result.getReactionsRoMatch().get(0)); assertTrue("Should return no non-matching reactions.", result.getReactionsNoRoMatch().isEmpty()); } @Test public void testReactionInDBNoRoMatch() { // Arrange L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, Arrays.asList(SUBSTRATE_PREDICTION_CHEMICAL), ERO_ID_STRING, Arrays.asList(PRODUCT_PRODUCED_CHEMICAL)); reaction.setMechanisticValidatorResult(validationNoRoMatch); Function<L2Prediction, L2Prediction> filter = new ReactionsTransformer(mockMongo); // Act L2Prediction result = filter.apply(testPrediction); // Assert assertEquals("Should return one non-matching reaction.", 1, result.getReactionsNoRoMatch().size()); assertEquals("Reaction ID should match DB response.", REACTION_ID, result.getReactionsNoRoMatch().get(0)); assertTrue("Should return no matching reactions.", result.getReactionsRoMatch().isEmpty()); } @Test public void testReactionNotInDB() { // Arrange L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, Arrays.asList(SUBSTRATE_PREDICTION_CHEMICAL), ERO_ID_STRING, Arrays.asList(PRODUCT_NOT_PRODUCED_CHEMICAL)); testPrediction.getSubstrates().get(0).setId(SUBSTRATE_ID); testPrediction.getProducts().get(0).setId(PRODUCT_NOT_PRODUCED_ID); Function<L2Prediction, L2Prediction> filter = new ReactionsTransformer(mockMongo); // Act L2Prediction result = filter.apply(testPrediction); // Assert assertTrue("Should return no matching reaction.", result.getReactionsRoMatch().isEmpty()); assertTrue("Should return no non-matching reaction.", result.getReactionsNoRoMatch().isEmpty()); } @Test public void testReactionSubstrateEmpty() { // Arrange L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, Arrays.asList(ONLY_INCHI_CHEMICAL), ERO_ID_STRING, Arrays.asList(PRODUCT_PRODUCED_CHEMICAL)); testPrediction.getProducts().get(0).setId(PRODUCT_PRODUCED_ID); Function<L2Prediction, L2Prediction> filter = new ReactionsTransformer(mockMongo); // Act L2Prediction result = filter.apply(testPrediction); // Assert assertEquals("No substrate- should return no reactions", 0, result.getReactionCount()); } @Test public void testReactionProductEmpty() { // Arrange L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, Arrays.asList(SUBSTRATE_PREDICTION_CHEMICAL), ERO_ID_STRING, Arrays.asList(ONLY_INCHI_CHEMICAL)); Function<L2Prediction, L2Prediction> filter = new ReactionsTransformer(mockMongo); // Act L2Prediction result = filter.apply(testPrediction); // Assert assertEquals("No product- should return no reactions", 0, result.getReactionCount()); } @Test public void testReactionOneSubstrateNotInDB() { // Arrange L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, Arrays.asList(ONLY_INCHI_CHEMICAL, SUBSTRATE_PREDICTION_CHEMICAL), ERO_ID_STRING, Arrays.asList(PRODUCT_PRODUCED_CHEMICAL)); testPrediction.getProducts().get(0).setId(PRODUCT_PRODUCED_ID); Function<L2Prediction, L2Prediction> filter = new ReactionsTransformer(mockMongo); // Act L2Prediction result = filter.apply(testPrediction); // Assert assertEquals("One substrate has no ID- should return no reactions", 0, result.getReactionCount()); } @Test public void testReactionOneProductNotInDB() { // Arrange L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, Arrays.asList(SUBSTRATE_PREDICTION_CHEMICAL), ERO_ID_STRING, Arrays.asList(ONLY_INCHI_CHEMICAL, PRODUCT_PRODUCED_CHEMICAL)); testPrediction.getProducts().get(0).setId(PRODUCT_PRODUCED_ID); Function<L2Prediction, L2Prediction> filter = new ReactionsTransformer(mockMongo); // Act L2Prediction result = filter.apply(testPrediction); // Assert assertEquals("One substrate has no ID- should return no reactions", 0, result.getReactionCount()); } }